-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
202 lines (164 loc) · 6.36 KB
/
Copy pathCMakeLists.txt
File metadata and controls
202 lines (164 loc) · 6.36 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
200
201
202
cmake_minimum_required(VERSION 3.14)
project(NekoLog VERSION 1.0.8 LANGUAGES CXX)
# ================
# === Config ====
# ================
# NekoLog project specific options
option(NEKO_LOG_BUILD_TESTS "Neko Log Build tests" ON)
option(NEKO_LOG_AUTO_FETCH_DEPS "Neko Log Automatically fetch dependencies" ON)
option(NEKO_LOG_ENABLE_MODULE "Neko Log Enable C++20 module" OFF)
find_package(NekoSchema QUIET)
find_package(GTest QUIET)
# Print configuration summary
message(STATUS "Start configuration Neko Log...")
message(STATUS "")
message(STATUS "NekoLog configuration summary:")
message(STATUS " - CMake version: ${CMAKE_VERSION}")
message(STATUS "")
message(STATUS " - Neko Log Auto fetch deps: ${NEKO_LOG_AUTO_FETCH_DEPS}")
message(STATUS " - Neko Log Build tests: ${NEKO_LOG_BUILD_TESTS}")
message(STATUS " - Neko Log Enable module: ${NEKO_LOG_ENABLE_MODULE}")
message(STATUS "")
message(STATUS "Dependency summary:")
message(STATUS " - NekoSchema : ${NekoSchema_FOUND} version : ${NekoSchema_VERSION}")
message(STATUS " - GTest : ${GTest_FOUND} version : ${GTest_VERSION}")
message(STATUS "")
if(NEKO_LOG_AUTO_FETCH_DEPS)
include(FetchContent)
if (NOT NekoSchema_FOUND)
message(STATUS "NekoSchema Not Found ; Neko Log is Fetching NekoSchema...")
FetchContent_Declare(
NekoSchema
GIT_REPOSITORY https://github.com/hoshimoe/NekoSchema.git
GIT_TAG main
)
set(NEKO_SCHEMA_BUILD_TESTS OFF CACHE BOOL "" FORCE)
if (NEKO_LOG_ENABLE_MODULE)
set(NEKO_SCHEMA_ENABLE_MODULE ON CACHE BOOL "" FORCE)
endif()
FetchContent_MakeAvailable(NekoSchema)
endif(NOT NekoSchema_FOUND)
if(NOT GTest_FOUND AND NEKO_LOG_BUILD_TESTS)
message(STATUS "GTest Not Found ; Neko Log is Fetching GoogleTest...")
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.17.0
)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
endif()
endif()
# ================
# = Main target =
# ================
add_library(NekoLog INTERFACE)
add_library(Neko::Log ALIAS NekoLog)
target_include_directories(NekoLog INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# Dependencies
target_link_libraries(NekoLog INTERFACE Neko::Schema)
target_compile_features(NekoLog INTERFACE cxx_std_20)
# ================
# = C++20 Module =
# ================
if(NEKO_LOG_ENABLE_MODULE)
message(STATUS "NekoLog C++20 module enabled (NEKO_LOG_ENABLE_MODULE=ON)")
# Check CMake version for module support
if(CMAKE_VERSION VERSION_LESS 3.28)
message(WARNING "CMake 3.28+ is recommended for full C++20 module support")
endif()
add_library(NekoLog_module)
add_library(Neko::Log::Module ALIAS NekoLog_module)
target_sources(NekoLog_module
PUBLIC
FILE_SET CXX_MODULES FILES
${CMAKE_CURRENT_SOURCE_DIR}/include/neko/log/neko.log.cppm
)
target_link_libraries(NekoLog_module PUBLIC Neko::Schema::Module)
target_compile_features(NekoLog_module PUBLIC cxx_std_20)
target_include_directories(NekoLog_module PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
else()
message(STATUS "NekoLog C++20 module disabled (NEKO_LOG_ENABLE_MODULE=OFF)")
endif()
# ================
# ==== Tests =====
# ================
if(NEKO_LOG_BUILD_TESTS)
enable_testing()
message(STATUS "NekoLog tests enabled (NEKO_LOG_BUILD_TESTS=ON)")
if (NOT GTest_FOUND AND NOT NEKO_LOG_AUTO_FETCH_DEPS)
message(WARNING "GTest is required for building tests but was not found.")
message(FATAL_ERROR "Please enable -DNEKO_LOG_AUTO_FETCH_DEPS=ON or install GTest and make it discoverable by CMake. e.g -DCMAKE_PREFIX_PATH=</path/to/googletest>")
endif()
add_executable(nlog_test tests/nlog_test.cpp)
target_include_directories(nlog_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(nlog_test PRIVATE NekoLog GTest::gtest GTest::gtest_main)
target_compile_features(nlog_test PRIVATE cxx_std_20)
include(GoogleTest)
gtest_discover_tests(nlog_test)
# Module test (if modules are enabled)
if(NEKO_LOG_ENABLE_MODULE)
if (MSVC)
message(STATUS "NekoLog module tests enabled (MSVC only)")
add_executable(nlog_module_test tests/nlog_module_test.cpp)
target_link_libraries(nlog_module_test PRIVATE Neko::Log::Module GTest::gtest GTest::gtest_main)
target_compile_features(nlog_module_test PRIVATE cxx_std_20)
gtest_discover_tests(nlog_module_test)
else()
message(STATUS "Skipping NekoLog module tests on non-MSVC toolchains")
endif()
endif()
else()
message(STATUS "NekoLog tests disabled (NEKO_LOG_BUILD_TESTS=OFF)")
endif()
# ================
# == Install =====
# ================
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
# Install headers
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING
PATTERN "*.hpp"
PATTERN "*.cppm"
)
# Install targets
install(TARGETS NekoLog
EXPORT NekoLogTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
# Install export targets
install(EXPORT NekoLogTargets
FILE NekoLogTargets.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/NekoLog
)
# Create and install Config file
configure_package_config_file(
${CMAKE_CURRENT_SOURCE_DIR}/cmake/NekoLogConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/NekoLogConfig.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/NekoLog
)
# Create and install Version file
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/NekoLogConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
ARCH_INDEPENDENT
)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/NekoLogConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/NekoLogConfigVersion.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/NekoLog
)
message(STATUS "Neko Log End of configuration")