Skip to content

Commit d0ecf4c

Browse files
committed
#550 Rewrite the whole installation logic
* Fix the cache variables * Copy the headers to the appropriate location in the PROJECT_BINARY_DIR * Rewrite the package config file template * Create proper config, version, and target files using CMakePackageConfigHelpers * Export and install namespaced targets Signed-off-by: Martin Stump <11492152+globberwops@users.noreply.github.com>
1 parent 642fb1b commit d0ecf4c

File tree

2 files changed

+46
-30
lines changed

2 files changed

+46
-30
lines changed

CMakeLists.txt

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
3535
endif()
3636

3737
# Offer the user the choice of overriding the installation directories
38-
option(OSI_INSTALL_LIB_DIR "Installation directory for libraries" lib)
39-
option(OSI_INSTALL_INCLUDE_DIR "Installation directory for header files" include)
38+
set(OSI_INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
39+
set(OSI_INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files")
4040

4141
if(WIN32 AND NOT CYGWIN)
4242
set(DEF_INSTALL_CMAKE_DIR CMake/${PROJECT_NAME}-${VERSION_MAJOR})
4343
else()
4444
set(DEF_INSTALL_CMAKE_DIR lib/cmake/${PROJECT_NAME}-${VERSION_MAJOR})
4545
endif()
46-
option(OSI_INSTALL_CMAKE_DIR "Installation directory for CMake files" ${DEF_INSTALL_CMAKE_DIR})
46+
set(OSI_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files")
4747

4848
set(OSI_INSTALL_LIB_DIR ${OSI_INSTALL_LIB_DIR}/osi${VERSION_MAJOR})
4949
set(OSI_INSTALL_INCLUDE_DIR ${OSI_INSTALL_INCLUDE_DIR}/osi${VERSION_MAJOR})
@@ -148,35 +148,52 @@ install(TARGETS ${PROJECT_NAME}
148148
EXPORT ${PROJECT_NAME}_targets
149149
DESTINATION "${OSI_INSTALL_LIB_DIR}" COMPONENT lib)
150150

151-
# Create the open_simulation_interface.cmake and open_simulation_interface-version files
151+
# Copy proto headers to where they are expected by the package config file
152+
add_custom_command(
153+
TARGET ${PROJECT_NAME} POST_BUILD
154+
COMMAND ${CMAKE_COMMAND} -E make_directory
155+
${CMAKE_CURRENT_BINARY_DIR}/${OSI_INSTALL_INCLUDE_DIR}
156+
COMMAND ${CMAKE_COMMAND} -E copy
157+
${PROTO_HEADERS}
158+
${CMAKE_CURRENT_BINARY_DIR}/${OSI_INSTALL_INCLUDE_DIR})
159+
160+
# Create the package config files
161+
include(CMakePackageConfigHelpers)
162+
write_basic_package_version_file(
163+
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config-version.cmake"
164+
VERSION ${OPEN_SIMULATION_INTERFACE_VERSION}
165+
COMPATIBILITY SameMajorVersion
166+
)
167+
168+
export(EXPORT ${PROJECT_NAME}_targets
169+
FILE "${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-targets.cmake"
170+
NAMESPACE ${PROJECT_NAME}::
171+
)
152172

153-
# ... for the build tree
154-
set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}")
155-
configure_file(open_simulation_interface-config.cmake.in
156-
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" @ONLY)
157-
# ... for the install tree
158-
set(CONF_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/${OSI_INSTALL_INCLUDE_DIR} ${PROTOBUF_INCLUDE_DIR})
159-
configure_file(open_simulation_interface-config.cmake.in
160-
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/open_simulation_interface-config.cmake" @ONLY)
161-
# ... for both
162-
configure_file(open_simulation_interface-config-version.cmake.in
163-
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" @ONLY)
173+
configure_package_config_file(open_simulation_interface-config.cmake.in
174+
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config.cmake"
175+
INSTALL_DESTINATION ${OSI_INSTALL_CMAKE_DIR}
176+
PATH_VARS OSI_INSTALL_INCLUDE_DIR
177+
NO_CHECK_REQUIRED_COMPONENTS_MACRO
178+
)
164179

165180
# Install the *cmake files
166181
install(FILES
167-
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/open_simulation_interface-config.cmake"
168-
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
169-
DESTINATION "${OSI_INSTALL_CMAKE_DIR}"
170-
COMPONENT dev)
182+
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config.cmake"
183+
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config-version.cmake"
184+
DESTINATION "${OSI_INSTALL_CMAKE_DIR}"
185+
COMPONENT dev)
171186

172187
# Header files
173188
install(FILES ${PROTO_HEADERS}
174189
DESTINATION "${OSI_INSTALL_INCLUDE_DIR}")
175190

176191
# Install the export set for use with the install-tree
177192
install(EXPORT ${PROJECT_NAME}_targets
178-
DESTINATION "${OSI_INSTALL_CMAKE_DIR}"
179-
COMPONENT dev)
193+
FILE open_simulation_interface-targets.cmake
194+
NAMESPACE ${PROJECT_NAME}::
195+
DESTINATION "${OSI_INSTALL_CMAKE_DIR}"
196+
COMPONENT dev)
180197

181198
# add a target to generate API documentation with Doxygen
182199
# Dependencies: Doxygen and proto2cpp.py
Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
# Compute paths
2-
get_filename_component(OPEN_SIMULATION_INTERFACE_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
3-
set(OPEN_SIMULATION_INTERFACE_INCLUDE_DIRS "@CONF_INCLUDE_DIRS@")
1+
@PACKAGE_INIT@
42

5-
# Our library dependencies (contains definitions for IMPORTED targets)
6-
if(NOT TARGET OPEN_SIMULATION_INTERFACE AND NOT OPEN_SIMULATION_INTERFACE_BINARY_DIR)
7-
include("${OPEN_SIMULATION_INTERFACE_CMAKE_DIR}/open_simulation_interface_targets.cmake")
8-
endif()
3+
include(CMakeFindDependencyMacro)
4+
find_dependency(Protobuf)
95

10-
# These are IMPORTED targets created by open_simulation_interface_targets.cmake
11-
set(OPEN_SIMULATION_INTERFACE_LIBRARIES open_simulation_interface)
6+
if(NOT TARGET @PROJECT_NAME@ AND NOT @PROJECT_NAME@_BINARY_DIR)
7+
set_and_check(OPEN_SIMULATION_INTERFACE_INCLUDE_DIRS "@PACKAGE_OSI_INSTALL_INCLUDE_DIR@")
8+
set(OPEN_SIMULATION_INTERFACE_LIBRARIES "@PROJECT_NAME@")
9+
include("${CMAKE_CURRENT_LIST_DIR}/open_simulation_interface_targets.cmake")
10+
endif()

0 commit comments

Comments
 (0)