You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
315 lines
12 KiB
315 lines
12 KiB
# generated from genmsg/cmake/genmsg-extras.cmake.in |
|
|
|
if(_GENMSG_EXTRAS_INCLUDED_) |
|
return() |
|
endif() |
|
set(_GENMSG_EXTRAS_INCLUDED_ TRUE) |
|
|
|
# set destination for langs |
|
set(GENMSG_LANGS_DESTINATION "etc/ros/genmsg") |
|
|
|
@[if DEVELSPACE]@ |
|
# bin dir variables in develspace |
|
set(GENMSG_CHECK_DEPS_SCRIPT "@(CMAKE_CURRENT_SOURCE_DIR)/scripts/genmsg_check_deps.py") |
|
@[else]@ |
|
# bin dir variables in installspace |
|
set(GENMSG_CHECK_DEPS_SCRIPT "${genmsg_DIR}/../../../@(CATKIN_PACKAGE_BIN_DESTINATION)/genmsg_check_deps.py") |
|
@[end if]@ |
|
|
|
include(CMakeParseArguments) |
|
|
|
# find message generators in all workspaces |
|
set(message_generators "") |
|
foreach(workspace ${CATKIN_WORKSPACES}) |
|
file(GLOB workspace_message_generators |
|
RELATIVE ${workspace}/${GENMSG_LANGS_DESTINATION} |
|
${workspace}/${GENMSG_LANGS_DESTINATION}/gen*) |
|
list(APPEND message_generators ${workspace_message_generators}) |
|
endforeach() |
|
if(message_generators) |
|
list(SORT message_generators) |
|
endif() |
|
|
|
foreach(message_generator ${message_generators}) |
|
find_package(${message_generator} REQUIRED) |
|
list(FIND CATKIN_MESSAGE_GENERATORS ${message_generator} _index) |
|
if(_index EQUAL -1) |
|
list(APPEND CATKIN_MESSAGE_GENERATORS ${message_generator}) |
|
endif() |
|
endforeach() |
|
if(CATKIN_MESSAGE_GENERATORS) |
|
list(SORT CATKIN_MESSAGE_GENERATORS) |
|
endif() |
|
|
|
# disable specific message generators |
|
string(REPLACE ":" ";" _disabled_message_generators "$ENV{ROS_LANG_DISABLE}") |
|
# remove unknown generators from disabled list |
|
foreach(message_generator ${_disabled_message_generators}) |
|
list(FIND CATKIN_MESSAGE_GENERATORS ${message_generator} _index) |
|
if(_index EQUAL -1) |
|
list(REMOVE_ITEM _disabled_message_generators ${message_generator}) |
|
message(WARNING "Unknown message generator specified in ROS_LANG_DISABLE: ${message_generator}") |
|
endif() |
|
endforeach() |
|
if(_disabled_message_generators) |
|
message(STATUS "Disabling the following message generators: ${_disabled_message_generators}") |
|
list(REMOVE_ITEM CATKIN_MESSAGE_GENERATORS ${_disabled_message_generators}) |
|
endif() |
|
message(STATUS "Using these message generators: ${CATKIN_MESSAGE_GENERATORS}") |
|
|
|
macro(_prepend_path ARG_PATH ARG_FILES ARG_OUTPUT_VAR) |
|
cmake_parse_arguments(ARG "UNIQUE" "" "" ${ARGN}) |
|
if(ARG_UNPARSED_ARGUMENTS) |
|
message(FATAL_ERROR "_prepend_path() called with unused arguments: ${ARG_UNPARSED_ARGUMENTS}") |
|
endif() |
|
# todo, check for proper path, slasheds, etc |
|
set(${ARG_OUTPUT_VAR} "") |
|
foreach(_file ${ARG_FILES}) |
|
set(_value ${ARG_PATH}/${_file}) |
|
list(FIND ${ARG_OUTPUT_VAR} ${_value} _index) |
|
if(NOT ARG_UNIQUE OR _index EQUAL -1) |
|
list(APPEND ${ARG_OUTPUT_VAR} ${_value}) |
|
endif() |
|
endforeach() |
|
endmacro() |
|
|
|
macro(add_message_files) |
|
cmake_parse_arguments(ARG "NOINSTALL" "DIRECTORY;BASE_DIR" "FILES" ${ARGN}) |
|
if(ARG_UNPARSED_ARGUMENTS) |
|
message(FATAL_ERROR "add_message_files() called with unused arguments: ${ARG_UNPARSED_ARGUMENTS}") |
|
endif() |
|
|
|
if(NOT ARG_DIRECTORY) |
|
set(ARG_DIRECTORY "msg") |
|
endif() |
|
|
|
set(MESSAGE_DIR "${ARG_DIRECTORY}") |
|
if(NOT IS_ABSOLUTE "${MESSAGE_DIR}") |
|
set(MESSAGE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${MESSAGE_DIR}") |
|
endif() |
|
# override message directory (used by add_action_files()) |
|
if(ARG_BASE_DIR) |
|
set(MESSAGE_DIR ${ARG_BASE_DIR}) |
|
endif() |
|
|
|
if(NOT IS_DIRECTORY ${MESSAGE_DIR}) |
|
message(FATAL_ERROR "add_message_files() directory not found: ${MESSAGE_DIR}") |
|
endif() |
|
|
|
if(${PROJECT_NAME}_GENERATE_MESSAGES) |
|
message(FATAL_ERROR "generate_messages() must be called after add_message_files()") |
|
endif() |
|
|
|
# if FILES are not passed search message files in the given directory |
|
# note: ARGV is not variable, so it can not be passed to list(FIND) directly |
|
set(_argv ${ARGV}) |
|
list(FIND _argv "FILES" _index) |
|
if(_index EQUAL -1) |
|
file(GLOB ARG_FILES RELATIVE "${MESSAGE_DIR}" "${MESSAGE_DIR}/*.msg") |
|
list(SORT ARG_FILES) |
|
endif() |
|
_prepend_path(${MESSAGE_DIR} "${ARG_FILES}" FILES_W_PATH) |
|
|
|
list(APPEND ${PROJECT_NAME}_MESSAGE_FILES ${FILES_W_PATH}) |
|
foreach(file ${FILES_W_PATH}) |
|
assert_file_exists(${file} "message file not found") |
|
endforeach() |
|
|
|
# remember path to messages to resolve them as dependencies |
|
list(FIND ${PROJECT_NAME}_MSG_INCLUDE_DIRS_DEVELSPACE ${MESSAGE_DIR} _index) |
|
if(_index EQUAL -1) |
|
list(APPEND ${PROJECT_NAME}_MSG_INCLUDE_DIRS_DEVELSPACE ${MESSAGE_DIR}) |
|
endif() |
|
|
|
if(NOT ARG_NOINSTALL) |
|
# ensure that destination variables are initialized |
|
catkin_destinations() |
|
|
|
list(APPEND ${PROJECT_NAME}_MSG_INCLUDE_DIRS_INSTALLSPACE ${ARG_DIRECTORY}) |
|
install(FILES ${FILES_W_PATH} |
|
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/${ARG_DIRECTORY}) |
|
|
|
_prepend_path("${ARG_DIRECTORY}" "${ARG_FILES}" FILES_W_PATH) |
|
list(APPEND ${PROJECT_NAME}_INSTALLED_MESSAGE_FILES ${FILES_W_PATH}) |
|
endif() |
|
endmacro() |
|
|
|
macro(add_service_files) |
|
cmake_parse_arguments(ARG "NOINSTALL" "DIRECTORY" "FILES" ${ARGN}) |
|
if(ARG_UNPARSED_ARGUMENTS) |
|
message(FATAL_ERROR "add_service_files() called with unused arguments: ${ARG_UNPARSED_ARGUMENTS}") |
|
endif() |
|
|
|
if(NOT ARG_DIRECTORY) |
|
set(ARG_DIRECTORY "srv") |
|
endif() |
|
|
|
set(SERVICE_DIR "${ARG_DIRECTORY}") |
|
if(NOT IS_ABSOLUTE "${SERVICE_DIR}") |
|
set(SERVICE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${SERVICE_DIR}") |
|
endif() |
|
|
|
if(NOT IS_DIRECTORY ${SERVICE_DIR}) |
|
message(FATAL_ERROR "add_service_files() directory not found: ${SERVICE_DIR}") |
|
endif() |
|
|
|
if(${PROJECT_NAME}_GENERATE_MESSAGES) |
|
message(FATAL_ERROR "generate_messages() must be called after add_service_files()") |
|
endif() |
|
|
|
# if FILES are not passed search service files in the given directory |
|
# note: ARGV is not variable, so it can not be passed to list(FIND) directly |
|
set(_argv ${ARGV}) |
|
list(FIND _argv "FILES" _index) |
|
if(_index EQUAL -1) |
|
file(GLOB ARG_FILES RELATIVE "${SERVICE_DIR}" "${SERVICE_DIR}/*.srv") |
|
list(SORT ARG_FILES) |
|
endif() |
|
_prepend_path(${SERVICE_DIR} "${ARG_FILES}" FILES_W_PATH) |
|
|
|
list(APPEND ${PROJECT_NAME}_SERVICE_FILES ${FILES_W_PATH}) |
|
foreach(file ${FILES_W_PATH}) |
|
assert_file_exists(${file} "service file not found") |
|
endforeach() |
|
|
|
if(NOT ARG_NOINSTALL) |
|
# ensure that destination variables are initialized |
|
catkin_destinations() |
|
|
|
install(FILES ${FILES_W_PATH} |
|
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/${ARG_DIRECTORY}) |
|
|
|
_prepend_path("${ARG_DIRECTORY}" "${ARG_FILES}" FILES_W_PATH) |
|
list(APPEND ${PROJECT_NAME}_INSTALLED_SERVICE_FILES ${FILES_W_PATH}) |
|
endif() |
|
endmacro() |
|
|
|
macro(generate_messages) |
|
cmake_parse_arguments(ARG "" "" "DEPENDENCIES;LANGS" ${ARGN}) |
|
|
|
if(${PROJECT_NAME}_GENERATE_MESSAGES) |
|
message(FATAL_ERROR "generate_messages() must only be called once per project'") |
|
endif() |
|
|
|
if(ARG_UNPARSED_ARGUMENTS) |
|
message(FATAL_ERROR "generate_messages() called with unused arguments: ${ARG_UNPARSED_ARGUMENTS}") |
|
endif() |
|
|
|
if(${PROJECT_NAME}_CATKIN_PACKAGE) |
|
message(FATAL_ERROR "generate_messages() must be called before catkin_package() in project '${PROJECT_NAME}'") |
|
endif() |
|
|
|
set(ARG_MESSAGES ${${PROJECT_NAME}_MESSAGE_FILES}) |
|
set(ARG_SERVICES ${${PROJECT_NAME}_SERVICE_FILES}) |
|
set(ARG_DEPENDENCIES ${ARG_DEPENDENCIES}) |
|
|
|
if(ARG_LANGS) |
|
set(GEN_LANGS ${ARG_LANGS}) |
|
else() |
|
set(GEN_LANGS ${CATKIN_MESSAGE_GENERATORS}) |
|
endif() |
|
|
|
@[if DEVELSPACE]@ |
|
# cmake dir in develspace |
|
set(genmsg_CMAKE_DIR "@(CMAKE_CURRENT_SOURCE_DIR)/cmake") |
|
@[else]@ |
|
# cmake dir in installspace |
|
set(genmsg_CMAKE_DIR "@(PKG_CMAKE_DIR)") |
|
@[end if]@ |
|
|
|
# ensure that destination variables are initialized |
|
catkin_destinations() |
|
|
|
# generate devel space config of message include dirs for project |
|
set(PKG_MSG_INCLUDE_DIRS "${${PROJECT_NAME}_MSG_INCLUDE_DIRS_DEVELSPACE}") |
|
configure_file( |
|
${genmsg_CMAKE_DIR}/pkg-msg-paths.cmake.develspace.in |
|
${CATKIN_DEVEL_PREFIX}/share/${PROJECT_NAME}/cmake/${PROJECT_NAME}-msg-paths.cmake |
|
@@ONLY) |
|
# generate and install config of message include dirs for project |
|
set(PKG_MSG_INCLUDE_DIRS "${${PROJECT_NAME}_MSG_INCLUDE_DIRS_INSTALLSPACE}") |
|
configure_file( |
|
${genmsg_CMAKE_DIR}/pkg-msg-paths.cmake.installspace.in |
|
${CMAKE_CURRENT_BINARY_DIR}/catkin_generated/installspace/${PROJECT_NAME}-msg-paths.cmake |
|
@@ONLY) |
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/catkin_generated/installspace/${PROJECT_NAME}-msg-paths.cmake |
|
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/cmake) |
|
|
|
# generate devel space pkg config extra defining variables with all processed message and service files |
|
set(PKG_MSG_FILES "${${PROJECT_NAME}_MESSAGE_FILES}") |
|
set(PKG_SRV_FILES "${${PROJECT_NAME}_SERVICE_FILES}") |
|
configure_file( |
|
${genmsg_CMAKE_DIR}/pkg-msg-extras.cmake.in |
|
${CMAKE_CURRENT_BINARY_DIR}/catkin_generated/${PROJECT_NAME}-msg-extras.cmake.develspace.in |
|
@@ONLY) |
|
# generate install space pkg config extra defining variables with all processed and installed message and service files |
|
set(PKG_MSG_FILES "${${PROJECT_NAME}_INSTALLED_MESSAGE_FILES}") |
|
set(PKG_SRV_FILES "${${PROJECT_NAME}_INSTALLED_SERVICE_FILES}") |
|
configure_file( |
|
${genmsg_CMAKE_DIR}/pkg-msg-extras.cmake.in |
|
${CMAKE_CURRENT_BINARY_DIR}/catkin_generated/${PROJECT_NAME}-msg-extras.cmake.installspace.in |
|
@@ONLY) |
|
# register pkg config files as cmake extra file for the project |
|
list(APPEND ${PROJECT_NAME}_CFG_EXTRAS ${CMAKE_CURRENT_BINARY_DIR}/catkin_generated/${PROJECT_NAME}-msg-extras.cmake) |
|
|
|
# find configuration containing include dirs for projects in all devel- and installspaces |
|
set(workspaces ${CATKIN_WORKSPACES}) |
|
list(FIND workspaces ${CATKIN_DEVEL_PREFIX} _index) |
|
if(_index EQUAL -1) |
|
list(INSERT workspaces 0 ${CATKIN_DEVEL_PREFIX}) |
|
endif() |
|
|
|
set(pending_deps ${PROJECT_NAME} ${ARG_DEPENDENCIES}) |
|
set(handled_deps "") |
|
while(pending_deps) |
|
list(GET pending_deps 0 dep) |
|
list(REMOVE_AT pending_deps 0) |
|
list(APPEND handled_deps ${dep}) |
|
|
|
if(NOT ${dep}_FOUND AND NOT ${dep}_SOURCE_DIR) |
|
message(FATAL_ERROR "Messages depends on unknown pkg: ${dep} (Missing find_package(${dep}?))") |
|
endif() |
|
|
|
unset(_dep_msg_paths_file CACHE) |
|
set(filename "share/${dep}/cmake/${dep}-msg-paths.cmake") |
|
find_file(_dep_msg_paths_file ${filename} PATHS ${workspaces} |
|
NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) |
|
if("${_dep_msg_paths_file}" STREQUAL "_dep_msg_paths_file-NOTFOUND") |
|
message(FATAL_ERROR "Could not find '${filename}' (searched in '${workspaces}').") |
|
endif() |
|
include(${_dep_msg_paths_file}) |
|
unset(_dep_msg_paths_file CACHE) |
|
|
|
# explicitly set message include dirs for current project since information from pkg-msg-paths.cmake is not yet available |
|
if(${dep} STREQUAL ${PROJECT_NAME}) |
|
set(${dep}_MSG_INCLUDE_DIRS ${${PROJECT_NAME}_MSG_INCLUDE_DIRS_DEVELSPACE}) |
|
endif() |
|
foreach(path ${${dep}_MSG_INCLUDE_DIRS}) |
|
list(APPEND MSG_INCLUDE_DIRS "${dep}") |
|
list(APPEND MSG_INCLUDE_DIRS "${path}") |
|
endforeach() |
|
|
|
# add transitive msg dependencies |
|
if(NOT ${dep} STREQUAL ${PROJECT_NAME}) |
|
foreach(recdep ${${dep}_MSG_DEPENDENCIES}) |
|
set(all_deps ${handled_deps} ${pending_deps}) |
|
list(FIND all_deps ${recdep} _index) |
|
if(_index EQUAL -1) |
|
list(APPEND pending_deps ${recdep}) |
|
endif() |
|
endforeach() |
|
endif() |
|
endwhile() |
|
|
|
# mark that generate_messages() was called in order to detect wrong order of calling with catkin_python_setup() |
|
set(${PROJECT_NAME}_GENERATE_MESSAGES TRUE) |
|
# check if catkin_python_setup() installs an __init__.py file for a package with the current project name |
|
# in order to skip the installation of a generated __init__.py file |
|
set(package_has_static_sources ${${PROJECT_NAME}_CATKIN_PYTHON_SETUP_HAS_PACKAGE_INIT}) |
|
|
|
em_expand(${genmsg_CMAKE_DIR}/pkg-genmsg.context.in |
|
${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}-genmsg-context.py |
|
${genmsg_CMAKE_DIR}/pkg-genmsg.cmake.em |
|
${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}-genmsg.cmake) |
|
include(${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}-genmsg.cmake) |
|
endmacro()
|
|
|