forked from an-dr/microlog
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
135 lines (112 loc) · 5.06 KB
/
CMakeLists.txt
File metadata and controls
135 lines (112 loc) · 5.06 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
# *************************************************************************
#
# Copyright (c) 2025 Andrei Gramakov. All rights reserved.
#
# This file is licensed under the terms of the MIT license. For a copy, see:
# https://opensource.org/licenses/MIT
#
# site: https://agramakov.me e-mail: mail@agramakov.me
#
# *************************************************************************
# ----------------------------------------------------------------------------
# Project
# ----------------------------------------------------------------------------
cmake_minimum_required(VERSION 3.15.0)
# Read version (raw file contains semantic version optionally with metadata)
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/version" VERSION_CONTENT)
string(STRIP "${VERSION_CONTENT}" PROJECT_VERSION_RAW)
string(REGEX REPLACE "^([0-9]+\.[0-9]+\.[0-9]+).*$" "\\1" PROJECT_VERSION
"${PROJECT_VERSION_RAW}")
# Declare the project
project(microlog VERSION ${PROJECT_VERSION})
# ----------------------------------------------------------------------------
# Version substitution
# ----------------------------------------------------------------------------
# Expose version for substitution
set(ULOG_VERSION "${PROJECT_VERSION_RAW}")
# Configure selected sources/headers preserving relative paths
set(ULOG_CONFIGURED_DIR ${CMAKE_CURRENT_BINARY_DIR}/configured)
# Treat source files as templates
set(ULOG_FILES_CONFIGURE src/ulog.c include/ulog.h)
# Process each template
foreach(input_file ${ULOG_FILES_CONFIGURE})
# Create subdirs as needed
get_filename_component(dir ${input_file} DIRECTORY)
if(dir)
file(MAKE_DIRECTORY ${ULOG_CONFIGURED_DIR}/${dir})
endif()
# Configure file
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${input_file}
${ULOG_CONFIGURED_DIR}/${input_file} @ONLY NEWLINE_STYLE UNIX)
endforeach()
# ----------------------------------------------------------------------------
# Building
# ----------------------------------------------------------------------------
set(ULOG_BUILD_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/include)
set(ULOG_BUILD_SRC_DIR ${CMAKE_CURRENT_LIST_DIR}/src)
set(ULOG_INSTALL_INCLUDE_DIR .)
set(ULOG_INSTALL_SRC_DIR share/${PROJECT_NAME}/src)
add_library(${PROJECT_NAME} INTERFACE)
add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
target_sources(
microlog
INTERFACE $<BUILD_INTERFACE:${ULOG_BUILD_SRC_DIR}/ulog.c>
$<INSTALL_INTERFACE:${ULOG_INSTALL_SRC_DIR}/ulog.c> # installed
# version
# will assume relative to install prefix
)
target_include_directories(
${PROJECT_NAME}
INTERFACE $<BUILD_INTERFACE:${ULOG_BUILD_INCLUDE_DIR}> # while building
$<INSTALL_INTERFACE:${ULOG_INSTALL_INCLUDE_DIR}> # when
# installed
)
# ----------------------------------------------------------------------------
# Testing
# ----------------------------------------------------------------------------
if(ULOG_BUILD_TESTS)
include(CTest)
enable_testing()
message(STATUS "Building tests")
add_subdirectory(tests/unit)
else()
message(STATUS "Skipping tests")
endif()
# ----------------------------------------------------------------------------
# Installing
# ----------------------------------------------------------------------------
set(ULOG_INSTALL_INCLUDE_IN ${ULOG_CONFIGURED_DIR}/include)
set(ULOG_INSTALL_SRC_IN ${ULOG_CONFIGURED_DIR}/src/ulog.c)
set(ULOG_CMAKE_INSTALL_DIR lib/cmake/${PROJECT_NAME})
install(
TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}Targets
ARCHIVE DESTINATION lib)
# Headers (they are sources, not artifacts so copy them explicitly)
install(DIRECTORY ${ULOG_INSTALL_INCLUDE_IN}
DESTINATION ${ULOG_INSTALL_INCLUDE_DIR})
install(FILES ${ULOG_INSTALL_SRC_IN} DESTINATION ${ULOG_INSTALL_SRC_DIR})
# ----------------------------------------------------------------------------
# Packing
# ----------------------------------------------------------------------------
set(ULOG_CONFIG_FILE_IN ${CMAKE_CURRENT_LIST_DIR}/cmake/micrologConfig.cmake.in)
set(ULOG_CONFIG_FILE_OUT ${CMAKE_CURRENT_BINARY_DIR}/micrologConfig.cmake)
set(ULOG_TARGETS_FILE ${CMAKE_CURRENT_LIST_DIR}/cmake/micrologTargets.cmake)
set(ULOG_VERSION_FILE_OUT
${CMAKE_CURRENT_BINARY_DIR}/micrologConfigVersion.cmake)
include(CMakePackageConfigHelpers)
# We have a custom Targets file below. Original is generated like this: install(
# EXPORT ${PROJECT_NAME}Targets NAMESPACE ${PROJECT_NAME}:: DESTINATION
# ${CMAKE_INSTALL_PREFIX})
install(FILES ${ULOG_TARGETS_FILE} DESTINATION ${ULOG_CMAKE_INSTALL_DIR})
# Make a config file using targets based on the template
configure_package_config_file(${ULOG_CONFIG_FILE_IN} ${ULOG_CONFIG_FILE_OUT}
INSTALL_DESTINATION ${ULOG_CMAKE_INSTALL_DIR})
# Make a version file
write_basic_package_version_file(
${ULOG_VERSION_FILE_OUT}
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion)
install(FILES ${ULOG_CONFIG_FILE_OUT} ${ULOG_VERSION_FILE_OUT}
DESTINATION ${ULOG_CMAKE_INSTALL_DIR})
install(FILES ${CMAKE_CURRENT_LIST_DIR}/LICENSE DESTINATION .)