-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
199 lines (161 loc) · 5.72 KB
/
CMakeLists.txt
File metadata and controls
199 lines (161 loc) · 5.72 KB
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
cmake_minimum_required(VERSION 3.8...3.10)
################################
# Project name and version #
################################
project(
fkYAML
VERSION 0.4.2
LANGUAGES CXX)
#############################################################
# Preparations depending on the specified build options #
#############################################################
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
# Configure installation of the fkYAML library if this project is the main project.
set(FK_YAML_INSTALL ON)
endif()
if(FK_YAML_CODE_COVERAGE OR FK_YAML_RUN_VALGRIND OR FK_YAML_RUN_CLANG_SANITIZERS)
if(FK_YAML_RUN_VALGRIND AND FK_YAML_RUN_CLANG_SANITIZERS)
message(FATAL_ERROR "FK_YAML_RUN_VALGRIND and FK_YAML_RUN_CLANG_SANITIZERS are mutually exclusive options.")
endif()
if(FK_YAML_RUN_CLANG_SANITIZERS AND NOT("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang"))
message(FATAL_ERROR "Compiler must be clang when FK_YAML_RUN_CLANG_SANITIZERS is enabled.")
endif()
# Generating code coverage depends on the unit test app. So force build it.
set(FK_YAML_BUILD_TEST ON)
endif()
###########################################
# Configure variables for the library #
###########################################
include(GNUInstallDirs)
set(FK_YAML_TARGET_NAME ${PROJECT_NAME})
set(FK_YAML_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME}" CACHE INTERNAL "Install directory path for config files.")
if(FK_YAML_USE_SINGLE_HEADER)
set(FK_YAML_INCLUDE_BUILD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/single_include/")
else()
set(FK_YAML_INCLUDE_BUILD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include/")
endif()
set(FK_YAML_INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}")
set(FK_YAML_TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets")
set(FK_YAML_CMAKE_CONFIG_TEMPLATE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/config.cmake.in")
set(FK_YAML_CMAKE_VERSION_CONFIG_TEMPLATE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake.in")
set(FK_YAML_CMAKE_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}")
set(FK_YAML_CMAKE_VERSION_CONFIG_FILE ${FK_YAML_CMAKE_CONFIG_DIR}/${PROJECT_NAME}ConfigVersion.cmake)
set(FK_YAML_CMAKE_PROJECT_CONFIG_FILE ${FK_YAML_CMAKE_CONFIG_DIR}/${PROJECT_NAME}Config.cmake)
set(FK_YAML_CMAKE_PROJECT_TARGETS_FILE ${FK_YAML_CMAKE_CONFIG_DIR}/${PROJECT_NAME}Targets.cmake)
set(FK_YAML_PKGCONFIG_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/pkgconfig")
##########################################
# Create target and add include path #
##########################################
add_library(${FK_YAML_TARGET_NAME} INTERFACE)
add_library(${PROJECT_NAME}::${FK_YAML_TARGET_NAME} ALIAS ${FK_YAML_TARGET_NAME})
target_compile_features(
${FK_YAML_TARGET_NAME}
INTERFACE
cxx_std_11
)
target_include_directories(
${FK_YAML_TARGET_NAME}
INTERFACE
$<BUILD_INTERFACE:${FK_YAML_INCLUDE_BUILD_DIR}>
$<INSTALL_INTERFACE:${FK_YAML_INCLUDE_INSTALL_DIR}>
)
# add .natvis file to apply custom debug view for MSVC
if(MSVC)
set(FK_YAML_INSTALL_NATVIS ON)
set(FK_YAML_NATVIS_FILE ${FK_YAML_TARGET_NAME}.natvis)
target_sources(
${FK_YAML_TARGET_NAME}
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${FK_YAML_NATVIS_FILE}>
$<INSTALL_INTERFACE:${FK_YAML_NATVIS_FILE}>
)
endif()
###########################
# Build example codes #
###########################
if(FK_YAML_BUILD_EXAMPLES)
add_subdirectory(examples)
endif()
############################
# Integrate with tools #
############################
# Configure clang-tidy if enabled.
if(FK_YAML_RUN_CLANG_TIDY)
add_subdirectory(tools/clang_tidy)
endif()
# Configure include-what-you-use if enabled.
if(FK_YAML_RUN_IWYU)
add_subdirectory(tools/iwyu)
endif()
if(FK_YAML_RUN_BENCHMARK)
add_subdirectory(tools/benchmark)
endif()
#################################
# Install a pkg-config file #
#################################
###########################
# Build the test apps #
###########################
if(FK_YAML_BUILD_TEST OR FK_YAML_BUILD_ALL_TEST)
include(CTest)
enable_testing()
add_subdirectory(tests)
# Set the unit test app project as the Visual Studio startup project
# if the target compiler is some version of Microsoft Visual C++ and
# if this project is the main project.
if(MSVC AND CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT fkYAMLUnitTest)
endif()
endif()
#######################
# Install package #
#######################
include(CMakePackageConfigHelpers)
configure_file(
${FK_YAML_CMAKE_CONFIG_TEMPLATE}
${FK_YAML_CMAKE_PROJECT_CONFIG_FILE}
@ONLY
)
configure_file(
${FK_YAML_CMAKE_VERSION_CONFIG_TEMPLATE}
${FK_YAML_CMAKE_VERSION_CONFIG_FILE}
@ONLY
)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/pkg-config.pc.in"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
)
if(FK_YAML_INSTALL)
install(
DIRECTORY ${FK_YAML_INCLUDE_BUILD_DIR}
DESTINATION ${FK_YAML_INCLUDE_INSTALL_DIR}
)
install(
FILES ${FK_YAML_CMAKE_PROJECT_CONFIG_FILE} ${FK_YAML_CMAKE_VERSION_CONFIG_FILE}
DESTINATION ${FK_YAML_CONFIG_INSTALL_DIR}
)
if(FK_YAML_INSTALL_NATVIS)
install(
FILES ${FK_YAML_NATVIS_FILE}
DESTINATION .
)
endif()
export(
TARGETS ${FK_YAML_TARGET_NAME}
NAMESPACE ${PROJECT_NAME}::
FILE ${FK_YAML_CMAKE_PROJECT_TARGETS_FILE}
)
install(
TARGETS ${FK_YAML_TARGET_NAME}
EXPORT ${FK_YAML_TARGETS_EXPORT_NAME}
)
install(
EXPORT ${FK_YAML_TARGETS_EXPORT_NAME}
NAMESPACE ${PROJECT_NAME}::
DESTINATION ${FK_YAML_CONFIG_INSTALL_DIR}
)
install(
FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
DESTINATION ${FK_YAML_PKGCONFIG_INSTALL_DIR}
)
endif()