Skip to content

Commit a1dc019

Browse files
authored
Create version header (#5)
* create version header * use correct return code * create real dependency target * use correct install destination * use sudo * update docs
1 parent b723ded commit a1dc019

10 files changed

Lines changed: 139 additions & 6 deletions

File tree

.github/workflows/test.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: Ubuntu
2+
3+
on:
4+
push:
5+
branches:
6+
- master
7+
pull_request:
8+
branches:
9+
- master
10+
11+
env:
12+
CTEST_OUTPUT_ON_FAILURE: 1
13+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
14+
15+
jobs:
16+
build:
17+
18+
runs-on: ubuntu-latest
19+
20+
steps:
21+
- uses: actions/checkout@v1
22+
23+
- name: test local build
24+
run: |
25+
cmake -Htest -Bbuild/local
26+
cmake --build build/local
27+
./build/local/test
28+
29+
- name: install dependency
30+
run: |
31+
cmake -Htest/dependency -Bbuild/dependency
32+
sudo cmake --build build/dependency --target install
33+
34+
- name: test installed build
35+
run: |
36+
cmake -Htest -Bbuild/installed -DTEST_INSTALLED_VERSION=1
37+
cmake --build build/installed
38+
./build/installed/test

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

CMakeLists.txt

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,49 @@
11

22
set(
3-
PACKAGE_PROJECT_CONFIG_FILE_PATH
4-
"${CMAKE_CURRENT_LIST_DIR}/Config.cmake.in"
3+
PACKAGE_PROJECT_ROOT_PATH
4+
"${CMAKE_CURRENT_LIST_DIR}"
55
CACHE INTERNAL
6-
"The config template for the packageProject script"
6+
"The path to the PackageProject directory"
77
)
88

99
function(packageProject)
1010
include(CMakePackageConfigHelpers)
1111
include(GNUInstallDirs)
1212

13-
cmake_parse_arguments(PROJECT "" "NAME;VERSION;INCLUDE_DIR;INCLUDE_DESTINATION;BINARY_DIR;COMPATIBILITY" "DEPENDENCIES" ${ARGN})
13+
cmake_parse_arguments(
14+
PROJECT
15+
""
16+
"NAME;VERSION;INCLUDE_DIR;INCLUDE_DESTINATION;BINARY_DIR;COMPATIBILITY;VERSION_HEADER"
17+
"DEPENDENCIES"
18+
${ARGN}
19+
)
1420

1521
# handle default arguments
1622
if (NOT DEFINED PROJECT_COMPATIBILITY)
1723
set(PROJECT_COMPATIBILITY AnyNewerVersion)
1824
endif()
1925

26+
if (DEFINED PROJECT_VERSION_HEADER)
27+
set(PROJECT_VERSION_INCLUDE_DIR ${PROJECT_BINARY_DIR}/PackageProjectInclude)
28+
string(TOUPPER ${PROJECT_NAME} UPPERCASE_PROJECT_NAME)
29+
configure_file(
30+
${PACKAGE_PROJECT_ROOT_PATH}/version.h.in
31+
${PROJECT_VERSION_INCLUDE_DIR}/${PROJECT_VERSION_HEADER}
32+
@ONLY
33+
)
34+
get_target_property(target_type ${PROJECT_NAME} TYPE)
35+
if (target_type STREQUAL "INTERFACE_LIBRARY")
36+
set(VISIBILITY INTERFACE)
37+
else()
38+
set(VISIBILITY PUBLIC)
39+
endif()
40+
target_include_directories(${PROJECT_NAME} ${VISIBILITY} "$<BUILD_INTERFACE:${PROJECT_VERSION_INCLUDE_DIR}>")
41+
install(
42+
DIRECTORY ${PROJECT_VERSION_INCLUDE_DIR}/
43+
DESTINATION ${PROJECT_INCLUDE_DESTINATION}
44+
)
45+
endif()
46+
2047
write_basic_package_version_file(
2148
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
2249
VERSION ${PROJECT_VERSION}
@@ -34,7 +61,7 @@ function(packageProject)
3461
)
3562

3663
configure_package_config_file(
37-
${PACKAGE_PROJECT_CONFIG_FILE_PATH}
64+
${PACKAGE_PROJECT_ROOT_PATH}/Config.cmake.in
3865
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
3966
INSTALL_DESTINATION lib/cmake/${PROJECT_NAME}-${PROJECT_VERSION}
4067
)

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ packageProject(
2828
INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include
2929
# should match the target's INSTALL_INTERFACE include directory
3030
INCLUDE_DESTINATION include/${PROJECT_NAME}-${PROJECT_VERSION}
31-
# semicolon separated list of the project's dependencies
31+
# (optional) create a header containing the version info
32+
VERSION_HEADER "${PROJECT_NAME}/version.h"
33+
# (optional) semicolon separated list of the project's dependencies
3234
DEPENDENCIES ""
3335
)
3436
```

test/CMakeLists.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
2+
3+
option(TEST_INSTALLED_VERSION "Test the version found by find_package" OFF)
4+
5+
project(PackageProjectTest
6+
VERSION 1.0
7+
LANGUAGES CXX
8+
)
9+
10+
if (TEST_INSTALLED_VERSION)
11+
find_package(dependency 1.2.3 REQUIRED)
12+
else()
13+
add_subdirectory(dependency)
14+
endif()
15+
16+
add_executable(test main.cpp)
17+
target_link_libraries(test dependency)

test/dependency/CMakeLists.txt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
2+
3+
project(dependency
4+
VERSION 1.2.3
5+
LANGUAGES CXX
6+
)
7+
8+
add_library(dependency source/dependency.cpp)
9+
10+
target_include_directories(dependency
11+
PUBLIC
12+
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
13+
$<INSTALL_INTERFACE:include/${PROJECT_NAME}-${PROJECT_VERSION}>
14+
)
15+
16+
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../.. ${CMAKE_CURRENT_BINARY_DIR}/PackageProject)
17+
18+
packageProject(
19+
NAME ${PROJECT_NAME}
20+
VERSION ${PROJECT_VERSION}
21+
BINARY_DIR ${PROJECT_BINARY_DIR}
22+
INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include
23+
INCLUDE_DESTINATION include/${PROJECT_NAME}-${PROJECT_VERSION}
24+
VERSION_HEADER "dependency/version.h"
25+
DEPENDENCIES ""
26+
)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#pragma once
2+
3+
#include <iostream>
4+
5+
void dependencyFunction();
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#include <iostream>
2+
#include <dependency/version.h>
3+
4+
void dependencyFunction() {
5+
std::cout << "Using dependency version " << DEPENDENCY_VERSION << std::endl;
6+
}

test/main.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#include <dependency/dependency.h>
2+
#include <dependency/version.h>
3+
#include <string>
4+
5+
int main() {
6+
dependencyFunction();
7+
return DEPENDENCY_VERSION == std::string("1.2.3") ? 0 : 1;
8+
}

version.h.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#pragma once
2+
3+
#define @UPPERCASE_PROJECT_NAME@_VERSION "@PROJECT_VERSION@"

0 commit comments

Comments
 (0)