diff --git a/FindBoost-Math.cmake b/FindBoost-Math.cmake index abaffeb..1e227a6 100644 --- a/FindBoost-Math.cmake +++ b/FindBoost-Math.cmake @@ -4,5 +4,10 @@ endif() add_library(boost-math INTERFACE) -target_include_directories(boost-math SYSTEM INTERFACE +if (DEFINED THIRD_PARTY_INCLUDES_AS_SYSTEM AND NOT THIRD_PARTY_INCLUDES_AS_SYSTEM) + target_include_directories(boost-math INTERFACE ${PROJECT_SOURCE_DIR}/third_party/boost-math/include/) +else() + target_include_directories(boost-math SYSTEM INTERFACE + ${PROJECT_SOURCE_DIR}/third_party/boost-math/include/) +endif() \ No newline at end of file diff --git a/FindEigen.cmake b/FindEigen.cmake index fd2bd58..c8d6ae2 100644 --- a/FindEigen.cmake +++ b/FindEigen.cmake @@ -4,16 +4,11 @@ endif() add_library(eigen INTERFACE) -# Include Eigen library as system headers to suppress warnings when not -# cross-compiling. GNU ARM toolchain wraps system headers with `extern "C"`, -# causing errors, so in this case Eigen must be #included using -# `#pragma GCC system_header` in the source. -# See https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html -if (NOT CMAKE_CROSSCOMPILING OR THIRD_PARTY_INCLUDES_AS_SYSTEM) - target_include_directories(eigen SYSTEM INTERFACE +if (DEFINED THIRD_PARTY_INCLUDES_AS_SYSTEM AND NOT THIRD_PARTY_INCLUDES_AS_SYSTEM) + target_include_directories(eigen INTERFACE ${PROJECT_SOURCE_DIR}/third_party/eigen/) else() - target_include_directories(eigen INTERFACE + target_include_directories(eigen SYSTEM INTERFACE ${PROJECT_SOURCE_DIR}/third_party/eigen/) endif() diff --git a/FindGFlags.cmake b/FindGFlags.cmake index 37f420f..5e6973a 100644 --- a/FindGFlags.cmake +++ b/FindGFlags.cmake @@ -1,19 +1,6 @@ include("GenericFindDependency") GenericFindDependency( - TARGET gflags - SOURCE_DIR "googleflags" - ) - -if(NOT CMAKE_CROSSCOMPILING OR THIRD_PARTY_INCLUDES_AS_SYSTEM) - # Change all of GoogleFlags's include directories to be system includes, to avoid - # compiler errors. The generalised version of this in GenericFindDependency won't - # work here because we are dealing with an aliased target - get_target_property(_aliased gflags ALIASED_TARGET) - if(_aliased) - get_target_property(gflags_include_directories ${_aliased} INTERFACE_INCLUDE_DIRECTORIES) - if(gflags_include_directories) - set_target_properties(${_aliased} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "") - target_include_directories(${_aliased} SYSTEM INTERFACE ${gflags_include_directories}) - endif() - endif() -endif() + TARGET gflags + SOURCE_DIR "googleflags" + SYSTEM_INCLUDES +) diff --git a/FindGnss-converters.cmake b/FindGnss-converters.cmake index 3b85ac4..0c48cfa 100644 --- a/FindGnss-converters.cmake +++ b/FindGnss-converters.cmake @@ -4,5 +4,4 @@ GenericFindDependency( TARGET gnss_converters SOURCE_DIR "gnss-converters/c" SYSTEM_HEADER_FILE "gnss-converters/nmea.h" - SYSTEM_INCLUDES ) diff --git a/FindGoogletest.cmake b/FindGoogletest.cmake index 1df6c39..0783918 100644 --- a/FindGoogletest.cmake +++ b/FindGoogletest.cmake @@ -1,7 +1,7 @@ include("GenericFindDependency") GenericFindDependency( TARGET gtest + ADDITIONAL_TARGETS gmock SOURCE_DIR "googletest" SYSTEM_INCLUDES - ) -mark_target_as_system_includes(gmock) +) \ No newline at end of file diff --git a/FindIxcom.cmake b/FindIxcom.cmake index 6521486..3fcbecc 100644 --- a/FindIxcom.cmake +++ b/FindIxcom.cmake @@ -3,5 +3,4 @@ option(libixcom_ENABLE_TESTS "" OFF) GenericFindDependency( TARGET ixcom SOURCE_DIR "c" - SYSTEM_INCLUDES ) diff --git a/FindOrion-Proto.cmake b/FindOrion-Proto.cmake index 474bbc4..277be74 100644 --- a/FindOrion-Proto.cmake +++ b/FindOrion-Proto.cmake @@ -2,5 +2,4 @@ include("GenericFindDependency") GenericFindDependency( TARGET orion-proto SOURCE_DIR "orion_proto" - SYSTEM_INCLUDES ) diff --git a/FindPal++.cmake b/FindPal++.cmake index 64a7ffc..d039871 100644 --- a/FindPal++.cmake +++ b/FindPal++.cmake @@ -3,5 +3,4 @@ option(pal++_ENABLE_TESTS "" OFF) GenericFindDependency( TARGET pal++ SOURCE_DIR libpal_cpp - SYSTEM_INCLUDES ) \ No newline at end of file diff --git a/FindPal.cmake b/FindPal.cmake index 8c34148..03b2d8a 100644 --- a/FindPal.cmake +++ b/FindPal.cmake @@ -3,5 +3,4 @@ option(pal_ENABLE_TESTS "" OFF) option(pal_ENABLE_EXAMPLES "" OFF) GenericFindDependency( TARGET pal - SYSTEM_INCLUDES - ) +) diff --git a/FindRapidCheck.cmake b/FindRapidCheck.cmake index 6a81b37..8ec0b49 100644 --- a/FindRapidCheck.cmake +++ b/FindRapidCheck.cmake @@ -4,27 +4,9 @@ include("GenericFindDependency") set(RC_ENABLE_GTEST ON CACHE BOOL "" FORCE) GenericFindDependency( - TARGET rapidcheck - ) - -# Change all of rapidcheck's include directories to be system includes, to avoid -# compiler errors. The generalised version in GenericFindDependency isn't suitable -# in this instance. -get_target_property(rapidcheck_interface_includes rapidcheck INTERFACE_INCLUDE_DIRECTORIES) -if(rapidcheck_interface_includes) - set_target_properties(rapidcheck PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "") - target_include_directories(rapidcheck SYSTEM INTERFACE ${rapidcheck_interface_includes}) -else() - message(WARNING "No include directories in rapidcheck, this seems wrong") -endif() -unset(rapidcheck_interface_includes) - -get_target_property(rapidcheck_gtest_interface_includes rapidcheck_gtest INTERFACE_INCLUDE_DIRECTORIES) -if(rapidcheck_gtest_interface_includes) - set_target_properties(rapidcheck_gtest PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "") - target_include_directories(rapidcheck_gtest SYSTEM INTERFACE ${rapidcheck_gtest_interface_includes}) -else() - message(WARNING "No include directories in rapidcheck_gtest, this seems wrong") -endif() -unset(rapidcheck_gtest_interface_includes) + TARGET rapidcheck + ADDITIONAL_TARGETS + rapidcheck_gtest + SYSTEM_INCLUDES +) diff --git a/FindRtcm.cmake b/FindRtcm.cmake index d4b8bcf..4f47ac4 100644 --- a/FindRtcm.cmake +++ b/FindRtcm.cmake @@ -4,5 +4,4 @@ GenericFindDependency( TARGET rtcm SOURCE_DIR "c" SYSTEM_HEADER_FILE "rtcm3/bits.h" - SYSTEM_INCLUDES ) diff --git a/FindSbp.cmake b/FindSbp.cmake index c6f33f7..cdd65c7 100644 --- a/FindSbp.cmake +++ b/FindSbp.cmake @@ -4,5 +4,4 @@ option(libsbp_ENABLE_DOCS "" OFF) GenericFindDependency( TARGET sbp SOURCE_DIR "c" - SYSTEM_INCLUDES ) diff --git a/FindSettings.cmake b/FindSettings.cmake index 9995bd8..f05e12c 100644 --- a/FindSettings.cmake +++ b/FindSettings.cmake @@ -2,5 +2,4 @@ include("GenericFindDependency") option(libsettings_ENABLE_TESTS "" OFF) GenericFindDependency( TARGET settings - SYSTEM_INCLUDES ) diff --git a/FindStarling.cmake b/FindStarling.cmake index 7d6f245..9b07e99 100644 --- a/FindStarling.cmake +++ b/FindStarling.cmake @@ -1,15 +1,17 @@ include("GenericFindDependency") + option(starling_ENABLE_TESTS "" OFF) +option(starling_ENABLE_TEST_LIBS "" OFF) option(starling_ENABLE_EXAMPLES "" OFF) + GenericFindDependency( - TARGET pvt-runner-lib - SOURCE_DIR starling - SYSTEM_HEADER_FILE "pvt_driver/runner/pvt_runner.h" - SYSTEM_INCLUDES + TARGET pvt-runner-lib + ADDITIONAL_TARGETS + sensorfusion + pvt_driver + pvt-engine + pvt-common + starling-util + SOURCE_DIR starling + SYSTEM_HEADER_FILE "pvt_driver/runner/pvt_runner.h" ) - -mark_target_as_system_includes(sensorfusion) -mark_target_as_system_includes(pvt_driver) -mark_target_as_system_includes(pvt-engine) -mark_target_as_system_includes(pvt-common) -mark_target_as_system_includes(starling-util) diff --git a/FindSwiftlets.cmake b/FindSwiftlets.cmake index 7635981..35ef7a6 100644 --- a/FindSwiftlets.cmake +++ b/FindSwiftlets.cmake @@ -3,5 +3,4 @@ option(swiftlets_ENABLE_TESTS "" OFF) GenericFindDependency( TARGET swiftlets SOURCE_DIR swiftlets - SYSTEM_INCLUDES ) diff --git a/FindSwiftnav.cmake b/FindSwiftnav.cmake index 4c2d8fd..0577a31 100644 --- a/FindSwiftnav.cmake +++ b/FindSwiftnav.cmake @@ -3,5 +3,4 @@ option(libswiftnav_ENABLE_TESTS "" OFF) GenericFindDependency( TARGET swiftnav SYSTEM_HEADER_FILE "swiftnav/bits.h" - SYSTEM_INCLUDES ) diff --git a/FindUbx.cmake b/FindUbx.cmake index 13d812f..67f631d 100644 --- a/FindUbx.cmake +++ b/FindUbx.cmake @@ -3,5 +3,4 @@ option(libubx_ENABLE_TESTS "" OFF) GenericFindDependency( TARGET ubx SOURCE_DIR "c" - SYSTEM_INCLUDES ) diff --git a/FindVariant.cmake b/FindVariant.cmake index d7ab910..9ceced9 100644 --- a/FindVariant.cmake +++ b/FindVariant.cmake @@ -1,4 +1,5 @@ include("GenericFindDependency") GenericFindDependency( TARGET variant - ) + SYSTEM_INCLUDES +) diff --git a/GenericFindDependency.cmake b/GenericFindDependency.cmake index 4b8c1e8..f03f2f2 100644 --- a/GenericFindDependency.cmake +++ b/GenericFindDependency.cmake @@ -21,7 +21,7 @@ # # cmake -DSWIFT_PREFERRED_DEPENDENCY_SOURCE=system # -# will try to use depenedencies from the system libraries rather than bundled +# will try to use dependencies from the system libraries rather than bundled # source code. # # If the dependency is picked up from the system libraries this function will @@ -37,12 +37,14 @@ # # The target name can be controlled by the option "TARGET". When using # bundled source code this is used to verify the target was created properly -# after calling add_subdirectory +# after calling add_subdirectory. If the add_subdirectory exposes a number of +# other targets, you can use the "ADDITIONAL_TARGETS" option to list them, this +# function will apply the "SYSTEM_INCLUDES" option to each of the targets. # # Passing the option SYSTEM_INCLUDES will rewrite the target include directories # so that they are marked as system headers. This will usually be passed to # the compiler as an command line option as decided by cmake. Be careful with -# this option, it will supress warning which might otherwise be helpful. +# this option, it will suppress warning which might otherwise be helpful. # # The option REQUIRED can be passed which will cause this function to fail # if the dependency was not found for any reason. @@ -267,12 +269,43 @@ endmacro() # # Helper function to mark the specified target's include directories as system. This is -# then passed to the compiler which will surpress warnings generated from any header file +# then passed to the compiler which will suppress warnings generated from any header file # included by this path. Use with care # # Should only be called from GenericFindDependency # function(mark_target_as_system_includes TGT) + # + # We will determine if a target is to be set as a system target based on if + # THIRD_PARTY_INCLUDES_AS_SYSTEM is explicitly set, otherwise the decision is + # delegated to whether or not the SYSTEM_INCLUDES option was specified via + # GenericFindDependency. The term "explicitly" is used since in cmake, an + # undefined variable is interpreted as false, which is undesirable effect in + # this case as we intend to use tri-state property of a variable (undefined/true/false). + # + if (DEFINED THIRD_PARTY_INCLUDES_AS_SYSTEM) + if (THIRD_PARTY_INCLUDES_AS_SYSTEM) + set (mark_as_system true) + else() + set (mark_as_system false) + endif() + else() + if (x_SYSTEM_INCLUDES) + set (mark_as_system true) + else() + set (mark_as_system false) + endif() + endif() + + if (NOT mark_as_system) + return() + endif() + + get_target_property(aliased_target ${TGT} ALIASED_TARGET) + if (aliased_target) + set (TGT ${aliased_target}) + endif() + get_target_property(directories ${TGT} INTERFACE_INCLUDE_DIRECTORIES) if(directories) message(STATUS "Marking ${TGT} include directories as system") @@ -284,7 +317,7 @@ endfunction() function(GenericFindDependency) set(argOptions "REQUIRED" "SYSTEM_INCLUDES") set(argSingleArguments "TARGET" "PREFER" "SOURCE_DIR" "SYSTEM_HEADER_FILE" "SYSTEM_LIB_NAMES") - set(argMultiArguments "EXCLUDE") + set(argMultiArguments "ADDITIONAL_TARGETS" "EXCLUDE") cmake_parse_arguments(x "${argOptions}" "${argSingleArguments}" "${argMultiArguments}" ${ARGN}) @@ -346,11 +379,7 @@ function(GenericFindDependency) # Final validation that the target was properly created from some source if(TARGET ${x_TARGET}) - if(x_SYSTEM_INCLUDES) - if(NOT CMAKE_CROSSCOMPILING OR THIRD_PARTY_INCLUDES_AS_SYSTEM) - mark_target_as_system_includes(${x_TARGET}) - endif() - endif() + mark_target_as_system_includes(${x_TARGET}) else() # Target not found in any location if(x_REQUIRED OR ${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED) @@ -359,5 +388,11 @@ function(GenericFindDependency) message(WARNING "Could not find dependency ${x_TARGET} in any available location") endif() endif() + + # If the primary target exposes additional targets, mark them as system + # targets in accordance to how the primary target was marked + foreach(additional_target IN LISTS x_ADDITIONAL_TARGETS) + mark_target_as_system_includes(${additional_target}) + endforeach() endfunction()