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