Skip to content

Commit 9865cb9

Browse files
committed
Merge branch 'release/v1.0.1'
2 parents 7bde3e7 + 47128bd commit 9865cb9

File tree

14 files changed

+113
-89
lines changed

14 files changed

+113
-89
lines changed

.clang-tidy

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
---
22
Checks: "-*,\
33
boost-*,\
4+
bugprone-*,\
45
cert-*,\
56
clang-analyzer-*,\
67
cppcoreguidelines-*,\
7-
-cppcoreguidelines-macro-usage,\
8+
cppcoreguidelines-macro-usage,\
89
-cppcoreguidelines-owning-memory,\
910
hicpp-*,\
11+
llvm-*,\
1012
misc-*,\
1113
misc-non-private-member-variables-in-classes,\
1214
modernize-*,\
@@ -17,7 +19,7 @@ readability-*,\
1719
-*magic-numbers,\
1820
-*avoid-c-arrays,\
1921
"
20-
WarningsAsErrors: ''
22+
WarningsAsErrors: 'clang-*'
2123
HeaderFilterRegex: '.*'
2224
AnalyzeTemporaryDtors: false
2325
FormatStyle: file

.cmake-format

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ parse:
6565
VERSION_HEADER: 1
6666
EXPORT_HEADER: 1
6767
DISABLE_VERSION_SUFFIX: 1
68+
DISABLE_CHECK_REQUIRED_COMPONENTS: 1
6869
DEPENDENCIES: +
6970
cpmusepackagelock:
7071
pargs: 1

CMakeLists.txt

Lines changed: 41 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -31,77 +31,73 @@ include(cmake/CPM.cmake)
3131
# PackageProject.cmake will be used to make our target installable
3232
CPMAddPackage(
3333
NAME PackageProject.cmake
34-
GITHUB_REPOSITORY TheLartians/PackageProject.cmake
35-
VERSION 1.5.1
34+
GITHUB_REPOSITORY ClausKlein/PackageProject.cmake
35+
# VERSION 1.5.1
36+
GIT_TAG 43fccf1a2f8f3d8dbecd547485c2278035448171
3637
)
3738

38-
option(COMPONENT_TARGETS_ENABLED "Install multiple cmake config target files" NO)
39+
set(COMPONENT_TARGETS_ENABLED NO) # Note: DO not set! CK
3940
set(PROJECT_NAMESPACE ${PROJECT_NAME})
41+
set(PROJECT_VERSION_INCLUDE_DIR ${PROJECT_BINARY_DIR}/PackageProjectInclude)
42+
include_directories(${PROJECT_VERSION_INCLUDE_DIR})
43+
4044
set(NAMESPACE_HEADER_LOCATION ${CMAKE_CURRENT_LIST_DIR}/include)
45+
set(INCLUDE_INSTALL_DIR include/${PROJECT_NAMESPACE}-${PROJECT_VERSION}) # XXX VERSION_SUFFIX
4146
string(TOLOWER ${PROJECT_NAMESPACE} PROJECT_HEADER_LOCATION)
42-
43-
if(NOT COMPONENT_TARGETS_ENABLED)
44-
message(STATUS "Install only 1 cmake config target ${PROJECT_NAMESPACE}Targets.cmake file")
45-
endif()
47+
# TODO: needed to be lower case? CK
4648

4749
# ---- Add components libraries here ----
4850

4951
add_subdirectory(source/Addition)
5052
add_subdirectory(source/SquareRoot)
51-
add_subdirectory(source/MathFunctions)
52-
53-
# ---------------------------------------
5453

55-
include(GenerateExportHeader)
56-
57-
# Note: depends on target MathFunctions! CK
58-
string(TOLOWER ${PROJECT_NAME}/${PROJECT_NAMESPACE}_export.h EXPORT_HEADER_LOCATION)
59-
60-
# Note: need to generate at source tree! CK
61-
generate_export_header(
62-
${PROJECT_NAMESPACE} EXPORT_FILE_NAME ${CMAKE_CURRENT_LIST_DIR}/include/${EXPORT_HEADER_LOCATION}
54+
# NO! add_subdirectory(source/MathFunctions)
55+
add_library(${PROJECT_NAME} source/MathFunctions/MathFunctions.cxx)
56+
target_include_directories(
57+
${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${NAMESPACE_HEADER_LOCATION}>
58+
$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
6359
)
6460

65-
# install generated header files
66-
install(
67-
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/${PROJECT_HEADER_LOCATION}
68-
TYPE INCLUDE # or: DESTINATION include/${PROJECT_NAMESPACE}
69-
FILES_MATCHING
70-
PATTERN "*.h"
61+
# Note: for SameMajorVersion upgrade stategie
62+
set_target_properties(
63+
${PROJECT_NAME}
64+
PROPERTIES SOVERSION ${PROJECT_VERSION_MAJOR}
65+
VERSION ${PROJECT_VERSION}
66+
VISIBILITY_INLINES_HIDDEN ${BUILD_SHARED_LIBS}
67+
CMAKE_VISIBILITY_INLINES_HIDDEN ${BUILD_SHARED_LIBS}
7168
)
7269

73-
# install source tree header files
74-
install(
75-
DIRECTORY include/${PROJECT_HEADER_LOCATION}
76-
TYPE INCLUDE # or: DESTINATION include/${PROJECT_NAMESPACE}
77-
FILES_MATCHING
78-
PATTERN "*.h"
79-
)
70+
# ---- Create an installable target ----
71+
# this allows users to install and find the libraries via `find_package()`.
72+
73+
# the location where the project's version header will be placed should match the project's regular
74+
# header paths
75+
string(TOLOWER ${PROJECT_NAMESPACE}/version.h PROJECT_VERSION_HEADER)
76+
string(TOLOWER ${PROJECT_NAMESPACE}/${PROJECT_NAMESPACE}_export.h PROJECT_EXPORT_HEADER)
77+
# TODO: needed to be lower case? CK
8078

8179
# Note: This needs to be done after all install(TARGETS ...) commands!
8280
# generate and install export targets file
8381
install(
8482
EXPORT ${PROJECT_NAMESPACE}Targets
8583
FILE ${PROJECT_NAMESPACE}Targets.cmake
8684
NAMESPACE ${PROJECT_NAMESPACE}::
87-
DESTINATION lib/cmake/${PROJECT_NAMESPACE}
85+
DESTINATION lib/cmake/${PROJECT_NAMESPACE}-${PROJECT_VERSION} # XXX VERSION_SUFFIX
8886
)
8987

90-
include(CMakePackageConfigHelpers)
91-
92-
# generate the version file for the config file
93-
write_basic_package_version_file(
94-
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAMESPACE}ConfigVersion.cmake
88+
# Note: the export header will be installed while installing the version header! CK
89+
packageProject(
90+
NAME ${PROJECT_NAME}
9591
VERSION ${PROJECT_VERSION}
92+
NAMESPACE ${PROJECT_NAMESPACE}
93+
BINARY_DIR ${PROJECT_BINARY_DIR}
94+
INCLUDE_DIR ${NAMESPACE_HEADER_LOCATION}
95+
INCLUDE_DESTINATION ${INCLUDE_INSTALL_DIR}
96+
VERSION_HEADER ${PROJECT_VERSION_HEADER}
97+
EXPORT_HEADER ${PROJECT_EXPORT_HEADER}
9698
COMPATIBILITY SameMajorVersion
97-
)
98-
99-
# create config file
100-
configure_package_config_file(
101-
${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
102-
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAMESPACE}Config.cmake
103-
INSTALL_DESTINATION lib/cmake/${PROJECT_NAMESPACE}
104-
NO_CHECK_REQUIRED_COMPONENTS_MACRO
99+
# XXX DISABLE_VERSION_SUFFIX NOT YET! CK
100+
DISABLE_CHECK_REQUIRED_COMPONENTS YES
105101
)
106102

107103
# generate the export targets for the build tree. Note: The file created by this command is specific
@@ -111,9 +107,3 @@ export(
111107
FILE ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAMESPACE}Targets.cmake
112108
NAMESPACE ${PROJECT_NAMESPACE}::
113109
)
114-
115-
# install cmake project config files
116-
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake
117-
${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake
118-
DESTINATION lib/cmake/${PROJECT_NAMESPACE}
119-
)

GNUmakefile

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,23 @@
44
GENERATOR?=Ninja
55

66
STAGE_DIR?=$(CURDIR)/stage
7-
BUILD_TYPE?=Release
8-
CMAKE_PRESET:=-G "$(GENERATOR)" -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DCMAKE_PREFIX_PATH=$(STAGE_DIR)
7+
BUILD_TYPE?=Debug
8+
CMAKE_PRESET:=-G "$(GENERATOR)" -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DCMAKE_PREFIX_PATH=$(STAGE_DIR) -DCMAKE_CXX_STANDARD=20 -DBUILD_SHARED_LIBS=1
99
# Note: not needed -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
1010

11-
#XXX export CXX=clang++
11+
# export CXX=/usr/local/bin/g++-10
12+
# export GCOV=/usr/local/bin/gcov-10
13+
# export CXX=clang++
14+
# export GCOV=llvm-cov
15+
1216
export CPM_USE_LOCAL_PACKAGES=0
1317
export CPM_SOURCE_CACHE=${HOME}/.cache/CPM
1418

19+
TOOL_NAME:=$(shell basename $(CXX))
1520
PROJECT_NAME:=$(shell basename $(CURDIR))
16-
BUILD_DIR?=../build-$(PROJECT_NAME)-$(CXX)-$(BUILD_TYPE)
21+
BUILD_DIR?=../build-$(PROJECT_NAME)-$(TOOL_NAME)-$(BUILD_TYPE)
1722

18-
.PHONY: update format all test standalone doc check clean distclean
23+
.PHONY: update format all test standalone doc modernize clean distclean
1924

2025
# the default target does just all, but neither standalone nor doc
2126
test:
@@ -33,10 +38,10 @@ update:
3338

3439
# install the library to stagedir
3540
install:
36-
cmake -S . -B $(BUILD_DIR)/$@ ${CMAKE_PRESET} -DCMAKE_INSTALL_PREFIX=$(STAGE_DIR) -DCMAKE_CXX_STANDARD=20 #NO! -DCMAKE_CXX_CLANG_TIDY=clang-tidy # --trace-expand
41+
cmake -S . -B $(BUILD_DIR)/$@ ${CMAKE_PRESET} -DCMAKE_INSTALL_PREFIX=$(STAGE_DIR)
3742
cmake --build $(BUILD_DIR)/$@ --target $@
3843
perl -i.bak -pe 's#-I($$CPM_SOURCE_CACHE)#-isystem $$1#g' $(BUILD_DIR)/$@/compile_commands.json
39-
run-clang-tidy.py -p $(BUILD_DIR)/$@ -quiet -header-filter='$(CURDIR)/.*' source # Note: only local sources! CK
44+
run-clang-tidy.py -p $(BUILD_DIR)/$@ -quiet -header-filter='$(CURDIR)/.*' source # Note: only local sources! CK
4045

4146
# test the library
4247
test: install
@@ -45,13 +50,17 @@ test: install
4550
perl -i.bak -pe 's#-I($$CPM_SOURCE_CACHE)#-isystem $$1#g' $(BUILD_DIR)/$@/compile_commands.json
4651
cmake --build $(BUILD_DIR)/$@
4752
cmake --build $(BUILD_DIR)/$@ --target $@
48-
run-clang-tidy.py -p $(BUILD_DIR)/$@ -quiet -header-filter='$(CURDIR)/.*' test/source # Note: only local sources! CK
53+
run-clang-tidy.py -p $(BUILD_DIR)/$@ -quiet -header-filter='$(CURDIR)/.*' test/source # Note: only local sources! CK
4954

5055
# all together
5156
all:
52-
cmake -S $@ -B $(BUILD_DIR)/$@ ${CMAKE_PRESET} -DENABLE_TEST_COVERAGE=1 # Note: NO! -DUSE_STATIC_ANALYZER=clang-tidy CK
57+
cmake -S $@ -B $(BUILD_DIR)/$@ ${CMAKE_PRESET} -DENABLE_TEST_COVERAGE=1 # NO! -DUSE_STATIC_ANALYZER=clang-tidy CK
5358
cmake --build $(BUILD_DIR)/$@
5459
cmake --build $(BUILD_DIR)/$@ --target test
60+
gcovr --root $(BUILD_DIR)/$@ --exclude-directories test # --verbose
61+
# gcovr -r $(BUILD_DIR)/$@ --html-details -o $(CURDIR)/coverage.html --verbose
62+
perl -i.bak -pe 's#-I($$CPM_SOURCE_CACHE)#-isystem $$1#g' $(BUILD_DIR)/$@/compile_commands.json
63+
run-clang-tidy.py -p $(BUILD_DIR)/$@ -quiet -header-filter='$(CURDIR)/.*' $(CURDIR) # Note: only local sources! CK
5564

5665
# GenerateDocs
5766
doc:
@@ -69,6 +78,7 @@ standalone:
6978
perl -i.bak -pe 's#-I($$CPM_SOURCE_CACHE)#-isystem $$1#g' $(BUILD_DIR)/$@/compile_commands.json
7079
cmake --build $(BUILD_DIR)/$@
7180

72-
# check the library
73-
check: standalone
74-
run-clang-tidy.py -p $(BUILD_DIR)/standalone -quiet -header-filter='$(CURDIR)/.*' -checks='-*,modernize-*,misc-*,hicpp-*,cert-*,readability-*,portability-*,performance-*,google-*' standalone
81+
# modernize the library sources
82+
modernize: standalone
83+
run-clang-tidy.py -p $(BUILD_DIR)/standalone -quiet -header-filter='$(CURDIR)/.*' \
84+
-checks='-*,modernize-*' -j1 -fix $(CURDIR) # Note: only local sources! CK

cmake/options.cmake

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ endif()
99
# Note: same postfix as fmt and spdlog! CK
1010
set(CMAKE_DEBUG_POSTFIX d)
1111

12-
option(BUILD_SHARED_LIBS "Build shared libraries" NO)
12+
option(BUILD_SHARED_LIBS "Build shared libraries" YES)
1313

1414
# build the dynamic libraries and executables together at bin directory
1515
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
@@ -45,6 +45,11 @@ if(NOT MSVC)
4545
CACHE STRING "dependency flag" FORCE
4646
)
4747
endif()
48+
49+
if(ENABLE_TEST_COVERAGE AND "${CMAKE_BUILD_TYPE}" STREQUAL Debug)
50+
add_compile_options(--coverage -O0 -g)
51+
add_link_options(--coverage)
52+
endif()
4853
endif()
4954

5055
option(CMAKE_EXPORT_COMPILE_COMMANDS "support clang-tidy, cppcheck, ..." YES)

include/mathfunctions/Addition.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
#pragma once
22

3+
// quickhack for now! CK
4+
#ifdef Addition_EXPORTS
5+
# define MathFunctions_EXPORTS
6+
#endif
7+
38
#include <mathfunctions/mathfunctions_export.h>
49

510
namespace MathFunctions {

include/mathfunctions/SquareRoot.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
#pragma once
22

3+
// quickhack for now! CK
4+
#ifdef SquareRoot_EXPORTS
5+
# define MathFunctions_EXPORTS
6+
#endif
7+
38
#include <mathfunctions/mathfunctions_export.h>
49

510
namespace MathFunctions {

source/Addition/CMakeLists.txt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,27 @@ set_target_properties(
1818

1919
# add include directories
2020
target_include_directories(
21-
Addition PUBLIC $<BUILD_INTERFACE:${NAMESPACE_HEADER_LOCATION}> $<INSTALL_INTERFACE:include>
21+
Addition
22+
PUBLIC $<BUILD_INTERFACE:${NAMESPACE_HEADER_LOCATION}>
23+
$<BUILD_INTERFACE:${PROJECT_VERSION_INCLUDE_DIR}>
24+
$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
2225
)
2326

2427
# install the target and create export-set
2528
install(
2629
TARGETS Addition
2730
EXPORT ${PROJECT_NAMESPACE}Targets
28-
ARCHIVE DESTINATION lib
29-
LIBRARY DESTINATION lib
30-
RUNTIME DESTINATION bin
31+
ARCHIVE DESTINATION lib/${PROJECT_NAMESPACE}-${PROJECT_VERSION} # XXX VERSION_SUFFIX
32+
LIBRARY DESTINATION lib/${PROJECT_NAMESPACE}-${PROJECT_VERSION} # XXX VERSION_SUFFIX
33+
RUNTIME DESTINATION bin/${PROJECT_NAMESPACE}-${PROJECT_VERSION} # XXX VERSION_SUFFIX
3134
INCLUDES
32-
DESTINATION include
35+
DESTINATION ${INCLUDE_INSTALL_DIR}
3336
)
3437

3538
# MAYBE: install public header files
3639
# string(TOLOWER ${PROJECT_NAMESPACE} HEADER_LOCATION)
3740
# install(FILES ${NAMESPACE_HEADER_LOCATION}/${PROJECT_NAMESPACE}/Addition.h
38-
# DESTINATION include/${HEADER_LOCATION}
41+
# DESTINATION ${INCLUDE_INSTALL_DIR}/${PROJECT_NAMESPACE}
3942
# )
4043

4144
if(COMPONENT_TARGETS_ENABLED)

source/MathFunctions/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ set_target_properties(
1919

2020
# add include directories
2121
target_include_directories(
22-
MathFunctions PUBLIC $<BUILD_INTERFACE:${NAMESPACE_HEADER_LOCATION}> $<INSTALL_INTERFACE:include>
22+
MathFunctions PUBLIC $<BUILD_INTERFACE:${NAMESPACE_HEADER_LOCATION}>
23+
$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
2324
)
2425

2526
# install the target and create export-set
@@ -34,9 +35,8 @@ install(
3435
)
3536

3637
# MAYBE: install public header files
37-
# string(TOLOWER ${PROJECT_NAMESPACE} HEADER_LOCATION)
3838
# install(FILES ${NAMESPACE_HEADER_LOCATION}/${PROJECT_NAMESPACE}/MathFunctions.h
39-
# DESTINATION include/${HEADER_LOCATION}
39+
# DESTINATION ${INCLUDE_INSTALL_DIR}/${PROJECT_NAMESPACE}
4040
# )
4141

4242
if(COMPONENT_TARGETS_ENABLED)

source/MathFunctions/MathFunctions.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "mathfunctions/MathFunctions.h"
1+
#include <mathfunctions/MathFunctions.h>
22

33
#include <cmath>
44

source/SquareRoot/CMakeLists.txt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,27 @@ set_target_properties(
1818

1919
# add include directories
2020
target_include_directories(
21-
SquareRoot PUBLIC $<BUILD_INTERFACE:${NAMESPACE_HEADER_LOCATION}> $<INSTALL_INTERFACE:include>
21+
SquareRoot
22+
PUBLIC $<BUILD_INTERFACE:${NAMESPACE_HEADER_LOCATION}>
23+
$<BUILD_INTERFACE:${PROJECT_VERSION_INCLUDE_DIR}>
24+
$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
2225
)
2326

2427
# install the target and create export-set
2528
install(
2629
TARGETS SquareRoot
2730
EXPORT ${PROJECT_NAMESPACE}Targets
28-
ARCHIVE DESTINATION lib
29-
LIBRARY DESTINATION lib
30-
RUNTIME DESTINATION bin
31+
ARCHIVE DESTINATION lib/${PROJECT_NAMESPACE}-${PROJECT_VERSION} # XXX VERSION_SUFFIX
32+
LIBRARY DESTINATION lib/${PROJECT_NAMESPACE}-${PROJECT_VERSION} # XXX VERSION_SUFFIX
33+
RUNTIME DESTINATION bin/${PROJECT_NAMESPACE}-${PROJECT_VERSION} # XXX VERSION_SUFFIX
3134
INCLUDES
32-
DESTINATION include
35+
DESTINATION ${INCLUDE_INSTALL_DIR}
3336
)
3437

3538
# MAYBE: install public header files
3639
# string(TOLOWER ${PROJECT_NAMESPACE} HEADER_LOCATION)
3740
# install(FILES ${NAMESPACE_HEADER_LOCATION}/${PROJECT_NAMESPACE}/SquareRoot.h
38-
# DESTINATION include/${PROJECT_NAMESPACE}
41+
# DESTINATION ${INCLUDE_INSTALL_DIR}/${PROJECT_NAMESPACE}
3942
# )
4043

4144
if(COMPONENT_TARGETS_ENABLED)

standalone/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ CPMAddPackage(
2525
)
2626

2727
CPMAddPackage(NAME MathFunctions SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/..)
28-
# same as: add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/.. MathFunctions)
28+
# Not same as! add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/.. MathFunctions)
2929

3030
# ---- Create standalone executable ----
3131

standalone/source/main.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ auto main(int argc, char* argv[]) -> int {
1313
}
1414

1515
// convert input to double
16-
const double inputValue = std::stod(argv[1]);
16+
const double inputValue = std::stod(argv[1]); // NOLINT Note: may throw! CK
1717

1818
// calculate square root
1919
const double sqrt = MathFunctions::sqrt(inputValue);

0 commit comments

Comments
 (0)