From: Petr Hosek Date: Mon, 8 Aug 2016 22:57:25 +0000 (+0000) Subject: Allow building both shared and static library X-Git-Tag: llvmorg-4.0.0-rc1~13013 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9e49a3376eac7d879804c688d2863a8b49d968af;p=platform%2Fupstream%2Fllvm.git Allow building both shared and static library This change allows building both shared and static version of libc++ in a single build, sharing object files between both versions. Differential Revision: https://reviews.llvm.org/D23232 llvm-svn: 278068 --- diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt index 950070d..98886b0 100644 --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -52,6 +52,7 @@ MACRO_ENSURE_OUT_OF_SOURCE_BUILD( # Basic options --------------------------------------------------------------- option(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON) option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON) +option(LIBCXX_ENABLE_STATIC "Build libc++ as a static library." ON) option(LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY "Build libc++experimental.a" ON) option(LIBCXX_ENABLE_FILESYSTEM "Build filesystem as part of libc++experimental.a" ${LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY}) @@ -68,6 +69,10 @@ option(LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY "Install libc++experimental.a" OFF) set(LIBCXX_ABI_VERSION 1 CACHE STRING "ABI version of libc++.") option(LIBCXX_ABI_UNSTABLE "Unstable ABI of libc++." OFF) +if (NOT LIBCXX_ENABLE_SHARED AND NOT LIBCXX_ENABLE_STATIC) + message(FATAL_ERROR "libc++ must be built as either a shared or static library.") +endif() + # ABI Library options --------------------------------------------------------- set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING "Specify C++ ABI library to use." FORCE) diff --git a/libcxx/docs/BuildingLibcxx.rst b/libcxx/docs/BuildingLibcxx.rst index 5dd174a..6709352 100644 --- a/libcxx/docs/BuildingLibcxx.rst +++ b/libcxx/docs/BuildingLibcxx.rst @@ -150,8 +150,15 @@ libc++ specific options **Default**: ``ON`` - Build libc++ as a shared library. If ``OFF`` is specified then libc++ is - built as a static library. + Build libc++ as a shared library. Either :option:`LIBCXX_ENABLE_SHARED` or + :option:`LIBCXX_ENABLE_STATIC` has to be enabled. + +.. option:: LIBCXX_ENABLE_STATIC:BOOL + + **Default**: ``ON`` + + Build libc++ as a static library. Either :option:`LIBCXX_ENABLE_SHARED` or + :option:`LIBCXX_ENABLE_STATIC` has to be enabled. .. option:: LIBCXX_LIBDIR_SUFFIX:STRING diff --git a/libcxx/lib/CMakeLists.txt b/libcxx/lib/CMakeLists.txt index afc388e..cabf2e6 100644 --- a/libcxx/lib/CMakeLists.txt +++ b/libcxx/lib/CMakeLists.txt @@ -28,16 +28,6 @@ if(NOT LIBCXX_INSTALL_LIBRARY) set(exclude_from_all EXCLUDE_FROM_ALL) endif() -if (LIBCXX_ENABLE_SHARED) - add_library(cxx SHARED ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS}) -else() - add_library(cxx STATIC ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS}) -endif() - -if (DEFINED LIBCXX_CXX_ABI_DEPS) - add_dependencies(cxx LIBCXX_CXX_ABI_DEPS) -endif() - #if LIBCXX_CXX_ABI_LIBRARY_PATH is defined we want to add it to the search path. add_link_flags_if(LIBCXX_CXX_ABI_LIBRARY_PATH "-L${LIBCXX_CXX_ABI_LIBRARY_PATH}") @@ -139,18 +129,51 @@ if ( APPLE AND (LIBCXX_CXX_ABI_LIBNAME STREQUAL "libcxxabi" OR endif() endif() -target_link_libraries(cxx ${LIBCXX_LIBRARIES}) split_list(LIBCXX_COMPILE_FLAGS) split_list(LIBCXX_LINK_FLAGS) -set_target_properties(cxx +# Add a object library that contains the compiled source files. +add_library(cxx_objects OBJECT ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS}) + +set_target_properties(cxx_objects PROPERTIES COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}" - LINK_FLAGS "${LIBCXX_LINK_FLAGS}" - OUTPUT_NAME "c++" - VERSION "${LIBCXX_ABI_VERSION}.0" - SOVERSION "${LIBCXX_ABI_VERSION}" +) + +set(LIBCXX_TARGETS) + +# Build the shared library. +if (LIBCXX_ENABLE_SHARED) + add_library(cxx_shared SHARED $) + target_link_libraries(cxx_shared ${LIBCXX_LIBRARIES}) + set_target_properties(cxx_shared + PROPERTIES + LINK_FLAGS "${LIBCXX_LINK_FLAGS}" + OUTPUT_NAME "c++" + VERSION "${LIBCXX_ABI_VERSION}.0" + SOVERSION "${LIBCXX_ABI_VERSION}" ) + list(APPEND LIBCXX_TARGETS "cxx_shared") +endif() + +# Build the static library. +if (LIBCXX_ENABLE_STATIC) + add_library(cxx_static STATIC $) + target_link_libraries(cxx_static ${LIBCXX_LIBRARIES}) + set_target_properties(cxx_static + PROPERTIES + LINK_FLAGS "${LIBCXX_LINK_FLAGS}" + OUTPUT_NAME "c++" + ) + list(APPEND LIBCXX_TARGETS "cxx_static") +endif() + +# Add a meta-target for both libraries. +add_custom_target(cxx DEPENDS ${LIBCXX_TARGETS}) + +if (DEFINED LIBCXX_CXX_ABI_DEPS) + add_dependencies(cxx LIBCXX_CXX_ABI_DEPS) +endif() if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY) file(GLOB LIBCXX_EXPERIMENTAL_SOURCES ../src/experimental/*.cpp) @@ -158,7 +181,11 @@ if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY) file(GLOB LIBCXX_FILESYSTEM_SOURCES ../src/experimental/filesystem/*.cpp) endif() add_library(cxx_experimental STATIC ${LIBCXX_EXPERIMENTAL_SOURCES} ${LIBCXX_FILESYSTEM_SOURCES}) - target_link_libraries(cxx_experimental cxx) + if (LIBCXX_ENABLE_SHARED) + target_link_libraries(cxx_experimental cxx_shared) + else() + target_link_libraries(cxx_experimental cxx_static) + endif() set(experimental_flags "${LIBCXX_COMPILE_FLAGS}") check_flag_supported(-std=c++14) @@ -174,7 +201,7 @@ endif() # Generate a linker script inplace of a libc++.so symlink. Rerun this command # after cxx builds. -if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT) +if (LIBCXX_ENABLE_SHARED AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT) # Get the name of the ABI library and handle the case where CXXABI_LIBNAME # is a target name and not a library. Ex cxxabi_shared. set(SCRIPT_ABI_LIBNAME "${LIBCXX_CXX_ABI_LIBRARY}") @@ -183,11 +210,11 @@ if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT) endif() # Generate a linker script inplace of a libc++.so symlink. Rerun this command # after cxx builds. - add_custom_command(TARGET cxx POST_BUILD + add_custom_command(TARGET cxx_shared POST_BUILD COMMAND ${PYTHON_EXECUTABLE} ${LIBCXX_SOURCE_DIR}/utils/gen_link_script/gen_link_script.py ARGS - "$" + "$" "${SCRIPT_ABI_LIBNAME}" WORKING_DIRECTORY ${LIBCXX_BUILD_DIR} ) @@ -197,13 +224,13 @@ if (LIBCXX_INSTALL_LIBRARY) if (LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY) set(experimental_lib cxx_experimental) endif() - install(TARGETS cxx ${experimental_lib} + install(TARGETS ${LIBCXX_TARGETS} ${experimental_lib} LIBRARY DESTINATION lib${LIBCXX_LIBDIR_SUFFIX} COMPONENT libcxx ARCHIVE DESTINATION lib${LIBCXX_LIBDIR_SUFFIX} COMPONENT libcxx ) # NOTE: This install command must go after the cxx install command otherwise # it will not be executed after the library symlinks are installed. - if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT) + if (LIBCXX_ENABLE_SHARED AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT) # Replace the libc++ filename with $ # after we required CMake 3.0. install(FILES "${LIBCXX_LIBRARY_DIR}/libc++${CMAKE_SHARED_LIBRARY_SUFFIX}"