Skip to content

Commit

Permalink
Fix static builds and optimize test compilation
Browse files Browse the repository at this point in the history
Signed-off-by: Addisu Z. Taddese <addisu@openrobotics.org>
  • Loading branch information
azeey committed Nov 3, 2023
1 parent 284c8ad commit 87af702
Showing 1 changed file with 51 additions and 69 deletions.
120 changes: 51 additions & 69 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,9 @@ ign_get_libsources_and_unittests(sources gtest_sources)
# Add the source file auto-generated into the build folder from sdf/CMakeLists.txt
list(APPEND sources EmbeddedSdf.cc)

# Use interface library to deduplicate cmake logic for URDF linking
add_library(using_parser_urdf INTERFACE)
# When using the internal URDF parser, we build its sources with the core library
if (USE_INTERNAL_URDF)
set(sources ${sources}
set(urdf_internal_sources
urdf/urdf_parser/model.cpp
urdf/urdf_parser/link.cpp
urdf/urdf_parser/joint.cpp
Expand All @@ -17,14 +16,7 @@ if (USE_INTERNAL_URDF)
urdf/urdf_parser/urdf_model_state.cpp
urdf/urdf_parser/urdf_sensor.cpp
urdf/urdf_parser/world.cpp)
target_include_directories(using_parser_urdf INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/urdf)
if (WIN32)
target_compile_definitions(using_parser_urdf INTERFACE -D_USE_MATH_DEFINES)
endif()
else()
target_link_libraries(using_parser_urdf INTERFACE
IgnURDFDOM::IgnURDFDOM)
set(sources ${sources} ${urdf_internal_sources})
endif()

ign_create_core_library(SOURCES ${sources}
Expand All @@ -37,8 +29,18 @@ target_link_libraries(${PROJECT_LIBRARY_TARGET_NAME}
ignition-math${IGN_MATH_VER}::ignition-math${IGN_MATH_VER}
ignition-utils${IGN_UTILS_VER}::ignition-utils${IGN_UTILS_VER}
PRIVATE
TINYXML2::TINYXML2
using_parser_urdf)
TINYXML2::TINYXML2)

if (USE_INTERNAL_URDF)
target_include_directories(${PROJECT_LIBRARY_TARGET_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/urdf)
if (WIN32)
target_compile_definitions(${PROJECT_LIBRARY_TARGET_NAME} PRIVATE -D_USE_MATH_DEFINES)
endif()
else()
target_link_libraries(${PROJECT_LIBRARY_TARGET_NAME} PRIVATE
IgnURDFDOM::IgnURDFDOM)
endif()

if (WIN32)
target_compile_definitions(${PROJECT_LIBRARY_TARGET_NAME} PRIVATE URDFDOM_STATIC)
Expand All @@ -55,43 +57,7 @@ if (BUILD_TESTING)
list(REMOVE_ITEM gtest_sources ign_TEST.cc)
endif()

# Skip tests that don't work on Windows
if (WIN32)
list(REMOVE_ITEM gtest_sources Converter_TEST.cc)
list(REMOVE_ITEM gtest_sources FrameSemantics_TEST.cc)
list(REMOVE_ITEM gtest_sources ParamPassing_TEST.cc)
list(REMOVE_ITEM gtest_sources Utils_TEST.cc)
list(REMOVE_ITEM gtest_sources XmlUtils_TEST.cc)
list(REMOVE_ITEM gtest_sources parser_urdf_TEST.cc)
endif()

ign_build_tests(
TYPE UNIT
SOURCES ${gtest_sources}
INCLUDE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/test
)

if (TARGET UNIT_Converter_TEST)
target_link_libraries(UNIT_Converter_TEST
TINYXML2::TINYXML2)
target_sources(UNIT_Converter_TEST PRIVATE
Converter.cc
EmbeddedSdf.cc
XmlUtils.cc)
endif()

if (TARGET UNIT_FrameSemantics_TEST)
target_sources(UNIT_FrameSemantics_TEST PRIVATE FrameSemantics.cc Utils.cc)
target_link_libraries(UNIT_FrameSemantics_TEST TINYXML2::TINYXML2)
endif()

if (TARGET UNIT_ParamPassing_TEST)
target_link_libraries(UNIT_ParamPassing_TEST
TINYXML2::TINYXML2
using_parser_urdf)
target_sources(UNIT_ParamPassing_TEST PRIVATE
add_library(library_for_tests STATIC
Converter.cc
EmbeddedSdf.cc
FrameSemantics.cc
Expand All @@ -100,29 +66,45 @@ if (BUILD_TESTING)
Utils.cc
XmlUtils.cc
parser.cc
parser_urdf.cc)
endif()
parser_urdf.cc
)

if (TARGET UNIT_Utils_TEST)
target_sources(UNIT_Utils_TEST PRIVATE Utils.cc)
target_link_libraries(UNIT_Utils_TEST TINYXML2::TINYXML2)
if (USE_INTERNAL_URDF)
target_sources(library_for_tests PRIVATE ${urdf_internal_sources})
endif()

if (TARGET UNIT_XmlUtils_TEST)
target_link_libraries(UNIT_XmlUtils_TEST
TINYXML2::TINYXML2)
target_sources(UNIT_XmlUtils_TEST PRIVATE XmlUtils.cc)
endif()
# MSVC will fail saying there are some symbols are defined multiple times. This is true
# since some of the symbols in the static library are public symbols and will also be in the
# dynamic library (core library). But this is okay since they will be exactly the same definitions,
# so here, we set `/FORCE:MULTIPLE` to disable the error.
target_link_options(library_for_tests PUBLIC $<$<CXX_COMPILER_ID:MSVC>:/FORCE:MULTIPLE>)

target_link_libraries(library_for_tests PUBLIC
${PROJECT_LIBRARY_TARGET_NAME}
# Also link against the privately linked libraries of the core library
$<TARGET_PROPERTY:${PROJECT_LIBRARY_TARGET_NAME},LINK_LIBRARIES>
)

# Use the private include flags from the core library
target_include_directories(library_for_tests PUBLIC
$<TARGET_PROPERTY:${PROJECT_LIBRARY_TARGET_NAME},INCLUDE_DIRECTORIES>
)

# Use the private comopile flags from the core library
target_compile_definitions(library_for_tests PUBLIC
$<TARGET_PROPERTY:${PROJECT_LIBRARY_TARGET_NAME},COMPILE_DEFINITIONS>
)

ign_build_tests(
TYPE UNIT
SOURCES ${gtest_sources}
INCLUDE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/test
LIB_DEPS
library_for_tests
)

if (TARGET UNIT_parser_urdf_TEST)
target_link_libraries(UNIT_parser_urdf_TEST
TINYXML2::TINYXML2
using_parser_urdf)
target_sources(UNIT_parser_urdf_TEST PRIVATE
SDFExtension.cc
XmlUtils.cc
parser_urdf.cc)
endif()
endif()

if(NOT WIN32)
Expand Down

0 comments on commit 87af702

Please sign in to comment.