Commit 7ce797f2 by Abseil Team Committed by Copybara-Service

Enable building monolithic shared library on macOS and Linux.

PiperOrigin-RevId: 638284938
Change-Id: I4189215d85862a8eeaff5c477ff2e47252fa52d3
parent 64457068
...@@ -747,7 +747,12 @@ function(absl_make_dll) ...@@ -747,7 +747,12 @@ function(absl_make_dll)
else() else()
set(_dll "abseil_dll") set(_dll "abseil_dll")
set(_dll_files ${ABSL_INTERNAL_DLL_FILES}) set(_dll_files ${ABSL_INTERNAL_DLL_FILES})
set(_dll_libs "") set(_dll_libs
Threads::Threads
# TODO(#1495): Use $<LINK_LIBRARY:FRAMEWORK,CoreFoundation> once our
# minimum CMake version >= 3.24
$<$<PLATFORM_ID:Darwin>:-Wl,-framework,CoreFoundation>
)
set(_dll_compile_definitions "") set(_dll_compile_definitions "")
set(_dll_includes "") set(_dll_includes "")
set(_dll_consume "ABSL_CONSUME_DLL") set(_dll_consume "ABSL_CONSUME_DLL")
......
...@@ -149,6 +149,14 @@ set(ABSL_LOCAL_GOOGLETEST_DIR "/usr/src/googletest" CACHE PATH ...@@ -149,6 +149,14 @@ set(ABSL_LOCAL_GOOGLETEST_DIR "/usr/src/googletest" CACHE PATH
"If ABSL_USE_GOOGLETEST_HEAD is OFF and ABSL_GOOGLETEST_URL is not set, specifies the directory of a local GoogleTest checkout." "If ABSL_USE_GOOGLETEST_HEAD is OFF and ABSL_GOOGLETEST_URL is not set, specifies the directory of a local GoogleTest checkout."
) )
option(ABSL_BUILD_MONOLITHIC_SHARED_LIBS
"Build Abseil as a single shared library (always enabled for Windows)"
OFF
)
if(NOT BUILD_SHARED_LIBS AND ABSL_BUILD_MONOLITHIC_SHARED_LIBS)
message(WARNING "Not building a shared library because BUILD_SHARED_LIBS is not set. Ignoring ABSL_BUILD_MONOLITHIC_SHARED_LIBS.")
endif()
if((BUILD_TESTING AND ABSL_BUILD_TESTING) OR ABSL_BUILD_TEST_HELPERS) if((BUILD_TESTING AND ABSL_BUILD_TESTING) OR ABSL_BUILD_TEST_HELPERS)
if (ABSL_USE_EXTERNAL_GOOGLETEST) if (ABSL_USE_EXTERNAL_GOOGLETEST)
if (ABSL_FIND_GOOGLETEST) if (ABSL_FIND_GOOGLETEST)
......
...@@ -3,7 +3,7 @@ include(GENERATED_AbseilCopts) ...@@ -3,7 +3,7 @@ include(GENERATED_AbseilCopts)
set(ABSL_DEFAULT_LINKOPTS "") set(ABSL_DEFAULT_LINKOPTS "")
if (BUILD_SHARED_LIBS AND MSVC) if (BUILD_SHARED_LIBS AND (MSVC OR ABSL_BUILD_MONOLITHIC_SHARED_LIBS))
set(ABSL_BUILD_DLL TRUE) set(ABSL_BUILD_DLL TRUE)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
else() else()
......
...@@ -34,12 +34,23 @@ if [[ -z ${ABSL_CMAKE_BUILD_SHARED:-} ]]; then ...@@ -34,12 +34,23 @@ if [[ -z ${ABSL_CMAKE_BUILD_SHARED:-} ]]; then
ABSL_CMAKE_BUILD_SHARED="OFF ON" ABSL_CMAKE_BUILD_SHARED="OFF ON"
fi fi
if [[ -z ${ABSL_CMAKE_BUILD_MONOLITHIC_SHARED_LIBS:-} ]]; then
ABSL_CMAKE_BUILD_MONOLITHIC_SHARED_LIBS="OFF ON"
fi
source "${ABSEIL_ROOT}/ci/linux_docker_containers.sh" source "${ABSEIL_ROOT}/ci/linux_docker_containers.sh"
readonly DOCKER_CONTAINER=${LINUX_GCC_LATEST_CONTAINER} readonly DOCKER_CONTAINER=${LINUX_GCC_LATEST_CONTAINER}
for std in ${ABSL_CMAKE_CXX_STANDARDS}; do for std in ${ABSL_CMAKE_CXX_STANDARDS}; do
for compilation_mode in ${ABSL_CMAKE_BUILD_TYPES}; do for compilation_mode in ${ABSL_CMAKE_BUILD_TYPES}; do
for build_shared in ${ABSL_CMAKE_BUILD_SHARED}; do for build_shared in ${ABSL_CMAKE_BUILD_SHARED}; do
if [[ $build_shared == "OFF" ]]; then
monolithic_shared_options="OFF"
else
monolithic_shared_options="$ABSL_CMAKE_BUILD_MONOLITHIC_SHARED_LIBS"
fi
for monolithic_shared in $monolithic_shared_options; do
time docker run \ time docker run \
--mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \ --mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \
--tmpfs=/buildfs:exec \ --tmpfs=/buildfs:exec \
...@@ -57,10 +68,12 @@ for std in ${ABSL_CMAKE_CXX_STANDARDS}; do ...@@ -57,10 +68,12 @@ for std in ${ABSL_CMAKE_CXX_STANDARDS}; do
-DABSL_BUILD_TESTING=ON \ -DABSL_BUILD_TESTING=ON \
-DCMAKE_BUILD_TYPE=${compilation_mode} \ -DCMAKE_BUILD_TYPE=${compilation_mode} \
-DCMAKE_CXX_STANDARD=${std} \ -DCMAKE_CXX_STANDARD=${std} \
-DABSL_BUILD_MONOLITHIC_SHARED_LIBS=${monolithic_shared} \
-DCMAKE_MODULE_LINKER_FLAGS=\"-Wl,--no-undefined\" && \ -DCMAKE_MODULE_LINKER_FLAGS=\"-Wl,--no-undefined\" && \
make -j$(nproc) && \ make -j$(nproc) && \
TZDIR=/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo \ TZDIR=/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo \
ctest -j$(nproc) --output-on-failure" ctest -j$(nproc) --output-on-failure"
done done
done done
done
done done
...@@ -34,12 +34,23 @@ if [[ -z ${ABSL_CMAKE_BUILD_SHARED:-} ]]; then ...@@ -34,12 +34,23 @@ if [[ -z ${ABSL_CMAKE_BUILD_SHARED:-} ]]; then
ABSL_CMAKE_BUILD_SHARED="OFF ON" ABSL_CMAKE_BUILD_SHARED="OFF ON"
fi fi
if [[ -z ${ABSL_CMAKE_BUILD_MONOLITHIC_SHARED_LIBS:-} ]]; then
ABSL_CMAKE_BUILD_MONOLITHIC_SHARED_LIBS="OFF ON"
fi
source "${ABSEIL_ROOT}/ci/linux_docker_containers.sh" source "${ABSEIL_ROOT}/ci/linux_docker_containers.sh"
readonly DOCKER_CONTAINER=${LINUX_ALPINE_CONTAINER} readonly DOCKER_CONTAINER=${LINUX_ALPINE_CONTAINER}
for std in ${ABSL_CMAKE_CXX_STANDARDS}; do for std in ${ABSL_CMAKE_CXX_STANDARDS}; do
for compilation_mode in ${ABSL_CMAKE_BUILD_TYPES}; do for compilation_mode in ${ABSL_CMAKE_BUILD_TYPES}; do
for build_shared in ${ABSL_CMAKE_BUILD_SHARED}; do for build_shared in ${ABSL_CMAKE_BUILD_SHARED}; do
if [[ $build_shared == "OFF" ]]; then
monolithic_shared_options="OFF"
else
monolithic_shared_options="$ABSL_CMAKE_BUILD_MONOLITHIC_SHARED_LIBS"
fi
for monolithic_shared in $monolithic_shared_options; do
time docker run \ time docker run \
--mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \ --mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \
--tmpfs=/buildfs:exec \ --tmpfs=/buildfs:exec \
...@@ -53,13 +64,16 @@ for std in ${ABSL_CMAKE_CXX_STANDARDS}; do ...@@ -53,13 +64,16 @@ for std in ${ABSL_CMAKE_CXX_STANDARDS}; do
/bin/sh -c " /bin/sh -c "
cmake /abseil-cpp \ cmake /abseil-cpp \
-DABSL_GOOGLETEST_DOWNLOAD_URL=${ABSL_GOOGLETEST_DOWNLOAD_URL} \ -DABSL_GOOGLETEST_DOWNLOAD_URL=${ABSL_GOOGLETEST_DOWNLOAD_URL} \
-DBUILD_SHARED_LIBS=${build_shared} \
-DABSL_BUILD_TESTING=ON \ -DABSL_BUILD_TESTING=ON \
-DCMAKE_BUILD_TYPE=${compilation_mode} \ -DCMAKE_BUILD_TYPE=${compilation_mode} \
-DCMAKE_CXX_STANDARD=${std} \ -DCMAKE_CXX_STANDARD=${std} \
-DABSL_BUILD_MONOLITHIC_SHARED_LIBS=${monolithic_shared} \
-DCMAKE_MODULE_LINKER_FLAGS=\"-Wl,--no-undefined\" && \ -DCMAKE_MODULE_LINKER_FLAGS=\"-Wl,--no-undefined\" && \
make -j$(nproc) && \ make -j$(nproc) && \
TZDIR=/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo \ TZDIR=/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo \
ctest -j$(nproc) --output-on-failure" ctest -j$(nproc) --output-on-failure"
done done
done done
done
done done
...@@ -36,8 +36,19 @@ if [[ -z ${ABSL_CMAKE_BUILD_SHARED:-} ]]; then ...@@ -36,8 +36,19 @@ if [[ -z ${ABSL_CMAKE_BUILD_SHARED:-} ]]; then
ABSL_CMAKE_BUILD_SHARED="OFF ON" ABSL_CMAKE_BUILD_SHARED="OFF ON"
fi fi
if [[ -z ${ABSL_CMAKE_BUILD_MONOLITHIC_SHARED_LIBS:-} ]]; then
ABSL_CMAKE_BUILD_MONOLITHIC_SHARED_LIBS="OFF ON"
fi
for compilation_mode in ${ABSL_CMAKE_BUILD_TYPES}; do for compilation_mode in ${ABSL_CMAKE_BUILD_TYPES}; do
for build_shared in ${ABSL_CMAKE_BUILD_SHARED}; do for build_shared in ${ABSL_CMAKE_BUILD_SHARED}; do
if [[ $build_shared == "OFF" ]]; then
monolithic_shared_options="OFF"
else
monolithic_shared_options="$ABSL_CMAKE_BUILD_MONOLITHIC_SHARED_LIBS"
fi
for monolithic_shared in $monolithic_shared_options; do
BUILD_DIR=$(mktemp -d ${compilation_mode}.XXXXXXXX) BUILD_DIR=$(mktemp -d ${compilation_mode}.XXXXXXXX)
cd ${BUILD_DIR} cd ${BUILD_DIR}
...@@ -49,9 +60,11 @@ for compilation_mode in ${ABSL_CMAKE_BUILD_TYPES}; do ...@@ -49,9 +60,11 @@ for compilation_mode in ${ABSL_CMAKE_BUILD_TYPES}; do
-DCMAKE_BUILD_TYPE=${compilation_mode} \ -DCMAKE_BUILD_TYPE=${compilation_mode} \
-DCMAKE_CXX_STANDARD=14 \ -DCMAKE_CXX_STANDARD=14 \
-DCMAKE_MODULE_LINKER_FLAGS="-Wl,--no-undefined" \ -DCMAKE_MODULE_LINKER_FLAGS="-Wl,--no-undefined" \
-DABSL_BUILD_MONOLITHIC_SHARED_LIBS=${monolithic_shared} \
-DABSL_GOOGLETEST_DOWNLOAD_URL="${ABSL_GOOGLETEST_DOWNLOAD_URL}" -DABSL_GOOGLETEST_DOWNLOAD_URL="${ABSL_GOOGLETEST_DOWNLOAD_URL}"
time cmake --build . time cmake --build .
time TZDIR=${ABSEIL_ROOT}/absl/time/internal/cctz/testdata/zoneinfo \ time TZDIR=${ABSEIL_ROOT}/absl/time/internal/cctz/testdata/zoneinfo \
ctest -C ${compilation_mode} --output-on-failure ctest -C ${compilation_mode} --output-on-failure
done done
done
done done
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment