ppovb5fc7/sdformat/cmake/SDFUtils.cmake

279 lines
10 KiB
CMake
Raw Permalink Normal View History

2019-03-25 11:01:43 +08:00
################################################################################
#APPEND_TO_CACHED_STRING(_string _cacheDesc [items...])
# Appends items to a cached list.
MACRO (APPEND_TO_CACHED_STRING _string _cacheDesc)
FOREACH (newItem ${ARGN})
SET (${_string} "${${_string}} ${newItem}" CACHE INTERNAL ${_cacheDesc} FORCE)
ENDFOREACH (newItem ${ARGN})
#STRING(STRIP ${${_string}} ${_string})
ENDMACRO (APPEND_TO_CACHED_STRING)
################################################################################
# APPEND_TO_CACHED_LIST (_list _cacheDesc [items...]
# Appends items to a cached list.
MACRO (APPEND_TO_CACHED_LIST _list _cacheDesc)
SET (tempList ${${_list}})
FOREACH (newItem ${ARGN})
LIST (APPEND tempList ${newItem})
ENDFOREACH (newItem ${newItem})
SET (${_list} ${tempList} CACHE INTERNAL ${_cacheDesc} FORCE)
ENDMACRO(APPEND_TO_CACHED_LIST)
#################################################
# Macro to turn a list into a string (why doesn't CMake have this built-in?)
MACRO (LIST_TO_STRING _string _list)
SET (${_string})
FOREACH (_item ${_list})
SET (${_string} "${${_string}} ${_item}")
ENDFOREACH (_item)
#STRING(STRIP ${${_string}} ${_string})
ENDMACRO (LIST_TO_STRING)
#################################################
# BUILD ERROR macro
macro (BUILD_ERROR)
foreach (str ${ARGN})
SET (msg "\t${str}")
MESSAGE (STATUS ${msg})
APPEND_TO_CACHED_LIST(build_errors "build errors" ${msg})
endforeach ()
endmacro (BUILD_ERROR)
#################################################
# BUILD WARNING macro
macro (BUILD_WARNING)
foreach (str ${ARGN})
SET (msg "\t${str}" )
MESSAGE (STATUS ${msg} )
APPEND_TO_CACHED_LIST(build_warnings "build warning" ${msg})
endforeach (str ${ARGN})
endmacro (BUILD_WARNING)
#################################################
macro (sdf_add_library _name)
set(LIBS_DESTINATION ${PROJECT_BINARY_DIR}/src)
set_source_files_properties(${ARGN} PROPERTIES COMPILE_DEFINITIONS "BUILDING_DLL")
add_library(${_name} SHARED ${ARGN})
target_link_libraries (${_name} ${general_libraries})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBS_DESTINATION})
if (MSVC)
set_target_properties( ${_name} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${LIBS_DESTINATION})
set_target_properties( ${_name} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${LIBS_DESTINATION})
set_target_properties( ${_name} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${LIBS_DESTINATION})
endif ()
endmacro ()
#################################################
macro (sdf_add_executable _name)
add_executable(${_name} ${ARGN})
target_link_libraries (${_name} ${general_libraries})
endmacro ()
#################################################
macro (sdf_install_includes _subdir)
install(FILES ${ARGN} DESTINATION ${INCLUDE_INSTALL_DIR}/${_subdir} COMPONENT headers)
endmacro()
#################################################
macro (sdf_install_library _name)
set_target_properties(${_name} PROPERTIES SOVERSION ${SDF_MAJOR_VERSION} VERSION ${SDF_VERSION_FULL})
install (TARGETS ${_name} DESTINATION ${LIB_INSTALL_DIR} COMPONENT shlib)
endmacro ()
#################################################
macro (sdf_install_executable _name)
set_target_properties(${_name} PROPERTIES VERSION ${SDF_VERSION_FULL})
install (TARGETS ${_name} DESTINATION ${BIN_INSTALL_DIR})
endmacro ()
#################################################
macro (sdf_setup_unix)
endmacro()
#################################################
macro (sdf_setup_windows)
# Need for M_PI constant
add_definitions(-D_USE_MATH_DEFINES -DWINDOWS_LEAN_AND_MEAN)
# Suppress warnings caused by boost
add_definitions(/wd4512 /wd4996)
# Use dynamic linking for boost
add_definitions(-DBOOST_ALL_DYN_LINK)
# And force linking to MSVC dynamic runtime
set(CMAKE_C_FLAGS_DEBUG "/MDd ${CMAKE_C_FLAGS_DEBUG}")
set(CMAKE_C_FLAGS_RELEASE "/MD ${CMAKE_C_FLAGS_RELEASE}")
if (MSVC AND CMAKE_SIZEOF_VOID_P EQUAL 8)
# Not need if proper cmake gnerator (-G "...Win64") is passed to cmake
# Enable as a second measeure to workaround over bug
# http://www.cmake.org/Bug/print_bug_page.php?bug_id=11240
set(CMAKE_SHARED_LINKER_FLAGS "/machine:x64")
endif()
endmacro()
#################################################
macro (sdf_setup_apple)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-undefined -Wl,dynamic_lookup")
endmacro()
#################################################
include_directories(${PROJECT_SOURCE_DIR}/test/gtest/include)
macro (sdf_build_tests)
# Build all the tests
foreach(GTEST_SOURCE_file ${ARGN})
string(REGEX REPLACE ".cc" "" BINARY_NAME ${GTEST_SOURCE_file})
set(BINARY_NAME ${TEST_TYPE}_${BINARY_NAME})
if (UNIX)
add_executable(${BINARY_NAME} ${GTEST_SOURCE_file})
elseif(WIN32)
add_executable(${BINARY_NAME}
${GTEST_SOURCE_file}
${PROJECT_SOURCE_DIR}/src/win/tinyxml/tinystr.cpp
${PROJECT_SOURCE_DIR}/src/win/tinyxml/tinyxmlerror.cpp
${PROJECT_SOURCE_DIR}/src/win/tinyxml/tinyxml.cpp
${PROJECT_SOURCE_DIR}/src/win/tinyxml/tinyxmlparser.cpp
)
else()
message(FATAL_ERROR "Unsupported platform")
endif()
add_dependencies(${BINARY_NAME}
gtest gtest_main sdformat
)
link_directories(${IGNITION-MATH_LIBRARY_DIRS})
if (UNIX)
target_link_libraries(${BINARY_NAME}
libgtest.a
libgtest_main.a
sdformat
pthread
${tinyxml_LIBRARIES}
${IGNITION-MATH_LIBRARIES}
)
elseif(WIN32)
target_link_libraries(${BINARY_NAME}
gtest.lib
gtest_main.lib
sdformat.dll
${IGNITION-MATH_LIBRARIES}
${Boost_LIBRARIES}
)
# Copy in sdformat library
add_custom_command(TARGET ${BINARY_NAME}
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_FILE:sdformat>
$<TARGET_FILE_DIR:${BINARY_NAME}> VERBATIM)
# Copy in ignition-math library
add_custom_command(TARGET ${BINARY_NAME}
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${IGNITION-MATH_LIBRARY_DIRS}/${IGNITION-MATH_LIBRARIES}.dll"
$<TARGET_FILE_DIR:${BINARY_NAME}> VERBATIM)
# Copy in boost libraries
foreach(lib ${Boost_LIBRARIES})
if (EXISTS ${lib})
add_custom_command(TARGET ${BINARY_NAME}
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${lib}"
$<TARGET_FILE_DIR:${BINARY_NAME}> VERBATIM)
string(REPLACE ".lib" ".dll" dll ${lib})
if (EXISTS ${dll})
add_custom_command(TARGET ${BINARY_NAME}
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${dll}"
$<TARGET_FILE_DIR:${BINARY_NAME}> VERBATIM)
endif()
# Check if there is a .dll in the /bin/ directory, sibling of /lib/
# This is the structure used by vcpkg boost port
string(REPLACE "/lib/" "/bin/" alt_dll ${dll})
if (EXISTS ${alt_dll})
add_custom_command(TARGET ${BINARY_NAME}
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${alt_dll}"
$<TARGET_FILE_DIR:${BINARY_NAME}> VERBATIM)
endif()
endif()
endforeach()
endif()
add_test(${BINARY_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
--gtest_output=xml:${CMAKE_BINARY_DIR}/test_results/${BINARY_NAME}.xml)
set (_env_vars)
set (sdf_paths)
# Get all the sdf protocol directory names
file(GLOB dirs RELATIVE "${PROJECT_SOURCE_DIR}/sdf"
"${PROJECT_SOURCE_DIR}/sdf/*")
list(SORT dirs)
# Add each sdf protocol to the sdf_path variable
foreach(dir ${dirs})
if (IS_DIRECTORY ${PROJECT_SOURCE_DIR}/sdf/${dir})
set(sdf_paths "${PROJECT_SOURCE_DIR}/sdf/${dir}:${sdf_paths}")
endif()
endforeach()
# Set the SDF_PATH environment variable
list(APPEND _env_vars "SDF_PATH=${sdf_paths}")
set_tests_properties(${BINARY_NAME} PROPERTIES
TIMEOUT 240
ENVIRONMENT "${_env_vars}")
if(PYTHONINTERP_FOUND)
# Check that the test produced a result and create a failure if it didn't.
# Guards against crashed and timed out tests.
add_test(check_${BINARY_NAME} ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/check_test_ran.py
${CMAKE_BINARY_DIR}/test_results/${BINARY_NAME}.xml)
endif()
if(SDFORMAT_RUN_VALGRIND_TESTS AND VALGRIND_PROGRAM)
add_test(memcheck_${BINARY_NAME} ${VALGRIND_PROGRAM} --leak-check=full
--error-exitcode=1 --show-leak-kinds=all ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME})
endif()
endforeach()
endmacro()
#################################################
# Macro to setup supported compiler warnings
# Based on work of Florent Lamiraux, Thomas Moulard, JRL, CNRS/AIST.
include(CheckCXXCompilerFlag)
macro(filter_valid_compiler_warnings)
foreach(flag ${ARGN})
CHECK_CXX_COMPILER_FLAG(${flag} R${flag})
if(${R${flag}})
set(WARNING_CXX_FLAGS "${WARNING_CXX_FLAGS} ${flag}")
endif()
endforeach()
endmacro()
#################################################
# Copied from catkin/cmake/empy.cmake
function(find_python_module module)
# cribbed from http://www.cmake.org/pipermail/cmake/2011-January/041666.html
string(TOUPPER ${module} module_upper)
if(NOT PY_${module_upper})
if(ARGC GREATER 1 AND ARGV1 STREQUAL "REQUIRED")
set(${module}_FIND_REQUIRED TRUE)
endif()
# A module's location is usually a directory, but for
# binary modules
# it's a .so file.
execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c" "import re, ${module}; print(re.compile('/__init__.py.*').sub('',${module}.__file__))"
RESULT_VARIABLE _${module}_status
OUTPUT_VARIABLE _${module}_location
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT _${module}_status)
set(PY_${module_upper} ${_${module}_location} CACHE STRING "Location of Python module ${module}")
endif(NOT _${module}_status)
endif(NOT PY_${module_upper})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PY_${module} DEFAULT_MSG PY_${module_upper})
endfunction(find_python_module)