Skip to content

Commit 120ce20

Browse files
committed
support find_package()
1 parent c2853aa commit 120ce20

17 files changed

+566
-174
lines changed

CMakeLists.txt

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#
22
# cpp-tbox
33
#
4-
cmake_minimum_required(VERSION 3.10)
4+
cmake_minimum_required(VERSION 3.15)
55

66
#
77
# Building in-tree is not allowed (we take care of your craziness).
@@ -27,14 +27,14 @@ set(TBOX_VERSION_REVISION ${CMAKE_MATCH_1})
2727
set(TBOX_VERSION ${TBOX_VERSION_MAJOR}.${TBOX_VERSION_MINOR}.${TBOX_VERSION_REVISION})
2828

2929

30+
3031
#
3132
# Set install prefix
3233
#
3334
#set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/install" CACHE PATH "")
3435

35-
3636
project(
37-
tbox
37+
cpp-tbox
3838
VERSION ${TBOX_VERSION}
3939
DESCRIPTION "Easy to use, convenient and modern C++ treasure box!"
4040
HOMEPAGE_URL "https://gitee.com/cpp-master/cpp-tbox"
@@ -76,7 +76,7 @@ option(TBOX_ENABLE_NLOHMANN_JSON "install nlohmann/json" ON)
7676
#
7777
# TESTS
7878
#
79-
option(CMAKE_ENABLE_TEST "Whether to enable unit tests" OFF)
79+
option(CMAKE_ENABLE_TEST "Whether to enable unit tests" ON)
8080

8181
if(CMAKE_ENABLE_TEST)
8282
message(STATUS "Unit tests enabled")
@@ -85,92 +85,128 @@ if(CMAKE_ENABLE_TEST)
8585
enable_testing()
8686
endif()
8787

88+
include(GNUInstallDirs)
8889

8990
#
9091
# Compiler args
9192
#
9293
set(CMAKE_C_STANDARD 99)
9394
set(CMAKE_CXX_STANDARD 11)
9495
add_compile_options(-Wall -Wextra -Werror -Wno-missing-field-initializers)
96+
9597
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rd-party)
9698
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/modules)
9799

98100
add_definitions(-DTBOX_VERSION_MAJOR=${TBOX_VERSION_MAJOR}
99101
-DTBOX_VERSION_MINOR=${TBOX_VERSION_MINOR}
100102
-DTBOX_VERSION_REVISION=${TBOX_VERSION_REVISION})
101103

104+
set(TBOX_COMPONENTS)
105+
102106
if(TBOX_ENABLE_BASE)
103107
message(STATUS "base module enabled")
104-
add_subdirectory(modules/base)
108+
list(APPEND TBOX_COMPONENTS base)
105109
endif()
106110

107111
if(TBOX_ENABLE_UTIL)
108112
message(STATUS "util module enabled")
109-
add_subdirectory(modules/util)
113+
list(APPEND TBOX_COMPONENTS util)
110114
endif()
111115

112116
if(TBOX_ENABLE_EVENT)
113117
message(STATUS "event module enabled")
114-
add_subdirectory(modules/event)
118+
list(APPEND TBOX_COMPONENTS event)
115119
endif()
116120

117121
if(TBOX_ENABLE_EVENTX)
118122
message(STATUS "eventx module enabled")
119-
add_subdirectory(modules/eventx)
123+
list(APPEND TBOX_COMPONENTS eventx)
120124
endif()
121125

122126
if(TBOX_ENABLE_LOG)
123127
message(STATUS "log module enabled")
124-
add_subdirectory(modules/log)
128+
list(APPEND TBOX_COMPONENTS log)
125129
endif()
126130

127131
if(TBOX_ENABLE_NETWORK)
128132
message(STATUS "network module enabled")
129-
add_subdirectory(modules/network)
133+
list(APPEND TBOX_COMPONENTS network)
130134
endif()
131135

132136
if(TBOX_ENABLE_TERMINAL)
133137
message(STATUS "terminal module enabled")
134-
add_subdirectory(modules/terminal)
138+
list(APPEND TBOX_COMPONENTS terminal)
135139
endif()
136140

137141
if(TBOX_ENABLE_MAIN)
138142
message(STATUS "main module enabled")
139-
add_subdirectory(modules/main)
143+
list(APPEND TBOX_COMPONENTS main)
140144
endif()
141145

142146
if(TBOX_ENABLE_COROUTINE)
143147
message(STATUS "coroutine module enabled")
144-
add_subdirectory(modules/coroutine)
148+
list(APPEND TBOX_COMPONENTS coroutine)
145149
endif()
146150

147151
if(TBOX_ENABLE_HTTP)
148152
message(STATUS "http module enabled")
149-
add_subdirectory(modules/http)
153+
list(APPEND TBOX_COMPONENTS http)
150154
endif()
151155

152156
if(TBOX_ENABLE_MQTT)
153157
message(STATUS "mqtt module enabled")
154-
add_subdirectory(modules/mqtt)
158+
list(APPEND TBOX_COMPONENTS mqtt)
155159
endif()
156160

157161
if(TBOX_ENABLE_FLOW)
158162
message(STATUS "flow module enabled")
159-
add_subdirectory(modules/flow)
163+
list(APPEND TBOX_COMPONENTS flow)
160164
endif()
161165

162166
if(TBOX_ENABLE_ALARM)
163167
message(STATUS "alarm module enabled")
164-
add_subdirectory(modules/alarm)
168+
list(APPEND TBOX_COMPONENTS alarm)
165169
endif()
166170

167171
if(TBOX_ENABLE_CRYPTO)
168172
message(STATUS "crypto module enabled")
169-
add_subdirectory(modules/crypto)
173+
list(APPEND TBOX_COMPONENTS crypto)
170174
endif()
171175

176+
177+
foreach(item IN LISTS TBOX_COMPONENTS)
178+
add_subdirectory(modules/${item})
179+
endforeach()
180+
172181
if(TBOX_ENABLE_NLOHMANN_JSON)
173182
message(STATUS "nlohmann/json installation enabled")
183+
list(APPEND TBOX_COMPONENTS nlohmann)
174184
add_subdirectory(3rd-party/nlohmann)
175185
endif()
176186

187+
#
188+
# installation
189+
#
190+
include(CMakePackageConfigHelpers)
191+
192+
# generate the version file for the config file
193+
write_basic_package_version_file(
194+
"${CMAKE_CURRENT_BINARY_DIR}/tboxConfigVersion.cmake"
195+
VERSION "${TBOX_VERSION}"
196+
COMPATIBILITY AnyNewerVersion
197+
)
198+
199+
configure_package_config_file(
200+
${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
201+
"${CMAKE_CURRENT_BINARY_DIR}/tboxConfig.cmake"
202+
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/tbox
203+
PATH_VARS TBOX_COMPONENTS
204+
)
205+
206+
install(
207+
FILES
208+
"${CMAKE_CURRENT_BINARY_DIR}/tboxConfig.cmake"
209+
"${CMAKE_CURRENT_BINARY_DIR}/tboxConfigVersion.cmake"
210+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/tbox
211+
)
212+

Config.cmake.in

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
@PACKAGE_INIT@
2+
3+
set(_cpp_tbox_supported_components "@TBOX_COMPONENTS@")
4+
5+
foreach(_comp ${tbox_FIND_COMPONENTS})
6+
if (NOT _comp IN_LIST _cpp_tbox_supported_components)
7+
set(tbox_FOUND False)
8+
set(tbox_NOT_FOUND_MESSAGE "Unsupported component: ${_comp}, supported list: ${_cpp_tbox_supported_components}")
9+
endif()
10+
include("${CMAKE_CURRENT_LIST_DIR}/tbox_${_comp}_targets.cmake")
11+
endforeach()

README_CN.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,17 @@ cmake -B build -DCMAKE_INSTALL_PREFIX=$HOME/.tbox
120120
```
121121

122122
# 使用教程
123-
关于如何使用 cpp-tbox 开发自己的程序,详见教程:
123+
1. 关于如何使用 cpp-tbox 开发自己的程序,详见教程:
124124
[cpp-tbox-tutorials](https://gitee.com/cpp-master/cpp-tbox-tutorials)
125125

126+
2. 使用CMake **find_package**:
127+
tbox 使用CMake的components构建, 使用库的方法如下(CMakeLists.txt):
128+
```
129+
find_package(tbox COMPONENTS base util alarm event eventx ... REQUIRED) or find_package(tbox COMPONENTS base REQUIRED PATHS /your/install/path)
130+
target_link_libraries(your_target PRIVATE tbox::tbox_base tbox::tbox_util tbox::tbox_alarm tbox::tbox_event tbox::tbox_eventx ...)
131+
```
132+
133+
126134
# 外部库依赖
127135

128136
| 库名 | 依赖模块 | 说明 | 安装方法 |

modules/alarm/CMakeLists.txt

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ set(TBOX_ALARM_VERSION_MINOR 0)
55
set(TBOX_ALARM_VERSION_PATCH 1)
66
set(TBOX_ALARM_VERSION ${TBOX_ALARM_VERSION_MAJOR}.${TBOX_ALARM_VERSION_MINOR}.${TBOX_ALARM_VERSION_PATCH})
77

8-
project(tbox_alarm)
9-
108
add_definitions(-DLOG_MODULE_ID="tbox.alarm")
119

10+
set(TBOX_LIBRARY_NAME tbox_alarm)
11+
1212
set(TBOX_ALARM_HEADERS
1313
alarm.h
1414
weekly_alarm.h
@@ -29,17 +29,43 @@ set(TBOX_ALARM_SOURCES
2929
set(TBOX_ALARM_TEST_SOURCES
3030
workday_calendar_test.cpp)
3131

32-
add_library(${PROJECT_NAME} ${TBOX_BUILD_LIB_TYPE} ${TBOX_ALARM_SOURCES})
32+
add_library(${TBOX_LIBRARY_NAME} ${TBOX_BUILD_LIB_TYPE} ${TBOX_ALARM_SOURCES})
33+
add_library(tbox::${TBOX_LIBRARY_NAME} ALIAS ${TBOX_LIBRARY_NAME})
3334

34-
set_target_properties(${PROJECT_NAME} PROPERTIES
35-
VERSION ${TBOX_ALARM_VERSION}
36-
SOVERSION ${TBOX_ALARM_VERSION_MAJOR})
35+
set_target_properties(
36+
${TBOX_LIBRARY_NAME} PROPERTIES
37+
VERSION ${TBOX_ALARM_VERSION}
38+
SOVERSION ${TBOX_ALARM_VERSION_MAJOR}
39+
)
3740

3841
if(${TBOX_ENABLE_TEST})
39-
add_executable(${PROJECT_NAME}_test ${TBOX_ALARM_TEST_SOURCES})
40-
target_link_libraries(${PROJECT_NAME}_test gmock_main gmock gtest pthread ${PROJECT_NAME} tbox_base tbox_event rt dl)
41-
add_test(NAME ${PROJECT_NAME}_test COMMAND ${PROJECT_NAME}_test)
42+
add_executable(${TBOX_LIBRARY_NAME}_test ${TBOX_ALARM_TEST_SOURCES})
43+
44+
target_link_libraries(${TBOX_LIBRARY_NAME}_test gmock_main gmock gtest pthread ${TBOX_LIBRARY_NAME} tbox_base rt dl)
45+
add_test(NAME ${TBOX_LIBRARY_NAME}_test COMMAND ${TBOX_LIBRARY_NAME}_test)
4246
endif()
4347

44-
install(FILES ${TBOX_ALARM_HEADERS} DESTINATION include/tbox/alarm)
45-
install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION lib)
48+
# install the target and create export-set
49+
install(
50+
TARGETS ${TBOX_LIBRARY_NAME}
51+
EXPORT ${TBOX_LIBRARY_NAME}_targets
52+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
53+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
54+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
55+
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
56+
)
57+
58+
# install header file
59+
install(
60+
FILES ${TBOX_ALARM_HEADERS}
61+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tbox/alarm
62+
)
63+
64+
65+
# generate and install export file
66+
install(
67+
EXPORT ${TBOX_LIBRARY_NAME}_targets
68+
FILE ${TBOX_LIBRARY_NAME}_targets.cmake
69+
NAMESPACE tbox::
70+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/tbox
71+
)

modules/base/CMakeLists.txt

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
cmake_minimum_required(VERSION 3.15)
2-
31
set(TBOX_BASE_VERSION_MAJOR 1)
42
set(TBOX_BASE_VERSION_MINOR 0)
53
set(TBOX_BASE_VERSION_PATCH 1)
64
set(TBOX_BASE_VERSION ${TBOX_BASE_VERSION_MAJOR}.${TBOX_BASE_VERSION_MINOR}.${TBOX_BASE_VERSION_PATCH})
75

8-
project(tbox_base)
9-
106
add_definitions(-DLOG_MODULE_ID="tbox.base")
117

8+
set(TBOX_LIBRARY_NAME tbox_base)
9+
1210
set(TBOX_BASE_HEADERS
1311
version.h
1412
log.h
@@ -45,18 +43,43 @@ set(TBOX_BASE_TEST_SOURCES
4543
catch_throw_test.cpp
4644
object_pool_test.cpp)
4745

48-
add_library(${PROJECT_NAME} ${TBOX_BUILD_LIB_TYPE} ${TBOX_BASE_SOURCES})
46+
add_library(${TBOX_LIBRARY_NAME} ${TBOX_BUILD_LIB_TYPE} ${TBOX_BASE_SOURCES})
47+
add_library(tbox::${TBOX_LIBRARY_NAME} ALIAS ${TBOX_LIBRARY_NAME})
4948

50-
set_target_properties(${PROJECT_NAME} PROPERTIES
51-
VERSION ${TBOX_BASE_VERSION}
52-
SOVERSION ${TBOX_BASE_VERSION_MAJOR})
49+
set_target_properties(
50+
${TBOX_LIBRARY_NAME} PROPERTIES
51+
VERSION ${TBOX_BASE_VERSION}
52+
SOVERSION ${TBOX_BASE_VERSION_MAJOR}
53+
)
5354

5455
if(${TBOX_ENABLE_TEST})
55-
add_executable(${PROJECT_NAME}_test ${TBOX_BASE_TEST_SOURCES})
56+
add_executable(${TBOX_LIBRARY_NAME}_test ${TBOX_BASE_TEST_SOURCES})
5657

57-
target_link_libraries(${PROJECT_NAME}_test gmock_main gmock gtest pthread ${PROJECT_NAME} rt dl)
58-
add_test(NAME ${PROJECT_NAME}_test COMMAND ${PROJECT_NAME}_test)
58+
target_link_libraries(${TBOX_LIBRARY_NAME}_test gmock_main gmock gtest pthread ${TBOX_LIBRARY_NAME} rt dl)
59+
add_test(NAME ${TBOX_LIBRARY_NAME}_test COMMAND ${TBOX_LIBRARY_NAME}_test)
5960
endif()
6061

61-
install(FILES ${TBOX_BASE_HEADERS} DESTINATION include/tbox/base)
62-
install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION lib)
62+
# install the target and create export-set
63+
install(
64+
TARGETS ${TBOX_LIBRARY_NAME}
65+
EXPORT ${TBOX_LIBRARY_NAME}_targets
66+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
67+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
68+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
69+
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
70+
)
71+
72+
# install header file
73+
install(
74+
FILES ${TBOX_BASE_HEADERS}
75+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tbox/base
76+
)
77+
78+
79+
# generate and install export file
80+
install(
81+
EXPORT ${TBOX_LIBRARY_NAME}_targets
82+
FILE ${TBOX_LIBRARY_NAME}_targets.cmake
83+
NAMESPACE tbox::
84+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/tbox
85+
)

0 commit comments

Comments
 (0)