summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoachim Breitner <mail@joachim-breitner.de>2015-08-12 09:07:54 +0200
committerJoachim Breitner <mail@joachim-breitner.de>2015-08-12 09:07:54 +0200
commit47dd8347e2f8657d9b7d48f5a10c75744de28cb5 (patch)
tree22f50421304f8b706159d8011ea37186c1c0a91d
parent8fd5f7bad6976a3ff1b92941ac60f92e054ad702 (diff)
downloadDHG_packages-47dd8347e2f8657d9b7d48f5a10c75744de28cb5.tar.gz
make-all: Do only provide the packages that we expect to build to sbuild
and not any .deb that happens to be laying around here.
-rw-r--r--dht.cabal1
-rw-r--r--src/make-all.hs33
2 files changed, 26 insertions, 8 deletions
diff --git a/dht.cabal b/dht.cabal
index aafd76944..698b034a4 100644
--- a/dht.cabal
+++ b/dht.cabal
@@ -19,6 +19,7 @@ executable make-all
containers,
directory,
parsec,
+ text,
shake == 0.15.*,
extra >= 1.1,
debian == 3.87.*,
diff --git a/src/make-all.hs b/src/make-all.hs
index 27d5034bd..256d6c21d 100644
--- a/src/make-all.hs
+++ b/src/make-all.hs
@@ -2,6 +2,7 @@
import qualified Data.Map as M
import qualified Data.Set as S
import Control.Applicative hiding (many)
+import qualified Data.Text as T
import Data.List
import Data.List.Split
import Data.Maybe
@@ -148,14 +149,17 @@ changesFileName s v = s ++ "_" ++ v ++ "_amd64.changes"
logFileName s v = s ++ "_" ++ v ++ "_amd64.build"
sourceFileName s v = s ++ "_" ++ v ++ ".dsc"
-binaryPackagesOfSource :: String -> Action [String]
+binaryPackagesOfSource :: String -> Action [(String, String)]
binaryPackagesOfSource s = do
let controlFile = "p" </> s </> "debian" </> "control"
need [controlFile]
ret <- liftIO $ parseDebianControlFromFile controlFile
case ret of
Left e -> fail (show e)
- Right dc -> return $ map unBinPkgName $ debianBinaryPackageNames dc
+ Right dc -> forM (debianBinaryParagraphs dc) $ \bp -> do
+ p <- maybe (fail "No Package field") (return . T.unpack) $ fieldValue "Package" bp
+ a <- maybe (fail "No Arch field") (return . T.unpack) $ fieldValue "Architecture" bp
+ return (p, if a == "all" then a else "amd64")
dependsOfDsc :: FilePath -> IO [String]
dependsOfDsc f = do
@@ -249,8 +253,9 @@ shakeMain conf@(Conf {..}) = do
targetDir </> "cache/all-binaries.txt" %> \out -> do
sources <- readFileLines $ targetDir </> "cache/sources.txt"
- binaries <- concat <$> mapM readFileLines [targetDir </> "cache/binaries/" ++ s ++ ".txt" | s <- sources]
- writeFileChanged out (unlines binaries)
+ binaries <- concat <$> mapM readFileLines
+ [ targetDir </> "cache" </> "binaries" </> s <.> "txt" | s <- sources ]
+ writeFileChanged out $ unlines binaries
targetDir </> "cache/built-by.txt" %> \out -> do
sources <- readFileLines $ targetDir </> "cache/sources.txt"
@@ -280,7 +285,9 @@ shakeMain conf@(Conf {..}) = do
targetDir </> "cache/binaries/*.txt" %> \out -> do
let s = dropExtension $ takeFileName $ out
pkgs <- binaryPackagesOfSource s
- writeFileChanged out (unlines pkgs)
+ v <- versionOfSource s
+
+ writeFileChanged out $ unlines [ p ++ "_" ++ v ++ "_" ++ a ++ ".deb" | (p,a) <- pkgs]
"all" ~> do
changesFiles <- readFileLines $ targetDir </> "cache/all-changes-files.txt"
@@ -308,15 +315,18 @@ shakeMain conf@(Conf {..}) = do
let changes = changesFileName source version
ensureVersion source version
+
+ -- To build something, we need the source
let dsc = sourceFileName source version
need [targetDir </> dsc]
+
+ -- This ensures all dependencies are up-to-date
deps <- liftIO $ dependsOfDsc $ targetDir </> dsc
depSources <- catMaybes <$> mapM builtBy deps
depChanges <- forM depSources $ \s -> do
v <- versionOfSource s
return $ targetDir </> changesFileName s v
- -- This ensures all dependencies are up-to-date
-- For the sake of packages like alex, uuagc etc, we exclude ourselves
-- from this, thus allowing the use of the binary from the archive to
-- bootstrap.
@@ -324,22 +334,29 @@ shakeMain conf@(Conf {..}) = do
-- What files do we have built locally?
-- Make sure the build uses only them
+ expectedDeps <- S.fromList <$> readFileLines (targetDir </> "cache" </> "all-binaries.txt")
localDebs <-
- filter ((==".deb") . takeExtension) .
+ filter (`S.member` expectedDeps) .
map (makeRelative targetDir) <$>
liftIO (listFiles targetDir)
let localDepPkgs = map debFileNameToPackage localDebs
- -- Monkey patch dependencies out of the package lists
withTempDir $ \tmpdir -> do
+ -- Now monkey-patch dependencies out of the package lists
let fixup = tmpdir </> "fixup.sh"
liftIO $ writeFile fixup $ fixupScript localDepPkgs
+
+ -- Run sbuild
Exit c <- cmd (Cwd targetDir) (EchoStdout False)
["sbuild", "-c", schrootName,"-A","--no-apt-update","--dist", distribution, "--chroot-setup-commands=bash "++fixup, dsc] ["--extra-package="++d | d <- localDebs ]
unless (c == ExitSuccess) $ do
putNormal $ "Failed to build " ++ source ++ "_" ++ version
ex <- liftIO $ System.Directory.doesFileExist out
putNormal $ "See " ++ out ++ " for details."
+
+ -- Add the sources to the changes file. We do not simply pass
+ -- "-s" to sbuild, as it would make sbuild re-create and override the .dsc file
+ -- which confuses the build system.
unit $ cmd "changestool" (targetDir </> changes) "adddsc" (targetDir </> dsc)