Skip to content

Commit 100bf32

Browse files
committed
Split CMakeLists
1 parent e089304 commit 100bf32

18 files changed

+789
-400
lines changed

CMakeLists.txt

Lines changed: 130 additions & 349 deletions
Large diffs are not rendered by default.

cmake/BuildDependencies.cmake

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
macro(get_compiler_id)
2+
# Get lowercase compiler id
3+
string(TOLOWER "${CMAKE_CXX_COMPILER_ID}" cmake_cxx_compiler_id)
4+
if(cmake_cxx_compiler_id STREQUAL "gnu")
5+
set(cmake_cxx_compiler_id "gcc")
6+
endif()
7+
endmacro()
8+
9+
# if set toolchain file, don't build, and add include path and link path
10+
if(CMAKE_TOOLCHAIN_FILE)
11+
set(BUILD_DEPENDENCIES
12+
OFF
13+
CACHE BOOL "Build Dependencies" FORCE
14+
)
15+
# toolchain file added include path and link path, use it
16+
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_INCLUDE_PATH})
17+
target_link_directories(${PROJECT_NAME} PRIVATE ${CMAKE_LIBRARY_PATH})
18+
endif()
19+
20+
if(BUILD_DEPENDENCIES)
21+
message(STATUS "Building Dependencies")
22+
23+
# CMake >= 3.14
24+
if(${CMAKE_VERSION} VERSION_LESS "3.14")
25+
message(FATAL_ERROR "CMake >= 3.14 required")
26+
endif()
27+
28+
include(FetchContent)
29+
# show progress
30+
set(FETCHCONTENT_QUIET OFF)
31+
set(FETCHCONTENT_UPDATES_DISCONNECTED ON)
32+
33+
# disable CMP0135 warning
34+
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.24")
35+
cmake_policy(SET CMP0135 NEW)
36+
endif()
37+
38+
# 💡Using URL is faster than git clone
39+
40+
# GTest/GoogleTest
41+
if(BUILD_TESTING)
42+
#[[
43+
# Can't use name ⚠️GTest/gtest⚠️ in FetchContent_Declare, see:
44+
# CMake FetchContent not working as expected (https://github.com/google/googletest/issues/2457)
45+
# FetchContent_* does not work with GTest as dependency name on Windows (https://gitlab.kitware.com/cmake/cmake/-/issues/25294)
46+
# The name gtest reserved:
47+
# googletest_SOURCE_DIR: build/_deps/googletest-src
48+
# gtest_SOURCE_DIR: build/_deps/googletest-src/googletest
49+
#]]
50+
FetchContent_Declare(googletest URL "https://github.com/google/googletest/archive/refs/tags/v1.14.0.tar.gz")
51+
# For Windows: Prevent overriding the parent project's compiler/linker ⚠️MT/MD⚠️ settings
52+
set(gtest_force_shared_crt
53+
ON
54+
CACHE BOOL "" FORCE
55+
)
56+
FetchContent_MakeAvailable(googletest)
57+
58+
# Set build output path, this is mainly for Windows, to solve the test/unittests running 0x000135 problems
59+
set_standard_build_output(gtest)
60+
set_standard_build_output(gtest_main)
61+
set_standard_build_output(gmock)
62+
set_standard_build_output(gmock_main)
63+
endif()
64+
65+
# spdlog
66+
if(TRANTOR_USE_SPDLOG)
67+
FetchContent_Declare(fmt URL "https://github.com/fmtlib/fmt/archive/refs/tags/10.2.1.tar.gz")
68+
FetchContent_Declare(spdlog URL "https://github.com/gabime/spdlog/archive/refs/tags/v1.13.0.tar.gz")
69+
FetchContent_MakeAvailable(fmt spdlog)
70+
71+
# Set build output path, this is mainly for Windows, to solve the test/unittests running 0x000135 problems
72+
set_standard_build_output(fmt)
73+
set_standard_build_output(spdlog)
74+
endif()
75+
76+
# c-ares
77+
if(TRANTOR_USE_C-ARES)
78+
FetchContent_Declare(c-ares URL "https://github.com/c-ares/c-ares/archive/refs/tags/cares-1_25_0.tar.gz")
79+
FetchContent_MakeAvailable(c-ares)
80+
81+
# Set build output path, this is mainly for Windows, to solve the test/unittests running 0x000135 problems
82+
set_standard_build_output(c-ares)
83+
endif()
84+
85+
# OpenSSL
86+
if(TRANTOR_TLS_PROVIDER STREQUAL "openssl")
87+
# openssl build need perl
88+
find_package(Perl REQUIRED)
89+
90+
FetchContent_Declare(OpenSSL URL "https://github.com/openssl/openssl/archive/refs/tags/openssl-3.2.0.tar.gz")
91+
FetchContent_MakeAvailable(OpenSSL)
92+
93+
# Set OPENSSL_ROOT_DIR, to let find_package could search from the build directory
94+
set(OPENSSL_ROOT_DIR
95+
${FETCHCONTENT_BASE_DIR}/openssl
96+
CACHE PATH "Let find_package use the directory to find" FORCE
97+
)
98+
99+
if(NOT EXISTS ${OPENSSL_ROOT_DIR}/include/openssl)
100+
# ⚠️ remove "no-asm" flags to improve openssl performance
101+
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
102+
execute_process(
103+
COMMAND ${PERL_EXECUTABLE} ${openssl_SOURCE_DIR}/Configure VC-WIN64A no-asm no-tests
104+
--prefix=${OPENSSL_ROOT_DIR} WORKING_DIRECTORY ${openssl_BINARY_DIR}
105+
)
106+
execute_process(COMMAND nmake WORKING_DIRECTORY ${openssl_BINARY_DIR})
107+
execute_process(COMMAND nmake install WORKING_DIRECTORY ${openssl_BINARY_DIR})
108+
else()
109+
execute_process(
110+
COMMAND ${openssl_SOURCE_DIR}/config no-asm no-tests --prefix=${OPENSSL_ROOT_DIR}
111+
WORKING_DIRECTORY ${openssl_BINARY_DIR}
112+
)
113+
execute_process(COMMAND make -j WORKING_DIRECTORY ${openssl_BINARY_DIR})
114+
execute_process(COMMAND make install WORKING_DIRECTORY ${openssl_BINARY_DIR})
115+
endif() # compiler id
116+
endif()
117+
118+
target_include_directories(${PROJECT_NAME} PRIVATE ${OPENSSL_ROOT_DIR}/include)
119+
# copy dlls, this is mainly for Windows, to solve the test/unittests running 0x000135 problems
120+
copy_dlls_to_standard_build_output(${OPENSSL_ROOT_DIR}/bin)
121+
122+
endif()
123+
124+
# Botan-3
125+
#[[
126+
# ⚠️⚠️⚠️Botan3 is now a C++20 codebase; compiler requirements have been increased to GCC 11, Clang 14, or MSVC 2022. (GH #2455 #3086)
127+
# support ninja build after botan 3.2
128+
#]]
129+
if(TRANTOR_TLS_PROVIDER STREQUAL "botan-3")
130+
# botan build need python
131+
find_package(PythonInterp REQUIRED)
132+
133+
FetchContent_Declare(Botan URL "https://github.com/randombit/botan/archive/refs/tags/3.2.0.tar.gz")
134+
FetchContent_MakeAvailable(Botan)
135+
136+
set(BOTAN_ROOT_DIR
137+
${FETCHCONTENT_BASE_DIR}/botan-3
138+
CACHE PATH "Let find_package use the directory to find" FORCE
139+
)
140+
141+
if(NOT EXISTS ${BOTAN_ROOT_DIR}/include/botan-3/botan)
142+
# Get lowercase compiler id
143+
get_compiler_id()
144+
145+
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
146+
# ⚠️botan-3 support ninja build
147+
execute_process(
148+
COMMAND ${PYTHON_EXECUTABLE} ${botan_SOURCE_DIR}/configure.py --prefix=${BOTAN_ROOT_DIR}
149+
--cc=${cmake_cxx_compiler_id} --build-tool=ninja --with-pkg-config --build-target=shared
150+
WORKING_DIRECTORY ${botan_BINARY_DIR}
151+
)
152+
execute_process(COMMAND ninja -j WORKING_DIRECTORY ${botan_BINARY_DIR})
153+
execute_process(COMMAND ninja install WORKING_DIRECTORY ${botan_BINARY_DIR})
154+
else()
155+
execute_process(
156+
COMMAND ${PYTHON_EXECUTABLE} ${botan_SOURCE_DIR}/configure.py --prefix=${BOTAN_ROOT_DIR}
157+
--cc=${cmake_cxx_compiler_id} --with-pkg-config --build-target=shared
158+
WORKING_DIRECTORY ${botan_BINARY_DIR}
159+
)
160+
execute_process(COMMAND make -j WORKING_DIRECTORY ${botan_BINARY_DIR})
161+
execute_process(COMMAND make install WORKING_DIRECTORY ${botan_BINARY_DIR})
162+
endif() # compiler id
163+
endif()
164+
165+
target_include_directories(${PROJECT_NAME} PRIVATE ${BOTAN_ROOT_DIR}/include/botan-3)
166+
# copy dlls, this is mainly for Windows, to solve the test/unittests running 0x000135 problems
167+
copy_dlls_to_standard_build_output(${BOTAN_ROOT_DIR}/bin)
168+
169+
endif()
170+
171+
endif()

cmake/SetBuildOutput.cmake

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Set build output path, this is mainly for Windows, to solve the test/unittests running 0x000135 problems
2+
macro(set_standard_build_output Tgt)
3+
if(WIN32)
4+
set_target_properties(${Tgt} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
5+
set_target_properties(${Tgt} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
6+
set_target_properties(${Tgt} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
7+
endif()
8+
endmacro()
9+
10+
# copy dll, this is mainly for Windows, to solve the test/unittests running 0x000135 problems
11+
macro(copy_dlls_to_standard_build_output SPath)
12+
if(WIN32)
13+
if(NOT CMAKE_BUILD_TYPE)
14+
set(CMAKE_BUILD_TYPE "Release")
15+
endif()
16+
17+
file(GLOB_RECURSE dlls ${SPath}/*.dll)
18+
foreach(dll ${dlls})
19+
message(STATUS "copying ${dll} to ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}")
20+
file(COPY ${dll} DESTINATION ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE})
21+
endforeach()
22+
endif()
23+
endmacro()

cmake/SetCAres.cmake

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# set normal resolver
2+
macro(set_normal_resolver)
3+
list(APPEND TRANTOR_SOURCES trantor/net/inner/NormalResolver.cc)
4+
list(APPEND PRIVATE_HEADERS trantor/net/inner/NormalResolver.h)
5+
endmacro()
6+
7+
# set cares resolver
8+
macro(set_cares_resolver)
9+
if(NOT BUILD_SHARED_LIBS)
10+
target_compile_definitions(${PROJECT_NAME} PRIVATE CARES_STATICLIB)
11+
endif()
12+
13+
target_link_libraries(${PROJECT_NAME} PRIVATE c-ares::cares)
14+
15+
if(APPLE)
16+
target_link_libraries(${PROJECT_NAME} PRIVATE resolv)
17+
elseif(WIN32)
18+
target_link_libraries(${PROJECT_NAME} PRIVATE Iphlpapi)
19+
endif()
20+
21+
list(APPEND TRANTOR_SOURCES trantor/net/inner/AresResolver.cc)
22+
list(APPEND PRIVATE_HEADERS trantor/net/inner/AresResolver.h)
23+
endmacro()
24+
25+
# ######################################################################################################################
26+
message(STATUS "Setting c-ares: ${TRANTOR_USE_C-ARES}")
27+
28+
if(TRANTOR_USE_C-ARES)
29+
if(NOT BUILD_DEPENDENCIES)
30+
find_package(c-ares REQUIRED)
31+
endif()
32+
33+
set_cares_resolver()
34+
else()
35+
set_normal_resolver()
36+
endif()

cmake/SetDoxygen.cmake

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
message(STATUS "Setting Doxygen documentation: ${BUILD_DOC}")
2+
3+
if(BUILD_DOC)
4+
if(WIN32)
5+
set(DOXYGEN_PREDEFINED _WIN32)
6+
endif(WIN32)
7+
8+
find_package(Doxygen OPTIONAL_COMPONENTS dot dia)
9+
if(DOXYGEN_FOUND)
10+
set(DOXYGEN_PROJECT_BRIEF "Non-blocking I/O cross-platform TCP network library, using C++14")
11+
set(DOXYGEN_OUTPUT_DIRECTORY docs/${PROJECT_NAME})
12+
set(DOXYGEN_GENERATE_LATEX NO)
13+
set(DOXYGEN_BUILTIN_STL_SUPPORT YES)
14+
set(DOXYGEN_USE_MDFILE_AS_MAINPAGE README.md)
15+
set(DOXYGEN_STRIP_FROM_INC_PATH ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/exports)
16+
17+
doxygen_add_docs(
18+
doc_${PROJECT_NAME}
19+
README.md
20+
ChangeLog.md
21+
${public_net_headers}
22+
${public_utils_headers}
23+
COMMENT "Generate documentation"
24+
)
25+
add_dependencies(${PROJECT_NAME} doc_${PROJECT_NAME})
26+
endif()
27+
28+
endif(BUILD_DOC)

cmake/SetExportHeader.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
include(GenerateExportHeader)
2+
set(TRANTOR_EXPORT_HEADER ${CMAKE_CURRENT_BINARY_DIR}/exports/trantor/exports.h)
3+
generate_export_header(${PROJECT_NAME} EXPORT_FILE_NAME ${TRANTOR_EXPORT_HEADER})
4+
set_target_properties(${PROJECT_NAME} PROPERTIES EXPORT_NAME Trantor)

cmake/SetInstall.cmake

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
message(STATUS "Setting Install")
2+
3+
# Install target Output Artifacts and associated files
4+
install(
5+
TARGETS trantor
6+
# IMPORTANT: Add the trantor library to the "export-set",
7+
# ⚠️To actually install the export file itself, call install(EXPORT),
8+
EXPORT TrantorTargets
9+
RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT bin
10+
ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" COMPONENT lib
11+
LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT lib
12+
)
13+
# Install a CMake file exporting targets for dependent projects
14+
install(
15+
EXPORT TrantorTargets
16+
DESTINATION "${INSTALL_TRANTOR_CMAKE_DIR}"
17+
NAMESPACE Trantor::
18+
COMPONENT dev
19+
)
20+
21+
# Install header files
22+
install(FILES ${public_net_headers} DESTINATION ${INSTALL_INCLUDE_DIR}/trantor/net)
23+
install(FILES ${public_utils_headers} DESTINATION ${INSTALL_INCLUDE_DIR}/trantor/utils)
24+
install(FILES ${trantor_export_header} DESTINATION ${INSTALL_INCLUDE_DIR}/trantor)
25+
26+
# Install the package configuration and package version file and cmake module files
27+
install(
28+
FILES "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TrantorConfig.cmake"
29+
"${CMAKE_CURRENT_BINARY_DIR}/TrantorConfigVersion.cmake"
30+
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/Findc-ares.cmake"
31+
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/FindBotan.cmake"
32+
DESTINATION "${INSTALL_TRANTOR_CMAKE_DIR}"
33+
COMPONENT dev
34+
)
35+
36+
# Install the documentation. Don't install twice, so limit to Debug (assume developer)
37+
if(BUILD_DOC)
38+
install(
39+
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docs/${PROJECT_NAME}
40+
TYPE DOC
41+
CONFIGURATIONS Debug
42+
)
43+
endif()

cmake/SetInstallDirs.cmake

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
message(STATUS "Setting Install Dirs")
2+
3+
include(GNUInstallDirs)
4+
# Offer the user the choice of overriding the installation directories
5+
set(INSTALL_BIN_DIR
6+
${CMAKE_INSTALL_BINDIR}
7+
CACHE PATH "Installation directory for binaries"
8+
)
9+
set(INSTALL_LIB_DIR
10+
${CMAKE_INSTALL_LIBDIR}
11+
CACHE PATH "Installation directory for libraries"
12+
)
13+
set(INSTALL_INCLUDE_DIR
14+
${CMAKE_INSTALL_INCLUDEDIR}
15+
CACHE PATH "Installation directory for header files"
16+
)
17+
set(INSTALL_TRANTOR_CMAKE_DIR
18+
${CMAKE_INSTALL_LIBDIR}/cmake/Trantor
19+
CACHE PATH "Installation directory for cmake files"
20+
)
21+
if(BUILD_SHARED_LIBS
22+
AND (NOT
23+
"${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}"
24+
IN_LIST
25+
CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES
26+
)
27+
)
28+
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}")
29+
endif()

cmake/SetPackageConfig.cmake

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
message(STATUS "Setting Package config")
2+
3+
include(CMakePackageConfigHelpers)
4+
# Generating a Package Configuration File
5+
configure_package_config_file(
6+
cmake/templates/TrantorConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TrantorConfig.cmake
7+
INSTALL_DESTINATION ${INSTALL_TRANTOR_CMAKE_DIR}
8+
)
9+
10+
# Generating a Package Version File
11+
write_basic_package_version_file(
12+
${CMAKE_CURRENT_BINARY_DIR}/TrantorConfigVersion.cmake
13+
VERSION ${TRANTOR_VERSION}
14+
COMPATIBILITY SameMajorVersion
15+
)

cmake/SetSpdlog.cmake

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
message(STATUS "Setting for spdlog: ${TRANTOR_USE_SPDLOG}")
2+
3+
if(TRANTOR_USE_SPDLOG)
4+
target_compile_definitions(${PROJECT_NAME} PUBLIC TRANTOR_SPDLOG_SUPPORT)
5+
6+
if(BUILD_DEPENDENCIES)
7+
target_include_directories(
8+
${PROJECT_NAME}
9+
PRIVATE
10+
PUBLIC $<BUILD_INTERFACE:${spdlog_SOURCE_DIR}/include> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
11+
)
12+
13+
else()
14+
find_package(spdlog REQUIRED)
15+
16+
target_link_libraries(${PROJECT_NAME} PUBLIC spdlog::spdlog)
17+
target_compile_definitions(${PROJECT_NAME} PUBLIC TRANTOR_SPDLOG_SUPPORT SPDLOG_FMT_EXTERNAL SPDLOG_FMT_EXTERNAL_HO)
18+
endif()
19+
endif()

0 commit comments

Comments
 (0)