haskell / cabal

Official upstream development repository for Cabal and cabal-install
https://haskell.org/cabal
Other
1.61k stars 691 forks source link

`cabal v2-build` fails to override global config with `--enable-static --disable-shared` #6688

Open mouse07410 opened 4 years ago

mouse07410 commented 4 years ago

Describe the bug Cabal ignores --enable-static --disable-shared given in the command line, and follows the settings in ~/.cabal/config.

To Reproduce Steps to reproduce the behavior:

  1. Set the values in the ~/.cabal/config for shared libraries and dynamic executables Here's the ~/.cabal/config I use: cabal-config.txt

$ cabal v2-build --enable-static --disable-shared
Resolving dependencies...
Build profile: -w ghc-8.6.5 -O1
In order, the following will be built (use -v for more details):
 - Str2Split-0.1.0.0 (lib) (first run)
 - Str2Split-0.1.0.0 (exe:Str2Split-exe) (first run)
Configuring library for Str2Split-0.1.0.0..
Preprocessing library for Str2Split-0.1.0.0..
Building library for Str2Split-0.1.0.0..
[1 of 2] Compiling Lib              ( src/Lib.hs, /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/Lib.o )
[2 of 2] Compiling Paths_Str2Split  ( /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/autogen/Paths_Str2Split.hs, /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/Paths_Str2Split.o )
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(Win32Utils.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(consUtils.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(mp_clz_tab.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(obprintf.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(obprntffuns.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(obvprintf.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(repl-vsnprintf.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(longlong.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(Disassembler.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(LdvProfile.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(OldARMAtomic.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(ProfilerReport.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(ProfilerReportJson.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(Profiling.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(RetainerProfile.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(RetainerSet.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(RtsDllMain.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(Evac_thr.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(Sanity.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(Scav_thr.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(EventLog.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(Elf.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(PEi386.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(elf_got.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(elf_plt.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(elf_plt_aarch64.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(elf_plt_arm.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(elf_reloc.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(elf_reloc_aarch64.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.a(elf_util.o) has no symbols
Preprocessing library for Str2Split-0.1.0.0..
Running Haddock on library for Str2Split-0.1.0.0..
Haddock coverage:
   0% (  0 /  5) in 'Lib'
  Missing documentation for:
    Module header
    splitStr (src/Lib.hs:12)
    chunker (src/Lib.hs:26)
    splitMore (src/Lib.hs:29)
    splitLess (src/Lib.hs:32)
Documentation created:
/Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/doc/html/Str2Split/index.html
Configuring executable 'Str2Split-exe' for Str2Split-0.1.0.0..
Warning: The package has an extraneous version range for a dependency on an
internal library: Str2Split -any && ==0.1.0.0, Str2Split -any && ==0.1.0.0.
This version range includes the current package but isn't needed as the
current package's library will always be used.
Preprocessing executable 'Str2Split-exe' for Str2Split-0.1.0.0..
Building executable 'Str2Split-exe' for Str2Split-0.1.0.0..
[1 of 2] Compiling Main             ( app/Main.hs, /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe-tmp/Main.dyn_o )
[2 of 2] Compiling Paths_Str2Split  ( /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/autogen/Paths_Str2Split.hs, /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe-tmp/Paths_Str2Split.dyn_o )
Linking /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe ...
$ otool -L /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe
/Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)
    @rpath/libHSStr2Split-0.1.0.0-inplace-ghc8.6.5.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libHSbase-4.12.0.0-ghc8.6.5.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libHSghc-prim-0.5.3-ghc8.6.5.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libHSrts_thr-ghc8.6.5.dylib (compatibility version 0.0.0, current version 0.0.0)

Expected behavior Executable linked with static Haskell libraries.

System information

Additional context

Here's my small test-project https://github.com/mouse07410/Str2Split.git

Attempts to build anything (demonstrating on this fairly simple reproducer project) with --enable-executable-static fails with:

$ cabal build --enable-static --disable-shared --enable-executable-static
Build profile: -w ghc-8.6.5 -O1
In order, the following will be built (use -v for more details):
 - Str2Split-0.1.0.0 (lib) (configuration changed)
 - Str2Split-0.1.0.0 (exe:Str2Split-exe) (configuration changed)
Configuring library for Str2Split-0.1.0.0..
cabal: --enable-executable-dynamic and --enable-executable-static are
incompatible with each other.

cabal: Failed to build Str2Split-0.1.0.0 (which is required by
exe:Str2Split-exe from Str2Split-0.1.0.0). The failure occurred during the
configure step.

With --enable-executable-static --disable-executable-dynamic fail because of the OS constraints.

$ cabal build --enable-static --disable-shared --enable-executable-static --disable-executable-dynamic
. . . . .
Linking /Users/uri/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-8.6.5/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe ...
ld: library not found for -lcrt0.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
`clang' failed in phase `Linker'. (Exit code: 1)
asr commented 4 years ago

I noted the same behaviour with various libraries using a .cabal/config file where any related to shared/static/dynamic is commented out. For example:

$ cabal get splitmix
$ cd splitmix-0.1
$ cabal install --lib --disable-shared -v2
...
Building library for splitmix-0.1..
creating dist/build
/usr/local/bin/ghc --make -fbuilding-cabal-package -O -static -dynamic-too...

Note that ghc is called with the option -dynamic-too.

Versions: GHC 8.10.1 and cabal-install 3.2.0.0.

Blocking https://github.com/agda/agda/issues/4796.

Mikolaj commented 3 years ago

Related to #7236.

jneira commented 2 years ago

@mouse07410 do we know if global config is overridden by cabal project config, top level or package specific? thanks!

jneira commented 2 years ago

@asr thanks for the info, however the command you tried is install and I am afraid the behaviour can be different for build, for better or worse the install case is being covered in #7236

jneira commented 2 years ago

in fact I am tempted to close this in favour the more general #7236, do you agree @mouse07410 ?

mouse07410 commented 2 years ago

do we know if global config is overridden by cabal project config, top level or package specific?

I've no idea, and don't fully understand the question. It appears that the global config settings take precedence over the CLI switches passed to Cabal invocation - which is the problem this issue points at.

in fact I am tempted to close this in favour the more general https://github.com/haskell/cabal/issues/7236, do you agree @mouse07410 ?

Decision is yours - but I don't think #7236 is more general, on the contrary: #7236 is about failure to strip the built executable when the build is static. This issue is about failing to build static regardless of the CLI flags, when the global config says otherwise.

jneira commented 2 years ago

I've no idea, and don't fully understand the question. It appears that the global config settings take precedence over the CLI switches passed to Cabal invocation - which is the problem this issue points at.

I wanted to mean if you add to your cabal project:

static: true

or

package mypackage
  static: true

do they override the global cabal config?

his issue is about facing to build static regardless of the CLI flags, when the global config says otherwise.

yeah i misunderstood the linked issue, sorry

mouse07410 commented 2 years ago

I wanted to mean if you add to your cabal project . . .

Honestly, I haven't tried that (yet? ;) ).

But the goal was to make something like cabal build --enable-static work, as opposed to modifying the project (or even global config) to accomplish it.

Also, it is unclear whether this problem extends to cabal install xyz --enable-static. For example, I may want most (all?) of my installed packages - both local and from Hackage - to be dynamically linked. But for some I may need to build/install them static...

jneira commented 2 years ago

well so a workaround could be to have dynamic in the global config and set static for the few exceptions in their cabal.project(.local), you exchange write or update a config file for avoid the flag in each invocation

but a workaround, the cli flag should override any previous config for sure

mouse07410 commented 2 years ago

well so a workaround could be to have dynamic in the global config and set static for the few exceptions in their cabal.project(.local),

Alas, no.

Same result - it still links dynamically after putting static: true into either one of those files (BTW, what's the purpose and the differences between cabal.project and cabal.project.local?):

$ otool -L /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe
/Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe:
    @rpath/libHSStr2Split-0.1.0.0-inplace-ghc9.0.2.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libHSbase-4.15.1.0-ghc9.0.2.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libHSghc-prim-0.7.0-ghc9.0.2.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libHSrts-1.0.2_thr-ghc9.0.2.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.100.3)
$ rm cabal.project.local
$

BTW, this is with Cabal-3.6.2.0, and GHC-9.0.2.

jneira commented 2 years ago

Same result - it still links dynamically after putting static: true into either one of those files (BTW, what's the purpose and the differences between cabal.project and cabal.project.local?):

cabal.project.local is automatically merged with the main cabal.project, the idea is to have local specific and/or temporal options in the .local one and no upload it to cvs

Same result - it still links dynamically after putting static: true into either one of those files

ugh, not sure if i will have time but i would like to reproduce in linux with -v3, just in case the verbose output give us a clue

mouse07410 commented 2 years ago

would like to reproduce in linux with -v3, just in case the verbose output give us a clue

Explain please. First, I might be able to reproduce it in Linux, as I have a couple of Linux VMs. Second - what do you mean by -v3? How exactly would you like to generate "verbose output"?

jneira commented 2 years ago

sorry didn't want to bother you with more testing so I was thinking in reproduce the error setting the -v3 cabal cli option to make it produce full verbose output and try to gather some insight from, but if you have time to attach such output, it would be great

mouse07410 commented 2 years ago

Here's the output of cabal -v3 build --enable-shared --disable-static on Mac: cabal-static1.log.txt

Then I started experimenting with adding stuff to cabal.project.local, and got this:

$ cabal clean
$ cat cabal.project.local 
static: true
shared: false
executable-dynamic: false
$ cat cabal.project
packages: ./

-- repository ll-skete
  -- url: http://g53blumenthal.llan.ll.mit.edu:12344/packages/archive/
  -- secure: True
  -- root-keys:
  -- key-threshold: 3

$ cabal -v3 build
File monitor 'config' changed: first run
Project settings changed, reconfiguring...
creating /Users/ur20980/src/Str2Split/dist-newstyle
creating /Users/ur20980/src/Str2Split/dist-newstyle/cache
this build was affected by the following (project) config files:
- /Users/ur20980/src/Str2Split/cabal.project
- /Users/ur20980/src/Str2Split/cabal.project.local
File monitor 'improved-plan' changed: first run
File monitor 'elaborated-plan' changed: first run
File monitor 'compiler' changed: first run
Compiler settings changed, reconfiguring...
Searching for ghc in path.
Found ghc at /Users/ur20980/.ghcup/bin/ghc
/Users/ur20980/.ghcup/bin/ghc --numeric-version
/Users/ur20980/.ghcup/bin/ghc is version 9.0.2
looking for tool ghc-pkg near compiler in /Users/ur20980/.ghcup/bin
candidate locations:
["/Users/ur20980/.ghcup/ghc/9.0.2/bin/ghc-pkg-ghc-9.0.2","/Users/ur20980/.ghcup/ghc/9.0.2/bin/ghc-pkg-9.0.2","/Users/ur20980/.ghcup/ghc/9.0.2/bin/ghc-pkg","/Users/ur20980/.ghcup/bin/ghc-pkg"]
found ghc-pkg in /Users/ur20980/.ghcup/ghc/9.0.2/bin/ghc-pkg-9.0.2
/Users/ur20980/.ghcup/ghc/9.0.2/bin/ghc-pkg-9.0.2 --version
/Users/ur20980/.ghcup/ghc/9.0.2/bin/ghc-pkg-9.0.2 is version 9.0.2
/Users/ur20980/.ghcup/bin/ghc --supported-languages
/Users/ur20980/.ghcup/bin/ghc --info
File monitor 'solver-plan' changed: first run
/Users/ur20980/.ghcup/bin/ghc --print-global-package-db
Reading installed packages...
/Users/ur20980/.ghcup/ghc/9.0.2/bin/ghc-pkg-9.0.2 dump --global -v0
/Users/ur20980/.ghcup/bin/ghc --print-libdir
Reading available packages of hackage.haskell.org...
.  .  .  .  .
/Users/ur20980/.ghcup/bin/ghc --make -fbuilding-cabal-package -O -static -outputdir /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe-tmp -odir /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe-tmp -hidir /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe-tmp -stubdir /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe-tmp -i -i/Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe-tmp -iapp -i/Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/autogen -i/Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/global-autogen -I/Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/autogen -I/Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/global-autogen -I/Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe-tmp -I/opt/local/include -I/usr/local/include -optP-include -optP/Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/autogen/cabal_macros.h -L/opt/local/lib/liconv -L/opt/local/lib -L/usr/local/lib -L/usr/lib -hide-all-packages -Wmissing-home-modules -no-user-package-db -package-db /Users/ur20980/.cabal/store/ghc-9.0.2/package.db -package-db /Users/ur20980/src/Str2Split/dist-newstyle/packagedb/ghc-9.0.2 -package-db /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/package.conf.inplace -package-id Str2Split-0.1.0.0-inplace -package-id base-4.15.1.0 -XHaskell2010 app/Main.hs Paths_Str2Split -o /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe -threaded -rtsopts '-with-rtsopts=-N' -hide-all-packages
Linking /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe ...
packages definitely up to date: Str2Split-0.1.0.0-inplace, Str2Split-0.1.0.0-inplace-Str2Split-exe
packages previously probably up to date: 
packages now probably up to date: Str2Split-0.1.0.0-inplace, Str2Split-0.1.0.0-inplace-Str2Split-exe
packages newly up to date: Str2Split-0.1.0.0-inplace, Str2Split-0.1.0.0-inplace-Str2Split-exe
packages out to date: Str2Split-0.1.0.0-inplace-Str2Split-test
packages invalid due to dep change: Str2Split-0.1.0.0-inplace-Str2Split-test
packages invalid due to build failure: 
$ otool -L /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe
/Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe:
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.100.3)
    /opt/local/lib/libffi.8.dylib (compatibility version 10.0.0, current version 10.0.0)
$ 

As you see, the above executable is static "enough" - as static as you can expect on MacOS, because system libraries are dynamic only.

Finally, I tried adding --disable-executable-dynamic to CLI options:

$ cabal clean
$ cabal build --disable-shared --enable-static --disable-executable-dynamic
Resolving dependencies...
Build profile: -w ghc-9.0.2 -O1
In order, the following will be built (use -v for more details):
 - Str2Split-0.1.0.0 (lib) (first run)
 - Str2Split-0.1.0.0 (exe:Str2Split-exe) (first run)
Configuring library for Str2Split-0.1.0.0..
Preprocessing library for Str2Split-0.1.0.0..
Building library for Str2Split-0.1.0.0..
[1 of 2] Compiling Lib              ( src/Lib.hs, /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/build/Lib.o )
[2 of 2] Compiling Paths_Str2Split  ( /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/build/autogen/Paths_Str2Split.hs, /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/build/Paths_Str2Split.o )
.  .  .  .  .
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc9.0.2.a(Sanity.o) has no symbols
Preprocessing library for Str2Split-0.1.0.0..
Running Haddock on library for Str2Split-0.1.0.0..
   0% (  0 /  5) in 'Lib'
  Missing documentation for:
    Module header
    splitStr (src/Lib.hs:7)
    chunker (src/Lib.hs:15)
    splitMore (src/Lib.hs:18)
    splitLess (src/Lib.hs:21)
Documentation created:
/Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/doc/html/Str2Split/Str2Split.txt
Configuring executable 'Str2Split-exe' for Str2Split-0.1.0.0..
Preprocessing executable 'Str2Split-exe' for Str2Split-0.1.0.0..
Building executable 'Str2Split-exe' for Str2Split-0.1.0.0..
[1 of 2] Compiling Main             ( app/Main.hs, /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe-tmp/Main.o )
[2 of 2] Compiling Paths_Str2Split  ( /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/autogen/Paths_Str2Split.hs, /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe-tmp/Paths_Str2Split.o )
Linking /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe ...
$ otool -L /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe
/Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe:
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.100.3)
    /opt/local/lib/libffi.8.dylib (compatibility version 10.0.0, current version 10.0.0)
$

Not even sure what this all means. It appears that to statically link an executable, the only CLI flag I need is --disable-executable-dynamic?!

$ cabal build --disable-executable-dynamic
Resolving dependencies...
Build profile: -w ghc-9.0.2 -O1
In order, the following will be built (use -v for more details):
 - Str2Split-0.1.0.0 (lib) (first run)
 - Str2Split-0.1.0.0 (exe:Str2Split-exe) (first run)
Configuring library for Str2Split-0.1.0.0..
Preprocessing library for Str2Split-0.1.0.0..
Building library for Str2Split-0.1.0.0..
[1 of 2] Compiling Lib              ( src/Lib.hs, /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/build/Lib.o )
[2 of 2] Compiling Paths_Str2Split  ( /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/build/autogen/Paths_Str2Split.hs, /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/build/Paths_Str2Split.o )
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc9.0.2.a(mp_clz_tab.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc9.0.2.a(obprintf.o) has no symbols
.  .  .  .  .
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/build/libHSStr2Split-0.1.0.0-inplace-ghc9.0.2.a(Sanity.o) has no symbols
Preprocessing library for Str2Split-0.1.0.0..
Running Haddock on library for Str2Split-0.1.0.0..
   0% (  0 /  5) in 'Lib'
  Missing documentation for:
    Module header
    splitStr (src/Lib.hs:7)
    chunker (src/Lib.hs:15)
    splitMore (src/Lib.hs:18)
    splitLess (src/Lib.hs:21)
Documentation created:
/Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/doc/html/Str2Split/Str2Split.txt
Configuring executable 'Str2Split-exe' for Str2Split-0.1.0.0..
Preprocessing executable 'Str2Split-exe' for Str2Split-0.1.0.0..
Building executable 'Str2Split-exe' for Str2Split-0.1.0.0..
[1 of 2] Compiling Main             ( app/Main.hs, /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe-tmp/Main.o )
[2 of 2] Compiling Paths_Str2Split  ( /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/autogen/Paths_Str2Split.hs, /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe-tmp/Paths_Str2Split.o )
Linking /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe ...
$ otool -L /Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe
/Users/ur20980/src/Str2Split/dist-newstyle/build/x86_64-osx/ghc-9.0.2/Str2Split-0.1.0.0/x/Str2Split-exe/build/Str2Split-exe/Str2Split-exe:
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.100.3)
    /opt/local/lib/libffi.8.dylib (compatibility version 10.0.0, current version 10.0.0)
$ 

Size difference (for this extremely trivial app):

P.S. Did not even need to get to Linux. ;-)