Skip to content

Commit 47e5e28

Browse files
Merge pull request #292 from chillenzer/add-packageproject
Add packageproject
2 parents 60d62dc + 4e1437a commit 47e5e28

File tree

5 files changed

+324
-8
lines changed

5 files changed

+324
-8
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ endif()
3131
# ---- Add dependencies via CPM ----
3232
# see https://github.com/TheLartians/CPM.cmake for more info
3333

34+
include(${CMAKE_CURRENT_LIST_DIR}/cmake/PackageProject.cmake)
3435
include(${CMAKE_CURRENT_LIST_DIR}/cmake/CPM_0.40.2.cmake)
3536
CPMUsePackageLock(${CMAKE_CURRENT_LIST_DIR}/cmake/package-lock.cmake)
3637

3738
include(${CMAKE_CURRENT_LIST_DIR}/cmake/add_controlled.cmake)
3839

3940
# PackageProject.cmake will be used to make our target installable
40-
add_controlled("PackageProject.cmake" REQUIRED)
4141
add_controlled("alpaka" REQUIRED)
4242

4343

cmake/Config.cmake.in

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# This file was copied from
2+
# https://github.com/TheLartians/PackageProject.cmake/blob/2b8d9b49d227f714092ffe5263966274dc863380/Config.cmake.in
3+
#
4+
# MIT License
5+
#
6+
# Copyright (c) 2020 Lars Melchior
7+
#
8+
# Permission is hereby granted, free of charge, to any person obtaining a copy
9+
# of this software and associated documentation files (the "Software"), to deal
10+
# in the Software without restriction, including without limitation the rights
11+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
# copies of the Software, and to permit persons to whom the Software is
13+
# furnished to do so, subject to the following conditions:
14+
#
15+
# The above copyright notice and this permission notice shall be included in all
16+
# copies or substantial portions of the Software.
17+
#
18+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
23+
include(CMakeFindDependencyMacro)
24+
25+
string(REGEX MATCHALL "[^;]+" SEPARATE_DEPENDENCIES "@PROJECT_DEPENDENCIES@")
26+
27+
foreach(dependency ${SEPARATE_DEPENDENCIES})
28+
string(REPLACE " " ";" args "${dependency}")
29+
find_dependency(${args})
30+
endforeach()
31+
32+
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")

cmake/PackageProject.cmake

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,261 @@
1+
# This file was copied from
2+
# https://github.com/TheLartians/PackageProject.cmake/blob/2b8d9b49d227f714092ffe5263966274dc863380/CMakeLists.txt
3+
#
4+
# MIT License
5+
#
6+
# Copyright (c) 2020 Lars Melchior
7+
#
8+
# Permission is hereby granted, free of charge, to any person obtaining a copy
9+
# of this software and associated documentation files (the "Software"), to deal
10+
# in the Software without restriction, including without limitation the rights
11+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
# copies of the Software, and to permit persons to whom the Software is
13+
# furnished to do so, subject to the following conditions:
14+
#
15+
# The above copyright notice and this permission notice shall be included in all
16+
# copies or substantial portions of the Software.
17+
#
18+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24+
# SOFTWARE.
25+
#
26+
# /
27+
28+
cmake_minimum_required(VERSION 3.14)
29+
30+
set(PACKAGE_PROJECT_ROOT_PATH
31+
"${CMAKE_CURRENT_LIST_DIR}"
32+
CACHE INTERNAL "The path to the PackageProject directory"
33+
)
34+
35+
function(packageProject)
36+
include(CMakePackageConfigHelpers)
37+
include(GNUInstallDirs)
38+
39+
cmake_parse_arguments(
40+
PROJECT
41+
""
42+
"NAME;VERSION;INCLUDE_DIR;INCLUDE_DESTINATION;BINARY_DIR;COMPATIBILITY;EXPORT_HEADER;VERSION_HEADER;NAMESPACE;DISABLE_VERSION_SUFFIX;ARCH_INDEPENDENT;INCLUDE_HEADER_PATTERN;CPACK;RUNTIME_DESTINATION"
43+
"DEPENDENCIES"
44+
${ARGN}
45+
)
46+
47+
# optional feature: TRUE or FALSE or UNDEFINED! These variables will then hold the respective
48+
# value from the argument list or be undefined if the associated one_value_keyword could not be
49+
# found.
50+
if(PROJECT_DISABLE_VERSION_SUFFIX)
51+
unset(PROJECT_VERSION_SUFFIX)
52+
else()
53+
set(PROJECT_VERSION_SUFFIX -${PROJECT_VERSION})
54+
endif()
55+
56+
if(NOT DEFINED PROJECT_COMPATIBILITY)
57+
set(PROJECT_COMPATIBILITY AnyNewerVersion)
58+
endif()
59+
60+
# we want to automatically add :: to our namespace, so only append if a namespace was given in the
61+
# first place we also provide an alias to ensure that local and installed versions have the same
62+
# name
63+
if(DEFINED PROJECT_NAMESPACE)
64+
if(PROJECT_CPACK)
65+
set(CPACK_PACKAGE_NAMESPACE ${PROJECT_NAMESPACE})
66+
endif()
67+
set(PROJECT_NAMESPACE ${PROJECT_NAMESPACE}::)
68+
add_library(${PROJECT_NAMESPACE}${PROJECT_NAME} ALIAS ${PROJECT_NAME})
69+
endif()
70+
71+
if(DEFINED PROJECT_VERSION_HEADER OR DEFINED PROJECT_EXPORT_HEADER)
72+
set(PROJECT_VERSION_INCLUDE_DIR ${PROJECT_BINARY_DIR}/PackageProjectInclude)
73+
74+
if(DEFINED PROJECT_EXPORT_HEADER)
75+
include(GenerateExportHeader)
76+
generate_export_header(
77+
${PROJECT_NAME} EXPORT_FILE_NAME ${PROJECT_VERSION_INCLUDE_DIR}/${PROJECT_EXPORT_HEADER}
78+
)
79+
endif()
80+
81+
if(DEFINED PROJECT_VERSION_HEADER)
82+
# clear previous matches
83+
unset(CMAKE_MATCH_1)
84+
unset(CMAKE_MATCH_3)
85+
unset(CMAKE_MATCH_5)
86+
unset(CMAKE_MATCH_7)
87+
88+
string(REGEX MATCH "^([0-9]+)(\\.([0-9]+))?(\\.([0-9]+))?(\\.([0-9]+))?$" _
89+
"${PROJECT_VERSION}"
90+
)
91+
92+
set(PROJECT_VERSION_MAJOR ${CMAKE_MATCH_1})
93+
set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_3})
94+
set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_5})
95+
set(PROJECT_VERSION_TWEAK ${CMAKE_MATCH_7})
96+
97+
if(NOT DEFINED PROJECT_VERSION_MAJOR)
98+
set(PROJECT_VERSION_MAJOR "0")
99+
endif()
100+
if(NOT DEFINED PROJECT_VERSION_MINOR)
101+
set(PROJECT_VERSION_MINOR "0")
102+
endif()
103+
if(NOT DEFINED PROJECT_VERSION_PATCH)
104+
set(PROJECT_VERSION_PATCH "0")
105+
endif()
106+
if(NOT DEFINED PROJECT_VERSION_TWEAK)
107+
set(PROJECT_VERSION_TWEAK "0")
108+
endif()
109+
110+
string(TOUPPER ${PROJECT_NAME} UPPERCASE_PROJECT_NAME)
111+
# ensure that the generated macro does not include invalid characters
112+
string(REGEX REPLACE [^a-zA-Z0-9] _ UPPERCASE_PROJECT_NAME ${UPPERCASE_PROJECT_NAME})
113+
configure_file(
114+
${PACKAGE_PROJECT_ROOT_PATH}/version.h.in
115+
${PROJECT_VERSION_INCLUDE_DIR}/${PROJECT_VERSION_HEADER} @ONLY
116+
)
117+
endif()
118+
119+
get_target_property(target_type ${PROJECT_NAME} TYPE)
120+
if(target_type STREQUAL "INTERFACE_LIBRARY")
121+
set(VISIBILITY INTERFACE)
122+
else()
123+
set(VISIBILITY PUBLIC)
124+
endif()
125+
target_include_directories(
126+
${PROJECT_NAME} ${VISIBILITY} "$<BUILD_INTERFACE:${PROJECT_VERSION_INCLUDE_DIR}>"
127+
)
128+
install(
129+
DIRECTORY ${PROJECT_VERSION_INCLUDE_DIR}/
130+
DESTINATION ${PROJECT_INCLUDE_DESTINATION}
131+
COMPONENT "${PROJECT_NAME}_Development"
132+
)
133+
endif()
134+
135+
set(wbpvf_extra_args "")
136+
if(NOT DEFINED PROJECT_ARCH_INDEPENDENT)
137+
get_target_property(target_type "${PROJECT_NAME}" TYPE)
138+
if(target_type STREQUAL "INTERFACE_LIBRARY")
139+
set(PROJECT_ARCH_INDEPENDENT YES)
140+
endif()
141+
endif()
142+
143+
if(PROJECT_ARCH_INDEPENDENT)
144+
set(wbpvf_extra_args ARCH_INDEPENDENT)
145+
# install to architecture independent (share) directory
146+
set(INSTALL_DIR_FOR_CMAKE_CONFIGS ${CMAKE_INSTALL_DATADIR})
147+
else()
148+
# if x32 or multilib->x32 , install to (lib) directory. if x64, install to (lib64) directory
149+
set(INSTALL_DIR_FOR_CMAKE_CONFIGS ${CMAKE_INSTALL_LIBDIR})
150+
endif()
151+
152+
write_basic_package_version_file(
153+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
154+
VERSION ${PROJECT_VERSION}
155+
COMPATIBILITY ${PROJECT_COMPATIBILITY} ${wbpvf_extra_args}
156+
)
157+
158+
# set default runtime install subdirectory (RUNTIME_DESTINATION)
159+
if(NOT DEFINED PROJECT_RUNTIME_DESTINATION)
160+
set(PROJECT_RUNTIME_DESTINATION ${PROJECT_NAME}${PROJECT_VERSION_SUFFIX})
161+
endif()
162+
163+
install(
164+
TARGETS ${PROJECT_NAME}
165+
EXPORT ${PROJECT_NAME}Targets
166+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_RUNTIME_DESTINATION}
167+
COMPONENT "${PROJECT_NAME}_Runtime"
168+
NAMELINK_COMPONENT "${PROJECT_NAME}_Development"
169+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_RUNTIME_DESTINATION}
170+
COMPONENT "${PROJECT_NAME}_Development"
171+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}/${PROJECT_RUNTIME_DESTINATION}
172+
COMPONENT "${PROJECT_NAME}_Runtime"
173+
BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}/${PROJECT_RUNTIME_DESTINATION}
174+
COMPONENT "${PROJECT_NAME}_Runtime"
175+
PUBLIC_HEADER DESTINATION ${PROJECT_INCLUDE_DESTINATION} COMPONENT "${PROJECT_NAME}_Development"
176+
INCLUDES
177+
DESTINATION "${PROJECT_INCLUDE_DESTINATION}"
178+
)
179+
180+
set("${PROJECT_NAME}_INSTALL_CMAKEDIR"
181+
"${INSTALL_DIR_FOR_CMAKE_CONFIGS}/cmake/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}"
182+
CACHE PATH "CMake package config location relative to the install prefix"
183+
)
184+
185+
mark_as_advanced("${PROJECT_NAME}_INSTALL_CMAKEDIR")
186+
187+
configure_file(
188+
${PACKAGE_PROJECT_ROOT_PATH}/Config.cmake.in
189+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" @ONLY
190+
)
191+
192+
install(
193+
EXPORT ${PROJECT_NAME}Targets
194+
DESTINATION "${${PROJECT_NAME}_INSTALL_CMAKEDIR}"
195+
NAMESPACE ${PROJECT_NAMESPACE}
196+
COMPONENT "${PROJECT_NAME}_Development"
197+
)
198+
199+
install(
200+
FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
201+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
202+
DESTINATION "${${PROJECT_NAME}_INSTALL_CMAKEDIR}"
203+
COMPONENT "${PROJECT_NAME}_Development"
204+
)
205+
206+
if(NOT DEFINED PROJECT_INCLUDE_HEADER_PATTERN)
207+
set(PROJECT_INCLUDE_HEADER_PATTERN "*")
208+
endif()
209+
210+
if(PROJECT_INCLUDE_DESTINATION AND PROJECT_INCLUDE_DIR)
211+
install(
212+
DIRECTORY ${PROJECT_INCLUDE_DIR}/
213+
DESTINATION ${PROJECT_INCLUDE_DESTINATION}
214+
COMPONENT "${PROJECT_NAME}_Development"
215+
FILES_MATCHING
216+
PATTERN "${PROJECT_INCLUDE_HEADER_PATTERN}"
217+
)
218+
endif()
219+
220+
set(${PROJECT_NAME}_VERSION
221+
${PROJECT_VERSION}
222+
CACHE INTERNAL ""
223+
)
224+
225+
if(PROJECT_CPACK)
226+
if(CPACK_PACKAGE_NAMESPACE)
227+
set(CPACK_PACKAGE_NAME ${CPACK_PACKAGE_NAMESPACE}-${PROJECT_NAME})
228+
else()
229+
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
230+
endif()
231+
if(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
232+
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}")
233+
endif()
234+
if(NOT CPACK_PACKAGE_HOMEPAGE_URL)
235+
set(CPACK_PACKAGE_HOMEPAGE_URL "${PROJECT_HOMEPAGE_URL}")
236+
endif()
237+
set(CPACK_VERBATIM_VARIABLES YES)
238+
set(CPACK_THREADS 0)
239+
set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
240+
set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
241+
set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
242+
243+
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
244+
set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
245+
endif()
246+
247+
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
248+
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
249+
set(CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
250+
OWNER_READ
251+
OWNER_WRITE
252+
OWNER_EXECUTE
253+
GROUP_READ
254+
GROUP_EXECUTE
255+
WORLD_READ
256+
WORLD_EXECUTE
257+
)
258+
259+
include(CPack)
260+
endif()
261+
endfunction()

cmake/package-lock.cmake

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
# CPM Package Lock
22
# This file should be committed to version control
33

4-
# PackageProject.cmake
5-
CPMDeclarePackage(PackageProject.cmake
6-
VERSION 1.8.0
7-
GITHUB_REPOSITORY TheLartians/PackageProject.cmake
8-
SYSTEM YES
9-
EXCLUDE_FROM_ALL YES
10-
)
114
# alpaka
125
CPMDeclarePackage(alpaka
136
NAME alpaka

cmake/version.h.in

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// This file was copied from
2+
// https://github.com/TheLartians/PackageProject.cmake/blob/2b8d9b49d227f714092ffe5263966274dc863380/version.h.in
3+
//
4+
// MIT License
5+
//
6+
// Copyright (c) 2020 Lars Melchior
7+
//
8+
// Permission is hereby granted, free of charge, to any person obtaining a copy
9+
// of this software and associated documentation files (the "Software"), to deal
10+
// in the Software without restriction, including without limitation the rights
11+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
// copies of the Software, and to permit persons to whom the Software is
13+
// furnished to do so, subject to the following conditions:
14+
//
15+
// The above copyright notice and this permission notice shall be included in all
16+
// copies or substantial portions of the Software.
17+
//
18+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
23+
#pragma once
24+
25+
#define @UPPERCASE_PROJECT_NAME @_VERSION "@PROJECT_VERSION@"
26+
27+
#define @UPPERCASE_PROJECT_NAME @_VERSION_MAJOR @PROJECT_VERSION_MAJOR @
28+
#define @UPPERCASE_PROJECT_NAME @_VERSION_MINOR @PROJECT_VERSION_MINOR @
29+
#define @UPPERCASE_PROJECT_NAME @_VERSION_PATCH @PROJECT_VERSION_PATCH @
30+
#define @UPPERCASE_PROJECT_NAME @_VERSION_TWEAK @PROJECT_VERSION_TWEAK @

0 commit comments

Comments
 (0)