Skip to content

Commit d553d1c

Browse files
authored
Merge pull request #551 from globberwops/550-cmake-build-is-missing-key-features-to-be-properly-usable-via-fetchcontent
#550 cmake build is missing key features to be properly usable via fetchcontent
2 parents 845f871 + 5a02aed commit d553d1c

File tree

3 files changed

+92
-73
lines changed

3 files changed

+92
-73
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ osi_version.proto
2323
version.py
2424
pyproject.toml
2525

26+
compile_commands.json
27+
2628
# Eclipse-specific files, if any
2729
*.cproject
2830
*.project

CMakeLists.txt

Lines changed: 82 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,19 @@ cmake_minimum_required(VERSION 3.5)
22

33
project(open_simulation_interface)
44

5-
# set default compiler
5+
# Toplevel check
6+
set(OSI_IS_TOP_LEVEL OFF)
7+
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
8+
set(OSI_IS_TOP_LEVEL ON)
9+
endif()
10+
11+
# Set the C++ standard
612
set(CMAKE_CXX_STANDARD 11)
13+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
714

815
# Optional Flatbuffer support
9-
set(BUILD_FLATBUFFER OFF CACHE BOOLEAN "Build flatbuffer versions of libraries")
16+
option(OSI_BUILD_FLATBUFFER "Build flatbuffer versions of libraries" OFF)
17+
option(OSI_BUILD_DOCUMENTATION "Build flatbuffer versions of libraries" ${OSI_IS_TOP_LEVEL})
1018

1119
# Set a default build type if none was specified
1220
set(default_build_type "Release")
@@ -38,27 +46,26 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
3846
endif()
3947

4048
# Offer the user the choice of overriding the installation directories
41-
set(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
42-
set(INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files")
49+
set(OSI_INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
50+
set(OSI_INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files")
4351

4452
if(WIN32 AND NOT CYGWIN)
4553
set(DEF_INSTALL_CMAKE_DIR CMake/${PROJECT_NAME}-${VERSION_MAJOR})
4654
else()
4755
set(DEF_INSTALL_CMAKE_DIR lib/cmake/${PROJECT_NAME}-${VERSION_MAJOR})
4856
endif()
49-
set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH
50-
"Installation directory for CMake files")
57+
set(OSI_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files")
5158

52-
set(INSTALL_LIB_DIR ${INSTALL_LIB_DIR}/osi${VERSION_MAJOR})
53-
set(INSTALL_INCLUDE_DIR ${INSTALL_INCLUDE_DIR}/osi${VERSION_MAJOR})
59+
set(OSI_INSTALL_LIB_DIR ${OSI_INSTALL_LIB_DIR}/osi${VERSION_MAJOR})
60+
set(OSI_INSTALL_INCLUDE_DIR ${OSI_INSTALL_INCLUDE_DIR}/osi${VERSION_MAJOR})
5461

55-
configure_file(osi_version.proto.in ${CMAKE_CURRENT_SOURCE_DIR}/osi_version.proto)
62+
configure_file(osi_version.proto.in osi_version.proto)
5663

5764
find_package(Protobuf 2.6.1 REQUIRED)
5865
set(PROTOBUF_IMPORT_DIRS ${PROTOBUF_INCLUDE_DIRS})
5966

6067
set(OSI_PROTO_FILES
61-
osi_version.proto
68+
${CMAKE_CURRENT_BINARY_DIR}/osi_version.proto
6269
osi_common.proto
6370
osi_datarecording.proto
6471
osi_detectedtrafficsign.proto
@@ -90,7 +97,7 @@ set(OSI_PROTO_FILES
9097

9198
protobuf_generate_cpp(PROTO_SRCS PROTO_HEADERS ${OSI_PROTO_FILES})
9299
set(FLAT_HEADERS "")
93-
if(BUILD_FLATBUFFER)
100+
if(OSI_BUILD_FLATBUFFER)
94101
set(FLAT_FBS "")
95102
add_subdirectory("flatbuffers"
96103
${CMAKE_CURRENT_BINARY_DIR}/flatbuffers-build
@@ -133,50 +140,53 @@ if(BUILD_FLATBUFFER)
133140
endif()
134141

135142
add_library(${PROJECT_NAME}_static STATIC ${PROTO_SRCS} ${PROTO_HEADERS})
143+
add_library(${PROJECT_NAME}::${PROJECT_NAME}_static ALIAS ${PROJECT_NAME}_static)
136144
target_include_directories(${PROJECT_NAME}_static
137145
PUBLIC
138146
${PROTOBUF_INCLUDE_DIR}
139147
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
140-
$<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>
148+
$<INSTALL_INTERFACE:${OSI_INSTALL_INCLUDE_DIR}>
141149
)
142150
target_link_libraries(${PROJECT_NAME}_static PUBLIC ${PROTOBUF_LIBRARY})
143151
install(TARGETS ${PROJECT_NAME}_static
144152
EXPORT ${PROJECT_NAME}_targets
145-
ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" COMPONENT lib)
153+
ARCHIVE DESTINATION "${OSI_INSTALL_LIB_DIR}" COMPONENT lib)
146154

147155

148156
add_library(${PROJECT_NAME}_obj OBJECT ${PROTO_SRCS} ${PROTO_HEADERS})
157+
add_library(${PROJECT_NAME}::${PROJECT_NAME}_obj ALIAS ${PROJECT_NAME}_obj)
149158
target_include_directories(${PROJECT_NAME}_obj
150159
PUBLIC
151160
${PROTOBUF_INCLUDE_DIR}
152161
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
153-
$<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>
162+
$<INSTALL_INTERFACE:${OSI_INSTALL_INCLUDE_DIR}>
154163
)
155164
set_property(TARGET ${PROJECT_NAME}_obj PROPERTY POSITION_INDEPENDENT_CODE ON)
156165

157166

158167
add_library(${PROJECT_NAME}_pic STATIC $<TARGET_OBJECTS:${PROJECT_NAME}_obj>)
159-
168+
add_library(${PROJECT_NAME}::${PROJECT_NAME}_pic ALIAS ${PROJECT_NAME}_pic)
160169
target_include_directories(${PROJECT_NAME}_pic
161170
PUBLIC
162171
${PROTOBUF_INCLUDE_DIR}
163172
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
164-
$<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>
173+
$<INSTALL_INTERFACE:${OSI_INSTALL_INCLUDE_DIR}>
165174
)
166175
target_link_libraries(${PROJECT_NAME}_pic PUBLIC ${PROTOBUF_LIBRARY})
167176

168177
set_property(TARGET ${PROJECT_NAME}_pic PROPERTY POSITION_INDEPENDENT_CODE ON)
169178

170179
install(TARGETS ${PROJECT_NAME}_pic
171180
EXPORT ${PROJECT_NAME}_targets
172-
ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" COMPONENT lib)
181+
ARCHIVE DESTINATION "${OSI_INSTALL_LIB_DIR}" COMPONENT lib)
173182

174183
add_library(${PROJECT_NAME} SHARED $<TARGET_OBJECTS:${PROJECT_NAME}_obj>)
184+
add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
175185
target_include_directories(${PROJECT_NAME}
176186
PUBLIC
177187
${PROTOBUF_INCLUDE_DIR}
178188
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
179-
$<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>
189+
$<INSTALL_INTERFACE:${OSI_INSTALL_INCLUDE_DIR}>
180190
)
181191

182192
set_property(
@@ -191,64 +201,72 @@ set_property(
191201
target_link_libraries(${PROJECT_NAME} PUBLIC ${PROTOBUF_LIBRARY})
192202
install(TARGETS ${PROJECT_NAME}
193203
EXPORT ${PROJECT_NAME}_targets
194-
DESTINATION "${INSTALL_LIB_DIR}" COMPONENT lib)
195-
196-
# Create the open_simulation_interface.cmake and open_simulation_interface-version files
197-
198-
# ... for the build tree
199-
set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}")
200-
configure_file(open_simulation_interface-config.cmake.in
201-
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" @ONLY)
202-
# ... for the install tree
203-
set(CONF_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/${INSTALL_INCLUDE_DIR} ${PROTOBUF_INCLUDE_DIR})
204-
configure_file(open_simulation_interface-config.cmake.in
205-
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/open_simulation_interface-config.cmake" @ONLY)
206-
# ... for both
207-
configure_file(open_simulation_interface-config-version.cmake.in
208-
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" @ONLY)
204+
DESTINATION "${OSI_INSTALL_LIB_DIR}" COMPONENT lib)
205+
206+
# Copy proto headers to where they are expected by the package config file
207+
add_custom_command(
208+
TARGET ${PROJECT_NAME} POST_BUILD
209+
COMMAND ${CMAKE_COMMAND} -E make_directory
210+
${CMAKE_CURRENT_BINARY_DIR}/${OSI_INSTALL_INCLUDE_DIR}
211+
COMMAND ${CMAKE_COMMAND} -E copy
212+
${PROTO_HEADERS}
213+
${CMAKE_CURRENT_BINARY_DIR}/${OSI_INSTALL_INCLUDE_DIR})
214+
215+
# Create the package config files
216+
include(CMakePackageConfigHelpers)
217+
write_basic_package_version_file(
218+
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config-version.cmake"
219+
VERSION ${OPEN_SIMULATION_INTERFACE_VERSION}
220+
COMPATIBILITY SameMajorVersion
221+
)
222+
223+
export(EXPORT ${PROJECT_NAME}_targets
224+
FILE "${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-targets.cmake"
225+
NAMESPACE ${PROJECT_NAME}::
226+
)
227+
228+
configure_package_config_file(open_simulation_interface-config.cmake.in
229+
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config.cmake"
230+
INSTALL_DESTINATION ${OSI_INSTALL_CMAKE_DIR}
231+
PATH_VARS OSI_INSTALL_INCLUDE_DIR
232+
NO_CHECK_REQUIRED_COMPONENTS_MACRO
233+
)
209234

210235
# Install the *cmake files
211236
install(FILES
212-
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/open_simulation_interface-config.cmake"
213-
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
214-
DESTINATION "${INSTALL_CMAKE_DIR}"
215-
COMPONENT dev)
237+
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config.cmake"
238+
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config-version.cmake"
239+
DESTINATION "${OSI_INSTALL_CMAKE_DIR}"
240+
COMPONENT dev)
216241

217242
# Header files
218243
install(FILES ${PROTO_HEADERS} ${FLAT_HEADERS}
219-
DESTINATION "${INSTALL_INCLUDE_DIR}")
244+
DESTINATION "${OSI_INSTALL_INCLUDE_DIR}")
220245

221246
# Install the export set for use with the install-tree
222247
install(EXPORT ${PROJECT_NAME}_targets
223-
DESTINATION "${INSTALL_CMAKE_DIR}"
224-
COMPONENT dev)
225-
226-
# add a target to generate API documentation with Doxygen
227-
# Dependencies: Doxygen and proto2cpp.py
228-
FIND_PACKAGE(Doxygen)
229-
set(FILTER_PROTO2CPP_PY_PATH CACHE PATH "directory to the filter proto2cpp.py")
230-
231-
if(NOT DOXYGEN_FOUND)
232-
233-
message(WARNING "Doxygen could not be found.")
234-
235-
else()
236-
248+
FILE open_simulation_interface-targets.cmake
249+
NAMESPACE ${PROJECT_NAME}::
250+
DESTINATION "${OSI_INSTALL_CMAKE_DIR}"
251+
COMPONENT dev)
252+
253+
if(OSI_BUILD_DOCUMENTATION)
254+
# add a target to generate API documentation with Doxygen
255+
# Dependencies: Doxygen and proto2cpp.py
256+
find_package(Doxygen)
257+
if(Doxygen_FOUND)
258+
set(FILTER_PROTO2CPP_PY_PATH CACHE PATH "directory to the filter proto2cpp.py")
237259
if(NOT EXISTS ${FILTER_PROTO2CPP_PY_PATH}/proto2cpp.py)
238-
239-
message(WARNING "${FILTER_PROTO2CPP_PY_PATH}/proto2cpp.py could not be found.")
240-
260+
message(WARNING "${FILTER_PROTO2CPP_PY_PATH}/proto2cpp.py could not be found.")
241261
else()
262+
set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/doxygen_config.cmake.in)
263+
set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
242264

243-
set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/doxygen_config.cmake.in)
244-
set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
245-
246-
configure_file(${doxyfile_in} ${doxyfile} @ONLY)
265+
configure_file(${doxyfile_in} ${doxyfile} @ONLY)
247266

248-
ADD_CUSTOM_TARGET(api_doc ALL
267+
add_custom_target(api_doc ALL
249268
COMMAND ${DOXYGEN_EXECUTABLE} ${doxyfile}
250269
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
251-
252-
endif(NOT EXISTS ${FILTER_PROTO2CPP_PY_PATH}/proto2cpp.py)
253-
254-
endif(NOT DOXYGEN_FOUND)
270+
endif()
271+
endif()
272+
endif()
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)