From f149eea57e0870a6af7c236c0907a68935a4d20e Mon Sep 17 00:00:00 2001 From: Adam Simpkins Date: Tue, 23 Oct 2018 15:41:34 -0700 Subject: [PATCH 1/3] Build OpenSSL 1.1.0 during Travis CI builds --- .travis.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fdcf38746..bbb7f19fd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -87,16 +87,27 @@ cache: - $HOME/folly before_script: + - eval "$COMPILER_EVAL" + - export DEP_INSTALL_DIR=$PWD/build/dep-install + # Ubuntu trusty only comes with OpenSSL 1.0.1f, but we require + # at least OpenSSL 1.0.2 for ALPN support. + - curl -L https://github.com/openssl/openssl/archive/OpenSSL_1_1_1.tar.gz -o OpenSSL_1_1_1.tar.gz + - tar -xzf OpenSSL_1_1_1.tar.gz + - cd openssl-OpenSSL_1_1_1 + - ./config --prefix=$DEP_INSTALL_DIR no-shared + - make -j4 + - make install_sw install_ssldirs + - cd .. # Install lcov to coveralls conversion + upload tool. - gem install coveralls-lcov - lcov --version - - eval "$COMPILER_EVAL" script: - mkdir build - cd build - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DRSOCKET_ASAN=$ASAN -DRSOCKET_INSTALL_DEPS=True + -DCMAKE_PREFIX_PATH=$DEP_INSTALL_DIR -DRSOCKET_BUILD_WITH_COVERAGE=ON .. - make -j4 - lcov --directory . --zerocounters From e52b002f76211b05ce07d1e3e3176dc0fb387665 Mon Sep 17 00:00:00 2001 From: Adam Simpkins Date: Tue, 23 Oct 2018 14:45:34 -0700 Subject: [PATCH 2/3] Fail the build if ALPN is not available --- rsocket/transports/tcp/TcpConnectionFactory.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rsocket/transports/tcp/TcpConnectionFactory.cpp b/rsocket/transports/tcp/TcpConnectionFactory.cpp index fcb82782c..83f527b24 100644 --- a/rsocket/transports/tcp/TcpConnectionFactory.cpp +++ b/rsocket/transports/tcp/TcpConnectionFactory.cpp @@ -43,8 +43,14 @@ class ConnectCallback : public folly::AsyncSocket::ConnectCallback { DCHECK(evb); if (sslContext) { +#if !FOLLY_OPENSSL_HAS_ALPN + // setAdvertisedNextProtocols() is unavailable +#error ALPN is required for rsockets. \ + Your version of OpenSSL is likely too old. +#else VLOG(3) << "Starting SSL socket"; sslContext->setAdvertisedNextProtocols({"rs"}); +#endif socket_.reset(new folly::AsyncSSLSocket(sslContext, evb)); } else { VLOG(3) << "Starting socket"; From 0f9463092aa5f92cdb1ecda1fc1ec3def522f4bb Mon Sep 17 00:00:00 2001 From: Adam Simpkins Date: Tue, 23 Oct 2018 13:50:43 -0700 Subject: [PATCH 3/3] [rsocket] find folly using its installed cmake config file Summary: Find folly using its installed CMake configuration file, and delete the custom FindFolly.cmake file that was being used previously. The FindFolly.cmake file did not list all dependent libraries necessary to link statically against folly. Linking against folly as a shared library is not recommended, as folly provides no binary compatibility guarantees between changes. folly's current CMake-based build only builds it as a static library by default. This also changes the build process to build folly with CMake rather than its deprecated autotools-based build when RSOCKET_INSTALL_DEPS or INSTALL_FOLLY is set. Note that the build now happens as part of the `cmake` step, since folly must be installed before we call `find_package()` to find folly. This also updates the code to always use the current folly master branch, rather than being pinned to v2018.06.25.00. This should hopefully help catch breakage's in the open source rsocket-cpp build much sooner. Test Plan: Tested building rsocket-cpp on an Ubuntu 18.04 host with the latest version of folly. Reviewers: blom,geleri,yfeldblum,#rsocket Differential Revision: https://phabricator.intern.facebook.com/D10380763 --- .travis.yml | 15 ++---- CMakeLists.txt | 4 +- cmake/FindFolly.cmake | 15 ------ cmake/InstallFolly.cmake | 78 +++++-------------------------- rsocket/benchmarks/CMakeLists.txt | 4 +- scripts/build_folly.sh | 48 +++++++++++++++++++ yarpl/CMakeLists.txt | 4 +- 7 files changed, 70 insertions(+), 98 deletions(-) delete mode 100644 cmake/FindFolly.cmake create mode 100755 scripts/build_folly.sh diff --git a/.travis.yml b/.travis.yml index bbb7f19fd..1c88d192b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,9 +14,6 @@ addons: packages: &common_deps - lcov # Folly dependencies - - autoconf - - autoconf-archive - - automake - binutils-dev - g++ - libboost-all-dev @@ -29,9 +26,7 @@ addons: - liblzma-dev - libsnappy-dev - libssl-dev - - libtool - make - - pkg-config - zlib1g-dev matrix: @@ -82,10 +77,6 @@ env: eHz/lHAoLXWg/BhtgQbPmMYYKRrQaH7EKzBbqEHv6PhOk7vLMtdx5X7KmhVuFjpAMbaYoj zwxxH0u+VAnVB5iazzyjhySjvzkvx6pGzZtTnjLJHxKcp9633z4OU= -cache: - directories: - - $HOME/folly - before_script: - eval "$COMPILER_EVAL" - export DEP_INSTALL_DIR=$PWD/build/dep-install @@ -101,12 +92,12 @@ before_script: # Install lcov to coveralls conversion + upload tool. - gem install coveralls-lcov - lcov --version + # Build folly + - ./scripts/build_folly.sh build/folly-src $DEP_INSTALL_DIR script: - - mkdir build - cd build - - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE - -DRSOCKET_ASAN=$ASAN -DRSOCKET_INSTALL_DEPS=True + - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DRSOCKET_ASAN=$ASAN -DCMAKE_PREFIX_PATH=$DEP_INSTALL_DIR -DRSOCKET_BUILD_WITH_COVERAGE=ON .. - make -j4 diff --git a/CMakeLists.txt b/CMakeLists.txt index 82fb206da..4ff9abf92 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -306,7 +306,9 @@ add_library( rsocket/transports/tcp/TcpDuplexConnection.cpp rsocket/transports/tcp/TcpDuplexConnection.h) -target_link_libraries(ReactiveSocket yarpl ${GFLAGS_LIBRARY} ${GLOG_LIBRARY}) +target_link_libraries(ReactiveSocket + PUBLIC yarpl ${GFLAGS_LIBRARY} ${GLOG_LIBRARY} + INTERFACE ${EXTRA_LINK_FLAGS}) target_compile_options( ReactiveSocket diff --git a/cmake/FindFolly.cmake b/cmake/FindFolly.cmake deleted file mode 100644 index 30736a77f..000000000 --- a/cmake/FindFolly.cmake +++ /dev/null @@ -1,15 +0,0 @@ -cmake_minimum_required(VERSION 3.2) - -include(FindPackageHandleStandardArgs) - -if (FOLLY_INSTALL_DIR) - set(lib_paths ${FOLLY_INSTALL_DIR}/lib) - set(include_paths ${FOLLY_INSTALL_DIR}/include) -endif () - -find_library(FOLLY_LIBRARY folly PATHS ${lib_paths}) -find_library(FOLLY_BENCHMARK_LIBRARY follybenchmark PATHS ${lib_paths}) -find_path(FOLLY_INCLUDE_DIR "folly/String.h" PATHS ${include_paths}) - -find_package_handle_standard_args(Folly - DEFAULT_MSG FOLLY_LIBRARY FOLLY_BENCHMARK_LIBRARY FOLLY_INCLUDE_DIR) diff --git a/cmake/InstallFolly.cmake b/cmake/InstallFolly.cmake index b7d8622f5..f7aaf46e2 100644 --- a/cmake/InstallFolly.cmake +++ b/cmake/InstallFolly.cmake @@ -1,73 +1,19 @@ if (NOT FOLLY_INSTALL_DIR) - set(FOLLY_INSTALL_DIR $ENV{HOME}/folly) + set(FOLLY_INSTALL_DIR ${CMAKE_BINARY_DIR}/folly-install) endif () -# Check if the correct version of folly is already installed. -set(FOLLY_VERSION v2018.06.25.00) -set(FOLLY_VERSION_FILE ${FOLLY_INSTALL_DIR}/${FOLLY_VERSION}) if (RSOCKET_INSTALL_DEPS) - if (NOT EXISTS ${FOLLY_VERSION_FILE}) - # Remove the old version of folly. - file(REMOVE_RECURSE ${FOLLY_INSTALL_DIR}) - set(INSTALL_FOLLY True) - endif () -endif () - -if (INSTALL_FOLLY) - # Build and install folly. - ExternalProject_Add( - folly-ext - GIT_REPOSITORY https://github.com/facebook/folly - GIT_TAG ${FOLLY_VERSION} - BINARY_DIR folly-ext-prefix/src/folly-ext/folly - CONFIGURE_COMMAND autoreconf -ivf - COMMAND ./configure CXX=${CMAKE_CXX_COMPILER} - --prefix=${FOLLY_INSTALL_DIR} - BUILD_COMMAND make -j4 - INSTALL_COMMAND make install - COMMAND cmake -E touch ${FOLLY_VERSION_FILE}) - - set(FOLLY_INCLUDE_DIR ${FOLLY_INSTALL_DIR}/include) - set(lib ${CMAKE_SHARED_LIBRARY_PREFIX}folly${CMAKE_SHARED_LIBRARY_SUFFIX}) - set(benchlib ${CMAKE_SHARED_LIBRARY_PREFIX}follybenchmark${CMAKE_SHARED_LIBRARY_SUFFIX}) - set(FOLLY_LIBRARY ${FOLLY_INSTALL_DIR}/lib/${lib}) - set(FOLLY_BENCHMARK_LIBRARY ${FOLLY_INSTALL_DIR}/lib/${benchlib}) - - # CMake requires directories listed in INTERFACE_INCLUDE_DIRECTORIES to exist. - file(MAKE_DIRECTORY ${FOLLY_INCLUDE_DIR}) -else () - # Use installed folly. - find_package(Folly REQUIRED) + execute_process( + COMMAND + ${CMAKE_SOURCE_DIR}/scripts/build_folly.sh + ${CMAKE_BINARY_DIR}/folly-src + ${FOLLY_INSTALL_DIR} + RESULT_VARIABLE folly_result + ) + if (NOT "${folly_result}" STREQUAL "0") + message(FATAL_ERROR "failed to build folly") + endif() endif () find_package(Threads) -find_library(EVENT_LIBRARY event) - -add_library(folly SHARED IMPORTED) -set_property(TARGET folly PROPERTY IMPORTED_LOCATION ${FOLLY_LIBRARY}) -set_property(TARGET folly - APPEND PROPERTY INTERFACE_LINK_LIBRARIES - ${EXTRA_LINK_FLAGS} ${EVENT_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) -if (TARGET folly-ext) - add_dependencies(folly folly-ext) -endif () - -add_library(folly-benchmark SHARED IMPORTED) -set_property(TARGET folly-benchmark PROPERTY IMPORTED_LOCATION ${FOLLY_BENCHMARK_LIBRARY}) -set_property(TARGET folly-benchmark - APPEND PROPERTY INTERFACE_LINK_LIBRARIES - ${EXTRA_LINK_FLAGS} ${EVENT_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) -if (TARGET folly-ext) - add_dependencies(folly-benchmark folly-ext) -endif () - -# Folly includes are marked as system to prevent errors on non-standard -# extensions when compiling with -pedantic and -Werror. -set_property(TARGET folly - APPEND PROPERTY INTERFACE_SYSTEM_INCLUDE_DIRECTORIES ${FOLLY_INCLUDE_DIR}) -set_property(TARGET folly - APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${FOLLY_INCLUDE_DIR}) -set_property(TARGET folly-benchmark - APPEND PROPERTY INTERFACE_SYSTEM_INCLUDE_DIRECTORIES ${FOLLY_INCLUDE_DIR}) -set_property(TARGET folly-benchmark - APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${FOLLY_INCLUDE_DIR}) +find_package(folly CONFIG REQUIRED PATHS ${FOLLY_INSTALL_DIR}) diff --git a/rsocket/benchmarks/CMakeLists.txt b/rsocket/benchmarks/CMakeLists.txt index 172309927..2ff59a03c 100644 --- a/rsocket/benchmarks/CMakeLists.txt +++ b/rsocket/benchmarks/CMakeLists.txt @@ -1,5 +1,5 @@ add_library(fixture Fixture.cpp Fixture.h) -target_link_libraries(fixture ReactiveSocket folly) +target_link_libraries(fixture ReactiveSocket Folly::folly) function(benchmark NAME FILE) add_executable(${NAME} ${FILE} Benchmarks.cpp) @@ -7,7 +7,7 @@ function(benchmark NAME FILE) ${NAME} fixture ReactiveSocket - folly-benchmark + Folly::follybenchmark ${GFLAGS_LIBRARY} ${GLOG_LIBRARY}) endfunction() diff --git a/scripts/build_folly.sh b/scripts/build_folly.sh new file mode 100755 index 000000000..ebe67aa00 --- /dev/null +++ b/scripts/build_folly.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# +# Copyright 2004-present Facebook. All Rights Reserved. +# +CHECKOUT_DIR=$1 +INSTALL_DIR=$2 +if [[ -z $INSTALL_DIR ]]; then + echo "usage: $0 CHECKOUT_DIR INSTALL_DIR" >&2 + exit 1 +fi + +# Convert INSTALL_DIR to an absolute path so it still refers to the same +# location after we cd into the build directory. +case "$INSTALL_DIR" in + /*) ;; + *) INSTALL_DIR="$PWD/$INSTALL_DIR" +esac + +# If folly was already installed, just return early +INSTALL_MARKER_FILE="$INSTALL_DIR/folly.installed" +if [[ -f $INSTALL_MARKER_FILE ]]; then + echo "folly was previously built" + exit 0 +fi + +set -e +set -x + +if [[ -d "$CHECKOUT_DIR" ]]; then + git -C "$CHECKOUT_DIR" fetch + git -C "$CHECKOUT_DIR" checkout master +else + git clone https://github.com/facebook/folly "$CHECKOUT_DIR" +fi + +mkdir -p "$CHECKOUT_DIR/_build" +cd "$CHECKOUT_DIR/_build" +if ! cmake \ + "-DCMAKE_PREFIX_PATH=${INSTALL_DIR}" \ + "-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}" \ + ..; then + echo "error configuring folly" >&2 + tail -n 100 CMakeFiles/CMakeError.log >&2 + exit 1 +fi +make -j4 +make install +touch "$INSTALL_MARKER_FILE" diff --git a/yarpl/CMakeLists.txt b/yarpl/CMakeLists.txt index 14d1c5f74..98dbdc710 100644 --- a/yarpl/CMakeLists.txt +++ b/yarpl/CMakeLists.txt @@ -119,8 +119,8 @@ message("yarpl source dir: ${CMAKE_CURRENT_SOURCE_DIR}") target_link_libraries( yarpl - folly - ${GLOG_LIBRARY}) + PUBLIC Folly::folly ${GLOG_LIBRARY} + INTERFACE ${EXTRA_LINK_FLAGS}) install(TARGETS yarpl DESTINATION lib) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION include FILES_MATCHING PATTERN "*.h")