From 14d98bcfe6fa1dd2f4220e50e99ec099939496d5 Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 15 Oct 2021 13:03:31 -0400 Subject: export: Propagate IMPORTED_NO_SYSTEM target property to consumers Enabling `IMPORTED_NO_SYSTEM` on a target built within the project has no effect on the build system, but it is still a useful way to set the property on imported targets generated by `install(EXPORT)` and `export()`. Issue: #17364 --- Help/prop_tgt/IMPORTED_NO_SYSTEM.rst | 4 +++- Source/cmExportFileGenerator.cxx | 6 ++++++ Tests/ExportImport/Export/CMakeLists.txt | 15 +++++++++++++++ .../testInterfaceIncludeUser/testInterfaceInclude.h | 1 + Tests/ExportImport/Import/A/CMakeLists.txt | 8 ++++++++ Tests/ExportImport/Import/A/imp_testInterfaceInclude1.c | 6 ++++++ .../A/testInterfaceIncludeSystem/testInterfaceInclude.h | 1 + 7 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 Tests/ExportImport/Export/include/testInterfaceIncludeUser/testInterfaceInclude.h create mode 100644 Tests/ExportImport/Import/A/imp_testInterfaceInclude1.c create mode 100644 Tests/ExportImport/Import/A/testInterfaceIncludeSystem/testInterfaceInclude.h diff --git a/Help/prop_tgt/IMPORTED_NO_SYSTEM.rst b/Help/prop_tgt/IMPORTED_NO_SYSTEM.rst index e9349db..cc726d1 100644 --- a/Help/prop_tgt/IMPORTED_NO_SYSTEM.rst +++ b/Help/prop_tgt/IMPORTED_NO_SYSTEM.rst @@ -8,7 +8,9 @@ a ``SYSTEM`` library. This has the following effects: as ``SYSTEM`` include directories when compiling consumers, as they would be by default. -Ignored for non-imported targets. +This property can also be enabled on a non-imported target. Doing so does +not affect the build system, but does tell the :command:`install(EXPORT)` and +:command:`export` commands to enable it on the imported targets they generate. See the :prop_tgt:`NO_SYSTEM_FROM_IMPORTED` target property to set this behavior on the target consuming the include directories rather than diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index c0a4cdc..0eda92c 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -1072,6 +1072,12 @@ void cmExportFileGenerator::GenerateImportTargetCode( os << "set_property(TARGET " << targetName << " PROPERTY DEPRECATION " << cmExportFileGeneratorEscape(target->GetDeprecation()) << ")\n"; } + + if (target->GetPropertyAsBool("IMPORTED_NO_SYSTEM")) { + os << "set_property(TARGET " << targetName + << " PROPERTY IMPORTED_NO_SYSTEM 1)\n"; + } + os << "\n"; } diff --git a/Tests/ExportImport/Export/CMakeLists.txt b/Tests/ExportImport/Export/CMakeLists.txt index a2968d4..7b33277 100644 --- a/Tests/ExportImport/Export/CMakeLists.txt +++ b/Tests/ExportImport/Export/CMakeLists.txt @@ -145,6 +145,19 @@ set_property(TARGET testLibCycleA PROPERTY LINK_INTERFACE_MULTIPLICITY 3) add_library(testLibNoSONAME SHARED testLibNoSONAME.c) set_property(TARGET testLibNoSONAME PROPERTY NO_SONAME 1) +add_library(testInterfaceIncludeUser INTERFACE) +target_include_directories(testInterfaceIncludeUser + INTERFACE + "$" + "$" +) +set_property(TARGET testInterfaceIncludeUser PROPERTY IMPORTED_NO_SYSTEM 1) +install( + FILES + "${CMAKE_CURRENT_SOURCE_DIR}/include/testInterfaceIncludeUser/testInterfaceInclude.h" + DESTINATION include/testInterfaceIncludeUser +) + cmake_policy(PUSH) cmake_policy(SET CMP0022 NEW) # Test exporting dependent libraries into different exports @@ -531,6 +544,7 @@ install( cmp0022NEW cmp0022OLD TopDirLib SubDirLinkA systemlib + testInterfaceIncludeUser EXPORT exp RUNTIME DESTINATION $<1:bin>$<0:/wrong> LIBRARY DESTINATION $<1:lib>$<0:/wrong> NAMELINK_SKIP @@ -590,6 +604,7 @@ export(TARGETS testExe1 testLib1 testLib2 testLib3 cmp0022NEW cmp0022OLD TopDirLib SubDirLinkA systemlib + testInterfaceIncludeUser NAMESPACE bld_ FILE ExportBuildTree.cmake ) diff --git a/Tests/ExportImport/Export/include/testInterfaceIncludeUser/testInterfaceInclude.h b/Tests/ExportImport/Export/include/testInterfaceIncludeUser/testInterfaceInclude.h new file mode 100644 index 0000000..fa882cb --- /dev/null +++ b/Tests/ExportImport/Export/include/testInterfaceIncludeUser/testInterfaceInclude.h @@ -0,0 +1 @@ +/* empty file */ diff --git a/Tests/ExportImport/Import/A/CMakeLists.txt b/Tests/ExportImport/Import/A/CMakeLists.txt index 3cb3833..0cd703f 100644 --- a/Tests/ExportImport/Import/A/CMakeLists.txt +++ b/Tests/ExportImport/Import/A/CMakeLists.txt @@ -70,6 +70,10 @@ target_link_libraries(imp_testExe1 exp_testLibPerConfigDest ) +add_library(imp_testInterfaceInclude1 STATIC imp_testInterfaceInclude1.c) +target_include_directories(imp_testInterfaceInclude1 SYSTEM PRIVATE testInterfaceIncludeSystem) +target_link_libraries(imp_testInterfaceInclude1 PRIVATE exp_testInterfaceIncludeUser) + # Try building a plugin to an executable imported from the install tree. add_library(imp_mod1 MODULE imp_mod1.c) target_link_libraries(imp_mod1 exp_testExe2) @@ -110,6 +114,10 @@ target_link_libraries(imp_testExe1b bld_testLibPerConfigDest ) +add_library(imp_testInterfaceInclude1b STATIC imp_testInterfaceInclude1.c) +target_include_directories(imp_testInterfaceInclude1b SYSTEM PRIVATE testInterfaceIncludeSystem) +target_link_libraries(imp_testInterfaceInclude1b PRIVATE bld_testInterfaceIncludeUser) + add_custom_target(check_testLib1_genex ALL COMMAND ${CMAKE_COMMAND} -DtestLib1=$ -Dprefix=${CMAKE_INSTALL_PREFIX} diff --git a/Tests/ExportImport/Import/A/imp_testInterfaceInclude1.c b/Tests/ExportImport/Import/A/imp_testInterfaceInclude1.c new file mode 100644 index 0000000..88a49b5 --- /dev/null +++ b/Tests/ExportImport/Import/A/imp_testInterfaceInclude1.c @@ -0,0 +1,6 @@ +#include "testInterfaceInclude.h" + +int imp_testInterfaceInclude1(void) +{ + return 0; +} diff --git a/Tests/ExportImport/Import/A/testInterfaceIncludeSystem/testInterfaceInclude.h b/Tests/ExportImport/Import/A/testInterfaceIncludeSystem/testInterfaceInclude.h new file mode 100644 index 0000000..2beeb8b --- /dev/null +++ b/Tests/ExportImport/Import/A/testInterfaceIncludeSystem/testInterfaceInclude.h @@ -0,0 +1 @@ +#error testInterfaceInclude.h included from testInterfaceIncludeSystem -- cgit v0.12