hackport-0.9.0.0: cabal/cabal-testsuite/PackageTests/LinkerOptions/NonignoredConfigs/cabal.test.hs
import Test.Cabal.Prelude
-- This test ensures the following fix holds:
-- > Fix project-local build flags being ignored.
-- >
-- > I noticed that running ‘cabal install’ with two separate sets of dynamic /
-- > static build flags (e.g. one with none, and one with ‘--enable-shared
-- > --enable-executable-dynamic --disable-library-vanilla’) produced packages with
-- > the same hash, instead of different hashes.
-- >
-- > After debugging this issue I found that this command (with no explicit cabal
-- > project file) was resulting in these build configuration flags being ignored,
-- > because in ProjectPlanning.hs, the sdist was not considered a local package, so
-- > the (non-shared) local-package-only configuration was being dropped.
-- >
-- > This fix ensures that these command-line arguments properly make it through to
-- > where they belong in cases like this.
--
-- Basically, take a simple package, build it under two sets of build flags:
-- > (nothing)
-- > --enable-shared --enable-executable-dynamic --disable-library-vanilla
--
-- And ensure that whereas before they produced the same hash, now the package
-- hashes produced are different. (And also supplementarily ensure that
-- re-running the same build with the same flags a second time produces a
-- deterministic hash too; the hash should differ only when we change these
-- flags.)
--
-- Based on the UniqueIPID test.
import Control.Monad (forM, foldM_)
import Data.List (isPrefixOf, tails)
data Linking = Static | Dynamic deriving (Eq, Ord, Show)
links :: [Linking]
links = [Static, Dynamic]
linkConfigFlags :: Linking -> [String]
linkConfigFlags Static =
[
]
linkConfigFlags Dynamic =
[
"--enable-shared",
"--enable-executable-dynamic",
"--disable-library-vanilla"
]
lrun :: [Linking]
lrun = [Static, Dynamic, Static, Dynamic]
main = cabalTest $ do
-- Skip if on Windows, since my default Chocolatey Windows setup (and the CI
-- server setup at the time, presumably) lacks support for dynamic builds
-- since the base package appears to be static only, lacking e.g. ‘.dyn_o’
-- files. Normal Windows installations would need support for dynamic
-- builds, or else this test would fail when it tries to build with the
-- dynamic flags.
skipIfWindows
withPackageDb $ do
-- Phase 1: get 4 hashes according to config flags.
results <- forM (zip [0..] lrun) $ \(idx, linking) -> do
withDirectory "basic" $ do
withSourceCopyDir ("basic" ++ show idx) $ do
-- (Now do ‘cd ..’, since withSourceCopyDir made our previous
-- previous such withDirectories now accumulate to be
-- relative to setup.dist/basic0, not testSourceDir
-- (see 'testCurrentDir').)
withDirectory ".." $ do
packageEnv <- (</> ("basic" ++ show idx ++ ".env")) . testWorkDir <$> getTestEnv
cabal "v2-install" $ ["--disable-deterministic", "--lib", "--package-env=" ++ packageEnv] ++ linkConfigFlags linking ++ ["basic"]
let exIPID s = takeWhile (/= '\n') . head . filter (\t -> any (`isPrefixOf` t) ["basic-0.1-", "bsc-0.1-"]) $ tails s
hashedIpid <- exIPID <$> liftIO (readFile packageEnv)
return $ ((idx, linking), hashedIpid)
-- Phase 2: make sure we have different hashes iff we have different config flags.
-- In particular make sure the dynamic config flags weren't silently
-- dropped and ignored, since this is the bug that prompted this test.
(\step -> foldM_ step (const $ return ()) results) $ \acc x -> do
acc x
return $ \future -> acc future >> do
let
((thisIdx, thisLinking), thisHashedIpid) = x
((futureIdx, futureLinking), futureHashedIpid) = future
when ((thisHashedIpid == futureHashedIpid) /= (thisLinking == futureLinking)) $ do
assertFailure . unlines $
if thisLinking /= futureLinking
then
-- What we are primarily concerned with testing
-- here.
[
"Error: static and dynamic config flags produced an IPID with the same hash; were the dynamic flags silently dropped?",
"\thashed IPID: " ++ thisHashedIpid
]
else
-- Help test our test can also make equal
-- hashes.
[
"Error: config flags were equal, yet a different IPID hash was produced.",
"\thashed IPID 1 : " ++ thisHashedIpid,
"\thashed IPID 2 : " ++ futureHashedIpid,
"\tlinking flags : " ++ show thisLinking
]