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,33 +34,46 @@ if [[ -z ${ABSL_CMAKE_BUILD_SHARED:-} ]]; then ...@@ -34,33 +34,46 @@ 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
time docker run \ if [[ $build_shared == "OFF" ]]; then
--mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \ monolithic_shared_options="OFF"
--tmpfs=/buildfs:exec \ else
--workdir=/buildfs \ monolithic_shared_options="$ABSL_CMAKE_BUILD_MONOLITHIC_SHARED_LIBS"
--cap-add=SYS_PTRACE \ fi
--rm \
-e CFLAGS="-Werror" \ for monolithic_shared in $monolithic_shared_options; do
-e CXXFLAGS="-Werror" \ time docker run \
${DOCKER_EXTRA_ARGS:-} \ --mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \
"${DOCKER_CONTAINER}" \ --tmpfs=/buildfs:exec \
/bin/bash -c " --workdir=/buildfs \
cmake /abseil-cpp \ --cap-add=SYS_PTRACE \
-DABSL_GOOGLETEST_DOWNLOAD_URL=${ABSL_GOOGLETEST_DOWNLOAD_URL} \ --rm \
-DBUILD_SHARED_LIBS=${build_shared} \ -e CFLAGS="-Werror" \
-DABSL_BUILD_TESTING=ON \ -e CXXFLAGS="-Werror" \
-DCMAKE_BUILD_TYPE=${compilation_mode} \ ${DOCKER_EXTRA_ARGS:-} \
-DCMAKE_CXX_STANDARD=${std} \ "${DOCKER_CONTAINER}" \
-DCMAKE_MODULE_LINKER_FLAGS=\"-Wl,--no-undefined\" && \ /bin/bash -c "
make -j$(nproc) && \ cmake /abseil-cpp \
TZDIR=/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo \ -DABSL_GOOGLETEST_DOWNLOAD_URL=${ABSL_GOOGLETEST_DOWNLOAD_URL} \
ctest -j$(nproc) --output-on-failure" -DBUILD_SHARED_LIBS=${build_shared} \
-DABSL_BUILD_TESTING=ON \
-DCMAKE_BUILD_TYPE=${compilation_mode} \
-DCMAKE_CXX_STANDARD=${std} \
-DABSL_BUILD_MONOLITHIC_SHARED_LIBS=${monolithic_shared} \
-DCMAKE_MODULE_LINKER_FLAGS=\"-Wl,--no-undefined\" && \
make -j$(nproc) && \
TZDIR=/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo \
ctest -j$(nproc) --output-on-failure"
done
done done
done done
done done
...@@ -34,32 +34,46 @@ if [[ -z ${ABSL_CMAKE_BUILD_SHARED:-} ]]; then ...@@ -34,32 +34,46 @@ 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
time docker run \ if [[ $build_shared == "OFF" ]]; then
--mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \ monolithic_shared_options="OFF"
--tmpfs=/buildfs:exec \ else
--workdir=/buildfs \ monolithic_shared_options="$ABSL_CMAKE_BUILD_MONOLITHIC_SHARED_LIBS"
--cap-add=SYS_PTRACE \ fi
--rm \
-e CFLAGS="-Werror" \ for monolithic_shared in $monolithic_shared_options; do
-e CXXFLAGS="-Werror" \ time docker run \
${DOCKER_EXTRA_ARGS:-} \ --mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \
"${DOCKER_CONTAINER}" \ --tmpfs=/buildfs:exec \
/bin/sh -c " --workdir=/buildfs \
cmake /abseil-cpp \ --cap-add=SYS_PTRACE \
-DABSL_GOOGLETEST_DOWNLOAD_URL=${ABSL_GOOGLETEST_DOWNLOAD_URL} \ --rm \
-DABSL_BUILD_TESTING=ON \ -e CFLAGS="-Werror" \
-DCMAKE_BUILD_TYPE=${compilation_mode} \ -e CXXFLAGS="-Werror" \
-DCMAKE_CXX_STANDARD=${std} \ ${DOCKER_EXTRA_ARGS:-} \
-DCMAKE_MODULE_LINKER_FLAGS=\"-Wl,--no-undefined\" && \ "${DOCKER_CONTAINER}" \
make -j$(nproc) && \ /bin/sh -c "
TZDIR=/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo \ cmake /abseil-cpp \
ctest -j$(nproc) --output-on-failure" -DABSL_GOOGLETEST_DOWNLOAD_URL=${ABSL_GOOGLETEST_DOWNLOAD_URL} \
-DBUILD_SHARED_LIBS=${build_shared} \
-DABSL_BUILD_TESTING=ON \
-DCMAKE_BUILD_TYPE=${compilation_mode} \
-DCMAKE_CXX_STANDARD=${std} \
-DABSL_BUILD_MONOLITHIC_SHARED_LIBS=${monolithic_shared} \
-DCMAKE_MODULE_LINKER_FLAGS=\"-Wl,--no-undefined\" && \
make -j$(nproc) && \
TZDIR=/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo \
ctest -j$(nproc) --output-on-failure"
done
done done
done done
done done
...@@ -36,22 +36,35 @@ if [[ -z ${ABSL_CMAKE_BUILD_SHARED:-} ]]; then ...@@ -36,22 +36,35 @@ 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
BUILD_DIR=$(mktemp -d ${compilation_mode}.XXXXXXXX) if [[ $build_shared == "OFF" ]]; then
cd ${BUILD_DIR} monolithic_shared_options="OFF"
else
# TODO(absl-team): Enable -Werror once all warnings are fixed. monolithic_shared_options="$ABSL_CMAKE_BUILD_MONOLITHIC_SHARED_LIBS"
time cmake ${ABSEIL_ROOT} \ fi
-GXcode \
-DBUILD_SHARED_LIBS=${build_shared} \ for monolithic_shared in $monolithic_shared_options; do
-DABSL_BUILD_TESTING=ON \ BUILD_DIR=$(mktemp -d ${compilation_mode}.XXXXXXXX)
-DCMAKE_BUILD_TYPE=${compilation_mode} \ cd ${BUILD_DIR}
-DCMAKE_CXX_STANDARD=14 \
-DCMAKE_MODULE_LINKER_FLAGS="-Wl,--no-undefined" \ # TODO(absl-team): Enable -Werror once all warnings are fixed.
-DABSL_GOOGLETEST_DOWNLOAD_URL="${ABSL_GOOGLETEST_DOWNLOAD_URL}" time cmake ${ABSEIL_ROOT} \
time cmake --build . -GXcode \
time TZDIR=${ABSEIL_ROOT}/absl/time/internal/cctz/testdata/zoneinfo \ -DBUILD_SHARED_LIBS=${build_shared} \
ctest -C ${compilation_mode} --output-on-failure -DABSL_BUILD_TESTING=ON \
-DCMAKE_BUILD_TYPE=${compilation_mode} \
-DCMAKE_CXX_STANDARD=14 \
-DCMAKE_MODULE_LINKER_FLAGS="-Wl,--no-undefined" \
-DABSL_BUILD_MONOLITHIC_SHARED_LIBS=${monolithic_shared} \
-DABSL_GOOGLETEST_DOWNLOAD_URL="${ABSL_GOOGLETEST_DOWNLOAD_URL}"
time cmake --build .
time TZDIR=${ABSEIL_ROOT}/absl/time/internal/cctz/testdata/zoneinfo \
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