Skip to content

Commit 0f94630

Browse files
committed
[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
1 parent e52b002 commit 0f94630

File tree

7 files changed

+70
-98
lines changed

7 files changed

+70
-98
lines changed

.travis.yml

+3-12
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ addons:
1414
packages: &common_deps
1515
- lcov
1616
# Folly dependencies
17-
- autoconf
18-
- autoconf-archive
19-
- automake
2017
- binutils-dev
2118
- g++
2219
- libboost-all-dev
@@ -29,9 +26,7 @@ addons:
2926
- liblzma-dev
3027
- libsnappy-dev
3128
- libssl-dev
32-
- libtool
3329
- make
34-
- pkg-config
3530
- zlib1g-dev
3631

3732
matrix:
@@ -82,10 +77,6 @@ env:
8277
eHz/lHAoLXWg/BhtgQbPmMYYKRrQaH7EKzBbqEHv6PhOk7vLMtdx5X7KmhVuFjpAMbaYoj
8378
zwxxH0u+VAnVB5iazzyjhySjvzkvx6pGzZtTnjLJHxKcp9633z4OU=
8479
85-
cache:
86-
directories:
87-
- $HOME/folly
88-
8980
before_script:
9081
- eval "$COMPILER_EVAL"
9182
- export DEP_INSTALL_DIR=$PWD/build/dep-install
@@ -101,12 +92,12 @@ before_script:
10192
# Install lcov to coveralls conversion + upload tool.
10293
- gem install coveralls-lcov
10394
- lcov --version
95+
# Build folly
96+
- ./scripts/build_folly.sh build/folly-src $DEP_INSTALL_DIR
10497

10598
script:
106-
- mkdir build
10799
- cd build
108-
- cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE
109-
-DRSOCKET_ASAN=$ASAN -DRSOCKET_INSTALL_DEPS=True
100+
- cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DRSOCKET_ASAN=$ASAN
110101
-DCMAKE_PREFIX_PATH=$DEP_INSTALL_DIR
111102
-DRSOCKET_BUILD_WITH_COVERAGE=ON ..
112103
- make -j4

CMakeLists.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,9 @@ add_library(
306306
rsocket/transports/tcp/TcpDuplexConnection.cpp
307307
rsocket/transports/tcp/TcpDuplexConnection.h)
308308

309-
target_link_libraries(ReactiveSocket yarpl ${GFLAGS_LIBRARY} ${GLOG_LIBRARY})
309+
target_link_libraries(ReactiveSocket
310+
PUBLIC yarpl ${GFLAGS_LIBRARY} ${GLOG_LIBRARY}
311+
INTERFACE ${EXTRA_LINK_FLAGS})
310312

311313
target_compile_options(
312314
ReactiveSocket

cmake/FindFolly.cmake

-15
This file was deleted.

cmake/InstallFolly.cmake

+12-66
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,19 @@
11
if (NOT FOLLY_INSTALL_DIR)
2-
set(FOLLY_INSTALL_DIR $ENV{HOME}/folly)
2+
set(FOLLY_INSTALL_DIR ${CMAKE_BINARY_DIR}/folly-install)
33
endif ()
44

5-
# Check if the correct version of folly is already installed.
6-
set(FOLLY_VERSION v2018.06.25.00)
7-
set(FOLLY_VERSION_FILE ${FOLLY_INSTALL_DIR}/${FOLLY_VERSION})
85
if (RSOCKET_INSTALL_DEPS)
9-
if (NOT EXISTS ${FOLLY_VERSION_FILE})
10-
# Remove the old version of folly.
11-
file(REMOVE_RECURSE ${FOLLY_INSTALL_DIR})
12-
set(INSTALL_FOLLY True)
13-
endif ()
14-
endif ()
15-
16-
if (INSTALL_FOLLY)
17-
# Build and install folly.
18-
ExternalProject_Add(
19-
folly-ext
20-
GIT_REPOSITORY https://github.com/facebook/folly
21-
GIT_TAG ${FOLLY_VERSION}
22-
BINARY_DIR folly-ext-prefix/src/folly-ext/folly
23-
CONFIGURE_COMMAND autoreconf -ivf
24-
COMMAND ./configure CXX=${CMAKE_CXX_COMPILER}
25-
--prefix=${FOLLY_INSTALL_DIR}
26-
BUILD_COMMAND make -j4
27-
INSTALL_COMMAND make install
28-
COMMAND cmake -E touch ${FOLLY_VERSION_FILE})
29-
30-
set(FOLLY_INCLUDE_DIR ${FOLLY_INSTALL_DIR}/include)
31-
set(lib ${CMAKE_SHARED_LIBRARY_PREFIX}folly${CMAKE_SHARED_LIBRARY_SUFFIX})
32-
set(benchlib ${CMAKE_SHARED_LIBRARY_PREFIX}follybenchmark${CMAKE_SHARED_LIBRARY_SUFFIX})
33-
set(FOLLY_LIBRARY ${FOLLY_INSTALL_DIR}/lib/${lib})
34-
set(FOLLY_BENCHMARK_LIBRARY ${FOLLY_INSTALL_DIR}/lib/${benchlib})
35-
36-
# CMake requires directories listed in INTERFACE_INCLUDE_DIRECTORIES to exist.
37-
file(MAKE_DIRECTORY ${FOLLY_INCLUDE_DIR})
38-
else ()
39-
# Use installed folly.
40-
find_package(Folly REQUIRED)
6+
execute_process(
7+
COMMAND
8+
${CMAKE_SOURCE_DIR}/scripts/build_folly.sh
9+
${CMAKE_BINARY_DIR}/folly-src
10+
${FOLLY_INSTALL_DIR}
11+
RESULT_VARIABLE folly_result
12+
)
13+
if (NOT "${folly_result}" STREQUAL "0")
14+
message(FATAL_ERROR "failed to build folly")
15+
endif()
4116
endif ()
4217

4318
find_package(Threads)
44-
find_library(EVENT_LIBRARY event)
45-
46-
add_library(folly SHARED IMPORTED)
47-
set_property(TARGET folly PROPERTY IMPORTED_LOCATION ${FOLLY_LIBRARY})
48-
set_property(TARGET folly
49-
APPEND PROPERTY INTERFACE_LINK_LIBRARIES
50-
${EXTRA_LINK_FLAGS} ${EVENT_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
51-
if (TARGET folly-ext)
52-
add_dependencies(folly folly-ext)
53-
endif ()
54-
55-
add_library(folly-benchmark SHARED IMPORTED)
56-
set_property(TARGET folly-benchmark PROPERTY IMPORTED_LOCATION ${FOLLY_BENCHMARK_LIBRARY})
57-
set_property(TARGET folly-benchmark
58-
APPEND PROPERTY INTERFACE_LINK_LIBRARIES
59-
${EXTRA_LINK_FLAGS} ${EVENT_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
60-
if (TARGET folly-ext)
61-
add_dependencies(folly-benchmark folly-ext)
62-
endif ()
63-
64-
# Folly includes are marked as system to prevent errors on non-standard
65-
# extensions when compiling with -pedantic and -Werror.
66-
set_property(TARGET folly
67-
APPEND PROPERTY INTERFACE_SYSTEM_INCLUDE_DIRECTORIES ${FOLLY_INCLUDE_DIR})
68-
set_property(TARGET folly
69-
APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${FOLLY_INCLUDE_DIR})
70-
set_property(TARGET folly-benchmark
71-
APPEND PROPERTY INTERFACE_SYSTEM_INCLUDE_DIRECTORIES ${FOLLY_INCLUDE_DIR})
72-
set_property(TARGET folly-benchmark
73-
APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${FOLLY_INCLUDE_DIR})
19+
find_package(folly CONFIG REQUIRED PATHS ${FOLLY_INSTALL_DIR})

rsocket/benchmarks/CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
add_library(fixture Fixture.cpp Fixture.h)
2-
target_link_libraries(fixture ReactiveSocket folly)
2+
target_link_libraries(fixture ReactiveSocket Folly::folly)
33

44
function(benchmark NAME FILE)
55
add_executable(${NAME} ${FILE} Benchmarks.cpp)
66
target_link_libraries(
77
${NAME}
88
fixture
99
ReactiveSocket
10-
folly-benchmark
10+
Folly::follybenchmark
1111
${GFLAGS_LIBRARY}
1212
${GLOG_LIBRARY})
1313
endfunction()

scripts/build_folly.sh

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#!/bin/bash
2+
#
3+
# Copyright 2004-present Facebook. All Rights Reserved.
4+
#
5+
CHECKOUT_DIR=$1
6+
INSTALL_DIR=$2
7+
if [[ -z $INSTALL_DIR ]]; then
8+
echo "usage: $0 CHECKOUT_DIR INSTALL_DIR" >&2
9+
exit 1
10+
fi
11+
12+
# Convert INSTALL_DIR to an absolute path so it still refers to the same
13+
# location after we cd into the build directory.
14+
case "$INSTALL_DIR" in
15+
/*) ;;
16+
*) INSTALL_DIR="$PWD/$INSTALL_DIR"
17+
esac
18+
19+
# If folly was already installed, just return early
20+
INSTALL_MARKER_FILE="$INSTALL_DIR/folly.installed"
21+
if [[ -f $INSTALL_MARKER_FILE ]]; then
22+
echo "folly was previously built"
23+
exit 0
24+
fi
25+
26+
set -e
27+
set -x
28+
29+
if [[ -d "$CHECKOUT_DIR" ]]; then
30+
git -C "$CHECKOUT_DIR" fetch
31+
git -C "$CHECKOUT_DIR" checkout master
32+
else
33+
git clone https://github.com/facebook/folly "$CHECKOUT_DIR"
34+
fi
35+
36+
mkdir -p "$CHECKOUT_DIR/_build"
37+
cd "$CHECKOUT_DIR/_build"
38+
if ! cmake \
39+
"-DCMAKE_PREFIX_PATH=${INSTALL_DIR}" \
40+
"-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}" \
41+
..; then
42+
echo "error configuring folly" >&2
43+
tail -n 100 CMakeFiles/CMakeError.log >&2
44+
exit 1
45+
fi
46+
make -j4
47+
make install
48+
touch "$INSTALL_MARKER_FILE"

yarpl/CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ message("yarpl source dir: ${CMAKE_CURRENT_SOURCE_DIR}")
119119

120120
target_link_libraries(
121121
yarpl
122-
folly
123-
${GLOG_LIBRARY})
122+
PUBLIC Folly::folly ${GLOG_LIBRARY}
123+
INTERFACE ${EXTRA_LINK_FLAGS})
124124

125125
install(TARGETS yarpl DESTINATION lib)
126126
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION include FILES_MATCHING PATTERN "*.h")

0 commit comments

Comments
 (0)