winksaville created this revision. winksaville added reviewers: tstellar, morehouse, gottesmm, chapuni. Herald added subscribers: llvm-commits, cfe-commits, mgorny. Herald added projects: clang, LLVM.
I ran into the need for both while trying to compile zig (https://ziglang.org) on my Arch Linux system and it fails. The problem is that the Arch Linux clang package only provides shared libraries using the following cmake command: cmake .. -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr \ -DPYTHON_EXECUTABLE=/usr/bin/python \ -DBUILD_SHARED_LIBS=ON \ -DLLVM_LINK_LLVM_DYLIB=ON \ -DLLVM_ENABLE_RTTI=ON \ -DLLVM_BUILD_TESTS=ON \ -DLLVM_INCLUDE_DOCS=ON \ -DLLVM_BUILD_DOCS=ON \ -DLLVM_ENABLE_SPHINX=ON \ -DSPHINX_WARNINGS_AS_ERRORS=OFF \ -DLLVM_EXTERNAL_LIT=/usr/bin/lit \ -DLLVM_MAIN_SRC_DIR="$srcdir/llvm-$pkgver.src" In particular, it uses "BUILD_SHARED_LIBS=ON" to get the shared libraries. This works but there are no static libraries and further a note in the documentation says, https://llvm.org/docs/CMake.html#llvm-specific-variables : "BUILD_SHARED_LIBS is only recommended for use by LLVM developers. If you want to build LLVM as a shared library, you should use the LLVM_BUILD_LLVM_DYLIB option." So it seemed to me it a solution would be to provide an easy way to build clang or other llvm subprojects with both static and shared libraries. As it turns out on small number modifications were needed: clang/CMAkeLists.txt: - Add options CLANG_ENABLE_STATIC_LIBRARIES and CLANG_ENABLE_SHARED_LIBRARIES These are defaulted to ON so libclang* libraries are built as static and shared. As these are options they can be overridden on the cmake command line. clang/cmake/modules/AddClang.cmake add_clang_library: - Add support for STATIC, SHARED or both - Add support for OUTPUT_NAME which defaults to the ${name} passed to add_clang_library llvm/cmake/modules/AddLLVM.cmake llvm_add_library: - Changed so when both SHARED and STATIC are passed SHARED is built first as cmake object ${name}_shared. Without this change llvm_add_library causes the shared libraries to be linked to clang rather than the static library and clang fails when run with: $ ./bin/clang-9 --version : CommandLine Error: Option 'use-dbg-addr' registered more than once! LLVM ERROR: inconsistency in registered CommandLine options Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D61804 Files: clang/CMakeLists.txt clang/cmake/modules/AddClang.cmake llvm/cmake/modules/AddLLVM.cmake Index: llvm/cmake/modules/AddLLVM.cmake =================================================================== --- llvm/cmake/modules/AddLLVM.cmake +++ llvm/cmake/modules/AddLLVM.cmake @@ -442,20 +442,20 @@ endif() if(ARG_SHARED AND ARG_STATIC) - # static - set(name_static "${name}_static") + # Do shared first + set(name_shared "${name}_shared") if(ARG_OUTPUT_NAME) set(output_name OUTPUT_NAME "${ARG_OUTPUT_NAME}") endif() # DEPENDS has been appended to LLVM_COMMON_LIBS. - llvm_add_library(${name_static} STATIC + llvm_add_library(${name_shared} SHARED ${output_name} OBJLIBS ${ALL_FILES} # objlib LINK_LIBS ${ARG_LINK_LIBS} LINK_COMPONENTS ${ARG_LINK_COMPONENTS} ) - # FIXME: Add name_static to anywhere in TARGET ${name}'s PROPERTY. - set(ARG_STATIC) + # FIXME: Add name_shared to anywhere in TARGET ${name}'s PROPERTY. + set(ARG_SHARED) endif() if(ARG_MODULE) Index: clang/cmake/modules/AddClang.cmake =================================================================== --- clang/cmake/modules/AddClang.cmake +++ clang/cmake/modules/AddClang.cmake @@ -44,8 +44,8 @@ macro(add_clang_library name) cmake_parse_arguments(ARG - "SHARED" - "" + "SHARED;STATIC" + "OUTPUT_NAME" "ADDITIONAL_HEADERS" ${ARGN}) set(srcs) @@ -80,10 +80,20 @@ ${ARG_ADDITIONAL_HEADERS} # It may contain unparsed unknown args. ) endif() - if(ARG_SHARED) + if(ARG_SHARED OR CLANG_ENABLE_SHARED_LIBRARIES) set(ARG_ENABLE_SHARED SHARED) endif() - llvm_add_library(${name} ${ARG_ENABLE_SHARED} ${ARG_UNPARSED_ARGUMENTS} ${srcs}) + if(ARG_STATIC OR CLANG_ENABLE_STATIC_LIBRARIES) + set(ARG_ENABLE_STATIC STATIC) + endif() + if(ARG_OUTPUT_NAME) + set(NAME_OUTPUT OUTPUT_NAME ${ARG_OUTPUT_NAME}) + elseif(ARG_SHARED AND ARG_STATIC) + set(NAME_OUTPUT OUTPUT_NAME ${name}) + else() + set(NAME_OUTPUT) + endif() + llvm_add_library(${name} ${NAME_OUTPUT} ${ARG_ENABLE_SHARED} ${ARG_ENABLE_STATIC} ${ARG_UNPARSED_ARGUMENTS} ${srcs}) if(TARGET ${name}) target_link_libraries(${name} INTERFACE ${LLVM_COMMON_LIBS}) Index: clang/CMakeLists.txt =================================================================== --- clang/CMakeLists.txt +++ clang/CMakeLists.txt @@ -447,6 +447,9 @@ option(CLANG_ENABLE_ARCMT "Build ARCMT." ON) option(CLANG_ENABLE_STATIC_ANALYZER "Build static analyzer." ON) +option(CLANG_ENABLE_SHARED_LIBRARIES "Build libclang* as shared libraries." ON) +option(CLANG_ENABLE_STATIC_LIBRARIES "Build libclang* as static libraries." ON) + option(CLANG_ENABLE_PROTO_FUZZER "Build Clang protobuf fuzzer." OFF) if(NOT CLANG_ENABLE_STATIC_ANALYZER AND CLANG_ENABLE_ARCMT)
Index: llvm/cmake/modules/AddLLVM.cmake =================================================================== --- llvm/cmake/modules/AddLLVM.cmake +++ llvm/cmake/modules/AddLLVM.cmake @@ -442,20 +442,20 @@ endif() if(ARG_SHARED AND ARG_STATIC) - # static - set(name_static "${name}_static") + # Do shared first + set(name_shared "${name}_shared") if(ARG_OUTPUT_NAME) set(output_name OUTPUT_NAME "${ARG_OUTPUT_NAME}") endif() # DEPENDS has been appended to LLVM_COMMON_LIBS. - llvm_add_library(${name_static} STATIC + llvm_add_library(${name_shared} SHARED ${output_name} OBJLIBS ${ALL_FILES} # objlib LINK_LIBS ${ARG_LINK_LIBS} LINK_COMPONENTS ${ARG_LINK_COMPONENTS} ) - # FIXME: Add name_static to anywhere in TARGET ${name}'s PROPERTY. - set(ARG_STATIC) + # FIXME: Add name_shared to anywhere in TARGET ${name}'s PROPERTY. + set(ARG_SHARED) endif() if(ARG_MODULE) Index: clang/cmake/modules/AddClang.cmake =================================================================== --- clang/cmake/modules/AddClang.cmake +++ clang/cmake/modules/AddClang.cmake @@ -44,8 +44,8 @@ macro(add_clang_library name) cmake_parse_arguments(ARG - "SHARED" - "" + "SHARED;STATIC" + "OUTPUT_NAME" "ADDITIONAL_HEADERS" ${ARGN}) set(srcs) @@ -80,10 +80,20 @@ ${ARG_ADDITIONAL_HEADERS} # It may contain unparsed unknown args. ) endif() - if(ARG_SHARED) + if(ARG_SHARED OR CLANG_ENABLE_SHARED_LIBRARIES) set(ARG_ENABLE_SHARED SHARED) endif() - llvm_add_library(${name} ${ARG_ENABLE_SHARED} ${ARG_UNPARSED_ARGUMENTS} ${srcs}) + if(ARG_STATIC OR CLANG_ENABLE_STATIC_LIBRARIES) + set(ARG_ENABLE_STATIC STATIC) + endif() + if(ARG_OUTPUT_NAME) + set(NAME_OUTPUT OUTPUT_NAME ${ARG_OUTPUT_NAME}) + elseif(ARG_SHARED AND ARG_STATIC) + set(NAME_OUTPUT OUTPUT_NAME ${name}) + else() + set(NAME_OUTPUT) + endif() + llvm_add_library(${name} ${NAME_OUTPUT} ${ARG_ENABLE_SHARED} ${ARG_ENABLE_STATIC} ${ARG_UNPARSED_ARGUMENTS} ${srcs}) if(TARGET ${name}) target_link_libraries(${name} INTERFACE ${LLVM_COMMON_LIBS}) Index: clang/CMakeLists.txt =================================================================== --- clang/CMakeLists.txt +++ clang/CMakeLists.txt @@ -447,6 +447,9 @@ option(CLANG_ENABLE_ARCMT "Build ARCMT." ON) option(CLANG_ENABLE_STATIC_ANALYZER "Build static analyzer." ON) +option(CLANG_ENABLE_SHARED_LIBRARIES "Build libclang* as shared libraries." ON) +option(CLANG_ENABLE_STATIC_LIBRARIES "Build libclang* as static libraries." ON) + option(CLANG_ENABLE_PROTO_FUZZER "Build Clang protobuf fuzzer." OFF) if(NOT CLANG_ENABLE_STATIC_ANALYZER AND CLANG_ENABLE_ARCMT)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits