Skip to content

Commit ea2ac23

Browse files
committed
GHC 9.2.x: Linking error when using -pgmc (PIE/relocation failure)
1 parent 71b3c85 commit ea2ac23

16 files changed

Lines changed: 594 additions & 58 deletions

File tree

Cabal/src/Distribution/Simple/GHC/Internal.hs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,10 @@ import Distribution.Types.GivenComponent
8181
import Distribution.Types.LocalBuildInfo
8282
import Distribution.Types.TargetInfo
8383
import Distribution.Types.UnitId
84+
import Distribution.Types.Version
8485
import Distribution.Utils.NubList (NubListR, toNubListR)
8586
import Distribution.Utils.Path
8687
import Distribution.Verbosity
87-
import Distribution.Version (Version)
8888
import Language.Haskell.Extension
8989
import System.Directory (listDirectory)
9090
import System.Environment (getEnv)
@@ -514,6 +514,22 @@ componentJsGhcOptions verbosity lbi bi clbi odir filename =
514514
, ghcOptExtra = hcOptions GHC bi
515515
}
516516

517+
defaultGhcOptCcProgram :: LocalBuildInfo -> Flag FilePath
518+
defaultGhcOptCcProgram lbi =
519+
maybeToFlag $ programPath <$> lookupProgram gccProgram (withPrograms lbi)
520+
521+
-- Since the GHС is sensitive to what is given to it, we sometimes need to
522+
-- be able to pass options only to new versions
523+
-- We want to be able to support C++ and C separately in older ghc
524+
-- See example in buildExtraSources "C++ Sources" or "C Sources"
525+
separateGhcOptions :: Monoid a => Version -> Compiler -> a -> a
526+
separateGhcOptions ver comp defaultOptions =
527+
case compilerCompatVersion GHC comp of
528+
Just v
529+
| v >= ver -> defaultOptions
530+
| otherwise -> mempty
531+
Nothing -> mempty
532+
517533
componentGhcOptions
518534
:: VerbosityLevel
519535
-> LocalBuildInfo
@@ -587,6 +603,11 @@ componentGhcOptions verbosity lbi bi clbi odir =
587603
, -- Unsupported extensions have already been checked by configure
588604
ghcOptExtensions = toNubListR $ usedExtensions bi
589605
, ghcOptExtensionMap = Map.fromList . compilerExtensions $ (compiler lbi)
606+
, ghcOptCcProgram =
607+
separateGhcOptions
608+
(mkVersion [9, 4])
609+
(compiler lbi)
610+
(defaultGhcOptCcProgram lbi)
590611
}
591612
where
592613
exe_paths =
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{-# LANGUAGE ForeignFunctionInterface #-}
2+
3+
module Main where
4+
5+
import Foreign.C (CInt (..))
6+
7+
foreign import ccall "pgmclib.h meaning_of_life_pgmc"
8+
meaning_of_life_pgmc :: IO CInt
9+
10+
main :: IO ()
11+
main = do
12+
secret <- meaning_of_life_pgmc
13+
-- The value 66 comes from __TESTOPT_PGMC__ - see cc-wrapper.sh.
14+
if (secret == 66)
15+
then putStrLn ("The secret is " ++ show secret)
16+
else error ("Expected value 66, got " ++ show secret)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# cabal v2-build
2+
Resolving dependencies...
3+
Build profile: -w ghc-<GHCVER> -O1
4+
In order, the following will be built:
5+
- foreign-opts-pgmc-0.1 (exe:foreign-opts-pgmc-exe) (first run)
6+
Configuring executable 'foreign-opts-pgmc-exe' for foreign-opts-pgmc-0.1...
7+
Preprocessing executable 'foreign-opts-pgmc-exe' for foreign-opts-pgmc-0.1...
8+
Building executable 'foreign-opts-pgmc-exe' for foreign-opts-pgmc-0.1...
9+
# foreign-opts-pgmc foreign-opts-pgmc-exe
10+
The secret is 66
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
packages: .
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import Test.Cabal.Prelude
2+
3+
main = do
4+
skipUnlessGhcVersion ">= 9.4"
5+
skipIfWindows "requires a POSIX shell script as the C compiler wrapper"
6+
cabalTest $ do
7+
cwd <- fmap testCurrentDir getTestEnv
8+
let wrapper = cwd </> "scripts/cc-wrapper.sh"
9+
cabal "v2-build" ["foreign-opts-pgmc-exe"]
10+
withPlan $ runPlanExe "foreign-opts-pgmc" "foreign-opts-pgmc-exe" []
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/bin/sh
2+
# Wrapper around cc that adds -D__TESTOPT_PGMC__=66 to every compilation.
3+
# Used by the ForeignOptsPgmc test to verify that -pgmc selects this wrapper.
4+
exec cc -D__TESTOPT_PGMC__=66 "$@"
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# cabal v2-update
2+
Downloading the latest package list from test-local-repo
3+
# cabal build
4+
Resolving dependencies...
5+
Build profile: -w ghc-<GHCVER> -O1
6+
In order, the following will be built:
7+
- Complex-0.1.0.0 (lib) (first run)
8+
- Complex-0.1.0.0 (exe:Complex) (first run)
9+
Configuring library for Complex-0.1.0.0...
10+
Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a directory which does not exist.
11+
Preprocessing library for Complex-0.1.0.0...
12+
Building library for Complex-0.1.0.0...
13+
Configuring executable 'Complex' for Complex-0.1.0.0...
14+
Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a directory which does not exist.
15+
Preprocessing executable 'Complex' for Complex-0.1.0.0...
16+
Building executable 'Complex' for Complex-0.1.0.0...
17+
# show-build-info Complex exe:Complex
18+
{"cabal-lib-version":"<CABALVER>","compiler":{"flavour":"ghc","compiler-id":"ghc-<GHCVER>","path":"<GHCPATH>"},"components":[{"type":"exe","name":"exe:Complex","unit-id":"Complex-0.1.0.0-inplace-Complex","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/x/Complex/build","-odir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/x/Complex/build","-hidir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/x/Complex/build","-hiedir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/x/Complex/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/x/Complex/build","-i","-iapp","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/x/Complex/build","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/x/Complex/build","-optP-include","-optPsingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/x/Complex/build/Complex/autogen/cabal_macros.h","-optc-O2","-optcxx-O2","-opta-O2","-this-unit-id","Complex-0.1.0.0-inplace-Complex","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","<ROOT>/single-2.dist/home/.cabal/store/ghc-<GHCVER>/package.db","-package-db","<ROOT>/single-2.dist/work/dist/packagedb/ghc-<GHCVER>","-package-id","<PACKAGEDEP>","-package-id","<PACKAGEDEP>","-XHaskell2010","-threaded","-rtsopts","-with-rtsopts=-N -T","-Wredundant-constraints"],"modules":["Other","Paths_Complex"],"src-files":["Main.lhs"],"hs-src-dirs":["app"],"src-dir":"<ROOT>/","cabal-file":"Complex.cabal"}]}
19+
# cabal build
20+
Up to date
21+
# show-build-info Complex lib
22+
{"cabal-lib-version":"<CABALVER>","compiler":{"flavour":"ghc","compiler-id":"ghc-<GHCVER>","path":"<GHCPATH>"},"components":[{"type":"lib","name":"lib","unit-id":"Complex-0.1.0.0-inplace","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/build","-odir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/build","-hidir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/build","-hiedir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/build","-i","-isrc","-idoesnt-exist","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/build","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/build/autogen","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/build/global-autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/build/autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/build/global-autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/build","-optP-include","-optPsingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/build/autogen/cabal_macros.h","-optc-O2","-optcxx-O2","-opta-O2","-this-unit-id","Complex-0.1.0.0-inplace","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","<ROOT>/single-2.dist/home/.cabal/store/ghc-<GHCVER>/package.db","-package-db","<ROOT>/single-2.dist/work/dist/packagedb/ghc-<GHCVER>","-package-id","<PACKAGEDEP>","-XHaskell2010","-Wall"],"modules":["A","B","C","D","Paths_Complex"],"src-files":[],"hs-src-dirs":["src","doesnt-exist"],"src-dir":"<ROOT>/","cabal-file":"Complex.cabal"}]}
23+
# cabal build
24+
Build profile: -w ghc-<GHCVER> -O1
25+
In order, the following will be built:
26+
- criterion-1.1.4.0 (lib) (requires build)
27+
- Complex-0.1.0.0 (bench:complex-benchmarks) (first run)
28+
Configuring library for criterion-1.1.4.0...
29+
Preprocessing library for criterion-1.1.4.0...
30+
Building library for criterion-1.1.4.0...
31+
Installing library in <PATH>
32+
Configuring benchmark 'complex-benchmarks' for Complex-0.1.0.0...
33+
Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a directory which does not exist.
34+
Preprocessing benchmark 'complex-benchmarks' for Complex-0.1.0.0...
35+
Building benchmark 'complex-benchmarks' for Complex-0.1.0.0...
36+
# show-build-info Complex bench:complex-benchmarks
37+
{"cabal-lib-version":"<CABALVER>","compiler":{"flavour":"ghc","compiler-id":"ghc-<GHCVER>","path":"<GHCPATH>"},"components":[{"type":"bench","name":"bench:complex-benchmarks","unit-id":"Complex-0.1.0.0-inplace-complex-benchmarks","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/b/complex-benchmarks/build","-odir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/b/complex-benchmarks/build","-hidir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/b/complex-benchmarks/build","-hiedir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/b/complex-benchmarks/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/b/complex-benchmarks/build","-i","-ibenchmark","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/b/complex-benchmarks/build","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/b/complex-benchmarks/build","-optP-include","-optPsingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen/cabal_macros.h","-optc-O2","-optcxx-O2","-opta-O2","-this-unit-id","Complex-0.1.0.0-inplace-complex-benchmarks","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","<ROOT>/single-2.dist/home/.cabal/store/ghc-<GHCVER>/package.db","-package-db","<ROOT>/single-2.dist/work/dist/packagedb/ghc-<GHCVER>","-package-id","<PACKAGEDEP>","-package-id","<PACKAGEDEP>","-package-id","<PACKAGEDEP>","-XHaskell2010","-Wall","-rtsopts","-threaded","-with-rtsopts=-N"],"modules":["Paths_Complex"],"src-files":["Main.hs"],"hs-src-dirs":["benchmark"],"src-dir":"<ROOT>/","cabal-file":"Complex.cabal"}]}
38+
# cabal build
39+
Build profile: -w ghc-<GHCVER> -O1
40+
In order, the following will be built:
41+
- test-framework-0.8.1.1 (lib) (requires build)
42+
- Complex-0.1.0.0 (test:func-test) (first run)
43+
Configuring library for test-framework-0.8.1.1...
44+
Preprocessing library for test-framework-0.8.1.1...
45+
Building library for test-framework-0.8.1.1...
46+
Installing library in <PATH>
47+
Configuring test suite 'func-test' for Complex-0.1.0.0...
48+
Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a directory which does not exist.
49+
Preprocessing test suite 'func-test' for Complex-0.1.0.0...
50+
Building test suite 'func-test' for Complex-0.1.0.0...
51+
# show-build-info Complex test:func-test
52+
{"cabal-lib-version":"<CABALVER>","compiler":{"flavour":"ghc","compiler-id":"ghc-<GHCVER>","path":"<GHCPATH>"},"components":[{"type":"test","name":"test:func-test","unit-id":"Complex-0.1.0.0-inplace-func-test","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/func-test/build","-odir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/func-test/build","-hidir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/func-test/build","-hiedir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/func-test/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/func-test/build","-i","-itest","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/func-test/build","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/func-test/build","-optP-include","-optPsingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/func-test/build/func-test/autogen/cabal_macros.h","-optc-O2","-optcxx-O2","-opta-O2","-this-unit-id","Complex-0.1.0.0-inplace-func-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","<ROOT>/single-2.dist/home/.cabal/store/ghc-<GHCVER>/package.db","-package-db","<ROOT>/single-2.dist/work/dist/packagedb/ghc-<GHCVER>","-package-id","<PACKAGEDEP>","-package-id","<PACKAGEDEP>","-package-id","<PACKAGEDEP>","-XHaskell2010"],"modules":[],"src-files":["FuncMain.hs"],"hs-src-dirs":["test"],"src-dir":"<ROOT>/","cabal-file":"Complex.cabal"}]}
53+
# cabal build
54+
Build profile: -w ghc-<GHCVER> -O1
55+
In order, the following will be built:
56+
- another-framework-0.8.1.1 (lib) (requires build)
57+
- Complex-0.1.0.0 (test:unit-test) (first run)
58+
Configuring library for another-framework-0.8.1.1...
59+
Preprocessing library for another-framework-0.8.1.1...
60+
Building library for another-framework-0.8.1.1...
61+
Installing library in <PATH>
62+
Configuring test suite 'unit-test' for Complex-0.1.0.0...
63+
Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a directory which does not exist.
64+
Preprocessing test suite 'unit-test' for Complex-0.1.0.0...
65+
Building test suite 'unit-test' for Complex-0.1.0.0...
66+
# show-build-info Complex test:unit-test
67+
{"cabal-lib-version":"<CABALVER>","compiler":{"flavour":"ghc","compiler-id":"ghc-<GHCVER>","path":"<GHCPATH>"},"components":[{"type":"test","name":"test:unit-test","unit-id":"Complex-0.1.0.0-inplace-unit-test","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/unit-test/build","-odir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/unit-test/build","-hidir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/unit-test/build","-hiedir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/unit-test/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/unit-test/build","-i","-itest","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/unit-test/build","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/unit-test/build","-optP-include","-optPsingle-2.dist/work/./dist/build/<ARCH>/ghc-<GHCVER>/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen/cabal_macros.h","-optc-O2","-optcxx-O2","-opta-O2","-this-unit-id","Complex-0.1.0.0-inplace-unit-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","<ROOT>/single-2.dist/home/.cabal/store/ghc-<GHCVER>/package.db","-package-db","<ROOT>/single-2.dist/work/dist/packagedb/ghc-<GHCVER>","-package-id","<PACKAGEDEP>","-package-id","<PACKAGEDEP>","-XHaskell2010"],"modules":[],"src-files":["UnitMain.hs"],"hs-src-dirs":["test"],"src-dir":"<ROOT>/","cabal-file":"Complex.cabal"}]}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
{-# LANGUAGE OverloadedStrings #-}
2+
3+
import Test.Cabal.DecodeShowBuildInfo
4+
import Test.Cabal.Prelude
5+
6+
main = do
7+
cabalTest $ do
8+
-- the With GHC-9.2+ output contains -this-unit-id
9+
skipUnlessGhcVersion "^>= 9.2"
10+
withRepo "repo" $ do
11+
runShowBuildInfo ["exe:Complex"]
12+
>> withPlan
13+
( do
14+
recordBuildInfo "Complex" (exe "Complex")
15+
assertComponent
16+
"Complex"
17+
(exe "Complex")
18+
defCompAssertion
19+
{ modules = ["Other", "Paths_Complex"]
20+
, sourceFiles = ["Main.lhs"]
21+
, sourceDirs = ["app"]
22+
}
23+
)
24+
25+
runShowBuildInfo ["lib:Complex"]
26+
>> withPlan
27+
( do
28+
recordBuildInfo "Complex" mainLib
29+
assertComponent
30+
"Complex"
31+
mainLib
32+
defCompAssertion
33+
{ modules = ["A", "B", "C", "D", "Paths_Complex"]
34+
, sourceDirs = ["src", "doesnt-exist"]
35+
}
36+
)
37+
38+
runShowBuildInfo ["benchmark:complex-benchmarks"]
39+
>> withPlan
40+
( do
41+
recordBuildInfo "Complex" (bench "complex-benchmarks")
42+
assertComponent
43+
"Complex"
44+
(bench "complex-benchmarks")
45+
defCompAssertion
46+
{ modules = ["Paths_Complex"]
47+
, sourceFiles = ["Main.hs"]
48+
, sourceDirs = ["benchmark"]
49+
}
50+
)
51+
52+
runShowBuildInfo ["test:func-test"]
53+
>> withPlan
54+
( do
55+
recordBuildInfo "Complex" (test "func-test")
56+
assertComponent
57+
"Complex"
58+
(test "func-test")
59+
defCompAssertion
60+
{ sourceFiles = ["FuncMain.hs"]
61+
, sourceDirs = ["test"]
62+
}
63+
)
64+
65+
runShowBuildInfo ["test:unit-test"]
66+
>> withPlan
67+
( do
68+
recordBuildInfo "Complex" (test "unit-test")
69+
assertComponent
70+
"Complex"
71+
(test "unit-test")
72+
defCompAssertion
73+
{ sourceFiles = ["UnitMain.hs"]
74+
, sourceDirs = ["test"]
75+
}
76+
)

0 commit comments

Comments
 (0)