Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LLVM cmake dependency with static: true appears to happily detect and respond with shared llvm #12323

Closed
eli-schwartz opened this issue Oct 3, 2023 · 0 comments · Fixed by #12823
Labels
dependencies dependency:cmake Issues related to `dependency` with the `cmake` method

Comments

@eli-schwartz
Copy link
Member

Currently the CI image builders fail to build several times. The error message looks like this:

Called: `/usr/sbin/llvm-config --libfiles --link-static` -> 1
stderr:
llvm-config: error: missing: /usr/lib/libLLVMTargetParser.a
llvm-config: error: missing: /usr/lib/libLLVMBinaryFormat.a
llvm-config: error: missing: /usr/lib/libLLVMBitstreamReader.a
llvm-config: error: missing: /usr/lib/libLLVMRemarks.a
llvm-config: error: missing: /usr/lib/libLLVMCore.a
llvm-config: error: missing: /usr/lib/libLLVMFuzzerCLI.a
llvm-config: error: missing: /usr/lib/libLLVMBitReader.a
llvm-config: error: missing: /usr/lib/libLLVMDebugInfoCodeView.a
llvm-config: error: missing: /usr/lib/libLLVMMC.a
llvm-config: error: missing: /usr/lib/libLLVMAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMIRReader.a
llvm-config: error: missing: /usr/lib/libLLVMMCParser.a
llvm-config: error: missing: /usr/lib/libLLVMTextAPI.a
llvm-config: error: missing: /usr/lib/libLLVMObject.a
llvm-config: error: missing: /usr/lib/libLLVMDebugInfoDWARF.a
llvm-config: error: missing: /usr/lib/libLLVMDebugInfoMSF.a
llvm-config: error: missing: /usr/lib/libLLVMDebugInfoPDB.a
llvm-config: error: missing: /usr/lib/libLLVMSymbolize.a
llvm-config: error: missing: /usr/lib/libLLVMProfileData.a
llvm-config: error: missing: /usr/lib/libLLVMAnalysis.a
llvm-config: error: missing: /usr/lib/libLLVMBitWriter.a
llvm-config: error: missing: /usr/lib/libLLVMTransformUtils.a
llvm-config: error: missing: /usr/lib/libLLVMAggressiveInstCombine.a
llvm-config: error: missing: /usr/lib/libLLVMInstCombine.a
llvm-config: error: missing: /usr/lib/libLLVMScalarOpts.a
llvm-config: error: missing: /usr/lib/libLLVMTarget.a
llvm-config: error: missing: /usr/lib/libLLVMFuzzMutate.a
llvm-config: error: missing: /usr/lib/libLLVMFileCheck.a
llvm-config: error: missing: /usr/lib/libLLVMInterfaceStub.a
llvm-config: error: missing: /usr/lib/libLLVMIRPrinter.a
llvm-config: error: missing: /usr/lib/libLLVMObjCARCOpts.a
llvm-config: error: missing: /usr/lib/libLLVMCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMSelectionDAG.a
llvm-config: error: missing: /usr/lib/libLLVMAsmPrinter.a
llvm-config: error: missing: /usr/lib/libLLVMMIRParser.a
llvm-config: error: missing: /usr/lib/libLLVMGlobalISel.a
llvm-config: error: missing: /usr/lib/libLLVMDWARFLinker.a
llvm-config: error: missing: /usr/lib/libLLVMDWARFLinkerParallel.a
llvm-config: error: missing: /usr/lib/libLLVMExtensions.a
llvm-config: error: missing: /usr/lib/libLLVMFrontendHLSL.a
llvm-config: error: missing: /usr/lib/libLLVMFrontendOpenACC.a
llvm-config: error: missing: /usr/lib/libLLVMFrontendOpenMP.a
llvm-config: error: missing: /usr/lib/libLLVMInstrumentation.a
llvm-config: error: missing: /usr/lib/libLLVMLinker.a
llvm-config: error: missing: /usr/lib/libLLVMVectorize.a
llvm-config: error: missing: /usr/lib/libLLVMipo.a
llvm-config: error: missing: /usr/lib/libLLVMCoroutines.a
llvm-config: error: missing: /usr/lib/libLLVMCFGuard.a
llvm-config: error: missing: /usr/lib/libLLVMPasses.a
llvm-config: error: missing: /usr/lib/libLLVMLTO.a
llvm-config: error: missing: /usr/lib/libLLVMMCDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMMCA.a
llvm-config: error: missing: /usr/lib/libLLVMObjCopy.a
llvm-config: error: missing: /usr/lib/libLLVMObjectYAML.a
llvm-config: error: missing: /usr/lib/libLLVMOption.a
llvm-config: error: missing: /usr/lib/libLLVMDebugInfoGSYM.a
llvm-config: error: missing: /usr/lib/libLLVMDebugInfoLogicalView.a
llvm-config: error: missing: /usr/lib/libLLVMDWP.a
llvm-config: error: missing: /usr/lib/libLLVMOrcShared.a
llvm-config: error: missing: /usr/lib/libLLVMOrcTargetProcess.a
llvm-config: error: missing: /usr/lib/libLLVMRuntimeDyld.a
llvm-config: error: missing: /usr/lib/libLLVMExecutionEngine.a
llvm-config: error: missing: /usr/lib/libLLVMInterpreter.a
llvm-config: error: missing: /usr/lib/libLLVMJITLink.a
llvm-config: error: missing: /usr/lib/libLLVMMCJIT.a
llvm-config: error: missing: /usr/lib/libLLVMWindowsDriver.a
llvm-config: error: missing: /usr/lib/libLLVMOrcJIT.a
llvm-config: error: missing: /usr/lib/libLLVMPerfJITEvents.a
llvm-config: error: missing: /usr/lib/libLLVMAArch64Info.a
llvm-config: error: missing: /usr/lib/libLLVMAArch64Utils.a
llvm-config: error: missing: /usr/lib/libLLVMAArch64Desc.a
llvm-config: error: missing: /usr/lib/libLLVMAArch64CodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMAArch64AsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMAArch64Disassembler.a
llvm-config: error: missing: /usr/lib/libLLVMAMDGPUInfo.a
llvm-config: error: missing: /usr/lib/libLLVMAMDGPUUtils.a
llvm-config: error: missing: /usr/lib/libLLVMAMDGPUDesc.a
llvm-config: error: missing: /usr/lib/libLLVMAMDGPUCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMAMDGPUAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMAMDGPUDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMAMDGPUTargetMCA.a
llvm-config: error: missing: /usr/lib/libLLVMARMInfo.a
llvm-config: error: missing: /usr/lib/libLLVMARMUtils.a
llvm-config: error: missing: /usr/lib/libLLVMARMDesc.a
llvm-config: error: missing: /usr/lib/libLLVMARMCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMARMAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMARMDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMAVRInfo.a
llvm-config: error: missing: /usr/lib/libLLVMAVRDesc.a
llvm-config: error: missing: /usr/lib/libLLVMAVRCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMAVRAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMAVRDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMBPFInfo.a
llvm-config: error: missing: /usr/lib/libLLVMBPFDesc.a
llvm-config: error: missing: /usr/lib/libLLVMBPFCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMBPFAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMBPFDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMHexagonInfo.a
llvm-config: error: missing: /usr/lib/libLLVMHexagonDesc.a
llvm-config: error: missing: /usr/lib/libLLVMHexagonAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMHexagonCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMHexagonDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMLanaiInfo.a
llvm-config: error: missing: /usr/lib/libLLVMLanaiDesc.a
llvm-config: error: missing: /usr/lib/libLLVMLanaiAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMLanaiCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMLanaiDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMLoongArchInfo.a
llvm-config: error: missing: /usr/lib/libLLVMLoongArchDesc.a
llvm-config: error: missing: /usr/lib/libLLVMLoongArchCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMLoongArchAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMLoongArchDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMMipsInfo.a
llvm-config: error: missing: /usr/lib/libLLVMMipsDesc.a
llvm-config: error: missing: /usr/lib/libLLVMMipsCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMMipsAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMMipsDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMMSP430Info.a
llvm-config: error: missing: /usr/lib/libLLVMMSP430Desc.a
llvm-config: error: missing: /usr/lib/libLLVMMSP430CodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMMSP430AsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMMSP430Disassembler.a
llvm-config: error: missing: /usr/lib/libLLVMNVPTXInfo.a
llvm-config: error: missing: /usr/lib/libLLVMNVPTXDesc.a
llvm-config: error: missing: /usr/lib/libLLVMNVPTXCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMPowerPCInfo.a
llvm-config: error: missing: /usr/lib/libLLVMPowerPCDesc.a
llvm-config: error: missing: /usr/lib/libLLVMPowerPCCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMPowerPCAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMPowerPCDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMRISCVInfo.a
llvm-config: error: missing: /usr/lib/libLLVMRISCVDesc.a
llvm-config: error: missing: /usr/lib/libLLVMRISCVCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMRISCVAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMRISCVDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMRISCVTargetMCA.a
llvm-config: error: missing: /usr/lib/libLLVMSparcInfo.a
llvm-config: error: missing: /usr/lib/libLLVMSparcDesc.a
llvm-config: error: missing: /usr/lib/libLLVMSparcCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMSparcAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMSparcDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMSystemZInfo.a
llvm-config: error: missing: /usr/lib/libLLVMSystemZDesc.a
llvm-config: error: missing: /usr/lib/libLLVMSystemZCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMSystemZAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMSystemZDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMVEInfo.a
llvm-config: error: missing: /usr/lib/libLLVMVEDesc.a
llvm-config: error: missing: /usr/lib/libLLVMVECodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMVEAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMVEDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMWebAssemblyInfo.a
llvm-config: error: missing: /usr/lib/libLLVMWebAssemblyUtils.a
llvm-config: error: missing: /usr/lib/libLLVMWebAssemblyDesc.a
llvm-config: error: missing: /usr/lib/libLLVMWebAssemblyCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMWebAssemblyAsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMWebAssemblyDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMX86Info.a
llvm-config: error: missing: /usr/lib/libLLVMX86Desc.a
llvm-config: error: missing: /usr/lib/libLLVMX86CodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMX86AsmParser.a
llvm-config: error: missing: /usr/lib/libLLVMX86Disassembler.a
llvm-config: error: missing: /usr/lib/libLLVMX86TargetMCA.a
llvm-config: error: missing: /usr/lib/libLLVMXCoreInfo.a
llvm-config: error: missing: /usr/lib/libLLVMXCoreDesc.a
llvm-config: error: missing: /usr/lib/libLLVMXCoreCodeGen.a
llvm-config: error: missing: /usr/lib/libLLVMXCoreDisassembler.a
llvm-config: error: missing: /usr/lib/libLLVMLineEditor.a
llvm-config: error: missing: /usr/lib/libLLVMCoverage.a
llvm-config: error: missing: /usr/lib/libLLVMDlltoolDriver.a
llvm-config: error: missing: /usr/lib/libLLVMLibDriver.a
llvm-config: error: missing: /usr/lib/libLLVMXRay.a
llvm-config: error: missing: /usr/lib/libLLVMWindowsManifest.a
-----------
Run-time dependency LLVM (modules: not-found(missing but optional)) found: NO (tried config-tool)

test cases/frameworks/15 llvm/meson.build:68:2: ERROR: Assert failed: optional module stopped llvm from being found.

This should not get so far, because we first check if it can be found without modules:

Guessed CMake target 'LLVM'
CMake TARGET:
  -- name:      LLVM
  -- type:      SHARED
  -- imported:  True
  -- properties: {
      'IMPORTED_CONFIGURATIONS': ['RELEASE']
      'IMPORTED_LOCATION_RELEASE': ['/usr/lib/libLLVM-16.so']
      'IMPORTED_SONAME_RELEASE': ['libLLVM-16.so']
     }
  -- tline: CMake TRACE: /usr/lib/cmake/llvm/LLVMExports.cmake:281 add_library(['LLVM', 'SHARED', 'IMPORTED'])
Include Dirs:         []
Compiler Options:     []
Libraries:            ['/usr/lib/libLLVM-16.so']
Run-time dependency LLVM found: YES 16.0.6

... except it is not respecting the static kwarg?

@eli-schwartz eli-schwartz added dependencies dependency:cmake Issues related to `dependency` with the `cmake` method labels Oct 3, 2023
thesamesam added a commit to thesamesam/meson that referenced this issue Feb 8, 2024
In 89146e8, a heuristic was introduced where
if libLLVMSupport is available as a static library, LLVM itself is assumed
to be availble as a static library as a whole.

This is unfortunately not the case at least on Gentoo and Arch Linux, where
a subsequent llvm-config call yields:
```
$ /usr/lib/llvm/17/bin/llvm-config --libfiles --link-static
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMTargetParser.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMBinaryFormat.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMBitstreamReader.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMRemarks.a
[...]
```

On Gentoo, where LLVM's static libraries are not included, we still have:
```
$ equery f llvm:17 | grep -i lib64/.*.a$
/usr/lib/llvm/17/lib64/libLLVMDemangle.a
/usr/lib/llvm/17/lib64/libLLVMSupport.a
/usr/lib/llvm/17/lib64/libLLVMTableGen.a
/usr/lib/llvm/17/lib64/libLLVMTestingAnnotations.a
/usr/lib/llvm/17/lib64/libLLVMTestingSupport.a
/usr/lib/llvm/17/lib64/libllvm_gtest.a
/usr/lib/llvm/17/lib64/libllvm_gtest_main.a
```

Therefore, testing for libLLVMSupport is insufficient. We now try libLLVMCore
instead, as that appears to only be installed when LLVM truly has static libraries
available.

(Specifically, LLVM's llvm/lib/Support/CMakeLists.txt pays 0 attention to
-DLLVM_BUILD_LLVM_DYLIB and -DLLVM_LINK_LLVM_DYLIB, and is hence only affected
by -DBUILD_SHARED_LIBS, which LLVM upstream say is only to be used for development.

Therefore, with -DBUILD_SHARED_LIBS=OFF (as is recommended/the default) and
-DLLVM_BUILD_LLVM_DYLIB=ON, you will get a static libLLVMShared, without it
indicating anything about the rest of your configuration.)

Bug: mesonbuild#12323
Fixes: 89146e8
Signed-off-by: Sam James <sam@gentoo.org>
thesamesam added a commit to thesamesam/meson that referenced this issue Feb 8, 2024
In 89146e8, a heuristic was introduced where
if libLLVMSupport is available as a static library, LLVM itself is assumed
to be availble as a static library as a whole.

This is unfortunately not the case at least on Gentoo and Arch Linux, where
a subsequent llvm-config call yields:
```
$ /usr/lib/llvm/17/bin/llvm-config --libfiles --link-static
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMTargetParser.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMBinaryFormat.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMBitstreamReader.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMRemarks.a
[...]
```

On Gentoo, where LLVM's static libraries are not included, we still have:
```
$ equery f llvm:17 | grep -i lib64/.*.a$
/usr/lib/llvm/17/lib64/libLLVMDemangle.a
/usr/lib/llvm/17/lib64/libLLVMSupport.a
/usr/lib/llvm/17/lib64/libLLVMTableGen.a
/usr/lib/llvm/17/lib64/libLLVMTestingAnnotations.a
/usr/lib/llvm/17/lib64/libLLVMTestingSupport.a
/usr/lib/llvm/17/lib64/libllvm_gtest.a
/usr/lib/llvm/17/lib64/libllvm_gtest_main.a
```

Therefore, testing for libLLVMSupport is insufficient. We now try libLLVMCore
instead, as that appears to only be installed when LLVM truly has static libraries
available.

(Specifically, LLVM's llvm/lib/Support/CMakeLists.txt pays 0 attention to
-DLLVM_BUILD_LLVM_DYLIB and -DLLVM_LINK_LLVM_DYLIB, and is hence only affected
by -DBUILD_SHARED_LIBS, which LLVM upstream say is only to be used for development.

Therefore, with -DBUILD_SHARED_LIBS=OFF (as is recommended/the default) and
-DLLVM_BUILD_LLVM_DYLIB=ON, you will get a static libLLVMShared, without it
indicating anything about the rest of your configuration.)

Bug: mesonbuild#12323
Fixes: 89146e8
Signed-off-by: Sam James <sam@gentoo.org>
thesamesam added a commit to thesamesam/meson that referenced this issue Feb 8, 2024
In 89146e8, a heuristic was introduced where
if libLLVMSupport is available as a static library, LLVM itself is assumed
to be availble as a static library as a whole.

This is unfortunately not the case at least on Gentoo and Arch Linux, where
a subsequent llvm-config call yields:
```
$ /usr/lib/llvm/17/bin/llvm-config --libfiles --link-static
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMTargetParser.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMBinaryFormat.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMBitstreamReader.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMRemarks.a
[...]
```

On Gentoo, where LLVM's static libraries are not included, we still have:
```
$ equery f llvm:17 | grep -i lib64/.*.a$
/usr/lib/llvm/17/lib64/libLLVMDemangle.a
/usr/lib/llvm/17/lib64/libLLVMSupport.a
/usr/lib/llvm/17/lib64/libLLVMTableGen.a
/usr/lib/llvm/17/lib64/libLLVMTestingAnnotations.a
/usr/lib/llvm/17/lib64/libLLVMTestingSupport.a
/usr/lib/llvm/17/lib64/libllvm_gtest.a
/usr/lib/llvm/17/lib64/libllvm_gtest_main.a
```

Therefore, testing for libLLVMSupport is insufficient. We now try libLLVMCore
instead, as that appears to only be installed when LLVM truly has static libraries
available. libLLVMCore is handled as a LLVM component which gives us some guarantee
this is supposed to be happening and not a fluke.

(Specifically, LLVM's llvm/lib/Support/CMakeLists.txt pays 0 attention to
-DLLVM_BUILD_LLVM_DYLIB and -DLLVM_LINK_LLVM_DYLIB, and is hence only affected
by -DBUILD_SHARED_LIBS, which LLVM upstream say is only to be used for development.

Therefore, with -DBUILD_SHARED_LIBS=OFF (as is recommended/the default) and
-DLLVM_BUILD_LLVM_DYLIB=ON, you will get a static libLLVMSupport, without it
indicating anything about the rest of your configuration.)

Bug: mesonbuild#12323
Fixes: 89146e8
Signed-off-by: Sam James <sam@gentoo.org>
thesamesam added a commit to thesamesam/meson that referenced this issue Feb 8, 2024
In 89146e8, a heuristic was introduced where
if libLLVMSupport is available as a static library, LLVM itself is assumed
to be availble as a static library as a whole.

This is unfortunately not the case at least on Gentoo and Arch Linux, where
a subsequent llvm-config call yields:
```
$ /usr/lib/llvm/17/bin/llvm-config --libfiles --link-static
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMTargetParser.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMBinaryFormat.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMBitstreamReader.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMRemarks.a
[...]
```

On Gentoo, where LLVM's static libraries are not included, we still have:
```
$ equery f llvm:17 | grep -i lib64/.*.a$
/usr/lib/llvm/17/lib64/libLLVMDemangle.a
/usr/lib/llvm/17/lib64/libLLVMSupport.a
/usr/lib/llvm/17/lib64/libLLVMTableGen.a
/usr/lib/llvm/17/lib64/libLLVMTestingAnnotations.a
/usr/lib/llvm/17/lib64/libLLVMTestingSupport.a
/usr/lib/llvm/17/lib64/libllvm_gtest.a
/usr/lib/llvm/17/lib64/libllvm_gtest_main.a
```

Therefore, testing for libLLVMSupport is insufficient. We now try libLLVMCore
instead, as that appears to only be installed when LLVM truly has static libraries
available. libLLVMCore is handled as a LLVM component which gives us some guarantee
this is supposed to be happening and not a fluke.

(Specifically, LLVM's llvm/lib/Support/CMakeLists.txt pays 0 attention to
-DLLVM_BUILD_LLVM_DYLIB and -DLLVM_LINK_LLVM_DYLIB, and is hence only affected
by -DBUILD_SHARED_LIBS, which LLVM upstream say is only to be used for development.

Therefore, with -DBUILD_SHARED_LIBS=OFF (as is recommended/the default) and
-DLLVM_BUILD_LLVM_DYLIB=ON, you will get a static libLLVMSupport, without it
indicating anything about the rest of your configuration.)

Closes: mesonbuild#12323
Fixes: 89146e8
Signed-off-by: Sam James <sam@gentoo.org>
nirbheek pushed a commit that referenced this issue Feb 11, 2024
In 89146e8, a heuristic was introduced where
if libLLVMSupport is available as a static library, LLVM itself is assumed
to be availble as a static library as a whole.

This is unfortunately not the case at least on Gentoo and Arch Linux, where
a subsequent llvm-config call yields:
```
$ /usr/lib/llvm/17/bin/llvm-config --libfiles --link-static
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMTargetParser.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMBinaryFormat.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMBitstreamReader.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMRemarks.a
[...]
```

On Gentoo, where LLVM's static libraries are not included, we still have:
```
$ equery f llvm:17 | grep -i lib64/.*.a$
/usr/lib/llvm/17/lib64/libLLVMDemangle.a
/usr/lib/llvm/17/lib64/libLLVMSupport.a
/usr/lib/llvm/17/lib64/libLLVMTableGen.a
/usr/lib/llvm/17/lib64/libLLVMTestingAnnotations.a
/usr/lib/llvm/17/lib64/libLLVMTestingSupport.a
/usr/lib/llvm/17/lib64/libllvm_gtest.a
/usr/lib/llvm/17/lib64/libllvm_gtest_main.a
```

Therefore, testing for libLLVMSupport is insufficient. We now try libLLVMCore
instead, as that appears to only be installed when LLVM truly has static libraries
available. libLLVMCore is handled as a LLVM component which gives us some guarantee
this is supposed to be happening and not a fluke.

(Specifically, LLVM's llvm/lib/Support/CMakeLists.txt pays 0 attention to
-DLLVM_BUILD_LLVM_DYLIB and -DLLVM_LINK_LLVM_DYLIB, and is hence only affected
by -DBUILD_SHARED_LIBS, which LLVM upstream say is only to be used for development.

Therefore, with -DBUILD_SHARED_LIBS=OFF (as is recommended/the default) and
-DLLVM_BUILD_LLVM_DYLIB=ON, you will get a static libLLVMSupport, without it
indicating anything about the rest of your configuration.)

Closes: #12323
Fixes: 89146e8
Signed-off-by: Sam James <sam@gentoo.org>
Signed-off-by: Eli Schwartz <eschwartz93@gmail.com>
soumyaDghosh pushed a commit to soumyaDghosh/meson that referenced this issue Jun 4, 2024
In 89146e8, a heuristic was introduced where
if libLLVMSupport is available as a static library, LLVM itself is assumed
to be availble as a static library as a whole.

This is unfortunately not the case at least on Gentoo and Arch Linux, where
a subsequent llvm-config call yields:
```
$ /usr/lib/llvm/17/bin/llvm-config --libfiles --link-static
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMTargetParser.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMBinaryFormat.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMBitstreamReader.a
llvm-config: error: missing: /usr/lib/llvm/17/lib64/libLLVMRemarks.a
[...]
```

On Gentoo, where LLVM's static libraries are not included, we still have:
```
$ equery f llvm:17 | grep -i lib64/.*.a$
/usr/lib/llvm/17/lib64/libLLVMDemangle.a
/usr/lib/llvm/17/lib64/libLLVMSupport.a
/usr/lib/llvm/17/lib64/libLLVMTableGen.a
/usr/lib/llvm/17/lib64/libLLVMTestingAnnotations.a
/usr/lib/llvm/17/lib64/libLLVMTestingSupport.a
/usr/lib/llvm/17/lib64/libllvm_gtest.a
/usr/lib/llvm/17/lib64/libllvm_gtest_main.a
```

Therefore, testing for libLLVMSupport is insufficient. We now try libLLVMCore
instead, as that appears to only be installed when LLVM truly has static libraries
available. libLLVMCore is handled as a LLVM component which gives us some guarantee
this is supposed to be happening and not a fluke.

(Specifically, LLVM's llvm/lib/Support/CMakeLists.txt pays 0 attention to
-DLLVM_BUILD_LLVM_DYLIB and -DLLVM_LINK_LLVM_DYLIB, and is hence only affected
by -DBUILD_SHARED_LIBS, which LLVM upstream say is only to be used for development.

Therefore, with -DBUILD_SHARED_LIBS=OFF (as is recommended/the default) and
-DLLVM_BUILD_LLVM_DYLIB=ON, you will get a static libLLVMSupport, without it
indicating anything about the rest of your configuration.)

Closes: mesonbuild#12323
Fixes: 89146e8
Signed-off-by: Sam James <sam@gentoo.org>
Signed-off-by: Eli Schwartz <eschwartz93@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
dependencies dependency:cmake Issues related to `dependency` with the `cmake` method
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant