-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
120 lines (100 loc) · 3.34 KB
/
CMakeLists.txt
File metadata and controls
120 lines (100 loc) · 3.34 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
cmake_minimum_required(VERSION 3.20)
# --- Version from git tag ---
find_package(Git QUIET)
if(Git_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
execute_process(
COMMAND "${GIT_EXECUTABLE}" describe --tags --abbrev=0
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE GIT_TAG
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE _tag_rc
ERROR_QUIET
)
endif()
if(NOT _tag_rc EQUAL 0 OR GIT_TAG STREQUAL "")
set(GIT_TAG "0.0.0")
endif()
string(REGEX REPLACE "^v" "" GIT_TAG_STRIPPED "${GIT_TAG}")
# Set some basic project attributes
project (smartmeter-gateway
DESCRIPTION "Protocol gateway for domestic meter telemetry"
VERSION ${GIT_TAG_STRIPPED}
LANGUAGES CXX
)
include(GNUInstallDirs)
# --- Git commit hash (optional) ---
if(Git_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE GIT_COMMIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE _hash_rc
ERROR_QUIET
)
endif()
if(NOT _hash_rc EQUAL 0 OR GIT_COMMIT_HASH STREQUAL "")
set(GIT_COMMIT_HASH "unknown")
endif()
# Create a simple configuration header
configure_file(config.h.in config.h)
# --- Build type (only for single-config generators) ---
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type" FORCE)
endif()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
# --- Language/standard ---
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# --- Dependencies ---
find_package(nlohmann_json REQUIRED)
find_package(spdlog REQUIRED)
find_package(yaml-cpp REQUIRED)
find_package(CLI11 REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(MOSQUITTO REQUIRED IMPORTED_TARGET libmosquitto)
pkg_check_modules(MODBUS REQUIRED IMPORTED_TARGET libmodbus)
# --- Sources ---
set(SRC_FILES
src/main.cpp
src/config_yaml.cpp
src/mqtt_client.cpp
src/meter.cpp
src/modbus_slave.cpp
)
# --- Executable ---
add_executable(${PROJECT_NAME} ${SRC_FILES})
target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_BINARY_DIR} # for generated config.h
${PROJECT_SOURCE_DIR}/include # project's public headers
)
target_link_libraries(${PROJECT_NAME} PRIVATE
yaml-cpp
spdlog::spdlog
PkgConfig::MOSQUITTO
PkgConfig::MODBUS
nlohmann_json::nlohmann_json
CLI11::CLI11
)
# --- Install (so CPack has something to package) ---
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
# --- CPack (components) ---
include(InstallRequiredSystemLibraries)
# Global metadata
set(CPACK_GENERATOR "TGZ;DEB")
set(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
set(CPACK_PACKAGE_CONTACT "Alexander Pohl <alex@ahpohl.com>")
set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
# DEB naming: canonical names per Debian policy
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
set(CPACK_DEBIAN_PACKAGE_SECTION "net")
# TGZ custom archive name
string(TOLOWER "${CMAKE_SYSTEM_NAME}" OS_NAME)
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" ARCH)
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}_v${PROJECT_VERSION}_${OS_NAME}_${ARCH}")
include(CPack)