CMake/build-from-src.cmake (123 lines of code) (raw):
# Note: Be aware of the differences between CMake project and Makefile project.
# Makefile project is not able to get BINARY_DIR at configuration.
set(actually_built)
function(build_from_src [dep])
if (dep STREQUAL "aio")
set(BINARY_DIR ${PROJECT_BINARY_DIR}/aio-build)
ExternalProject_Add(
aio
URL ${PHOTON_AIO_SOURCE}
URL_MD5 605237f35de238dfacc83bcae406d95d
UPDATE_DISCONNECTED ON
BUILD_IN_SOURCE ON
CONFIGURE_COMMAND ""
BUILD_COMMAND $(MAKE) prefix=${BINARY_DIR} install
INSTALL_COMMAND ""
)
set(AIO_INCLUDE_DIRS ${BINARY_DIR}/include PARENT_SCOPE)
set(AIO_LIBRARIES ${BINARY_DIR}/lib/libaio.a PARENT_SCOPE)
elseif (dep STREQUAL "zlib")
set(BINARY_DIR ${PROJECT_BINARY_DIR}/zlib-build)
ExternalProject_Add(
zlib
URL ${PHOTON_ZLIB_SOURCE}
URL_MD5 9b8aa094c4e5765dabf4da391f00d15c
UPDATE_DISCONNECTED ON
BUILD_IN_SOURCE ON
CONFIGURE_COMMAND sh -c "CFLAGS=\"-fPIC -O3\" ./configure --prefix=${BINARY_DIR} --static"
BUILD_COMMAND $(MAKE)
INSTALL_COMMAND $(MAKE) install
)
set(ZLIB_INCLUDE_DIRS ${BINARY_DIR}/include PARENT_SCOPE)
set(ZLIB_LIBRARIES ${BINARY_DIR}/lib/libz.a PARENT_SCOPE)
elseif (dep STREQUAL "uring")
set(BINARY_DIR ${PROJECT_BINARY_DIR}/uring-build)
ExternalProject_Add(
uring
URL ${PHOTON_URING_SOURCE}
URL_MD5 2e8c3c23795415475654346484f5c4b8
UPDATE_DISCONNECTED ON
BUILD_IN_SOURCE ON
CONFIGURE_COMMAND ./configure --prefix=${BINARY_DIR}
BUILD_COMMAND sh -c "V=1 CFLAGS=\"-fPIC -O3 -Wall -Wextra -fno-stack-protector\" $(MAKE) -C src"
INSTALL_COMMAND $(MAKE) install
)
set(URING_INCLUDE_DIRS ${BINARY_DIR}/include PARENT_SCOPE)
set(URING_LIBRARIES ${BINARY_DIR}/lib/liburing.a PARENT_SCOPE)
elseif (dep STREQUAL "gflags")
ExternalProject_Add(
gflags
URL ${PHOTON_GFLAGS_SOURCE}
URL_MD5 1a865b93bacfa963201af3f75b7bd64c
CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_POSITION_INDEPENDENT_CODE=ON
INSTALL_COMMAND ""
)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(POSTFIX "_debug")
endif ()
ExternalProject_Get_Property(gflags BINARY_DIR)
set(GFLAGS_INCLUDE_DIRS ${BINARY_DIR}/include PARENT_SCOPE)
set(GFLAGS_LIBRARIES ${BINARY_DIR}/lib/libgflags${POSTFIX}.a PARENT_SCOPE)
elseif (dep STREQUAL "googletest")
ExternalProject_Add(
googletest
URL ${PHOTON_GOOGLETEST_SOURCE}
URL_MD5 e82199374acdfda3f425331028eb4e2a
CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DINSTALL_GTEST=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON
INSTALL_COMMAND ""
)
ExternalProject_Get_Property(googletest SOURCE_DIR)
ExternalProject_Get_Property(googletest BINARY_DIR)
set(GOOGLETEST_INCLUDE_DIRS ${SOURCE_DIR}/googletest/include ${SOURCE_DIR}/googlemock/include PARENT_SCOPE)
set(GOOGLETEST_LIBRARIES ${BINARY_DIR}/lib/libgmock.a ${BINARY_DIR}/lib/libgtest_main.a ${BINARY_DIR}/lib/libgtest.a PARENT_SCOPE)
elseif (dep STREQUAL "openssl")
set(BINARY_DIR ${PROJECT_BINARY_DIR}/openssl-build)
ExternalProject_Add(
openssl
URL ${PHOTON_OPENSSL_SOURCE}
URL_MD5 3f76825f195e52d4b10c70040681a275
UPDATE_DISCONNECTED ON
BUILD_IN_SOURCE ON
CONFIGURE_COMMAND ./config -fPIC --prefix=${BINARY_DIR} --openssldir=${BINARY_DIR} no-shared
BUILD_COMMAND $(MAKE)
INSTALL_COMMAND $(MAKE) install
LOG_CONFIGURE ON
LOG_BUILD ON
LOG_INSTALL ON
)
set(OPENSSL_ROOT_DIR ${BINARY_DIR} PARENT_SCOPE)
set(OPENSSL_INCLUDE_DIRS ${BINARY_DIR}/include PARENT_SCOPE)
set(OPENSSL_LIBRARIES ${BINARY_DIR}/lib/libssl.a ${BINARY_DIR}/lib/libcrypto.a PARENT_SCOPE)
elseif (dep STREQUAL "curl")
if (${OPENSSL_ROOT_DIR} STREQUAL "")
message(FATAL_ERROR "OPENSSL_ROOT_DIR not exist")
endif ()
set(BINARY_DIR ${PROJECT_BINARY_DIR}/curl-build)
ExternalProject_Add(
curl
URL ${PHOTON_CURL_SOURCE}
URL_MD5 1211d641ae670cebce361ab6a7c6acff
CMAKE_ARGS -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR} -DCMAKE_INSTALL_PREFIX=${BINARY_DIR}
-DBUILD_SHARED_LIBS=OFF -DHTTP_ONLY=ON -DBUILD_CURL_EXE=OFF
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
)
add_dependencies(curl openssl)
set(CURL_INCLUDE_DIRS ${BINARY_DIR}/include PARENT_SCOPE)
if (EXISTS ${BINARY_DIR}/lib64/libcurl.a)
set(_curl_lib_path ${BINARY_DIR}/lib64/libcurl.a)
else ()
set(_curl_lib_path ${BINARY_DIR}/lib/libcurl.a)
endif ()
set(CURL_LIBRARIES ${_curl_lib_path} PARENT_SCOPE)
elseif (dep STREQUAL "rdmacore")
set(BINARY_DIR ${PROJECT_BINARY_DIR}/rdmacore-build)
ExternalProject_Add(
rdmacore
URL ${PHOTON_RDMACORE_SOURCE}
URL_MD5 96758c5cd34cf13584ebc59d4621fdad
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${BINARY_DIR}
)
endif ()
list(APPEND actually_built ${dep})
set(actually_built ${actually_built} PARENT_SCOPE)
endfunction()