[PATCH] D61804: Support building shared and static libraries simultaneously
Wink Saville via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri May 10 13:43:39 PDT 2019
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)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61804.199078.patch
Type: text/x-patch
Size: 2744 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190510/4aabb893/attachment.bin>
More information about the cfe-commits
mailing list