From b7d97c3977705df7c5f8dfbbbdc841149e42fcba Mon Sep 17 00:00:00 2001 From: Ilia Baryshnikov Date: Sat, 9 May 2026 13:17:22 +0300 Subject: [PATCH 1/2] tests for asm-options, ld-options, cpp-options --- .hlint.yaml | 7 ++++--- .../{ => Cmm}/CmmSources/cabal.out | 0 .../{ => Cmm}/CmmSources/cabal.project | 0 .../{ => Cmm}/CmmSources/cabal.test.hs | 0 .../{ => Cmm}/CmmSources/cbits/HeapPrim.cmm | 0 .../{ => Cmm}/CmmSources/cmmexperiment.cabal | 0 .../{ => Cmm}/CmmSources/demo/Main.hs | 0 .../{ => Cmm}/CmmSources/setup.out | 0 .../{ => Cmm}/CmmSources/setup.test.hs | 0 .../{ => Cmm}/CmmSources/src/Demo.hs | 0 .../{ => Cmm}/CmmSourcesDyn/cabal.out | 0 .../{ => Cmm}/CmmSourcesDyn/cabal.project | 0 .../{ => Cmm}/CmmSourcesDyn/cabal.test.hs | 0 .../{ => Cmm}/CmmSourcesDyn/cbits/HeapPrim.cmm | 0 .../CmmSourcesDyn/cmmexperiment.cabal | 0 .../{ => Cmm}/CmmSourcesDyn/demo/Main.hs | 0 .../{ => Cmm}/CmmSourcesDyn/setup.out | 0 .../{ => Cmm}/CmmSourcesDyn/setup.test.hs | 0 .../{ => Cmm}/CmmSourcesDyn/src/Demo.hs | 0 .../{ => Cmm}/CmmSourcesExe/cabal.out | 0 .../{ => Cmm}/CmmSourcesExe/cabal.project | 0 .../{ => Cmm}/CmmSourcesExe/cabal.test.hs | 0 .../{ => Cmm}/CmmSourcesExe/cbits/HeapPrim.cmm | 0 .../CmmSourcesExe/cmmexperiment.cabal | 0 .../{ => Cmm}/CmmSourcesExe/demo/Main.hs | 0 .../{ => Cmm}/CmmSourcesExe/setup.out | 0 .../{ => Cmm}/CmmSourcesExe/setup.test.hs | 0 .../{ => Cmm}/CmmSourcesExe/src/Demo.hs | 0 .../PackageTests/CppOptions/CppOpts/Main.hs | 15 +++++++++++++++ .../PackageTests/CppOptions/CppOpts/cabal.out | 0 .../CppOptions/CppOpts/cabal.project | 1 + .../CppOptions/CppOpts/cabal.test.hs | 5 +++++ .../CppOptions/CppOpts/cpp-opts.cabal | 10 ++++++++++ .../PackageTests/FFI/ForeignOptsAsm/Main.hs | 16 ++++++++++++++++ .../FFI/ForeignOptsAsm/abits/asmlib.h | 6 ++++++ .../abits/asmlib_aarch64_darwin.S | 11 +++++++++++ .../ForeignOptsAsm/abits/asmlib_x86_64_linux.S | 7 +++++++ .../abits/asmlib_x86_64_windows.S | 6 ++++++ .../PackageTests/FFI/ForeignOptsAsm/cabal.out | 0 .../FFI/ForeignOptsAsm/cabal.project | 1 + .../FFI/ForeignOptsAsm/cabal.test.hs | 12 ++++++++++++ .../FFI/ForeignOptsAsm/foreign-opts-asm.cabal | 17 +++++++++++++++++ .../PackageTests/FFI/ForeignOptsCxx/Main.hs | 2 +- .../PackageTests/FFI/ForeignOptsLd/Main.hs | 18 ++++++++++++++++++ .../PackageTests/FFI/ForeignOptsLd/cabal.out | 0 .../FFI/ForeignOptsLd/cabal.project | 1 + .../FFI/ForeignOptsLd/cabal.test.hs | 8 ++++++++ .../FFI/ForeignOptsLd/cbits/ldlib.c | 14 ++++++++++++++ .../FFI/ForeignOptsLd/cbits/ldlib.h | 10 ++++++++++ .../FFI/ForeignOptsLd/foreign-opts-ld.cabal | 15 +++++++++++++++ 50 files changed, 178 insertions(+), 4 deletions(-) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSources/cabal.out (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSources/cabal.project (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSources/cabal.test.hs (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSources/cbits/HeapPrim.cmm (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSources/cmmexperiment.cabal (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSources/demo/Main.hs (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSources/setup.out (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSources/setup.test.hs (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSources/src/Demo.hs (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesDyn/cabal.out (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesDyn/cabal.project (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesDyn/cabal.test.hs (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesDyn/cbits/HeapPrim.cmm (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesDyn/cmmexperiment.cabal (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesDyn/demo/Main.hs (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesDyn/setup.out (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesDyn/setup.test.hs (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesDyn/src/Demo.hs (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesExe/cabal.out (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesExe/cabal.project (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesExe/cabal.test.hs (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesExe/cbits/HeapPrim.cmm (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesExe/cmmexperiment.cabal (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesExe/demo/Main.hs (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesExe/setup.out (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesExe/setup.test.hs (100%) rename cabal-testsuite/PackageTests/{ => Cmm}/CmmSourcesExe/src/Demo.hs (100%) create mode 100644 cabal-testsuite/PackageTests/CppOptions/CppOpts/Main.hs create mode 100644 cabal-testsuite/PackageTests/CppOptions/CppOpts/cabal.out create mode 100644 cabal-testsuite/PackageTests/CppOptions/CppOpts/cabal.project create mode 100644 cabal-testsuite/PackageTests/CppOptions/CppOpts/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/CppOptions/CppOpts/cpp-opts.cabal create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/Main.hs create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib.h create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib_aarch64_darwin.S create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib_x86_64_linux.S create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib_x86_64_windows.S create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/cabal.out create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/cabal.project create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/foreign-opts-asm.cabal create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsLd/Main.hs create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cabal.out create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cabal.project create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cbits/ldlib.c create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cbits/ldlib.h create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsLd/foreign-opts-ld.cabal diff --git a/.hlint.yaml b/.hlint.yaml index e5672ae408a..752f69a8a1c 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -52,10 +52,11 @@ - --ignore-glob=Cabal-tests/tests/custom-setup/CabalDoctestSetup.hs - --ignore-glob=Cabal-tests/tests/custom-setup/IdrisSetup.hs - --ignore-glob=cabal-testsuite/PackageTests/BuildWays/q/app/Main.hs + - --ignore-glob=cabal-testsuite/PackageTests/CppOptions/CppOpts/Main.hs - --ignore-glob=cabal-testsuite/PackageTests/CMain/10168/src/Lib.hs - - --ignore-glob=cabal-testsuite/PackageTests/CmmSources/src/Demo.hs - - --ignore-glob=cabal-testsuite/PackageTests/CmmSourcesDyn/src/Demo.hs - - --ignore-glob=cabal-testsuite/PackageTests/CmmSourcesExe/src/Demo.hs + - --ignore-glob=cabal-testsuite/PackageTests/Cmm/CmmSources/src/Demo.hs + - --ignore-glob=cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/src/Demo.hs + - --ignore-glob=cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/src/Demo.hs - --ignore-glob=cabal-testsuite/PackageTests/NewBuild/CmdRun/Script/script.hs - --ignore-glob=cabal-testsuite/PackageTests/NewBuild/CmdRun/ScriptLiterate/script.lhs - --ignore-glob=cabal-testsuite/PackageTests/Regression/T5309/lib/Bio/Character/Exportable/Class.hs diff --git a/cabal-testsuite/PackageTests/CmmSources/cabal.out b/cabal-testsuite/PackageTests/Cmm/CmmSources/cabal.out similarity index 100% rename from cabal-testsuite/PackageTests/CmmSources/cabal.out rename to cabal-testsuite/PackageTests/Cmm/CmmSources/cabal.out diff --git a/cabal-testsuite/PackageTests/CmmSources/cabal.project b/cabal-testsuite/PackageTests/Cmm/CmmSources/cabal.project similarity index 100% rename from cabal-testsuite/PackageTests/CmmSources/cabal.project rename to cabal-testsuite/PackageTests/Cmm/CmmSources/cabal.project diff --git a/cabal-testsuite/PackageTests/CmmSources/cabal.test.hs b/cabal-testsuite/PackageTests/Cmm/CmmSources/cabal.test.hs similarity index 100% rename from cabal-testsuite/PackageTests/CmmSources/cabal.test.hs rename to cabal-testsuite/PackageTests/Cmm/CmmSources/cabal.test.hs diff --git a/cabal-testsuite/PackageTests/CmmSources/cbits/HeapPrim.cmm b/cabal-testsuite/PackageTests/Cmm/CmmSources/cbits/HeapPrim.cmm similarity index 100% rename from cabal-testsuite/PackageTests/CmmSources/cbits/HeapPrim.cmm rename to cabal-testsuite/PackageTests/Cmm/CmmSources/cbits/HeapPrim.cmm diff --git a/cabal-testsuite/PackageTests/CmmSources/cmmexperiment.cabal b/cabal-testsuite/PackageTests/Cmm/CmmSources/cmmexperiment.cabal similarity index 100% rename from cabal-testsuite/PackageTests/CmmSources/cmmexperiment.cabal rename to cabal-testsuite/PackageTests/Cmm/CmmSources/cmmexperiment.cabal diff --git a/cabal-testsuite/PackageTests/CmmSources/demo/Main.hs b/cabal-testsuite/PackageTests/Cmm/CmmSources/demo/Main.hs similarity index 100% rename from cabal-testsuite/PackageTests/CmmSources/demo/Main.hs rename to cabal-testsuite/PackageTests/Cmm/CmmSources/demo/Main.hs diff --git a/cabal-testsuite/PackageTests/CmmSources/setup.out b/cabal-testsuite/PackageTests/Cmm/CmmSources/setup.out similarity index 100% rename from cabal-testsuite/PackageTests/CmmSources/setup.out rename to cabal-testsuite/PackageTests/Cmm/CmmSources/setup.out diff --git a/cabal-testsuite/PackageTests/CmmSources/setup.test.hs b/cabal-testsuite/PackageTests/Cmm/CmmSources/setup.test.hs similarity index 100% rename from cabal-testsuite/PackageTests/CmmSources/setup.test.hs rename to cabal-testsuite/PackageTests/Cmm/CmmSources/setup.test.hs diff --git a/cabal-testsuite/PackageTests/CmmSources/src/Demo.hs b/cabal-testsuite/PackageTests/Cmm/CmmSources/src/Demo.hs similarity index 100% rename from cabal-testsuite/PackageTests/CmmSources/src/Demo.hs rename to cabal-testsuite/PackageTests/Cmm/CmmSources/src/Demo.hs diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.out b/cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/cabal.out similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.out rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/cabal.out diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.project b/cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/cabal.project similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.project rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/cabal.project diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.test.hs b/cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/cabal.test.hs similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.test.hs rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/cabal.test.hs diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/cbits/HeapPrim.cmm b/cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/cbits/HeapPrim.cmm similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesDyn/cbits/HeapPrim.cmm rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/cbits/HeapPrim.cmm diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/cmmexperiment.cabal b/cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/cmmexperiment.cabal similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesDyn/cmmexperiment.cabal rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/cmmexperiment.cabal diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/demo/Main.hs b/cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/demo/Main.hs similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesDyn/demo/Main.hs rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/demo/Main.hs diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/setup.out b/cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/setup.out similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesDyn/setup.out rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/setup.out diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/setup.test.hs b/cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/setup.test.hs similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesDyn/setup.test.hs rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/setup.test.hs diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/src/Demo.hs b/cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/src/Demo.hs similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesDyn/src/Demo.hs rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesDyn/src/Demo.hs diff --git a/cabal-testsuite/PackageTests/CmmSourcesExe/cabal.out b/cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/cabal.out similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesExe/cabal.out rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/cabal.out diff --git a/cabal-testsuite/PackageTests/CmmSourcesExe/cabal.project b/cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/cabal.project similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesExe/cabal.project rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/cabal.project diff --git a/cabal-testsuite/PackageTests/CmmSourcesExe/cabal.test.hs b/cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/cabal.test.hs similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesExe/cabal.test.hs rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/cabal.test.hs diff --git a/cabal-testsuite/PackageTests/CmmSourcesExe/cbits/HeapPrim.cmm b/cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/cbits/HeapPrim.cmm similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesExe/cbits/HeapPrim.cmm rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/cbits/HeapPrim.cmm diff --git a/cabal-testsuite/PackageTests/CmmSourcesExe/cmmexperiment.cabal b/cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/cmmexperiment.cabal similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesExe/cmmexperiment.cabal rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/cmmexperiment.cabal diff --git a/cabal-testsuite/PackageTests/CmmSourcesExe/demo/Main.hs b/cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/demo/Main.hs similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesExe/demo/Main.hs rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/demo/Main.hs diff --git a/cabal-testsuite/PackageTests/CmmSourcesExe/setup.out b/cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/setup.out similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesExe/setup.out rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/setup.out diff --git a/cabal-testsuite/PackageTests/CmmSourcesExe/setup.test.hs b/cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/setup.test.hs similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesExe/setup.test.hs rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/setup.test.hs diff --git a/cabal-testsuite/PackageTests/CmmSourcesExe/src/Demo.hs b/cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/src/Demo.hs similarity index 100% rename from cabal-testsuite/PackageTests/CmmSourcesExe/src/Demo.hs rename to cabal-testsuite/PackageTests/Cmm/CmmSourcesExe/src/Demo.hs diff --git a/cabal-testsuite/PackageTests/CppOptions/CppOpts/Main.hs b/cabal-testsuite/PackageTests/CppOptions/CppOpts/Main.hs new file mode 100644 index 00000000000..cdd4f68347a --- /dev/null +++ b/cabal-testsuite/PackageTests/CppOptions/CppOpts/Main.hs @@ -0,0 +1,15 @@ +{-# LANGUAGE CPP #-} + +module Main where + +#ifndef __TESTOPT_CPP__ +#error "Did not get required __TESTOPT_CPP__ from cpp-options" +#endif + +main :: IO () +main = do + -- The value 44 comes from __TESTOPT_CPP__ - see the cabal file. + let secret = __TESTOPT_CPP__ :: Int + if secret == 44 + then putStrLn ("The secret is " ++ show secret) + else error ("Expected value 44, got " ++ show secret) diff --git a/cabal-testsuite/PackageTests/CppOptions/CppOpts/cabal.out b/cabal-testsuite/PackageTests/CppOptions/CppOpts/cabal.out new file mode 100644 index 00000000000..e69de29bb2d diff --git a/cabal-testsuite/PackageTests/CppOptions/CppOpts/cabal.project b/cabal-testsuite/PackageTests/CppOptions/CppOpts/cabal.project new file mode 100644 index 00000000000..e6fdbadb439 --- /dev/null +++ b/cabal-testsuite/PackageTests/CppOptions/CppOpts/cabal.project @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/CppOptions/CppOpts/cabal.test.hs b/cabal-testsuite/PackageTests/CppOptions/CppOpts/cabal.test.hs new file mode 100644 index 00000000000..185491f22c9 --- /dev/null +++ b/cabal-testsuite/PackageTests/CppOptions/CppOpts/cabal.test.hs @@ -0,0 +1,5 @@ +import Test.Cabal.Prelude + +main = cabalTest $ recordMode DoNotRecord $ do + cabal "v2-build" ["cpp-opts-exe"] + withPlan $ runPlanExe "cpp-opts" "cpp-opts-exe" [] diff --git a/cabal-testsuite/PackageTests/CppOptions/CppOpts/cpp-opts.cabal b/cabal-testsuite/PackageTests/CppOptions/CppOpts/cpp-opts.cabal new file mode 100644 index 00000000000..9913b86d720 --- /dev/null +++ b/cabal-testsuite/PackageTests/CppOptions/CppOpts/cpp-opts.cabal @@ -0,0 +1,10 @@ +cabal-version: 2.2 +name: cpp-opts +version: 0.1 +build-type: Simple + +executable cpp-opts-exe + main-is: Main.hs + build-depends: base + default-language: Haskell2010 + cpp-options: -D__TESTOPT_CPP__=44 diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/Main.hs b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/Main.hs new file mode 100644 index 00000000000..ec92f1779fa --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/Main.hs @@ -0,0 +1,16 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +module Main where + +import Foreign.C (CInt (..)) + +foreign import ccall "asmlib.h meaning_of_life_asm" + meaning_of_life_asm :: IO CInt + +main :: IO () +main = do + secret <- meaning_of_life_asm + -- The value 33 comes from meaning_of_life_val - see asm-options in the cabal file. + if (secret == 33) + then putStrLn ("The secret is " ++ show secret) + else error ("Expected value 33, got " ++ show secret) diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib.h b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib.h new file mode 100644 index 00000000000..0b373105531 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib.h @@ -0,0 +1,6 @@ +#ifndef ASMLIB_H +#define ASMLIB_H + +int meaning_of_life_asm(); + +#endif diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib_aarch64_darwin.S b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib_aarch64_darwin.S new file mode 100644 index 00000000000..3a13064e4cc --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib_aarch64_darwin.S @@ -0,0 +1,11 @@ + # macOS/AArch64 (Mach-O) + .macro func name + .globl _\name +_\name: + .endm + + .text + func meaning_of_life_asm + + mov w0, #MEANING_OF_LIFE_VAL + ret \ No newline at end of file diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib_x86_64_linux.S b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib_x86_64_linux.S new file mode 100644 index 00000000000..2c1dfb2f758 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib_x86_64_linux.S @@ -0,0 +1,7 @@ + .text + .globl meaning_of_life_asm + .type meaning_of_life_asm, @function +meaning_of_life_asm: + movl $MEANING_OF_LIFE_VAL, %eax + ret + .size meaning_of_life_asm, .-meaning_of_life_asm \ No newline at end of file diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib_x86_64_windows.S b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib_x86_64_windows.S new file mode 100644 index 00000000000..0669d7acfd7 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/abits/asmlib_x86_64_windows.S @@ -0,0 +1,6 @@ + .text + .globl meaning_of_life_asm + +meaning_of_life_asm: + movl $MEANING_OF_LIFE_VAL, %eax + ret \ No newline at end of file diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/cabal.out b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/cabal.out new file mode 100644 index 00000000000..e69de29bb2d diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/cabal.project b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/cabal.project new file mode 100644 index 00000000000..e6fdbadb439 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/cabal.project @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/cabal.test.hs b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/cabal.test.hs new file mode 100644 index 00000000000..06e7f7b439d --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/cabal.test.hs @@ -0,0 +1,12 @@ +import Test.Cabal.Prelude +import Distribution.System (Arch (..), buildArch, OS (..), buildOS) + +main = do + skipUnlessIO "needs x86_64 or aarch64" + ( (buildArch == X86_64 && buildOS == Windows) + || (buildArch == X86_64 && buildOS == Linux) + || (buildArch == AArch64 && buildOS == OSX) + ) + cabalTest $ recordMode DoNotRecord $ do + cabal "v2-build" ["foreign-opts-asm-exe"] + withPlan $ runPlanExe "foreign-opts-asm" "foreign-opts-asm-exe" [] diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/foreign-opts-asm.cabal b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/foreign-opts-asm.cabal new file mode 100644 index 00000000000..2623c36aa3f --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsAsm/foreign-opts-asm.cabal @@ -0,0 +1,17 @@ +cabal-version: 3.0 +name: foreign-opts-asm +version: 0.1 +build-type: Simple + +executable foreign-opts-asm-exe + main-is: Main.hs + build-depends: base + default-language: Haskell2010 + include-dirs: abits + if os(windows) && arch(x86_64) + asm-sources: abits/asmlib_x86_64_windows.S + elif os(darwin) && arch(aarch64) + asm-sources: abits/asmlib_aarch64_darwin.S + elif os(linux) && arch(x86_64) + asm-sources: abits/asmlib_x86_64_linux.S + asm-options: -DMEANING_OF_LIFE_VAL=33 diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsCxx/Main.hs b/cabal-testsuite/PackageTests/FFI/ForeignOptsCxx/Main.hs index 2343305fc39..50e2d727d7e 100644 --- a/cabal-testsuite/PackageTests/FFI/ForeignOptsCxx/Main.hs +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsCxx/Main.hs @@ -11,6 +11,6 @@ main :: IO () main = do secret <- meaning_of_life_cxx -- The value 22 comes from __TESTOPT_CXX__ - see the cabal file. - if (secret == 22) + if secret == 22 then putStrLn ("The secret is " ++ show secret) else error ("Expected value 22, got " ++ show secret) diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/Main.hs b/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/Main.hs new file mode 100644 index 00000000000..33e31fe719c --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/Main.hs @@ -0,0 +1,18 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +module Main where + +import Foreign.C (CInt (..)) + +-- With ld-options: -Wl,--wrap=meaning_of_life_ld_real, the linker redirects +-- this call to __wrap_meaning_of_life_ld_real, which returns 55. +foreign import ccall "ldlib.h meaning_of_life_ld_real" + meaning_of_life_ld_real :: IO CInt + +main :: IO () +main = do + secret <- meaning_of_life_ld_real + -- The value 55 comes from __wrap_meaning_of_life_ld_real - see ld-options in the cabal file. + if secret == 55 + then putStrLn ("The secret is " ++ show secret) + else error ("Expected value 55, got " ++ show secret) diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cabal.out b/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cabal.out new file mode 100644 index 00000000000..e69de29bb2d diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cabal.project b/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cabal.project new file mode 100644 index 00000000000..e6fdbadb439 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cabal.project @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cabal.test.hs b/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cabal.test.hs new file mode 100644 index 00000000000..395bebb60dc --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cabal.test.hs @@ -0,0 +1,8 @@ +import Test.Cabal.Prelude + +main = do + skipIfOSX "Apple linker does not support --wrap" + skipIfWindows "Windows linker does not support --wrap" + cabalTest $ recordMode DoNotRecord $ do + cabal "v2-build" ["foreign-opts-ld-exe"] + withPlan $ runPlanExe "foreign-opts-ld" "foreign-opts-ld-exe" [] diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cbits/ldlib.c b/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cbits/ldlib.c new file mode 100644 index 00000000000..67e7972c6b2 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cbits/ldlib.c @@ -0,0 +1,14 @@ +#include "ldlib.h" + +/* The "real" implementation - returns 0, the wrong value. + * With ld-options: -Wl,--wrap=meaning_of_life_ld_real, the linker redirects + * all calls to this function to __wrap_meaning_of_life_ld_real below. */ +int meaning_of_life_ld_real() { + return 0; +} + +/* The wrapper that the linker substitutes in place of the real function. + * Returns 55 - see ld-options in the cabal file. */ +int __wrap_meaning_of_life_ld_real() { + return 55; +} diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cbits/ldlib.h b/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cbits/ldlib.h new file mode 100644 index 00000000000..773c3dc6853 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/cbits/ldlib.h @@ -0,0 +1,10 @@ +#ifndef LDLIB_H +#define LDLIB_H + +/* The "real" function; with --wrap, calls to this are redirected by the linker. */ +int meaning_of_life_ld_real(); + +/* The wrapper that the linker calls instead of the real function. */ +int __wrap_meaning_of_life_ld_real(); + +#endif diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/foreign-opts-ld.cabal b/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/foreign-opts-ld.cabal new file mode 100644 index 00000000000..741874d0a56 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsLd/foreign-opts-ld.cabal @@ -0,0 +1,15 @@ +cabal-version: 2.2 +name: foreign-opts-ld +version: 0.1 +build-type: Simple + +executable foreign-opts-ld-exe + main-is: Main.hs + build-depends: base + default-language: Haskell2010 + include-dirs: cbits + c-sources: cbits/ldlib.c + -- Redirect calls to meaning_of_life_ld_real to __wrap_meaning_of_life_ld_real. + -- If ld-options are not passed the real function (returning 0) is called instead + -- of the wrapper (returning 55), and the test fails at runtime. + ld-options: -Wl,--wrap=meaning_of_life_ld_real From b772900cbfced89ad5787ee8e0c345a53d36327c Mon Sep 17 00:00:00 2001 From: Ilia Baryshnikov Date: Fri, 24 Apr 2026 13:01:37 +0300 Subject: [PATCH 2/2] Adding an explicit pgmc flag for interaction with GHC --- Cabal/src/Distribution/Simple/GHC/Internal.hs | 22 +++- .../PackageTests/FFI/ForeignOptsPgmc/Main.hs | 16 +++ .../FFI/ForeignOptsPgmc/README.md | 7 ++ .../FFI/ForeignOptsPgmc/cabal.out | 0 .../FFI/ForeignOptsPgmc/cabal.project | 1 + .../FFI/ForeignOptsPgmc/cabal.test.hs | 13 +++ .../FFI/ForeignOptsPgmc/cbits/pgmclib.c | 9 ++ .../FFI/ForeignOptsPgmc/cbits/pgmclib.h | 6 ++ .../ForeignOptsPgmc/foreign-opts-pgmc.cabal | 12 +++ .../FFI/ForeignOptsPgmc/scripts/cc-wrapper.sh | 4 + .../ShowBuildInfo/Complex/single-2.out | 67 ++++++++++++ .../ShowBuildInfo/Complex/single-2.test.hs | 75 +++++++++++++ .../ShowBuildInfo/Complex/single.out | 10 +- .../ShowBuildInfo/Complex/single.test.hs | 102 ++++++++++++------ .../ShowBuildInfo/Custom/custom.test.hs | 32 +++--- .../src/Test/Cabal/OutputNormalizer.hs | 4 + changelog.d/11713.md | 9 ++ 17 files changed, 334 insertions(+), 55 deletions(-) create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/Main.hs create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/README.md create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cabal.out create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cabal.project create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cbits/pgmclib.c create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cbits/pgmclib.h create mode 100644 cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/foreign-opts-pgmc.cabal create mode 100755 cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/scripts/cc-wrapper.sh create mode 100644 cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single-2.out create mode 100644 cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single-2.test.hs create mode 100644 changelog.d/11713.md diff --git a/Cabal/src/Distribution/Simple/GHC/Internal.hs b/Cabal/src/Distribution/Simple/GHC/Internal.hs index f32b0e34eb3..1cfef4c38d4 100644 --- a/Cabal/src/Distribution/Simple/GHC/Internal.hs +++ b/Cabal/src/Distribution/Simple/GHC/Internal.hs @@ -81,10 +81,10 @@ import Distribution.Types.GivenComponent import Distribution.Types.LocalBuildInfo import Distribution.Types.TargetInfo import Distribution.Types.UnitId +import Distribution.Types.Version import Distribution.Utils.NubList (NubListR, toNubListR) import Distribution.Utils.Path import Distribution.Verbosity -import Distribution.Version (Version) import Language.Haskell.Extension import System.Directory (listDirectory) import System.Environment (getEnv) @@ -482,6 +482,16 @@ componentJsGhcOptions verbosity lbi bi clbi odir filename = , ghcOptExtra = hcOptions GHC bi } +-- Applies options only if the GHC version is greater than or +-- equal to the given one. +ghcOptionsSince :: Monoid a => Version -> Compiler -> a -> a +ghcOptionsSince ver comp defOptions = + case compilerCompatVersion GHC comp of + Just v + | v >= ver -> defOptions + | otherwise -> mempty + Nothing -> mempty + componentGhcOptions :: VerbosityLevel -> LocalBuildInfo @@ -555,6 +565,16 @@ componentGhcOptions verbosity lbi bi clbi odir = , -- Unsupported extensions have already been checked by configure ghcOptExtensions = toNubListR $ usedExtensions bi , ghcOptExtensionMap = Map.fromList . compilerExtensions $ (compiler lbi) + , -- Use -pgmc to ensure that Cabal always passes cc-options, ld-options to GHC (#4435, #9801) + -- We can only do this on GHC >= 9.4, as we need https://gitlab.haskell.org/ghc/ghc/-/merge_requests/6949 + -- Without that GHC MR, this change would cause GHC to never pass -no-pie when linking, + -- which can cause breakage depending on the C toolchain use. We would have to appropriately + -- pass -pgmc-supports-no-pie as appropriate to avoid this regression. + ghcOptCcProgram = + ghcOptionsSince + (mkVersion [9, 4]) + (compiler lbi) + (maybeToFlag $ programPath <$> lookupProgram gccProgram (withPrograms lbi)) } where exe_paths = diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/Main.hs b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/Main.hs new file mode 100644 index 00000000000..e3da361399f --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/Main.hs @@ -0,0 +1,16 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +module Main where + +import Foreign.C (CInt (..)) + +foreign import ccall "pgmclib.h meaning_of_life_pgmc" + meaning_of_life_pgmc :: IO CInt + +main :: IO () +main = do + secret <- meaning_of_life_pgmc + -- The value 66 comes from __TESTOPT_PGMC__ - see cc-wrapper.sh. + if (secret == 66) + then putStrLn ("The secret is " ++ show secret) + else error ("Expected value 66, got " ++ show secret) diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/README.md b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/README.md new file mode 100644 index 00000000000..3f5209e81e6 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/README.md @@ -0,0 +1,7 @@ +# ForeignOptsPgmc + +This test case asserts that cabal passes the `-pgmc` GHC option to override the C compiler program. + +The cabal file sets `ghc-options: -pgmc scripts/cc-wrapper.sh`, pointing GHC at a shell script wrapper (`scripts/cc-wrapper.sh`) instead of the system C compiler. The wrapper adds `-D__TESTOPT_PGMC__=66` to every compilation and then delegates to the real `cc`. The C source requires `__TESTOPT_PGMC__` to be defined; if the wrapper is not used as the C compiler, the build fails with a `#error`. + +This test is skipped on Windows (no POSIX shell). diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cabal.out b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cabal.out new file mode 100644 index 00000000000..e69de29bb2d diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cabal.project b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cabal.project new file mode 100644 index 00000000000..e6fdbadb439 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cabal.project @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cabal.test.hs b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cabal.test.hs new file mode 100644 index 00000000000..8c1395ad636 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cabal.test.hs @@ -0,0 +1,13 @@ +import Test.Cabal.Prelude + +main = do + skipIfWindows "requires a POSIX shell script as the C compiler wrapper" + -- Use -pgmc to ensure that Cabal always passes cc-options, ld-options to GHC (#4435, #9801) + -- We can only do this on GHC >= 9.4, as we need https://gitlab.haskell.org/ghc/ghc/-/merge_requests/6949 + -- Without that GHC MR, this change would cause GHC to never pass -no-pie when linking, + -- which can cause breakage depending on the C toolchain use. We would have to appropriately + -- pass -pgmc-supports-no-pie as appropriate to avoid this regression. + cabalTest $ recordMode DoNotRecord $ do + skipUnlessGhcVersion ">= 9.4" + cabal "v2-build" ["foreign-opts-pgmc-exe"] + withPlan $ runPlanExe "foreign-opts-pgmc" "foreign-opts-pgmc-exe" [] diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cbits/pgmclib.c b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cbits/pgmclib.c new file mode 100644 index 00000000000..a93cf4961e4 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cbits/pgmclib.c @@ -0,0 +1,9 @@ +#include "pgmclib.h" + +#ifndef __TESTOPT_PGMC__ +#error "Did not get required __TESTOPT_PGMC__ from the -pgmc wrapper" +#endif + +int meaning_of_life_pgmc() { + return __TESTOPT_PGMC__; +} diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cbits/pgmclib.h b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cbits/pgmclib.h new file mode 100644 index 00000000000..1e525fd32bf --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/cbits/pgmclib.h @@ -0,0 +1,6 @@ +#ifndef PGMCLIB_H +#define PGMCLIB_H + +int meaning_of_life_pgmc(); + +#endif diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/foreign-opts-pgmc.cabal b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/foreign-opts-pgmc.cabal new file mode 100644 index 00000000000..e8a119c3d36 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/foreign-opts-pgmc.cabal @@ -0,0 +1,12 @@ +cabal-version: 2.2 +name: foreign-opts-pgmc +version: 0.1 +build-type: Simple + +executable foreign-opts-pgmc-exe + main-is: Main.hs + build-depends: base + default-language: Haskell2010 + include-dirs: cbits + c-sources: cbits/pgmclib.c + ghc-options: -pgmc scripts/cc-wrapper.sh diff --git a/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/scripts/cc-wrapper.sh b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/scripts/cc-wrapper.sh new file mode 100755 index 00000000000..8ef2af63ec1 --- /dev/null +++ b/cabal-testsuite/PackageTests/FFI/ForeignOptsPgmc/scripts/cc-wrapper.sh @@ -0,0 +1,4 @@ +#!/bin/sh +# Wrapper around cc that adds -D__TESTOPT_PGMC__=66 to every compilation. +# Used by the ForeignOptsPgmc test to verify that -pgmc selects this wrapper. +exec cc -D__TESTOPT_PGMC__=66 "$@" diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single-2.out b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single-2.out new file mode 100644 index 00000000000..4360812ba2e --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single-2.out @@ -0,0 +1,67 @@ +# cabal v2-update +Downloading the latest package list from test-local-repo +# cabal build +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following will be built: + - Complex-0.1.0.0 (lib) (first run) + - Complex-0.1.0.0 (exe:Complex) (first run) +Configuring library for Complex-0.1.0.0... +Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a directory which does not exist. +Preprocessing library for Complex-0.1.0.0... +Building library for Complex-0.1.0.0... +Configuring executable 'Complex' for Complex-0.1.0.0... +Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a directory which does not exist. +Preprocessing executable 'Complex' for Complex-0.1.0.0... +Building executable 'Complex' for Complex-0.1.0.0... +# show-build-info Complex exe:Complex +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"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//ghc-/Complex-0.1.0.0/x/Complex/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-i","-iapp","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-optP-include","-optPsingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace-Complex","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010","-threaded","-rtsopts","-with-rtsopts=-N -T","-Wredundant-constraints"],"modules":["Other","Paths_Complex"],"src-files":["Main.lhs"],"hs-src-dirs":["app"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +# cabal build +Up to date +# show-build-info Complex lib +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"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//ghc-/Complex-0.1.0.0/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-i","-isrc","-idoesnt-exist","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-optP-include","-optPsingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.dist/work/dist/packagedb/ghc-","-package-id","","-XHaskell2010","-Wall"],"modules":["A","B","C","D","Paths_Complex"],"src-files":[],"hs-src-dirs":["src","doesnt-exist"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +# cabal build +Build profile: -w ghc- -O1 +In order, the following will be built: + - criterion-1.1.4.0 (lib) (requires build) + - Complex-0.1.0.0 (bench:complex-benchmarks) (first run) +Configuring library for criterion-1.1.4.0... +Preprocessing library for criterion-1.1.4.0... +Building library for criterion-1.1.4.0... +Installing library in +Configuring benchmark 'complex-benchmarks' for Complex-0.1.0.0... +Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a directory which does not exist. +Preprocessing benchmark 'complex-benchmarks' for Complex-0.1.0.0... +Building benchmark 'complex-benchmarks' for Complex-0.1.0.0... +# show-build-info Complex bench:complex-benchmarks +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"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//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-i","-ibenchmark","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-optP-include","-optPsingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace-complex-benchmarks","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010","-Wall","-rtsopts","-threaded","-with-rtsopts=-N"],"modules":["Paths_Complex"],"src-files":["Main.hs"],"hs-src-dirs":["benchmark"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +# cabal build +Build profile: -w ghc- -O1 +In order, the following will be built: + - test-framework-0.8.1.1 (lib) (requires build) + - Complex-0.1.0.0 (test:func-test) (first run) +Configuring library for test-framework-0.8.1.1... +Preprocessing library for test-framework-0.8.1.1... +Building library for test-framework-0.8.1.1... +Installing library in +Configuring test suite 'func-test' for Complex-0.1.0.0... +Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a directory which does not exist. +Preprocessing test suite 'func-test' for Complex-0.1.0.0... +Building test suite 'func-test' for Complex-0.1.0.0... +# show-build-info Complex test:func-test +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"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//ghc-/Complex-0.1.0.0/t/func-test/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-i","-itest","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-optP-include","-optPsingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace-func-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["FuncMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +# cabal build +Build profile: -w ghc- -O1 +In order, the following will be built: + - another-framework-0.8.1.1 (lib) (requires build) + - Complex-0.1.0.0 (test:unit-test) (first run) +Configuring library for another-framework-0.8.1.1... +Preprocessing library for another-framework-0.8.1.1... +Building library for another-framework-0.8.1.1... +Installing library in +Configuring test suite 'unit-test' for Complex-0.1.0.0... +Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a directory which does not exist. +Preprocessing test suite 'unit-test' for Complex-0.1.0.0... +Building test suite 'unit-test' for Complex-0.1.0.0... +# show-build-info Complex test:unit-test +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"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//ghc-/Complex-0.1.0.0/t/unit-test/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-i","-itest","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-optP-include","-optPsingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace-unit-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["UnitMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} \ No newline at end of file diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single-2.test.hs b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single-2.test.hs new file mode 100644 index 00000000000..aee4385bb54 --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single-2.test.hs @@ -0,0 +1,75 @@ +{-# LANGUAGE OverloadedStrings #-} + +import Test.Cabal.DecodeShowBuildInfo +import Test.Cabal.Prelude + +main = cabalTest $ do + -- the With GHC-9.2+ output contains -this-unit-id + skipUnlessGhcVersion "^>= 9.2" + withRepo "repo" $ do + runShowBuildInfo ["exe:Complex"] + >> withPlan + ( do + recordBuildInfo "Complex" (exe "Complex") + assertComponent + "Complex" + (exe "Complex") + defCompAssertion + { modules = ["Other", "Paths_Complex"] + , sourceFiles = ["Main.lhs"] + , sourceDirs = ["app"] + } + ) + + runShowBuildInfo ["lib:Complex"] + >> withPlan + ( do + recordBuildInfo "Complex" mainLib + assertComponent + "Complex" + mainLib + defCompAssertion + { modules = ["A", "B", "C", "D", "Paths_Complex"] + , sourceDirs = ["src", "doesnt-exist"] + } + ) + + runShowBuildInfo ["benchmark:complex-benchmarks"] + >> withPlan + ( do + recordBuildInfo "Complex" (bench "complex-benchmarks") + assertComponent + "Complex" + (bench "complex-benchmarks") + defCompAssertion + { modules = ["Paths_Complex"] + , sourceFiles = ["Main.hs"] + , sourceDirs = ["benchmark"] + } + ) + + runShowBuildInfo ["test:func-test"] + >> withPlan + ( do + recordBuildInfo "Complex" (test "func-test") + assertComponent + "Complex" + (test "func-test") + defCompAssertion + { sourceFiles = ["FuncMain.hs"] + , sourceDirs = ["test"] + } + ) + + runShowBuildInfo ["test:unit-test"] + >> withPlan + ( do + recordBuildInfo "Complex" (test "unit-test") + assertComponent + "Complex" + (test "unit-test") + defCompAssertion + { sourceFiles = ["UnitMain.hs"] + , sourceDirs = ["test"] + } + ) diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out index 3825d1f6cf8..fb8047cbd02 100644 --- a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out @@ -15,11 +15,11 @@ Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a director Preprocessing executable 'Complex' for Complex-0.1.0.0... Building executable 'Complex' for Complex-0.1.0.0... # show-build-info Complex exe:Complex -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"exe","name":"exe:Complex","unit-id":"Complex-0.1.0.0-inplace-Complex","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-i","-iapp","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace-Complex","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010","-threaded","-rtsopts","-with-rtsopts=-N -T","-Wredundant-constraints"],"modules":["Other","Paths_Complex"],"src-files":["Main.lhs"],"hs-src-dirs":["app"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"exe","name":"exe:Complex","unit-id":"Complex-0.1.0.0-inplace-Complex","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-i","-iapp","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen/cabal_macros.h","-pgmc","","-this-unit-id","Complex-0.1.0.0-inplace-Complex","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010","-threaded","-rtsopts","-with-rtsopts=-N -T","-Wredundant-constraints"],"modules":["Other","Paths_Complex"],"src-files":["Main.lhs"],"hs-src-dirs":["app"],"src-dir":"/","cabal-file":"Complex.cabal"}]} # cabal build Up to date # show-build-info Complex lib -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"lib","name":"lib","unit-id":"Complex-0.1.0.0-inplace","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-i","-isrc","-idoesnt-exist","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-XHaskell2010","-Wall"],"modules":["A","B","C","D","Paths_Complex"],"src-files":[],"hs-src-dirs":["src","doesnt-exist"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"lib","name":"lib","unit-id":"Complex-0.1.0.0-inplace","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-i","-isrc","-idoesnt-exist","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen/cabal_macros.h","-pgmc","","-this-unit-id","Complex-0.1.0.0-inplace","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-XHaskell2010","-Wall"],"modules":["A","B","C","D","Paths_Complex"],"src-files":[],"hs-src-dirs":["src","doesnt-exist"],"src-dir":"/","cabal-file":"Complex.cabal"}]} # cabal build Build profile: -w ghc- -O1 In order, the following will be built: @@ -34,7 +34,7 @@ Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a director Preprocessing benchmark 'complex-benchmarks' for Complex-0.1.0.0... Building benchmark 'complex-benchmarks' for Complex-0.1.0.0... # show-build-info Complex bench:complex-benchmarks -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"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.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-i","-ibenchmark","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace-complex-benchmarks","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010","-Wall","-rtsopts","-threaded","-with-rtsopts=-N"],"modules":["Paths_Complex"],"src-files":["Main.hs"],"hs-src-dirs":["benchmark"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"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.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-i","-ibenchmark","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen/cabal_macros.h","-pgmc","","-this-unit-id","Complex-0.1.0.0-inplace-complex-benchmarks","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010","-Wall","-rtsopts","-threaded","-with-rtsopts=-N"],"modules":["Paths_Complex"],"src-files":["Main.hs"],"hs-src-dirs":["benchmark"],"src-dir":"/","cabal-file":"Complex.cabal"}]} # cabal build Build profile: -w ghc- -O1 In order, the following will be built: @@ -49,7 +49,7 @@ Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a director Preprocessing test suite 'func-test' for Complex-0.1.0.0... Building test suite 'func-test' for Complex-0.1.0.0... # show-build-info Complex test:func-test -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"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.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-i","-itest","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace-func-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["FuncMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"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.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-i","-itest","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen/cabal_macros.h","-pgmc","","-this-unit-id","Complex-0.1.0.0-inplace-func-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["FuncMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} # cabal build Build profile: -w ghc- -O1 In order, the following will be built: @@ -64,4 +64,4 @@ Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a director Preprocessing test suite 'unit-test' for Complex-0.1.0.0... Building test suite 'unit-test' for Complex-0.1.0.0... # show-build-info Complex test:unit-test -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"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.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-i","-itest","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace-unit-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["UnitMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"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.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-i","-itest","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen/cabal_macros.h","-pgmc","","-this-unit-id","Complex-0.1.0.0-inplace-unit-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["UnitMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} \ No newline at end of file diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.test.hs b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.test.hs index b4bdc16f0cd..8869461c2e7 100644 --- a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.test.hs +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.test.hs @@ -1,44 +1,76 @@ {-# LANGUAGE OverloadedStrings #-} -import Test.Cabal.Prelude -import Test.Cabal.DecodeShowBuildInfo + +import Test.Cabal.DecodeShowBuildInfo +import Test.Cabal.Prelude main = cabalTest $ do -- the With GHC-9.2+ output contains -this-unit-id - skipUnlessGhcVersion ">= 9.2" + -- the With GHC-9.4+ output contains -pgmc by default + skipUnlessGhcVersion ">= 9.4" withRepo "repo" $ do - runShowBuildInfo ["exe:Complex"] >> withPlan (do - recordBuildInfo "Complex" (exe "Complex") - assertComponent "Complex" (exe "Complex") defCompAssertion - { modules = ["Other", "Paths_Complex"] - , sourceFiles = ["Main.lhs"] - , sourceDirs = ["app"] - }) + runShowBuildInfo ["exe:Complex"] + >> withPlan + ( do + recordBuildInfo "Complex" (exe "Complex") + assertComponent + "Complex" + (exe "Complex") + defCompAssertion + { modules = ["Other", "Paths_Complex"] + , sourceFiles = ["Main.lhs"] + , sourceDirs = ["app"] + } + ) - runShowBuildInfo ["lib:Complex"] >> withPlan (do - recordBuildInfo "Complex" mainLib - assertComponent "Complex" mainLib defCompAssertion - { modules = ["A", "B", "C", "D", "Paths_Complex"] - , sourceDirs = ["src", "doesnt-exist"] - }) + runShowBuildInfo ["lib:Complex"] + >> withPlan + ( do + recordBuildInfo "Complex" mainLib + assertComponent + "Complex" + mainLib + defCompAssertion + { modules = ["A", "B", "C", "D", "Paths_Complex"] + , sourceDirs = ["src", "doesnt-exist"] + } + ) - runShowBuildInfo ["benchmark:complex-benchmarks"] >> withPlan (do - recordBuildInfo "Complex" (bench "complex-benchmarks") - assertComponent "Complex" (bench "complex-benchmarks") defCompAssertion - { modules = ["Paths_Complex"] - , sourceFiles = ["Main.hs"] - , sourceDirs = ["benchmark"] - }) + runShowBuildInfo ["benchmark:complex-benchmarks"] + >> withPlan + ( do + recordBuildInfo "Complex" (bench "complex-benchmarks") + assertComponent + "Complex" + (bench "complex-benchmarks") + defCompAssertion + { modules = ["Paths_Complex"] + , sourceFiles = ["Main.hs"] + , sourceDirs = ["benchmark"] + } + ) - runShowBuildInfo ["test:func-test"] >> withPlan (do - recordBuildInfo "Complex" (test "func-test") - assertComponent "Complex" (test "func-test") defCompAssertion - { sourceFiles = ["FuncMain.hs"] - , sourceDirs = ["test"] - }) + runShowBuildInfo ["test:func-test"] + >> withPlan + ( do + recordBuildInfo "Complex" (test "func-test") + assertComponent + "Complex" + (test "func-test") + defCompAssertion + { sourceFiles = ["FuncMain.hs"] + , sourceDirs = ["test"] + } + ) - runShowBuildInfo ["test:unit-test"] >> withPlan (do - recordBuildInfo "Complex" (test "unit-test") - assertComponent "Complex" (test "unit-test") defCompAssertion - { sourceFiles = ["UnitMain.hs"] - , sourceDirs = ["test"] - }) + runShowBuildInfo ["test:unit-test"] + >> withPlan + ( do + recordBuildInfo "Complex" (test "unit-test") + assertComponent + "Complex" + (test "unit-test") + defCompAssertion + { sourceFiles = ["UnitMain.hs"] + , sourceDirs = ["test"] + } + ) diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Custom/custom.test.hs b/cabal-testsuite/PackageTests/ShowBuildInfo/Custom/custom.test.hs index f8c413c7c5b..182a0338347 100644 --- a/cabal-testsuite/PackageTests/ShowBuildInfo/Custom/custom.test.hs +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Custom/custom.test.hs @@ -1,7 +1,8 @@ {-# LANGUAGE OverloadedStrings #-} -import Test.Cabal.Prelude -import Test.Cabal.DecodeShowBuildInfo -import Control.Monad.Trans.Reader + +import Control.Monad.Trans.Reader +import Test.Cabal.DecodeShowBuildInfo +import Test.Cabal.Prelude main = setupTest $ do -- No cabal test because per-component is broken with it @@ -14,15 +15,18 @@ main = setupTest $ do assertCommonBuildInfo buildInfo let [libBI, exeBI] = components buildInfo - assertComponentPure libBI defCompAssertion - { modules = ["MyLib"] - , compType = "lib" - , sourceDirs = ["src"] - } - - assertComponentPure exeBI defCompAssertion - { sourceFiles = ["Main.hs"] - , compType = "exe" - , sourceDirs = ["app"] - } + assertComponentPure + libBI + defCompAssertion + { modules = ["MyLib"] + , compType = "lib" + , sourceDirs = ["src"] + } + assertComponentPure + exeBI + defCompAssertion + { sourceFiles = ["Main.hs"] + , compType = "exe" + , sourceDirs = ["app"] + } diff --git a/cabal-testsuite/src/Test/Cabal/OutputNormalizer.hs b/cabal-testsuite/src/Test/Cabal/OutputNormalizer.hs index c4b45c6f161..57bcb5dbb79 100644 --- a/cabal-testsuite/src/Test/Cabal/OutputNormalizer.hs +++ b/cabal-testsuite/src/Test/Cabal/OutputNormalizer.hs @@ -125,6 +125,10 @@ normalizeOutput nenv = resub ("\"path\":\"" <> posixRegexEscape (normalizerGhcPath nenv) <> "\"") "\"path\":\"\"" + -- Normalize the C compiler path embedded in -pgmc. + . resub + ("\"-pgmc\",\"[^\"]+\"") + "\"-pgmc\",\"\"" -- Remove cabal version output from show-build-info output . resub ("{\"cabal-lib-version\":\"" ++ posixRegexEscape (display (normalizerCabalVersion nenv)) ++ "\"") diff --git a/changelog.d/11713.md b/changelog.d/11713.md new file mode 100644 index 00000000000..04669a05c75 --- /dev/null +++ b/changelog.d/11713.md @@ -0,0 +1,9 @@ +--- +synopsis: Adding an explicit pgmc flag for interaction with GHC +packages: [Cabal] +prs: 11713 +--- + +Added an explicit `pgmc` flag to Cabal's GHC invocation logic. This allows for +reliable and consistent passing of `cc-options`, `ld-options`, and `cpp-options` +to GHC by removing conditional filtering of these arguments.