-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCMakeLists.txt
132 lines (104 loc) · 4.15 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
cmake_minimum_required(VERSION 3.14)
set(CMAKE_CXX_STANDARD 17)
file(READ "src/version.h" HeaderVersionFile)
string(REGEX MATCH
"#define CONFIGCAT_VERSION \"([0-9\\.]+).*\""
_
${HeaderVersionFile}
)
set(CONFIGCAT_VERSION ${CMAKE_MATCH_1})
message("ConfigCat version: ${CONFIGCAT_VERSION}")
project(configcat VERSION ${CONFIGCAT_VERSION})
include(FetchContent)
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
option(CONFIGCAT_USE_EXTERNAL_NETWORK_ADAPTER "Use external network adapter." OFF)
option(CONFIGCAT_USE_EXTERNAL_SHA "Use external hash calculation." OFF)
option(CONFIGCAT_BUILD_TESTS "Build ConfigCat unittests." ON)
if(NOT CONFIGCAT_USE_EXTERNAL_NETWORK_ADAPTER)
find_package(CURL REQUIRED)
endif()
find_package(nlohmann_json REQUIRED)
if(NOT CONFIGCAT_USE_EXTERNAL_SHA)
find_package(unofficial-hash-library REQUIRED)
endif()
find_package(semver REQUIRED)
set(CONFIGCAT_INCLUDE_PATHS
"src"
"include"
)
if(CONFIGCAT_BUILD_TESTS)
include(CTest)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/refs/tags/release-1.12.1.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
enable_testing()
include(GoogleTest)
include_directories("${PROJECT_SOURCE_DIR}/include")
file(GLOB tests "${PROJECT_SOURCE_DIR}/test/*.cpp")
list(REMOVE_ITEM tests "${PROJECT_SOURCE_DIR}/test/test-main.cpp")
add_executable("google_tests"
${tests}
"${PROJECT_SOURCE_DIR}/test/test-main.cpp"
)
target_include_directories(google_tests PRIVATE ${CONFIGCAT_INCLUDE_PATHS})
# $<TARGET_PROPERTY:configcat,LINK_LIBRARIES> explicitly propagates private dependencies
target_link_libraries(google_tests configcat gmock_main $<TARGET_PROPERTY:configcat,LINK_LIBRARIES>)
gtest_discover_tests(google_tests)
endif()
file(GLOB SOURCES "src/*")
add_library(configcat ${SOURCES})
add_library(configcat::configcat ALIAS configcat)
set(CONFIGCAT_LIBRARIES ${CONFIGCAT_LIBRARIES} nlohmann_json::nlohmann_json semver::semver)
# Conditionally add libraries based on options and set compile definitions
if(NOT CONFIGCAT_USE_EXTERNAL_NETWORK_ADAPTER)
list(APPEND CONFIGCAT_LIBRARIES CURL::libcurl)
else()
target_compile_definitions(configcat PRIVATE CONFIGCAT_EXTERNAL_NETWORK_ADAPTER_ENABLED)
endif()
if(NOT CONFIGCAT_USE_EXTERNAL_SHA)
list(APPEND CONFIGCAT_LIBRARIES unofficial::hash-library)
else()
target_compile_definitions(configcat PRIVATE CONFIGCAT_EXTERNAL_SHA_ENABLED)
endif()
target_link_libraries(configcat
PRIVATE ${CONFIGCAT_LIBRARIES}
)
target_include_directories(${PROJECT_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
PRIVATE
${CONFIGCAT_INCLUDE_PATHS}
)
# install
configure_package_config_file(
${PROJECT_SOURCE_DIR}/cmake/${PROJECT_NAME}-config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME}
PATH_VARS CMAKE_INSTALL_FULL_INCLUDEDIR)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
ARCH_INDEPENDENT)
install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
DESTINATION ${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME})
export(TARGETS ${PROJECT_NAME}
NAMESPACE ${PROJECT_NAME}::
FILE ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-targets.cmake)
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}-targets
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(EXPORT ${PROJECT_NAME}-targets
NAMESPACE ${PROJECT_NAME}::
DESTINATION ${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME})