mirror of
				https://github.com/TheLartians/ModernCppStarter.git
				synced 2025-10-31 02:01:33 +01:00 
			
		
		
		
	Merge branch 'feature/modernize-cmake' into develop
This commit is contained in:
		
						commit
						49fc73f82c
					
				
					 19 changed files with 213 additions and 102 deletions
				
			
		|  | @ -40,10 +40,16 @@ parse: | ||||||
|         flags: [] |         flags: [] | ||||||
|       spelling: CPMFindPackage |       spelling: CPMFindPackage | ||||||
|       kwargs: *cpmaddpackagekwargs |       kwargs: *cpmaddpackagekwargs | ||||||
|     packageproject: |     cpmdeclarepackage: | ||||||
|       pargs: |       pargs: | ||||||
|         nargs: '*' |         nargs: '*' | ||||||
|         flags: [] |         flags: [] | ||||||
|  |       spelling: CPMDeclarePackage | ||||||
|  |       kwargs: *cpmaddpackagekwargs | ||||||
|  |     packageproject: | ||||||
|  |       pargs: | ||||||
|  |         nargs: '*' | ||||||
|  |         flags: [NO_VERSION_SUFFIX] | ||||||
|       spelling: packageProject |       spelling: packageProject | ||||||
|       kwargs: |       kwargs: | ||||||
|         NAME: 1 |         NAME: 1 | ||||||
|  | @ -55,3 +61,12 @@ parse: | ||||||
|         COMPATIBILITY: 1 |         COMPATIBILITY: 1 | ||||||
|         VERSION_HEADER: 1 |         VERSION_HEADER: 1 | ||||||
|         DEPENDENCIES: + |         DEPENDENCIES: + | ||||||
|  |     cpmusepackagelock: | ||||||
|  |       pargs: 1 | ||||||
|  |       spelling: CPMUsePackageLock | ||||||
|  |     cpmregisterpackage: | ||||||
|  |       pargs: 1 | ||||||
|  |       spelling: CPMRegisterPackage | ||||||
|  |     cpmgetpackageversion: | ||||||
|  |       pargs: 2 | ||||||
|  |       spelling: CPMGetPackageVersion | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								.github/workflows/install.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/install.yml
									
										
									
									
										vendored
									
									
								
							|  | @ -1,12 +1,15 @@ | ||||||
|  | --- | ||||||
| name: Install | name: Install | ||||||
| 
 | 
 | ||||||
| on: | on: | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
|       - master |       - master | ||||||
|  |       - develop | ||||||
|   pull_request: |   pull_request: | ||||||
|     branches: |     branches: | ||||||
|       - master |       - master | ||||||
|  |       - develop | ||||||
| 
 | 
 | ||||||
| env: | env: | ||||||
|   CTEST_OUTPUT_ON_FAILURE: 1 |   CTEST_OUTPUT_ON_FAILURE: 1 | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								.github/workflows/macos.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/macos.yml
									
										
									
									
										vendored
									
									
								
							|  | @ -1,12 +1,15 @@ | ||||||
|  | --- | ||||||
| name: MacOS | name: MacOS | ||||||
| 
 | 
 | ||||||
| on: | on: | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
|       - master |       - master | ||||||
|  |       - develop | ||||||
|   pull_request: |   pull_request: | ||||||
|     branches: |     branches: | ||||||
|       - master |       - master | ||||||
|  |       - develop | ||||||
| 
 | 
 | ||||||
| env: | env: | ||||||
|   CTEST_OUTPUT_ON_FAILURE: 1 |   CTEST_OUTPUT_ON_FAILURE: 1 | ||||||
|  |  | ||||||
							
								
								
									
										11
									
								
								.github/workflows/standalone.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/workflows/standalone.yml
									
										
									
									
										vendored
									
									
								
							|  | @ -1,12 +1,13 @@ | ||||||
|  | --- | ||||||
| name: Standalone | name: Standalone | ||||||
| 
 | 
 | ||||||
| on: | on: | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
|       - master |       - develop | ||||||
|   pull_request: |   pull_request: | ||||||
|     branches: |     branches: | ||||||
|       - master |       - develop | ||||||
| 
 | 
 | ||||||
| env: | env: | ||||||
|   CPM_SOURCE_CACHE: ${{ github.workspace }}/cpm_modules |   CPM_SOURCE_CACHE: ${{ github.workspace }}/cpm_modules | ||||||
|  | @ -29,5 +30,7 @@ jobs: | ||||||
|       - name: build |       - name: build | ||||||
|         run: cmake --build build -j4 |         run: cmake --build build -j4 | ||||||
| 
 | 
 | ||||||
|       - name: run |       - name: test | ||||||
|         run: ./build/Greeter |         run: | | ||||||
|  |           cd build | ||||||
|  |           ctest --build-config Debug --verbose | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								.github/workflows/style.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/style.yml
									
										
									
									
										vendored
									
									
								
							|  | @ -1,12 +1,15 @@ | ||||||
|  | --- | ||||||
| name: Style | name: Style | ||||||
| 
 | 
 | ||||||
| on: | on: | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
|       - master |       - master | ||||||
|  |       - develop | ||||||
|   pull_request: |   pull_request: | ||||||
|     branches: |     branches: | ||||||
|       - master |       - master | ||||||
|  |       - develop | ||||||
| 
 | 
 | ||||||
| env: | env: | ||||||
|   CPM_SOURCE_CACHE: ${{ github.workspace }}/cpm_modules |   CPM_SOURCE_CACHE: ${{ github.workspace }}/cpm_modules | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								.github/workflows/ubuntu.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/ubuntu.yml
									
										
									
									
										vendored
									
									
								
							|  | @ -1,12 +1,15 @@ | ||||||
|  | --- | ||||||
| name: Ubuntu | name: Ubuntu | ||||||
| 
 | 
 | ||||||
| on: | on: | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
|       - master |       - master | ||||||
|  |       - develop | ||||||
|   pull_request: |   pull_request: | ||||||
|     branches: |     branches: | ||||||
|       - master |       - master | ||||||
|  |       - develop | ||||||
| 
 | 
 | ||||||
| env: | env: | ||||||
|   CTEST_OUTPUT_ON_FAILURE: 1 |   CTEST_OUTPUT_ON_FAILURE: 1 | ||||||
|  |  | ||||||
							
								
								
									
										7
									
								
								.github/workflows/windows.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.github/workflows/windows.yml
									
										
									
									
										vendored
									
									
								
							|  | @ -1,12 +1,15 @@ | ||||||
|  | --- | ||||||
| name: Windows | name: Windows | ||||||
| 
 | 
 | ||||||
| on: | on: | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
|       - master |       - master | ||||||
|  |       - develop | ||||||
|   pull_request: |   pull_request: | ||||||
|     branches: |     branches: | ||||||
|       - master |       - master | ||||||
|  |       - develop | ||||||
| 
 | 
 | ||||||
| env: | env: | ||||||
|   CTEST_OUTPUT_ON_FAILURE: 1 |   CTEST_OUTPUT_ON_FAILURE: 1 | ||||||
|  | @ -25,7 +28,7 @@ jobs: | ||||||
|           key: ${{ github.workflow }}-cpm-modules-${{ hashFiles('**/CMakeLists.txt', '**/*.cmake') }} |           key: ${{ github.workflow }}-cpm-modules-${{ hashFiles('**/CMakeLists.txt', '**/*.cmake') }} | ||||||
| 
 | 
 | ||||||
|       - name: configure |       - name: configure | ||||||
|         run: cmake -Stest -Bbuild |         run: cmake -S test -B build   # XXX -G "Visual Studio 16 2019" -T ClangCL | ||||||
| 
 | 
 | ||||||
|       - name: build |       - name: build | ||||||
|         run: cmake --build build --config Debug -j4 |         run: cmake --build build --config Debug -j4 | ||||||
|  | @ -33,4 +36,4 @@ jobs: | ||||||
|       - name: test |       - name: test | ||||||
|         run: | |         run: | | ||||||
|           cd build |           cd build | ||||||
|           ctest --build-config Debug |           ctest --build-config Debug --verbose | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -1,3 +1,5 @@ | ||||||
|  | stagedir/ | ||||||
|  | build/ | ||||||
| /build* | /build* | ||||||
| /.vscode | /.vscode | ||||||
| /cpm_modules | /cpm_modules | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.14...3.19) | ||||||
| # Note: update this to your new project's name and version | # Note: update this to your new project's name and version | ||||||
| project( | project( | ||||||
|   Greeter |   Greeter | ||||||
|   VERSION 1.0 |   VERSION 1.0.1 | ||||||
|   LANGUAGES CXX |   LANGUAGES CXX | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -20,28 +20,21 @@ endif() | ||||||
| 
 | 
 | ||||||
| # ---- Project settings ---- | # ---- Project settings ---- | ||||||
| 
 | 
 | ||||||
| if(NOT DEFINED CMAKE_CXX_STANDARD) | include(cmake/options.cmake) | ||||||
|   set(CMAKE_CXX_STANDARD 20) |  | ||||||
|   set(CMAKE_CXX_STANDARD_REQUIRED ON) |  | ||||||
|   set(CMAKE_CXX_EXTENSIONS NO) |  | ||||||
| endif() |  | ||||||
| 
 | 
 | ||||||
| # ---- Add dependencies via CPM ---- | # ---- Add dependencies via CPM ---- | ||||||
| # see https://github.com/cpm-cmake/CPM.cmake for more info | # see https://github.com/cpm-cmake/CPM.cmake for more info | ||||||
| 
 | 
 | ||||||
| include(cmake/CPM.cmake) | include(cmake/CPM.cmake) | ||||||
| cpmusepackagelock(package-lock.cmake) | CPMUsePackageLock(package-lock.cmake) | ||||||
| 
 | 
 | ||||||
| # PackageProject.cmake will be used to make our target installable | # PackageProject.cmake will be used to make our target installable | ||||||
| CPMAddPackage( | CPMAddPackage( | ||||||
|   NAME PackageProject.cmake |   NAME PackageProject.cmake | ||||||
|   GITHUB_REPOSITORY TheLartians/PackageProject.cmake |   GITHUB_REPOSITORY TheLartians/PackageProject.cmake | ||||||
|   VERSION 1.4.1 |   VERSION 1.5.0 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| # Note: If fmt is not imported, this is needed to prevent: CMake Error: install(EXPORT |  | ||||||
| # "GreeterTargets" ...) includes target "Greeter" which requires target "fmt" that is not in any |  | ||||||
| # export set.  see too https://gitlab.kitware.com/cmake/cmake/-/issues/15415 |  | ||||||
| CPMAddPackage( | CPMAddPackage( | ||||||
|   NAME fmt |   NAME fmt | ||||||
|   GIT_TAG 7.1.3 |   GIT_TAG 7.1.3 | ||||||
|  | @ -53,31 +46,30 @@ CPMAddPackage( | ||||||
| 
 | 
 | ||||||
| # Note: globbing sources is considered bad practice as CMake's generators may not detect new files | # Note: globbing sources is considered bad practice as CMake's generators may not detect new files | ||||||
| # automatically. Keep that in mind when changing files, or explicitly mention them here. | # automatically. Keep that in mind when changing files, or explicitly mention them here. | ||||||
| file(GLOB_RECURSE headers CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h") | file(GLOB_RECURSE headers CONFIGURE_DEPENDS include/*.h) | ||||||
| file(GLOB_RECURSE sources CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp") | file(GLOB_RECURSE sources CONFIGURE_DEPENDS source/*.cpp) | ||||||
| 
 | 
 | ||||||
| # ---- Create library ---- | # ---- Create library ---- | ||||||
| 
 | 
 | ||||||
| # Note: for header-only libraries change all PUBLIC flags to INTERFACE and create an interface | # Note: for header-only libraries change all PUBLIC flags to INTERFACE and create an interface | ||||||
| # target! EITHER: add_library(Greeter INTERFACE) OR: | # target! EITHER: add_library(Greeter INTERFACE) OR: | ||||||
| add_library(Greeter SHARED ${headers} ${sources}) | add_library(Greeter ${headers} ${sources}) | ||||||
| 
 |  | ||||||
| # EITHER: |  | ||||||
| set_target_properties(Greeter PROPERTIES CXX_STANDARD ${CMAKE_CXX_STANDARD}) | set_target_properties(Greeter PROPERTIES CXX_STANDARD ${CMAKE_CXX_STANDARD}) | ||||||
| # OR target_compile_features(Greeter PUBLIC cxx_std_17) |  | ||||||
| 
 | 
 | ||||||
| # being a cross-platform target, we enforce standards conformance on MSVC | # for SameMajorVersion upgrade stategie | ||||||
| if(MSVC) | set_target_properties(Greeter PROPERTIES SOVERSION 1 VERSION ${PROJECT_VERSION}) | ||||||
|   target_compile_options(Greeter PUBLIC /permissive) | 
 | ||||||
| endif() | # being a cross-platform target, we enforce standards conformance on MSVC: | ||||||
|  | target_compile_options(Greeter PUBLIC "$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/permissive>") | ||||||
| 
 | 
 | ||||||
| # Link dependencies EITHER: | # Link dependencies EITHER: | ||||||
| target_link_libraries(Greeter PRIVATE $<BUILD_INTERFACE:fmt::fmt-header-only>) | target_link_libraries(Greeter PRIVATE $<BUILD_INTERFACE:fmt::fmt-header-only>) | ||||||
| # OR: target_link_libraries(Greeter PUBLIC fmt::fmt) | # OR: target_link_libraries(Greeter PUBLIC fmt::fmt) | ||||||
| 
 | 
 | ||||||
|  | set(INCLUDE_INSTALL_DIR include/${PROJECT_NAME}-${PROJECT_VERSION}) | ||||||
| target_include_directories( | target_include_directories( | ||||||
|   Greeter PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> |   Greeter BEFORE PUBLIC $<BUILD_INTERFACE: ${PROJECT_SOURCE_DIR}/include> | ||||||
|                  $<INSTALL_INTERFACE:include/${PROJECT_NAME}-${PROJECT_VERSION}> |                         $<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}> | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| # ---- Create an installable target ---- | # ---- Create an installable target ---- | ||||||
|  | @ -86,6 +78,14 @@ target_include_directories( | ||||||
| # the location where the project's version header will be placed should match the project's regular | # the location where the project's version header will be placed should match the project's regular | ||||||
| # header paths | # header paths | ||||||
| string(TOLOWER ${PROJECT_NAME}/version.h VERSION_HEADER_LOCATION) | string(TOLOWER ${PROJECT_NAME}/version.h VERSION_HEADER_LOCATION) | ||||||
|  | string(TOLOWER ${PROJECT_NAME}/greeter_export.h EXPORT_HEADER_LOCATION) | ||||||
|  | 
 | ||||||
|  | # TODO: should be done in packageProject() | ||||||
|  | include(GenerateExportHeader) | ||||||
|  | generate_export_header( | ||||||
|  |   ${PROJECT_NAME} EXPORT_FILE_NAME PackageProjectInclude/${EXPORT_HEADER_LOCATION} | ||||||
|  | ) | ||||||
|  | # Note: the export header will be installed while installing the version header! CK | ||||||
| 
 | 
 | ||||||
| packageProject( | packageProject( | ||||||
|   NAME ${PROJECT_NAME} |   NAME ${PROJECT_NAME} | ||||||
|  | @ -93,8 +93,8 @@ packageProject( | ||||||
|   NAMESPACE ${PROJECT_NAME} |   NAMESPACE ${PROJECT_NAME} | ||||||
|   BINARY_DIR ${PROJECT_BINARY_DIR} |   BINARY_DIR ${PROJECT_BINARY_DIR} | ||||||
|   INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include |   INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include | ||||||
|   INCLUDE_DESTINATION include/${PROJECT_NAME}-${PROJECT_VERSION} |   INCLUDE_DESTINATION ${INCLUDE_INSTALL_DIR} | ||||||
|   VERSION_HEADER "${VERSION_HEADER_LOCATION}" |   VERSION_HEADER "${VERSION_HEADER_LOCATION}" | ||||||
|   COMPATIBILITY SameMajorVersion |   COMPATIBILITY SameMajorVersion | ||||||
|   # NOTE: not needed DEPENDENCIES "fmt 7.1.3" |   # Note: not needed DEPENDENCIES "fmt 7.1.3" | ||||||
| ) | ) | ||||||
|  |  | ||||||
							
								
								
									
										73
									
								
								GNUmakefile
									
										
									
									
									
								
							
							
						
						
									
										73
									
								
								GNUmakefile
									
										
									
									
									
								
							|  | @ -1,58 +1,69 @@ | ||||||
| # | # | ||||||
| # CURDIR=$(/bin/pwd) | # Note: make var CURDIR:=$(/bin/pwd) | ||||||
| # | ROOT?=$(CURDIR)/stagedir | ||||||
| # GENERATOR="Unix Makefiles" |  | ||||||
| GENERATOR=Ninja |  | ||||||
| 
 | 
 | ||||||
|  | #XXX GENERATOR?="Unix Makefiles" | ||||||
|  | GENERATOR?=Ninja | ||||||
|  | 
 | ||||||
|  | #XXX export CXX=clang++ | ||||||
|  | export CPM_USE_LOCAL_PACKAGES=0 | ||||||
| export CPM_SOURCE_CACHE=${HOME}/.cache/CPM | export CPM_SOURCE_CACHE=${HOME}/.cache/CPM | ||||||
| export CPM_USE_LOCAL_PACKAGES=1 |  | ||||||
| 
 | 
 | ||||||
| .PHONY: update format all test check clean distclean lock | .PHONY: update format all test standalone doc check clean distclean lock | ||||||
| 
 | 
 | ||||||
| # the default target does just all | # the default target does just all, but neither standalone nor doc | ||||||
| check: all | all: | ||||||
| 
 | 
 | ||||||
| all: test | clean: | ||||||
|  | 	find . -type d -name build | xargs rm -rf | ||||||
| 
 | 
 | ||||||
| test: install | distclean: clean | ||||||
| 
 | 	rm -rf build ${ROOT} | ||||||
| 
 |  | ||||||
| distclean: |  | ||||||
| 	rm -rf build root |  | ||||||
| 
 | 
 | ||||||
| # update CPM.cmake | # update CPM.cmake | ||||||
| update: | update: | ||||||
| 	wget -q -O cmake/CPM.cmake https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/get_cpm.cmake | 	wget -q -O cmake/CPM.cmake https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/get_cpm.cmake | ||||||
| 
 | 
 | ||||||
| lock: install | lock: all standalone doc | ||||||
|  | 	cmake --build build/all --target cpm-update-package-lock | ||||||
|  | 	cmake --build build/test --target cpm-update-package-lock | ||||||
| 	cmake --build build/install --target cpm-update-package-lock | 	cmake --build build/install --target cpm-update-package-lock | ||||||
|  | 	cmake --build build/standalone --target cpm-update-package-lock | ||||||
|  | 	cmake --build build/documentation --target cpm-update-package-lock | ||||||
| 
 | 
 | ||||||
| # install the library | # install the library to stagedir | ||||||
| install: | install: | ||||||
| 	cmake -S . -B build/install -G "${GENERATOR}" -DCMAKE_PREFIX_PATH=${CURDIR}/root -DCMAKE_INSTALL_PREFIX=${CURDIR}/root -DCMAKE_CXX_STANDARD=20 # --trace-expand | 	cmake -S . -B build/$@ -G "${GENERATOR}" -DCMAKE_PREFIX_PATH=${ROOT} -DCMAKE_INSTALL_PREFIX=${ROOT} # --trace-expand | ||||||
| 	cmake --build build/install --target install | 	cmake --build build/$@ --target $@ | ||||||
| 
 | 
 | ||||||
| # test the library | # test the library | ||||||
| test: | test: install | ||||||
| 	cmake -S test -B build/test -G "${GENERATOR}" -DCMAKE_PREFIX_PATH=${CURDIR}/root -DTEST_INSTALLED_VERSION=1 | 	cmake -S $@ -B build/$@ -G "${GENERATOR}" -DCMAKE_PREFIX_PATH=${ROOT} -DTEST_INSTALLED_VERSION=1 | ||||||
| 	cmake --build build/test | 	cmake --build build/$@ | ||||||
| 	cmake --build build/test --target test | 	cmake --build build/$@ --target $@ | ||||||
| 
 | 
 | ||||||
| # all together | # all together | ||||||
| all: | all: test | ||||||
| 	cmake -S all -B build/all -G "${GENERATOR}" -DCMAKE_PREFIX_PATH=${CURDIR}/root -DTEST_INSTALLED_VERSION=1 -DENABLE_TEST_COVERAGE=1 | 	cmake -S $@ -B build/$@ -G "${GENERATOR}" -DCMAKE_PREFIX_PATH=${ROOT} -DTEST_INSTALLED_VERSION=1 -DENABLE_TEST_COVERAGE=1 | ||||||
| 	cmake --build build/all | 	cmake --build build/$@ | ||||||
| 	cmake --build build/all --target test | 	cmake --build build/$@ --target test | ||||||
| 	cmake --build build/all --target GenerateDocs | 	cmake --build build/$@ --target check-format | ||||||
| 	cmake --build build/all --target check-format | 
 | ||||||
|  | # GenerateDocs | ||||||
|  | doc: | ||||||
|  | 	cmake -S documentation -B build/documentation -G "${GENERATOR}" | ||||||
|  | 	cmake --build build/documentation --target GenerateDocs | ||||||
| 
 | 
 | ||||||
| format: distclean | format: distclean | ||||||
| 	find . -name CMakeLists.txt | xargs cmake-format -i | 	find . -name CMakeLists.txt | xargs cmake-format -i | ||||||
|  | 	find . -name '*.cmake' | xargs cmake-format -i | ||||||
| 	find . -name '*.cpp' | xargs clang-format -i | 	find . -name '*.cpp' | xargs clang-format -i | ||||||
| 	find . -name '*.h' | xargs clang-format -i | 	find . -name '*.h' | xargs clang-format -i | ||||||
| 
 | 
 | ||||||
|  | standalone: | ||||||
|  | 	cmake -S $@ -B build/$@ -G "${GENERATOR}" -DCMAKE_PREFIX_PATH=${ROOT} -DCMAKE_EXPORT_COMPILE_COMMANDS=1 | ||||||
|  | 	cmake --build build/$@ | ||||||
|  | 
 | ||||||
| # check the library | # check the library | ||||||
| check: | check: standalone | ||||||
| 	cmake -S standalone -B build/standalone -G "${GENERATOR}" -DCMAKE_PREFIX_PATH=${CURDIR}/root -DCMAKE_EXPORT_COMPILE_COMMANDS=1 |  | ||||||
| 	cmake --build build/standalone --target all |  | ||||||
| 	run-clang-tidy.py -p build/standalone -checks='-*,modernize-*,misc-*,hicpp-*,cert-*,readability-*,portability-*,performance-*,google-*' standalone | 	run-clang-tidy.py -p build/standalone -checks='-*,modernize-*,misc-*,hicpp-*,cert-*,readability-*,portability-*,performance-*,google-*' standalone | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| # this script adds all subprojects to a single build to allow IDEs understand the full project | # this script adds all subprojects to a single build to allow IDEs understand the full project | ||||||
| # structure. | # structure. | ||||||
| 
 | 
 | ||||||
| cmake_minimum_required(VERSION 3.14 FATAL_ERROR) | cmake_minimum_required(VERSION 3.14...3.19) | ||||||
| 
 | 
 | ||||||
| project(BuildAll LANGUAGES CXX) | project(BuildAll LANGUAGES CXX) | ||||||
| 
 | 
 | ||||||
|  | @ -10,6 +10,6 @@ include(../cmake/tools.cmake) | ||||||
| # needed to generate test target | # needed to generate test target | ||||||
| enable_testing() | enable_testing() | ||||||
| 
 | 
 | ||||||
| add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../standalone ${CMAKE_BINARY_DIR}/standalone) | add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../standalone standalone) | ||||||
| add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../test ${CMAKE_BINARY_DIR}/test) | add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../test test) | ||||||
| add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../documentation ${CMAKE_BINARY_DIR}/documentation) | add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../documentation documentation) | ||||||
|  |  | ||||||
							
								
								
									
										50
									
								
								cmake/options.cmake
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								cmake/options.cmake
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,50 @@ | ||||||
|  | # only activate options for top level project | ||||||
|  | if(NOT PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) | ||||||
|  |   return() | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | option(BUILD_SHARED_LIBS "Create shared libraries" YES) | ||||||
|  | 
 | ||||||
|  | # Set default visibility to hidden for all targets | ||||||
|  | set(CMAKE_CXX_VISIBILITY_PRESET hidden) | ||||||
|  | set(CMAKE_VISIBILITY_INLINES_HIDDEN YES) | ||||||
|  | 
 | ||||||
|  | # build the dynamic libraries and executables together at bin directory | ||||||
|  | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) | ||||||
|  | set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) | ||||||
|  | set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) | ||||||
|  | 
 | ||||||
|  | if(NOT DEFINED CMAKE_CXX_STANDARD) | ||||||
|  |   option(CXX_STANDARD_REQUIRED "Require c++ standard" YES) | ||||||
|  |   set(CMAKE_CXX_STANDARD 17) | ||||||
|  |   set(CMAKE_CXX_EXTENSIONS NO) | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | # this reduce build time if using Nina generators | ||||||
|  | option(CMAKE_DEPENDS_IN_PROJECT_ONLY "do NOT use system header files for dependency checking" YES) | ||||||
|  | if(NOT MSVC) | ||||||
|  |   if(CMAKE_DEPENDS_IN_PROJECT_ONLY) | ||||||
|  |     set(CMAKE_DEPFILE_FLAGS_C | ||||||
|  |         "-MMD" | ||||||
|  |         CACHE STRING "dependency flag" FORCE | ||||||
|  |     ) | ||||||
|  |     set(CMAKE_DEPFILE_FLAGS_CXX | ||||||
|  |         "-MMD" | ||||||
|  |         CACHE STRING "dependency flag" FORCE | ||||||
|  |     ) | ||||||
|  |   else() | ||||||
|  |     set(CMAKE_DEPFILE_FLAGS_C | ||||||
|  |         "-MD" | ||||||
|  |         CACHE STRING "dependency flag" FORCE | ||||||
|  |     ) | ||||||
|  |     set(CMAKE_DEPFILE_FLAGS_CXX | ||||||
|  |         "-MD" | ||||||
|  |         CACHE STRING "dependency flag" FORCE | ||||||
|  |     ) | ||||||
|  |   endif() | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | option(CMAKE_EXPORT_COMPILE_COMMANDS "support clang-tidy, cppcheck, ..." YES) | ||||||
|  | if(CMAKE_EXPORT_COMPILE_COMMANDS) | ||||||
|  |   set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) | ||||||
|  | endif() | ||||||
|  | @ -7,6 +7,15 @@ if(NOT PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
| include(${CMAKE_CURRENT_LIST_DIR}/CPM.cmake) | include(${CMAKE_CURRENT_LIST_DIR}/CPM.cmake) | ||||||
|  | CPMUsePackageLock(package-lock.cmake) | ||||||
|  | 
 | ||||||
|  | include(${CMAKE_CURRENT_LIST_DIR}/options.cmake) | ||||||
|  | 
 | ||||||
|  | # option: default not set | ||||||
|  | set(USE_STATIC_ANALYZER | ||||||
|  |     "" | ||||||
|  |     CACHE STRING "clang-tidy;cppcheck;iwyu" | ||||||
|  | ) | ||||||
| 
 | 
 | ||||||
| # enables sanitizers support using the the `USE_SANITIZER` flag available values are: Address, | # enables sanitizers support using the the `USE_SANITIZER` flag available values are: Address, | ||||||
| # Memory, MemoryWithOrigins, Undefined, Thread, Leak, 'Address;Undefined' | # Memory, MemoryWithOrigins, Undefined, Thread, Leak, 'Address;Undefined' | ||||||
|  | @ -65,6 +74,7 @@ if(USE_SANITIZER OR USE_STATIC_ANALYZER) | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
| # enables CCACHE support through the USE_CCACHE flag possible values are: YES, NO or equivalent | # enables CCACHE support through the USE_CCACHE flag possible values are: YES, NO or equivalent | ||||||
|  | option(USE_CCACHE "use ccache" YES) | ||||||
| if(USE_CCACHE) | if(USE_CCACHE) | ||||||
|   CPMAddPackage( |   CPMAddPackage( | ||||||
|     NAME Ccache.cmake |     NAME Ccache.cmake | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ project(GreeterDocs) | ||||||
| # ---- Dependencies ---- | # ---- Dependencies ---- | ||||||
| 
 | 
 | ||||||
| include(../cmake/CPM.cmake) | include(../cmake/CPM.cmake) | ||||||
|  | CPMUsePackageLock(package-lock.cmake) | ||||||
| 
 | 
 | ||||||
| CPMAddPackage(NAME Greeter SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/..) | CPMAddPackage(NAME Greeter SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/..) | ||||||
| 
 | 
 | ||||||
|  | @ -21,16 +22,16 @@ CPMAddPackage( | ||||||
| set(DOXYGEN_PROJECT_NAME Greeter) | set(DOXYGEN_PROJECT_NAME Greeter) | ||||||
| set(DOXYGEN_PROJECT_VERSION ${Greeter_VERSION}) | set(DOXYGEN_PROJECT_VERSION ${Greeter_VERSION}) | ||||||
| set(DOXYGEN_PROJECT_ROOT "${CMAKE_CURRENT_LIST_DIR}/..") | set(DOXYGEN_PROJECT_ROOT "${CMAKE_CURRENT_LIST_DIR}/..") | ||||||
| set(DOXYGEN_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/doxygen") | set(DOXYGEN_OUTPUT_DIRECTORY doxygen) | ||||||
| 
 | 
 | ||||||
| configure_file(${CMAKE_CURRENT_LIST_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) | configure_file(${CMAKE_CURRENT_LIST_DIR}/Doxyfile Doxyfile) | ||||||
| 
 | 
 | ||||||
| configure_file(${CMAKE_CURRENT_LIST_DIR}/conf.py ${CMAKE_CURRENT_BINARY_DIR}/conf.py) | configure_file(${CMAKE_CURRENT_LIST_DIR}/conf.py conf.py) | ||||||
| 
 | 
 | ||||||
| add_custom_target( | add_custom_target( | ||||||
|   GenerateDocs |   GenerateDocs | ||||||
|   ${CMAKE_COMMAND} -E make_directory "${DOXYGEN_OUTPUT_DIRECTORY}" |   ${CMAKE_COMMAND} -E make_directory "${DOXYGEN_OUTPUT_DIRECTORY}" | ||||||
|   COMMAND "${MCSS_SOURCE_DIR}/documentation/doxygen.py" "${CMAKE_CURRENT_BINARY_DIR}/conf.py" |   COMMAND "${MCSS_SOURCE_DIR}/documentation/doxygen.py" conf.py | ||||||
|   COMMAND echo "Docs written to: ${DOXYGEN_OUTPUT_DIRECTORY}" |   COMMAND echo "Docs written to: ${DOXYGEN_OUTPUT_DIRECTORY}" | ||||||
|   WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" |   WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | @ -1,5 +1,7 @@ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
|  | #include <greeter/greeter_export.h> | ||||||
|  | 
 | ||||||
| #include <string> | #include <string> | ||||||
| 
 | 
 | ||||||
| namespace greeter { | namespace greeter { | ||||||
|  | @ -18,14 +20,15 @@ namespace greeter { | ||||||
|      * @brief Creates a new greeter |      * @brief Creates a new greeter | ||||||
|      * @param name the name to greet |      * @param name the name to greet | ||||||
|      */ |      */ | ||||||
|     explicit Greeter(std::string name); |     explicit GREETER_EXPORT Greeter(std::string _name); | ||||||
| 
 | 
 | ||||||
|     /**
 |     /**
 | ||||||
|      * @brief Creates a localized string containing the greeting |      * @brief Creates a localized string containing the greeting | ||||||
|      * @param lang the language to greet in |      * @param lang the language to greet in | ||||||
|      * @return a string containing the greeting |      * @return a string containing the greeting | ||||||
|      */ |      */ | ||||||
|     [[nodiscard]] std::string greet(LanguageCode lang = LanguageCode::EN) const; |     [[nodiscard]] auto GREETER_EXPORT greet(LanguageCode lang = LanguageCode::EN) const | ||||||
|  |         -> std::string; | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
| }  // namespace greeter
 | }  // namespace greeter
 | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ include(../cmake/tools.cmake) | ||||||
| # ---- Dependencies ---- | # ---- Dependencies ---- | ||||||
| 
 | 
 | ||||||
| include(../cmake/CPM.cmake) | include(../cmake/CPM.cmake) | ||||||
|  | CPMUsePackageLock(package-lock.cmake) | ||||||
| 
 | 
 | ||||||
| CPMAddPackage( | CPMAddPackage( | ||||||
|   NAME cxxopts |   NAME cxxopts | ||||||
|  | @ -21,14 +22,17 @@ CPMAddPackage(NAME Greeter SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/..) | ||||||
| 
 | 
 | ||||||
| # ---- Create standalone executable ---- | # ---- Create standalone executable ---- | ||||||
| 
 | 
 | ||||||
| file(GLOB sources CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp) | file(GLOB sources CONFIGURE_DEPENDS source/*.cpp) | ||||||
| 
 | 
 | ||||||
| add_executable(GreeterStandalone ${sources}) | add_executable(GreeterStandalone ${sources}) | ||||||
|  | set_target_properties(GreeterStandalone PROPERTIES CXX_STANDARD ${CMAKE_CXX_STANDARD}) | ||||||
| 
 | 
 | ||||||
| set_target_properties(GreeterStandalone PROPERTIES CXX_STANDARD 17 OUTPUT_NAME "Greeter") | # WORKAROUND missing ALIAS target error! CK | ||||||
| 
 |  | ||||||
| # WORKAROUND for ALIAS target is missing error! CK |  | ||||||
| if(NOT TARGET cxxopts::cxxopts) | if(NOT TARGET cxxopts::cxxopts) | ||||||
|   add_library(cxxopts::cxxopts ALIAS cxxopts) |   add_library(cxxopts::cxxopts ALIAS cxxopts) | ||||||
| endif() | endif() | ||||||
| target_link_libraries(GreeterStandalone Greeter::Greeter cxxopts::cxxopts) | target_link_libraries(GreeterStandalone Greeter::Greeter cxxopts::cxxopts) | ||||||
|  | 
 | ||||||
|  | # ---- run the standalone executable ---- | ||||||
|  | enable_testing() | ||||||
|  | add_test(NAME GreeterStandalone COMMAND GreeterStandalone) | ||||||
|  |  | ||||||
|  | @ -8,8 +8,6 @@ | ||||||
| 
 | 
 | ||||||
| // NOLINTNEXTLINE(modernize-use-trailing-return-type)
 | // NOLINTNEXTLINE(modernize-use-trailing-return-type)
 | ||||||
| int main(int argc, char** argv) { | int main(int argc, char** argv) { | ||||||
|   // prevent warning: initialization of 'languages' with static storage duration may throw an
 |  | ||||||
|   // exception that cannot be caught [cert-err58-cpp]
 |  | ||||||
|   const std::unordered_map<std::string, greeter::LanguageCode> languages{ |   const std::unordered_map<std::string, greeter::LanguageCode> languages{ | ||||||
|       {"en", greeter::LanguageCode::EN}, |       {"en", greeter::LanguageCode::EN}, | ||||||
|       {"de", greeter::LanguageCode::DE}, |       {"de", greeter::LanguageCode::DE}, | ||||||
|  | @ -17,8 +15,6 @@ int main(int argc, char** argv) { | ||||||
|       {"fr", greeter::LanguageCode::FR}, |       {"fr", greeter::LanguageCode::FR}, | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   // prevent warning: do not use pointer arithmetic
 |  | ||||||
|   // [cppcoreguidelines-pro-bounds-pointer-arithmetic]
 |  | ||||||
|   cxxopts::Options options(*argv, "A program to welcome the world!"); |   cxxopts::Options options(*argv, "A program to welcome the world!"); | ||||||
| 
 | 
 | ||||||
|   std::string language; |   std::string language; | ||||||
|  | @ -40,7 +36,6 @@ int main(int argc, char** argv) { | ||||||
|     return 0; |     return 0; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // prevent warning: do not use 'else' after 'return' [readability-else-after-return]
 |  | ||||||
|   if (result["version"].as<bool>()) { |   if (result["version"].as<bool>()) { | ||||||
|     std::cout << "Greeter, version " << GREETER_VERSION << std::endl; |     std::cout << "Greeter, version " << GREETER_VERSION << std::endl; | ||||||
|     return 0; |     return 0; | ||||||
|  |  | ||||||
|  | @ -1,6 +1,10 @@ | ||||||
| cmake_minimum_required(VERSION 3.14...3.19) | cmake_minimum_required(VERSION 3.14...3.19) | ||||||
| 
 | 
 | ||||||
| project(GreeterTests LANGUAGES CXX) | project( | ||||||
|  |   GreeterTests | ||||||
|  |   VERSION 1 | ||||||
|  |   LANGUAGES CXX | ||||||
|  | ) | ||||||
| 
 | 
 | ||||||
| # ---- Options ---- | # ---- Options ---- | ||||||
| 
 | 
 | ||||||
|  | @ -14,6 +18,7 @@ include(../cmake/tools.cmake) | ||||||
| # ---- Dependencies ---- | # ---- Dependencies ---- | ||||||
| 
 | 
 | ||||||
| include(../cmake/CPM.cmake) | include(../cmake/CPM.cmake) | ||||||
|  | CPMUsePackageLock(package-lock.cmake) | ||||||
| 
 | 
 | ||||||
| CPMAddPackage( | CPMAddPackage( | ||||||
|   NAME doctest |   NAME doctest | ||||||
|  | @ -37,16 +42,15 @@ CPMAddPackage( | ||||||
| 
 | 
 | ||||||
| # ---- Create binary ---- | # ---- Create binary ---- | ||||||
| 
 | 
 | ||||||
| file(GLOB sources CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp) | file(GLOB sources CONFIGURE_DEPENDS source/*.cpp) | ||||||
| add_executable(GreeterTests ${sources}) | add_executable(GreeterTests ${sources}) | ||||||
| target_link_libraries(GreeterTests doctest::doctest Greeter::Greeter) | target_link_libraries(GreeterTests doctest::doctest Greeter::Greeter) | ||||||
| 
 | set_target_properties(GreeterTests PROPERTIES CXX_STANDARD ${CMAKE_CXX_STANDARD}) | ||||||
| set_target_properties(GreeterTests PROPERTIES CXX_STANDARD 17) |  | ||||||
| 
 | 
 | ||||||
| # enable compiler warnings | # enable compiler warnings | ||||||
| if(NOT TEST_INSTALLED_VERSION) | if(NOT TEST_INSTALLED_VERSION) | ||||||
|   if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") |   if(CMAKE_CXX_COMPILER_ID MATCHES "(Apple)?[Cc]lang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") | ||||||
|     target_compile_options(Greeter PUBLIC -Wall -Wpedantic -Wextra -Werror) |     target_compile_options(Greeter PUBLIC -Wall -Wextra -Werror) | ||||||
|   elseif(MSVC) |   elseif(MSVC) | ||||||
|     target_compile_options(Greeter PUBLIC /W4 /WX) |     target_compile_options(Greeter PUBLIC /W4 /WX) | ||||||
|     target_compile_definitions(GreeterTests PUBLIC DOCTEST_CONFIG_USE_STD_HEADERS) |     target_compile_definitions(GreeterTests PUBLIC DOCTEST_CONFIG_USE_STD_HEADERS) | ||||||
|  | @ -57,7 +61,7 @@ endif() | ||||||
| 
 | 
 | ||||||
| enable_testing() | enable_testing() | ||||||
| 
 | 
 | ||||||
| add_test(greeterTests GreeterTests) | add_test(NAME greeterTests COMMAND GreeterTests -s false) | ||||||
| 
 | 
 | ||||||
| # ---- code coverage ---- | # ---- code coverage ---- | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,8 +2,6 @@ | ||||||
| #include <greeter/greeter.h> | #include <greeter/greeter.h> | ||||||
| #include <greeter/version.h> | #include <greeter/version.h> | ||||||
| 
 | 
 | ||||||
| #include <string> |  | ||||||
| 
 |  | ||||||
| TEST_CASE("Greeter") { | TEST_CASE("Greeter") { | ||||||
|   using namespace greeter; |   using namespace greeter; | ||||||
| 
 | 
 | ||||||
|  | @ -17,10 +15,10 @@ TEST_CASE("Greeter") { | ||||||
| 
 | 
 | ||||||
| TEST_CASE("Greeter version") { | TEST_CASE("Greeter version") { | ||||||
| #if (__cpp_lib_starts_ends_with) | #if (__cpp_lib_starts_ends_with) | ||||||
|   static_assert(std::string_view(GREETER_VERSION).starts_with("1.0"));  // TBD C++20 only
 |   static_assert(std::string_view(GREETER_VERSION).starts_with("1"));  // TBD C++20 only
 | ||||||
|   CHECK(std::string(GREETER_VERSION).starts_with("1.0"));               // SameMajorVersion
 |   CHECK(std::string(GREETER_VERSION).starts_with("1"));               // SameMajorVersion
 | ||||||
| #else | #else | ||||||
|   static_assert(std::string_view(GREETER_VERSION) == std::string_view("1.0")); |   static_assert(std::string_view(GREETER_VERSION) == std::string_view("1.0.1")); | ||||||
|   CHECK(std::string(GREETER_VERSION) == std::string("1.0")); |   CHECK(std::string(GREETER_VERSION) == std::string("1.0.1")); | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue