Skip to content

Commit 91d21e9

Browse files
committed
cmake: update cmake stuff
1 parent 120cc53 commit 91d21e9

13 files changed

+812
-95
lines changed

CMakeLists.txt

+50-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# This file is just an orchestration
2-
cmake_minimum_required(VERSION 3.16..3.27)
2+
cmake_minimum_required(VERSION 3.16..3.31)
33
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
44

5-
option(CMAKE_EXPORT_COMPILE_COMMANDS "Export compile command" TRUE)
5+
# Enable output of compile commands during generation.
6+
option(CMAKE_EXPORT_COMPILE_COMMANDS "Export compile command" ON)
67

78
project(CMakeCpp VERSION 1.0.0 LANGUAGES CXX)
89
set(PROJECT_NAMESPACE CMakeCpp)
@@ -12,6 +13,14 @@ message(STATUS "${PROJECT_NAME} version: ${PROJECT_VERSION}")
1213
#message(STATUS "patch: ${PROJECT_VERSION_PATCH}")
1314

1415
message(STATUS "system name: ${CMAKE_SYSTEM_NAME}")
16+
# Set max os target version.
17+
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15)
18+
19+
set(CMAKE_CXX_STANDARD 20)
20+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
21+
set(CMAKE_CXX_EXTENSIONS OFF)
22+
23+
# Default Build Type to be Release
1524
get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
1625
if(isMultiConfig)
1726
if(NOT CMAKE_CONFIGURATION_TYPES)
@@ -67,8 +76,47 @@ endif()
6776
set_property(GLOBAL PROPERTY CTEST_TARGETS_ADDED 1)
6877
include(CTest)
6978

79+
option(BUILD_ZLIB "Build the ZLIB dependency Library" ON)
80+
message(STATUS "Build ZLIB: ${BUILD_ZLIB}")
81+
82+
option(BUILD_absl "Build the abseil-cpp dependency Library" ON)
83+
message(STATUS "Build abseil-cpp: ${BUILD_absl}")
84+
85+
option(BUILD_Protobuf "Build the Protobuf dependency Library" ON)
86+
message(STATUS "Build protobuf: ${BUILD_Protobuf}")
87+
88+
if(BUILD_TESTING)
89+
option(BUILD_Catch2 "Build Catch2" ON)
90+
message(STATUS "Build Catch2: ${BUILD_Catch2}")
91+
92+
option(BUILD_re2 "Build the re2 dependency Library" ON)
93+
message(STATUS "Build re2: ${BUILD_re2}")
94+
95+
option(BUILD_googletest "Build googletest" ON)
96+
message(STATUS "Build googletest: ${BUILD_googletest}")
97+
98+
option(BUILD_benchmark "Build benchmark" ON)
99+
message(STATUS "Build benchmark: ${BUILD_benchmark}")
100+
else()
101+
set(BUILD_Catch2 OFF)
102+
set(BUILD_re2 OFF)
103+
set(BUILD_googletest OFF)
104+
set(BUILD_benchmark OFF)
105+
endif()
106+
107+
# Find system deps
108+
include(system_deps)
109+
110+
# Build Needed dependencies
111+
add_subdirectory(cmake/dependencies dependencies)
112+
113+
include(host)
114+
# verify deps
115+
include(check_deps)
116+
70117
include(cpp)
71118

119+
## Examples
72120
option(BUILD_EXAMPLES "Build examples" ON)
73121
message(STATUS "Build examples: ${BUILD_EXAMPLES}")
74122
add_subdirectory(examples)

cmake/CMakeCppConfig.cmake.in

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# CMakeCpp CMake configuration file
22

3-
#include(CMakeFindDependencyMacro)
4-
#find_dependency(Foo REQUIRED NO_MODULE)
3+
include(CMakeFindDependencyMacro)
4+
find_dependency(ZLIB REQUIRED NO_MODULE)
5+
find_dependency(absl REQUIRED NO_MODULE)
6+
find_dependency(Protobuf REQUIRED NO_MODULE)
57

68
include("${CMAKE_CURRENT_LIST_DIR}/CMakeCppTargets.cmake")

cmake/check_deps.cmake

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Check dependencies
2+
if(NOT TARGET ZLIB::ZLIB)
3+
message(FATAL_ERROR "Target ZLIB::ZLIB not available.")
4+
endif()
5+
6+
if(NOT TARGET absl::base)
7+
message(FATAL_ERROR "Target absl::base not available.")
8+
endif()
9+
set(ABSL_DEPS
10+
absl::base
11+
absl::core_headers
12+
absl::absl_check
13+
absl::absl_log
14+
absl::check
15+
absl::die_if_null
16+
absl::flags
17+
absl::flags_commandlineflag
18+
absl::flags_marshalling
19+
absl::flags_parse
20+
absl::flags_reflection
21+
absl::flags_usage
22+
absl::log
23+
absl::log_flags
24+
absl::log_globals
25+
absl::log_initialize
26+
absl::log_internal_message
27+
absl::cord
28+
absl::random_random
29+
absl::raw_hash_set
30+
absl::hash
31+
absl::leak_check
32+
absl::memory
33+
absl::meta
34+
absl::stacktrace
35+
absl::status
36+
absl::statusor
37+
absl::str_format
38+
absl::strings
39+
absl::synchronization
40+
absl::time
41+
absl::any
42+
)
43+
44+
if(NOT TARGET protobuf::libprotobuf)
45+
message(FATAL_ERROR "Target protobuf::libprotobuf not available.")
46+
endif()
47+
48+
# CXX Test
49+
if(BUILD_TESTING)
50+
if(NOT TARGET Catch2::Catch2)
51+
message(FATAL_ERROR "Target Catch2::Catch2 not available.")
52+
endif()
53+
54+
if(NOT TARGET re2::re2)
55+
message(FATAL_ERROR "Target re2::re2 not available.")
56+
endif()
57+
58+
if(NOT TARGET GTest::gtest_main)
59+
message(FATAL_ERROR "Target GTest::gtest_main not available.")
60+
endif()
61+
endif()

cmake/cpp.cmake

+17-91
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
enable_language(CXX)
2-
set(CMAKE_CXX_STANDARD 20)
3-
set(CMAKE_CXX_STANDARD_REQUIRED ON)
4-
set(CMAKE_CXX_EXTENSIONS OFF)
5-
61
# Check primitive types
72
option(CHECK_TYPE "Check primitive type size" OFF)
83
if(CHECK_TYPE)
@@ -33,83 +28,6 @@ if(CHECK_TYPE)
3328
cmake_pop_check_state()
3429
endif()
3530

36-
# Check dependencies
37-
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
38-
set(THREAD_PREFER_PTHREAD_FLAG TRUE)
39-
find_package(Threads REQUIRED)
40-
41-
include(FetchContent)
42-
set(FETCHCONTENT_QUIET OFF)
43-
set(FETCHCONTENT_UPDATES_DISCONNECTED ON)
44-
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
45-
set(CMAKE_Fortran_COMPILER OFF)
46-
47-
# ##############################################################################
48-
# ABSEIL-CPP
49-
# ##############################################################################
50-
message(CHECK_START "Fetching Abseil-cpp")
51-
list(APPEND CMAKE_MESSAGE_INDENT " ")
52-
set(ABSL_USE_SYSTEM_INCLUDES ON)
53-
# We want Abseil to declare what C++ standard it was compiled with.
54-
set(ABSL_PROPAGATE_CXX_STD ON)
55-
# We want Abseil to keep the INSTALL rules enabled, even though it is a
56-
# subproject. Otherwise the install rules in this project break.
57-
set(ABSL_ENABLE_INSTALL ON)
58-
FetchContent_Declare(
59-
absl
60-
GIT_REPOSITORY "https://github.com/abseil/abseil-cpp.git"
61-
GIT_TAG "20240116.2"
62-
GIT_SHALLOW TRUE
63-
PATCH_COMMAND git apply --ignore-whitespace "${CMAKE_CURRENT_LIST_DIR}/../patches/abseil-cpp-20240116.2.patch"
64-
OVERRIDE_FIND_PACKAGE)
65-
FetchContent_MakeAvailable(absl)
66-
list(POP_BACK CMAKE_MESSAGE_INDENT)
67-
message(CHECK_PASS "fetched")
68-
69-
# ##############################################################################
70-
# Protobuf
71-
# ##############################################################################
72-
message(CHECK_START "Fetching Protobuf")
73-
list(APPEND CMAKE_MESSAGE_INDENT " ")
74-
set(protobuf_BUILD_TESTS OFF)
75-
set(protobuf_BUILD_SHARED_LIBS OFF)
76-
set(protobuf_BUILD_EXPORT OFF)
77-
set(protobuf_MSVC_STATIC_RUNTIME OFF)
78-
set(protobuf_WITH_ZLIB OFF)
79-
FetchContent_Declare(
80-
protobuf
81-
GIT_REPOSITORY "https://github.com/protocolbuffers/protobuf.git"
82-
GIT_TAG "v27.2"
83-
GIT_SUBMODULES ""
84-
GIT_SHALLOW TRUE
85-
PATCH_COMMAND git apply --ignore-whitespace "${CMAKE_CURRENT_LIST_DIR}/../patches/protobuf-v27.2.patch")
86-
FetchContent_MakeAvailable(protobuf)
87-
list(POP_BACK CMAKE_MESSAGE_INDENT)
88-
message(CHECK_PASS "fetched")
89-
90-
if(BUILD_TESTING)
91-
message(CHECK_START "Fetching Googletest")
92-
FetchContent_Declare(
93-
googletest
94-
GIT_REPOSITORY https://github.com/google/googletest.git
95-
GIT_TAG main
96-
GIT_SHALLOW TRUE
97-
FIND_PACKAGE_ARGS NAMES GTest GMock)
98-
#set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
99-
FetchContent_MakeAvailable(googletest)
100-
message(CHECK_PASS "fetched")
101-
102-
message(CHECK_START "Fetching Catch2")
103-
FetchContent_Declare(
104-
Catch2
105-
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
106-
GIT_TAG devel
107-
GIT_SHALLOW TRUE
108-
FIND_PACKAGE_ARGS)
109-
FetchContent_MakeAvailable(Catch2)
110-
message(CHECK_PASS "fetched")
111-
endif()
112-
11331
include(GNUInstallDirs)
11432

11533
# add_cpp_test()
@@ -136,7 +54,8 @@ function(add_cpp_test FILE_NAME)
13654
target_include_directories(${TEST_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
13755
target_compile_features(${TEST_NAME} PRIVATE cxx_std_20)
13856
target_link_libraries(${TEST_NAME} PRIVATE
139-
Catch2 Catch2WithMain
57+
#GTest::gtest_main
58+
Catch2::Catch2WithMain
14059
${PROJECT_NAMESPACE}::Foo
14160
${PROJECT_NAMESPACE}::Bar
14261
${PROJECT_NAMESPACE}::FooBar)
@@ -152,13 +71,6 @@ add_subdirectory(Bar)
15271
add_subdirectory(FooBar)
15372

15473
add_library(Full)
155-
target_include_directories(Full
156-
PUBLIC
157-
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Foo/include>
158-
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Bar/include>
159-
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/FooBar/include>
160-
$<INSTALL_INTERFACE:include>)
161-
#target_link_libraries(Full INTERFACE
16274
# Xcode fails to build if library doesn't contains at least one source file.
16375
if(XCODE)
16476
file(GENERATE
@@ -171,14 +83,28 @@ target_sources(Full PRIVATE
17183
$<TARGET_OBJECTS:Foo>
17284
$<TARGET_OBJECTS:FooBar>
17385
)
86+
target_include_directories(Full
87+
PUBLIC
88+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Foo/include>
89+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Bar/include>
90+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/FooBar/include>
91+
$<INSTALL_INTERFACE:include>)
92+
target_compile_features(Full PUBLIC cxx_std_20)
93+
set_target_properties(Full PROPERTIES VERSION ${PROJECT_VERSION})
94+
if(APPLE)
95+
set_target_properties(Full PROPERTIES INSTALL_RPATH "@loader_path")
96+
elseif(UNIX)
97+
set_target_properties(Full PROPERTIES INSTALL_RPATH "$ORIGIN")
98+
endif()
99+
target_link_libraries(Full PRIVATE absl::log)
174100
add_library(${PROJECT_NAMESPACE}::Full ALIAS Full)
175101
install(TARGETS Full
176102
EXPORT ${PROJECT_NAME}Targets
177103
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/foobar
178104
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
179105
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
180106
#RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
181-
)
107+
)
182108

183109
add_subdirectory(FooBarApp)
184110

0 commit comments

Comments
 (0)