Skip to content

Commit

Permalink
Create a build with libc++ on Linux (#1771)
Browse files Browse the repository at this point in the history
  • Loading branch information
remyabel authored and coryan committed Jan 6, 2019
1 parent 3e3b3bd commit ca5d9bd
Show file tree
Hide file tree
Showing 12 changed files with 42 additions and 6 deletions.
8 changes: 5 additions & 3 deletions .travis.yml
Expand Up @@ -118,12 +118,14 @@ matrix:
CMAKE_FLAGS=-DGOOGLE_CLOUD_CPP_ENABLE_CXX_EXCEPTIONS=no
DISTRO=ubuntu
DISTRO_VERSION=16.04
- # Compile on Fedora.
- # Compile on Fedora with libc++.
os: linux
compiler: gcc
compiler: clang
env:
CMAKE_FLAGS=-DBUILD_SHARED_LIBS=ON
DISTRO=fedora
DISTRO_VERSION=28
DISTRO_VERSION=29
USE_LIBCXX=yes
if: repo =~ ^GoogleCloudPlatform/ or head_repo =~ ^GoogleCloudPlatform/
- # Compile on CentOS.
os: linux
Expand Down
2 changes: 2 additions & 0 deletions CMakeLists.txt
Expand Up @@ -73,6 +73,8 @@ cmake -DGOOGLE_CLOUD_CPP_ENABLE_MACOS_OPENSSL_CHECK=OFF ...
endif ()
endif (APPLE)

option(GOOGLE_CLOUD_CPP_USE_LIBCXX "Build with libcxx and libcxxabi" OFF)

# If ccache is installed use it for the build. This makes the Travis
# configuration agnostic as to wether ccache is installed or not.
option(
Expand Down
2 changes: 2 additions & 0 deletions ci/travis/Dockerfile.fedora
Expand Up @@ -30,6 +30,8 @@ RUN dnf makecache && dnf install -y \
gcc-c++ \
git \
libcurl-devel \
libcxx-devel \
libcxxabi-devel \
libtool \
make \
ncurses-term \
Expand Down
8 changes: 8 additions & 0 deletions ci/travis/build-docker.sh
Expand Up @@ -31,6 +31,10 @@ source "${PROJECT_ROOT}/ci/colors.sh"

(cd "${PROJECT_ROOT}" ; ./ci/check-style.sh)

# TODO (#1797): this is a workaround for the shared library error.
readonly LD_LIBRARY_PATH="${PWD}/${BUILD_OUTPUT}/external/lib:${PWD}/${BUILD_OUTPUT}/external/lib64"
export LD_LIBRARY_PATH

CMAKE_COMMAND="cmake"
if [ "${SCAN_BUILD}" = "yes" ]; then
CMAKE_COMMAND="scan-build --use-cc=${CC} --use-c++=${CXX} cmake"
Expand All @@ -51,6 +55,10 @@ if [ "${SCAN_BUILD:-}" = "yes" ]; then
cmake_install_flags="${cmake_install_flags} -DGOOGLE_CLOUD_CPP_ENABLE_CCACHE=OFF"
fi

if [ "${USE_LIBCXX:-}" = "yes" ]; then
cmake_install_flags="${cmake_install_flags} -DGOOGLE_CLOUD_CPP_USE_LIBCXX=ON"
fi

${CMAKE_COMMAND} \
-DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \
${cmake_install_flags} \
Expand Down
1 change: 1 addition & 0 deletions ci/travis/build-linux.sh
Expand Up @@ -49,6 +49,7 @@ sudo docker run \
--env NCPU="${NCPU:-2}" \
--env BUILD_TYPE="${BUILD_TYPE:-Release}" \
--env BUILD_TESTING="${BUILD_TESTING:-}" \
--env USE_LIBCXX="${USE_LIBCXX:-}" \
--env CHECK_ABI="${CHECK_ABI:-}" \
--env CHECK_STYLE="${CHECK_STYLE:-}" \
--env SCAN_BUILD="${SCAN_BUILD:-}" \
Expand Down
4 changes: 4 additions & 0 deletions cmake/GoogleCloudCppCommon.cmake
Expand Up @@ -111,6 +111,10 @@ function (google_cloud_cpp_add_common_options target)
if (GOOGLE_CLOUD_CPP_COMPILER_SUPPORTS_WERROR)
target_compile_options(${target} INTERFACE "-Werror")
endif ()
if (GOOGLE_CLOUD_CPP_USE_LIBCXX)
target_compile_options(${target} INTERFACE "-stdlib=libc++")
target_link_libraries(${target} INTERFACE "-stdlib=libc++" "c++abi")
endif ()
endfunction ()

function (google_cloud_cpp_add_clang_tidy target)
Expand Down
4 changes: 4 additions & 0 deletions cmake/external/crc32c.cmake
Expand Up @@ -50,6 +50,10 @@ if (NOT TARGET crc32c_project)
-DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS}
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DCMAKE_PREFIX_PATH=<INSTALL_DIR>
$<$<BOOL:${GOOGLE_CLOUD_CPP_USE_LIBCXX}>:
-DCMAKE_CXX_FLAGS=-stdlib=libc++
-DCMAKE_SHARED_LINKER_FLAGS=-Wl,-lc++abi
>
BUILD_COMMAND ${CMAKE_COMMAND}
--build
<BINARY_DIR>
Expand Down
5 changes: 5 additions & 0 deletions cmake/external/googletest.cmake
Expand Up @@ -51,6 +51,10 @@ if (NOT TARGET googletest_project)
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS}
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
$<$<BOOL:${GOOGLE_CLOUD_CPP_USE_LIBCXX}>:
-DCMAKE_CXX_FLAGS=-stdlib=libc++
-DCMAKE_SHARED_LINKER_FLAGS=-Wl,-lc++abi
>
BUILD_COMMAND ${CMAKE_COMMAND}
--build
<BINARY_DIR>
Expand All @@ -74,6 +78,7 @@ if (NOT TARGET googletest_project)
add_dependencies(GTest::gtest googletest_project)
set_library_properties_for_external_project(GTest::gtest
gtest${_lib_postfix})

set_property(TARGET GTest::gtest
APPEND
PROPERTY INTERFACE_LINK_LIBRARIES "Threads::Threads")
Expand Down
5 changes: 4 additions & 1 deletion cmake/external/grpc.cmake
Expand Up @@ -41,7 +41,6 @@ if (NOT TARGET gprc_project)
"grpc++"
"gpr"
"address_sorting")

include(ExternalProject)
externalproject_add(
grpc_project
Expand All @@ -62,6 +61,10 @@ if (NOT TARGET gprc_project)
-DgRPC_SSL_PROVIDER=package
-DgRPC_CARES_PROVIDER=package
-DgRPC_PROTOBUF_PROVIDER=package
$<$<BOOL:${GOOGLE_CLOUD_CPP_USE_LIBCXX}>:
-DCMAKE_CXX_FLAGS=-stdlib=libc++
-DCMAKE_SHARED_LINKER_FLAGS=-Wl,-lc++abi
>
BUILD_COMMAND ${CMAKE_COMMAND}
--build
<BINARY_DIR>
Expand Down
5 changes: 5 additions & 0 deletions cmake/external/protobuf.cmake
Expand Up @@ -60,6 +60,11 @@ if (NOT TARGET protobuf_project)
-Dprotobuf_DEBUG_POSTFIX=
-H<SOURCE_DIR>/cmake
-B<BINARY_DIR>
$<$<BOOL:${GOOGLE_CLOUD_CPP_USE_LIBCXX}>:
-DCMAKE_CXX_FLAGS=-stdlib=libc++
# This is needed for protoc
-DCMAKE_EXE_LINKER_FLAGS=-Wl,-lc++abi
-DCMAKE_SHARED_LINKER_FLAGS=-Wl,-lc++abi >
BUILD_COMMAND ${CMAKE_COMMAND}
--build
<BINARY_DIR>
Expand Down
1 change: 0 additions & 1 deletion cmake/external/zlib.cmake
Expand Up @@ -59,5 +59,4 @@ if (NOT TARGET zlib_project)
add_library(ZLIB::ZLIB INTERFACE IMPORTED)
add_dependencies(ZLIB::ZLIB zlib_project)
set_library_properties_for_external_project(ZLIB::ZLIB z)

endif ()
3 changes: 2 additions & 1 deletion google/cloud/bigtable/CMakeLists.txt
Expand Up @@ -99,7 +99,8 @@ add_library(bigtable_protos
target_link_libraries(bigtable_protos
gRPC::grpc++
gRPC::grpc
protobuf::libprotobuf)
protobuf::libprotobuf
bigtable_common_options)
target_include_directories(bigtable_protos
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
Expand Down

0 comments on commit ca5d9bd

Please sign in to comment.