@@ -2,11 +2,19 @@ cmake_minimum_required(VERSION 3.5)
22
33project (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
612set (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
1220set (default_build_type "Release" )
@@ -38,27 +46,26 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
3846endif ()
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
4452if (WIN32 AND NOT CYGWIN )
4553 set (DEF_INSTALL_CMAKE_DIR CMake/${PROJECT_NAME} -${VERSION_MAJOR} )
4654else ()
4755 set (DEF_INSTALL_CMAKE_DIR lib/cmake/${PROJECT_NAME} -${VERSION_MAJOR} )
4856endif ()
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
5764find_package (Protobuf 2.6.1 REQUIRED)
5865set (PROTOBUF_IMPORT_DIRS ${PROTOBUF_INCLUDE_DIRS} )
5966
6067set (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
9198protobuf_generate_cpp(PROTO_SRCS PROTO_HEADERS ${OSI_PROTO_FILES} )
9299set (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)
133140endif ()
134141
135142add_library (${PROJECT_NAME} _static STATIC ${PROTO_SRCS} ${PROTO_HEADERS} )
143+ add_library (${PROJECT_NAME} ::${PROJECT_NAME} _static ALIAS ${PROJECT_NAME} _static)
136144target_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)
142150target_link_libraries (${PROJECT_NAME} _static PUBLIC ${PROTOBUF_LIBRARY} )
143151install (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
148156add_library (${PROJECT_NAME} _obj OBJECT ${PROTO_SRCS} ${PROTO_HEADERS} )
157+ add_library (${PROJECT_NAME} ::${PROJECT_NAME} _obj ALIAS ${PROJECT_NAME} _obj)
149158target_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)
155164set_property (TARGET ${PROJECT_NAME} _obj PROPERTY POSITION_INDEPENDENT_CODE ON )
156165
157166
158167add_library (${PROJECT_NAME} _pic STATIC $<TARGET_OBJECTS:${PROJECT_NAME} _obj>)
159-
168+ add_library ( ${PROJECT_NAME} :: ${PROJECT_NAME} _pic ALIAS ${PROJECT_NAME} _pic)
160169target_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)
166175target_link_libraries (${PROJECT_NAME} _pic PUBLIC ${PROTOBUF_LIBRARY} )
167176
168177set_property (TARGET ${PROJECT_NAME} _pic PROPERTY POSITION_INDEPENDENT_CODE ON )
169178
170179install (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
174183add_library (${PROJECT_NAME} SHARED $<TARGET_OBJECTS:${PROJECT_NAME} _obj>)
184+ add_library (${PROJECT_NAME} ::${PROJECT_NAME} ALIAS ${PROJECT_NAME} )
175185target_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
182192set_property (
@@ -191,64 +201,72 @@ set_property(
191201target_link_libraries (${PROJECT_NAME} PUBLIC ${PROTOBUF_LIBRARY} )
192202install (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
211236install (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
218243install (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
222247install (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 ()
0 commit comments