Skip to content

Building with --enable-shared=no #8143

Open
@DieracDelta

Description

@DieracDelta

Describe the bug

I'd like to build nix with --enable-shared=no on my aarch64-darwin so I can link against the static libs it generates. So I override the configure flags of the nix derivation.

                nix = inputs.nix.packages.aarch64-darwin.nix
                  .overrideAttrs (oldAttrs: {
                    LIBARCHIVE_LIBS = "${pkgs.libiconv.override {enableStatic = true; enableShared = false;}}/lib/libiconv.a";
                    configureFlags = oldAttrs.configureFlags ++ [ "--enable-shared=no" ];
                    buildInputs = oldAttrs.buildInputs ++ [
                      prev.darwin.apple_sdk.frameworks.Security
                      prev.darwin.apple_sdk.frameworks.SystemConfiguration
                      prev.gtest
                      prev.curl
                      prev.bzip2 prev.xz prev.brotli prev.editline
                      prev.openssl prev.sqlite
                      # prev.libarchive
                      prev.boost
                    ];

                    nativeBuildInputs = oldAttrs.nativeBuildInputs ++ [
                      prev.darwin.apple_sdk.frameworks.Security
                      prev.darwin.apple_sdk.frameworks.SystemConfiguration
                    ];

                    propagatedBuildInputs = oldAttrs.propagatedBuildInputs ++ [
                      prev.darwin.apple_sdk.frameworks.Security
                      prev.darwin.apple_sdk.frameworks.SystemConfiguration
                    ];
                    postInstall = ''
                        cp src/libcmd/libnixcmd.a $out/lib/
                        cp src/libexpr/libnixexpr.a $out/lib/
                        cp src/libfetchers/libnixfetchers.a $out/lib/
                        cp src/libmain/libnixmain.a $out/lib/
                        cp src/libstore/libnixstore.a $out/lib/
                        cp src/libutil/libnixutil.a $out/lib/
                    '';
                  });
              }

Expected behavior

The overrides to successfully build the library. When I build the library in the same fashion outside nix (that is, with ./configure --enable-shared=no && make install from with nix develop .#native-clang11StdenvPackages), the build successfully finishes and I'm able to inspect the output binaries.

However, with these overrides from within the derivation, I get a lot of libarchive missing symbols. Errors like:

error: builder for '/nix/store/fj68rc8xjn7f0p2kyf4fa5rmxd2kqcm3-nix-2.15.0pre20230318_220aa8e.drv' failed with exit code 2;
       last 10 log lines:
       >       nix::ArchiveCompressionSink::ArchiveCompressionSink(nix::Sink&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, int) in libnixutil.a(libnixutil.o)
       >   "_archive_write_set_bytes_per_block", referenced from:
       >       nix::ArchiveCompressionSink::ArchiveCompressionSink(nix::Sink&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, int) in libnixutil.a(libnixutil.o)
       >   "_archive_write_set_filter_option", referenced from:
       >       nix::ArchiveCompressionSink::ArchiveCompressionSink(nix::Sink&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, int) in libnixutil.a(libnixutil.o)
       >   "_archive_write_set_format_raw", referenced from:
       >       nix::ArchiveCompressionSink::ArchiveCompressionSink(nix::Sink&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, int) in libnixutil.a(libnixutil.o)
       > ld: symbol(s) not found for architecture arm64

I believe this is because libarchive is a shared lib not a static lib. Any advice on (1) how to build libarchive as a static lib and (2) why this builds successfully in the nix shell but not a pure nix context would be appreciated!

nix-env --version output

nix-env --version output
nix-env (Nix) 2.13.3

Additional context

Priorities

Metadata

Metadata

Assignees

No one assigned

    Labels

    build-problemNix fails to compile or test; also improvements to build process

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions