Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix static builds and optimize test compilation #1343

Merged
merged 5 commits into from
Nov 27, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 64 additions & 84 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,59 +16,48 @@ 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()

if (BUILD_TESTING)
# Build this test file only if Ignition Tools is installed.
if (NOT IGN_PROGRAM)
list(REMOVE_ITEM gtest_sources ign_TEST.cc)
endif()
ign_create_core_library(SOURCES ${sources}
CXX_STANDARD 17
LEGACY_PROJECT_PREFIX SDFormat
)

# 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)
target_link_libraries(${PROJECT_LIBRARY_TARGET_NAME}
PUBLIC
ignition-math${IGN_MATH_VER}::ignition-math${IGN_MATH_VER}
ignition-utils${IGN_UTILS_VER}::ignition-utils${IGN_UTILS_VER}
PRIVATE
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()

ign_build_tests(
TYPE UNIT
SOURCES ${gtest_sources}
INCLUDE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/test
)
if (WIN32 AND USE_INTERNAL_URDF)
target_compile_definitions(${PROJECT_LIBRARY_TARGET_NAME} PRIVATE URDFDOM_STATIC)
endif()

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()
target_include_directories(${PROJECT_LIBRARY_TARGET_NAME}
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
)

if (TARGET UNIT_FrameSemantics_TEST)
target_sources(UNIT_FrameSemantics_TEST PRIVATE FrameSemantics.cc Utils.cc)
target_link_libraries(UNIT_FrameSemantics_TEST TINYXML2::TINYXML2)
if (BUILD_TESTING)
# Build this test file only if Ignition Tools is installed.
if (NOT IGN_PROGRAM)
list(REMOVE_ITEM gtest_sources ign_TEST.cc)
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 OBJECT
Converter.cc
EmbeddedSdf.cc
FrameSemantics.cc
Expand All @@ -78,53 +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()
# Link against the publically and privately linked libraries of the core library
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# Link against the publically and privately linked libraries of the core library
# Link against the publicly and privately linked libraries of the core library

nit: spelling

target_link_libraries(library_for_tests
$<TARGET_PROPERTY:${PROJECT_LIBRARY_TARGET_NAME},LINK_LIBRARIES>
)

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()
# Use the include flags from the core library
target_include_directories(library_for_tests PUBLIC
$<TARGET_PROPERTY:${PROJECT_LIBRARY_TARGET_NAME},INCLUDE_DIRECTORIES>
)

ign_create_core_library(SOURCES ${sources}
CXX_STANDARD 17
LEGACY_PROJECT_PREFIX SDFormat
# Use the private compile flags from the core library. Also set IGNITION_SDFORMAT_STATIC_DEFINE to avoid
# inconsistent linkage issues on windows. Setting the define will cause the SDFORMAT_VISIBLE/SDFORMAT_HIDDEN macros
# to expand to nothing when building a static library
target_compile_definitions(library_for_tests PUBLIC
$<TARGET_PROPERTY:${PROJECT_LIBRARY_TARGET_NAME},COMPILE_DEFINITIONS>
-DIGNITION_SDFORMAT_STATIC_DEFINE
)

target_link_libraries(${PROJECT_LIBRARY_TARGET_NAME}
PUBLIC
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)
ign_build_tests(
TYPE UNIT
SOURCES ${gtest_sources}
INCLUDE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/test
LIB_DEPS
library_for_tests
TEST_LIST
test_targets
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: I don't think test_targets is used anywhere

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oops. I saw this right after I merged. See #1347.

)

if (WIN32)
target_compile_definitions(${PROJECT_LIBRARY_TARGET_NAME} PRIVATE URDFDOM_STATIC)
endif()

target_include_directories(${PROJECT_LIBRARY_TARGET_NAME}
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
)

if(NOT WIN32)
add_subdirectory(cmd)
endif()