NixOS / nixpkgs

Nix Packages collection & NixOS
MIT License
17.41k stars 13.63k forks source link

llvmPackages: how to include dynamic libraries only? (in a closure) #230616

Open inclyc opened 1 year ago

inclyc commented 1 year ago

Describe the bug

Recently I'm working on a project depends on llvmPackages, and want to package it into a standalone container (to release). However, looks like llvmPackages_*.llvm.libs is coupled with dynamic and static libraries, which significantly increases the closure size :( . Is there anyway to declare that the derivation only depends on llvm dynamic libraries only? e.g. libLLVM-15.so.

Steps To Reproduce

Steps to reproduce the behavior:

[user@system:~]$ ls `nix eval --raw nixpkgs#llvmPackages_15.llvm.lib`/lib
LLVMPolly.so                    libLLVMAsmParser.a          libLLVMExegesisMips.a         libLLVMMCA.a                  libLLVMPowerPCInfo.a          libLLVMVEDisassembler.a
LLVMgold.so                     libLLVMAsmPrinter.a         libLLVMExegesisPowerPC.a      libLLVMMCDisassembler.a       libLLVMProfileData.a          libLLVMVEInfo.a
libLLVM-15.0.7.so               libLLVMBPFAsmParser.a       libLLVMExegesisX86.a          libLLVMMCJIT.a                libLLVMRISCVAsmParser.a       libLLVMVectorize.a
libLLVM-15.so                   libLLVMBPFCodeGen.a         libLLVMExtensions.a           libLLVMMCParser.a             libLLVMRISCVCodeGen.a         libLLVMWebAssemblyAsmParser.a
libLLVM.so                      libLLVMBPFDesc.a            libLLVMFileCheck.a            libLLVMMIRParser.a            libLLVMRISCVDesc.a            libLLVMWebAssemblyCodeGen.a
libLLVMAArch64AsmParser.a       libLLVMBPFDisassembler.a    libLLVMFrontendOpenACC.a      libLLVMMSP430AsmParser.a      libLLVMRISCVDisassembler.a    libLLVMWebAssemblyDesc.a
libLLVMAArch64CodeGen.a         libLLVMBPFInfo.a            libLLVMFrontendOpenMP.a       libLLVMMSP430CodeGen.a        libLLVMRISCVInfo.a            libLLVMWebAssemblyDisassembler.a
libLLVMAArch64Desc.a            libLLVMBinaryFormat.a       libLLVMFuzzMutate.a           libLLVMMSP430Desc.a           libLLVMRemarks.a              libLLVMWebAssemblyInfo.a
libLLVMAArch64Disassembler.a    libLLVMBitReader.a          libLLVMFuzzerCLI.a            libLLVMMSP430Disassembler.a   libLLVMRuntimeDyld.a          libLLVMWebAssemblyUtils.a
libLLVMAArch64Info.a            libLLVMBitWriter.a          libLLVMGlobalISel.a           libLLVMMSP430Info.a           libLLVMScalarOpts.a           libLLVMWindowsDriver.a
libLLVMAArch64Utils.a           libLLVMBitstreamReader.a    libLLVMHexagonAsmParser.a     libLLVMMipsAsmParser.a        libLLVMSelectionDAG.a         libLLVMWindowsManifest.a
libLLVMAMDGPUAsmParser.a        libLLVMCFGuard.a            libLLVMHexagonCodeGen.a       libLLVMMipsCodeGen.a          libLLVMSparcAsmParser.a       libLLVMX86AsmParser.a
libLLVMAMDGPUCodeGen.a          libLLVMCFIVerify.a          libLLVMHexagonDesc.a          libLLVMMipsDesc.a             libLLVMSparcCodeGen.a         libLLVMX86CodeGen.a
libLLVMAMDGPUDesc.a             libLLVMCodeGen.a            libLLVMHexagonDisassembler.a  libLLVMMipsDisassembler.a     libLLVMSparcDesc.a            libLLVMX86Desc.a
libLLVMAMDGPUDisassembler.a     libLLVMCore.a               libLLVMHexagonInfo.a          libLLVMMipsInfo.a             libLLVMSparcDisassembler.a    libLLVMX86Disassembler.a
libLLVMAMDGPUInfo.a             libLLVMCoroutines.a         libLLVMIRReader.a             libLLVMNVPTXCodeGen.a         libLLVMSparcInfo.a            libLLVMX86Info.a
libLLVMAMDGPUTargetMCA.a        libLLVMCoverage.a           libLLVMInstCombine.a          libLLVMNVPTXDesc.a            libLLVMSupport.a              libLLVMX86TargetMCA.a
libLLVMAMDGPUUtils.a            libLLVMDWARFLinker.a        libLLVMInstrumentation.a      libLLVMNVPTXInfo.a            libLLVMSymbolize.a            libLLVMXCoreCodeGen.a
libLLVMARMAsmParser.a           libLLVMDWP.a                libLLVMInterfaceStub.a        libLLVMObjCARCOpts.a          libLLVMSystemZAsmParser.a     libLLVMXCoreDesc.a
libLLVMARMCodeGen.a             libLLVMDebugInfoCodeView.a  libLLVMInterpreter.a          libLLVMObjCopy.a              libLLVMSystemZCodeGen.a       libLLVMXCoreDisassembler.a
libLLVMARMDesc.a                libLLVMDebugInfoDWARF.a     libLLVMJITLink.a              libLLVMObject.a               libLLVMSystemZDesc.a          libLLVMXCoreInfo.a
libLLVMARMDisassembler.a        libLLVMDebugInfoGSYM.a      libLLVMLTO.a                  libLLVMObjectYAML.a           libLLVMSystemZDisassembler.a  libLLVMXRay.a
libLLVMARMInfo.a                libLLVMDebugInfoMSF.a       libLLVMLanaiAsmParser.a       libLLVMOption.a               libLLVMSystemZInfo.a          libLLVMipo.a
libLLVMARMUtils.a               libLLVMDebugInfoPDB.a       libLLVMLanaiCodeGen.a         libLLVMOrcJIT.a               libLLVMTableGen.a             libLTO.so
libLLVMAVRAsmParser.a           libLLVMDebuginfod.a         libLLVMLanaiDesc.a            libLLVMOrcShared.a            libLLVMTableGenGlobalISel.a   libLTO.so.15
libLLVMAVRCodeGen.a             libLLVMDemangle.a           libLLVMLanaiDisassembler.a    libLLVMOrcTargetProcess.a     libLLVMTarget.a               libPolly.a
libLLVMAVRDesc.a                libLLVMDiff.a               libLLVMLanaiInfo.a            libLLVMPasses.a               libLLVMTextAPI.a              libPollyISL.a
libLLVMAVRDisassembler.a        libLLVMDlltoolDriver.a      libLLVMLibDriver.a            libLLVMPowerPCAsmParser.a     libLLVMTransformUtils.a       libRemarks.so
libLLVMAVRInfo.a                libLLVMExecutionEngine.a    libLLVMLineEditor.a           libLLVMPowerPCCodeGen.a       libLLVMVEAsmParser.a          libRemarks.so.15
libLLVMAggressiveInstCombine.a  libLLVMExegesis.a           libLLVMLinker.a               libLLVMPowerPCDesc.a          libLLVMVECodeGen.a
libLLVMAnalysis.a               libLLVMExegesisAArch64.a    libLLVMMC.a                   libLLVMPowerPCDisassembler.a  libLLVMVEDesc.a

Expected behavior

Anyway to include dynamic libraries only?

Notify maintainers

@fpletz @Ericson2314 @sternenseemann @rrbutani

Metadata

[user@system:~]$ nix-shell -p nix-info --run "nix-info -m"
 - system: `"x86_64-linux"`
 - host os: `Linux 6.2.13, NixOS, 23.05 (Stoat), 23.05.20230502.1a411f2`
 - multi-user?: `yes`
 - sandbox: `yes`
 - version: `nix-env (Nix) 2.15.0`
 - channels(root): `"nixos"`
 - channels(lyc): `"nixpkgs"`
 - nixpkgs: `/home/lyc/.nix-defexpr/channels/nixpkgs`
rrbutani commented 1 year ago

Related: #164141, #162607


162607 addresses this issue but it was reverted in #178007; as @sternenseemann noted, we'd want to have LLVM install the static libraries in a separate location rather than moving them after the fact.

rrbutani commented 1 year ago

I'm not super familiar with CMake but I think modifying this install in add_llvm_library would be a good place to start (i.e. introducing a CMAKE_INSTALL_LIBDIR_STATIC that's defaulted to CMAKE_INSTALL_LIBDIR, using SHARED to select the right install location), though I may be misunderstanding how add_llvm_library interacts with static libs.

Unfortunately I don't have the bandwidth to pursue this at the moment but @inclyc if you're interested in looking into this I'm happy to try to help debug stuff and to answer questions!


Alternatively if you're willing to rebuild stuff adding -DBUILD_SHARED_LIBS to the LLVM package instead of LLVM_LINK_LLVM_DYLIB (i.e. not building the static libraries) may solve your problem.