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 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@278068 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -52,6 +52,7 @@ MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
|
|||||||
# Basic options ---------------------------------------------------------------
|
# Basic options ---------------------------------------------------------------
|
||||||
option(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)
|
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_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_EXPERIMENTAL_LIBRARY "Build libc++experimental.a" ON)
|
||||||
option(LIBCXX_ENABLE_FILESYSTEM
|
option(LIBCXX_ENABLE_FILESYSTEM
|
||||||
"Build filesystem as part of libc++experimental.a" ${LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY})
|
"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++.")
|
set(LIBCXX_ABI_VERSION 1 CACHE STRING "ABI version of libc++.")
|
||||||
option(LIBCXX_ABI_UNSTABLE "Unstable ABI of libc++." OFF)
|
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 ---------------------------------------------------------
|
# ABI Library options ---------------------------------------------------------
|
||||||
set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING
|
set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING
|
||||||
"Specify C++ ABI library to use." FORCE)
|
"Specify C++ ABI library to use." FORCE)
|
||||||
|
|||||||
@@ -150,8 +150,15 @@ libc++ specific options
|
|||||||
|
|
||||||
**Default**: ``ON``
|
**Default**: ``ON``
|
||||||
|
|
||||||
Build libc++ as a shared library. If ``OFF`` is specified then libc++ is
|
Build libc++ as a shared library. Either :option:`LIBCXX_ENABLE_SHARED` or
|
||||||
built as a static library.
|
: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
|
.. option:: LIBCXX_LIBDIR_SUFFIX:STRING
|
||||||
|
|
||||||
|
|||||||
@@ -28,16 +28,6 @@ if(NOT LIBCXX_INSTALL_LIBRARY)
|
|||||||
set(exclude_from_all EXCLUDE_FROM_ALL)
|
set(exclude_from_all EXCLUDE_FROM_ALL)
|
||||||
endif()
|
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.
|
#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}")
|
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()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_libraries(cxx ${LIBCXX_LIBRARIES})
|
|
||||||
split_list(LIBCXX_COMPILE_FLAGS)
|
split_list(LIBCXX_COMPILE_FLAGS)
|
||||||
split_list(LIBCXX_LINK_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
|
PROPERTIES
|
||||||
COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}"
|
COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}"
|
||||||
LINK_FLAGS "${LIBCXX_LINK_FLAGS}"
|
)
|
||||||
OUTPUT_NAME "c++"
|
|
||||||
VERSION "${LIBCXX_ABI_VERSION}.0"
|
set(LIBCXX_TARGETS)
|
||||||
SOVERSION "${LIBCXX_ABI_VERSION}"
|
|
||||||
|
# Build the shared library.
|
||||||
|
if (LIBCXX_ENABLE_SHARED)
|
||||||
|
add_library(cxx_shared SHARED $<TARGET_OBJECTS:cxx_objects>)
|
||||||
|
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_OBJECTS:cxx_objects>)
|
||||||
|
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)
|
if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY)
|
||||||
file(GLOB LIBCXX_EXPERIMENTAL_SOURCES ../src/experimental/*.cpp)
|
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)
|
file(GLOB LIBCXX_FILESYSTEM_SOURCES ../src/experimental/filesystem/*.cpp)
|
||||||
endif()
|
endif()
|
||||||
add_library(cxx_experimental STATIC ${LIBCXX_EXPERIMENTAL_SOURCES} ${LIBCXX_FILESYSTEM_SOURCES})
|
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}")
|
set(experimental_flags "${LIBCXX_COMPILE_FLAGS}")
|
||||||
check_flag_supported(-std=c++14)
|
check_flag_supported(-std=c++14)
|
||||||
@@ -174,7 +201,7 @@ endif()
|
|||||||
|
|
||||||
# Generate a linker script inplace of a libc++.so symlink. Rerun this command
|
# Generate a linker script inplace of a libc++.so symlink. Rerun this command
|
||||||
# after cxx builds.
|
# 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
|
# 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.
|
# is a target name and not a library. Ex cxxabi_shared.
|
||||||
set(SCRIPT_ABI_LIBNAME "${LIBCXX_CXX_ABI_LIBRARY}")
|
set(SCRIPT_ABI_LIBNAME "${LIBCXX_CXX_ABI_LIBRARY}")
|
||||||
@@ -183,11 +210,11 @@ if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
|
|||||||
endif()
|
endif()
|
||||||
# Generate a linker script inplace of a libc++.so symlink. Rerun this command
|
# Generate a linker script inplace of a libc++.so symlink. Rerun this command
|
||||||
# after cxx builds.
|
# after cxx builds.
|
||||||
add_custom_command(TARGET cxx POST_BUILD
|
add_custom_command(TARGET cxx_shared POST_BUILD
|
||||||
COMMAND
|
COMMAND
|
||||||
${PYTHON_EXECUTABLE} ${LIBCXX_SOURCE_DIR}/utils/gen_link_script/gen_link_script.py
|
${PYTHON_EXECUTABLE} ${LIBCXX_SOURCE_DIR}/utils/gen_link_script/gen_link_script.py
|
||||||
ARGS
|
ARGS
|
||||||
"$<TARGET_LINKER_FILE:cxx>"
|
"$<TARGET_LINKER_FILE:cxx_shared>"
|
||||||
"${SCRIPT_ABI_LIBNAME}"
|
"${SCRIPT_ABI_LIBNAME}"
|
||||||
WORKING_DIRECTORY ${LIBCXX_BUILD_DIR}
|
WORKING_DIRECTORY ${LIBCXX_BUILD_DIR}
|
||||||
)
|
)
|
||||||
@@ -197,13 +224,13 @@ if (LIBCXX_INSTALL_LIBRARY)
|
|||||||
if (LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY)
|
if (LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY)
|
||||||
set(experimental_lib cxx_experimental)
|
set(experimental_lib cxx_experimental)
|
||||||
endif()
|
endif()
|
||||||
install(TARGETS cxx ${experimental_lib}
|
install(TARGETS ${LIBCXX_TARGETS} ${experimental_lib}
|
||||||
LIBRARY DESTINATION lib${LIBCXX_LIBDIR_SUFFIX} COMPONENT libcxx
|
LIBRARY DESTINATION lib${LIBCXX_LIBDIR_SUFFIX} COMPONENT libcxx
|
||||||
ARCHIVE 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
|
# NOTE: This install command must go after the cxx install command otherwise
|
||||||
# it will not be executed after the library symlinks are installed.
|
# 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 $<TARGET_LINKER_FILE:cxx>
|
# Replace the libc++ filename with $<TARGET_LINKER_FILE:cxx>
|
||||||
# after we required CMake 3.0.
|
# after we required CMake 3.0.
|
||||||
install(FILES "${LIBCXX_LIBRARY_DIR}/libc++${CMAKE_SHARED_LIBRARY_SUFFIX}"
|
install(FILES "${LIBCXX_LIBRARY_DIR}/libc++${CMAKE_SHARED_LIBRARY_SUFFIX}"
|
||||||
|
|||||||
Reference in New Issue
Block a user