Skip to content
Merged
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ osi_version.proto
version.py
pyproject.toml

compile_commands.json

# Eclipse-specific files, if any
*.cproject
*.project
Expand Down
146 changes: 82 additions & 64 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,19 @@ cmake_minimum_required(VERSION 3.5)

project(open_simulation_interface)

# set default compiler
# Toplevel check
set(OSI_IS_TOP_LEVEL OFF)
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
set(OSI_IS_TOP_LEVEL ON)
endif()

# Set the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Optional Flatbuffer support
set(BUILD_FLATBUFFER OFF CACHE BOOLEAN "Build flatbuffer versions of libraries")
option(OSI_BUILD_FLATBUFFER "Build flatbuffer versions of libraries" OFF)
option(OSI_BUILD_DOCUMENTATION "Build flatbuffer versions of libraries" ${OSI_IS_TOP_LEVEL})

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

# Offer the user the choice of overriding the installation directories
set(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
set(INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files")
set(OSI_INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
set(OSI_INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files")

if(WIN32 AND NOT CYGWIN)
set(DEF_INSTALL_CMAKE_DIR CMake/${PROJECT_NAME}-${VERSION_MAJOR})
else()
set(DEF_INSTALL_CMAKE_DIR lib/cmake/${PROJECT_NAME}-${VERSION_MAJOR})
endif()
set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH
"Installation directory for CMake files")
set(OSI_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files")

set(INSTALL_LIB_DIR ${INSTALL_LIB_DIR}/osi${VERSION_MAJOR})
set(INSTALL_INCLUDE_DIR ${INSTALL_INCLUDE_DIR}/osi${VERSION_MAJOR})
set(OSI_INSTALL_LIB_DIR ${OSI_INSTALL_LIB_DIR}/osi${VERSION_MAJOR})
set(OSI_INSTALL_INCLUDE_DIR ${OSI_INSTALL_INCLUDE_DIR}/osi${VERSION_MAJOR})

configure_file(osi_version.proto.in ${CMAKE_CURRENT_SOURCE_DIR}/osi_version.proto)
configure_file(osi_version.proto.in osi_version.proto)

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

set(OSI_PROTO_FILES
osi_version.proto
${CMAKE_CURRENT_BINARY_DIR}/osi_version.proto
osi_common.proto
osi_datarecording.proto
osi_detectedtrafficsign.proto
Expand Down Expand Up @@ -90,7 +97,7 @@ set(OSI_PROTO_FILES

protobuf_generate_cpp(PROTO_SRCS PROTO_HEADERS ${OSI_PROTO_FILES})
set(FLAT_HEADERS "")
if(BUILD_FLATBUFFER)
if(OSI_BUILD_FLATBUFFER)
set(FLAT_FBS "")
add_subdirectory("flatbuffers"
${CMAKE_CURRENT_BINARY_DIR}/flatbuffers-build
Expand Down Expand Up @@ -133,50 +140,53 @@ if(BUILD_FLATBUFFER)
endif()

add_library(${PROJECT_NAME}_static STATIC ${PROTO_SRCS} ${PROTO_HEADERS})
add_library(${PROJECT_NAME}::${PROJECT_NAME}_static ALIAS ${PROJECT_NAME}_static)
target_include_directories(${PROJECT_NAME}_static
PUBLIC
${PROTOBUF_INCLUDE_DIR}
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>
$<INSTALL_INTERFACE:${OSI_INSTALL_INCLUDE_DIR}>
)
target_link_libraries(${PROJECT_NAME}_static PUBLIC ${PROTOBUF_LIBRARY})
install(TARGETS ${PROJECT_NAME}_static
EXPORT ${PROJECT_NAME}_targets
ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" COMPONENT lib)
ARCHIVE DESTINATION "${OSI_INSTALL_LIB_DIR}" COMPONENT lib)


add_library(${PROJECT_NAME}_obj OBJECT ${PROTO_SRCS} ${PROTO_HEADERS})
add_library(${PROJECT_NAME}::${PROJECT_NAME}_obj ALIAS ${PROJECT_NAME}_obj)
target_include_directories(${PROJECT_NAME}_obj
PUBLIC
${PROTOBUF_INCLUDE_DIR}
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>
$<INSTALL_INTERFACE:${OSI_INSTALL_INCLUDE_DIR}>
)
set_property(TARGET ${PROJECT_NAME}_obj PROPERTY POSITION_INDEPENDENT_CODE ON)


add_library(${PROJECT_NAME}_pic STATIC $<TARGET_OBJECTS:${PROJECT_NAME}_obj>)

add_library(${PROJECT_NAME}::${PROJECT_NAME}_pic ALIAS ${PROJECT_NAME}_pic)
target_include_directories(${PROJECT_NAME}_pic
PUBLIC
${PROTOBUF_INCLUDE_DIR}
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>
$<INSTALL_INTERFACE:${OSI_INSTALL_INCLUDE_DIR}>
)
target_link_libraries(${PROJECT_NAME}_pic PUBLIC ${PROTOBUF_LIBRARY})

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

install(TARGETS ${PROJECT_NAME}_pic
EXPORT ${PROJECT_NAME}_targets
ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" COMPONENT lib)
ARCHIVE DESTINATION "${OSI_INSTALL_LIB_DIR}" COMPONENT lib)

add_library(${PROJECT_NAME} SHARED $<TARGET_OBJECTS:${PROJECT_NAME}_obj>)
add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
target_include_directories(${PROJECT_NAME}
PUBLIC
${PROTOBUF_INCLUDE_DIR}
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>
$<INSTALL_INTERFACE:${OSI_INSTALL_INCLUDE_DIR}>
)

set_property(
Expand All @@ -191,64 +201,72 @@ set_property(
target_link_libraries(${PROJECT_NAME} PUBLIC ${PROTOBUF_LIBRARY})
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}_targets
DESTINATION "${INSTALL_LIB_DIR}" COMPONENT lib)

# Create the open_simulation_interface.cmake and open_simulation_interface-version files

# ... for the build tree
set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}")
configure_file(open_simulation_interface-config.cmake.in
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" @ONLY)
# ... for the install tree
set(CONF_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/${INSTALL_INCLUDE_DIR} ${PROTOBUF_INCLUDE_DIR})
configure_file(open_simulation_interface-config.cmake.in
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/open_simulation_interface-config.cmake" @ONLY)
# ... for both
configure_file(open_simulation_interface-config-version.cmake.in
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" @ONLY)
DESTINATION "${OSI_INSTALL_LIB_DIR}" COMPONENT lib)

# Copy proto headers to where they are expected by the package config file
add_custom_command(
TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
${CMAKE_CURRENT_BINARY_DIR}/${OSI_INSTALL_INCLUDE_DIR}
COMMAND ${CMAKE_COMMAND} -E copy
${PROTO_HEADERS}
${CMAKE_CURRENT_BINARY_DIR}/${OSI_INSTALL_INCLUDE_DIR})

# Create the package config files
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config-version.cmake"
VERSION ${OPEN_SIMULATION_INTERFACE_VERSION}
COMPATIBILITY SameMajorVersion
)

export(EXPORT ${PROJECT_NAME}_targets
FILE "${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-targets.cmake"
NAMESPACE ${PROJECT_NAME}::
)

configure_package_config_file(open_simulation_interface-config.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config.cmake"
INSTALL_DESTINATION ${OSI_INSTALL_CMAKE_DIR}
PATH_VARS OSI_INSTALL_INCLUDE_DIR
NO_CHECK_REQUIRED_COMPONENTS_MACRO
)

# Install the *cmake files
install(FILES
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/open_simulation_interface-config.cmake"
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
DESTINATION "${INSTALL_CMAKE_DIR}"
COMPONENT dev)
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config-version.cmake"
DESTINATION "${OSI_INSTALL_CMAKE_DIR}"
COMPONENT dev)

# Header files
install(FILES ${PROTO_HEADERS} ${FLAT_HEADERS}
DESTINATION "${INSTALL_INCLUDE_DIR}")
DESTINATION "${OSI_INSTALL_INCLUDE_DIR}")

# Install the export set for use with the install-tree
install(EXPORT ${PROJECT_NAME}_targets
DESTINATION "${INSTALL_CMAKE_DIR}"
COMPONENT dev)

# add a target to generate API documentation with Doxygen
# Dependencies: Doxygen and proto2cpp.py
FIND_PACKAGE(Doxygen)
set(FILTER_PROTO2CPP_PY_PATH CACHE PATH "directory to the filter proto2cpp.py")

if(NOT DOXYGEN_FOUND)

message(WARNING "Doxygen could not be found.")

else()

FILE open_simulation_interface-targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION "${OSI_INSTALL_CMAKE_DIR}"
COMPONENT dev)

if(OSI_BUILD_DOCUMENTATION)
# add a target to generate API documentation with Doxygen
# Dependencies: Doxygen and proto2cpp.py
find_package(Doxygen)
if(Doxygen_FOUND)
set(FILTER_PROTO2CPP_PY_PATH CACHE PATH "directory to the filter proto2cpp.py")
if(NOT EXISTS ${FILTER_PROTO2CPP_PY_PATH}/proto2cpp.py)

message(WARNING "${FILTER_PROTO2CPP_PY_PATH}/proto2cpp.py could not be found.")

message(WARNING "${FILTER_PROTO2CPP_PY_PATH}/proto2cpp.py could not be found.")
else()
set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/doxygen_config.cmake.in)
set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)

set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/doxygen_config.cmake.in)
set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)

configure_file(${doxyfile_in} ${doxyfile} @ONLY)
configure_file(${doxyfile_in} ${doxyfile} @ONLY)

ADD_CUSTOM_TARGET(api_doc ALL
add_custom_target(api_doc ALL
COMMAND ${DOXYGEN_EXECUTABLE} ${doxyfile}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

endif(NOT EXISTS ${FILTER_PROTO2CPP_PY_PATH}/proto2cpp.py)

endif(NOT DOXYGEN_FOUND)
endif()
endif()
endif()
17 changes: 8 additions & 9 deletions open_simulation_interface-config.cmake.in
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
# Compute paths
get_filename_component(OPEN_SIMULATION_INTERFACE_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
set(OPEN_SIMULATION_INTERFACE_INCLUDE_DIRS "@CONF_INCLUDE_DIRS@")
@PACKAGE_INIT@

# Our library dependencies (contains definitions for IMPORTED targets)
if(NOT TARGET OPEN_SIMULATION_INTERFACE AND NOT OPEN_SIMULATION_INTERFACE_BINARY_DIR)
include("${OPEN_SIMULATION_INTERFACE_CMAKE_DIR}/open_simulation_interface_targets.cmake")
endif()
include(CMakeFindDependencyMacro)
find_dependency(Protobuf)

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