Always consider includes from IMPORTED targets to be SYSTEM.

Introduce a target property to control this behavior variable
to set the default value for the target property.

This does not affect try_compile runs.
This commit is contained in:
Stephen Kelly 2013-08-29 10:28:09 +02:00
parent 9bcf6adc38
commit a63fcbcb9f
7 changed files with 134 additions and 1 deletions

View File

@ -1562,6 +1562,14 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
"See that target property for additional information.", "See that target property for additional information.",
false, false,
"Variables that Control the Build"); "Variables that Control the Build");
cm->DefineProperty
("CMAKE_NO_SYSTEM_FROM_IMPORTED", cmProperty::VARIABLE,
"Default value for NO_SYSTEM_FROM_IMPORTED of targets.",
"This variable is used to initialize the "
"NO_SYSTEM_FROM_IMPORTED property on all the targets. "
"See that target property for additional information.",
false,
"Variables that Control the Build");
cm->DefineProperty cm->DefineProperty
("CMAKE_<LANG>_VISIBILITY_PRESET", cmProperty::VARIABLE, ("CMAKE_<LANG>_VISIBILITY_PRESET", cmProperty::VARIABLE,
"Default value for <LANG>_VISIBILITY_PRESET of targets.", "Default value for <LANG>_VISIBILITY_PRESET of targets.",

View File

@ -927,6 +927,17 @@ void cmTarget::DefineProperties(cmake *cm)
"to be not found. This property is ignored for non-imported targets.", "to be not found. This property is ignored for non-imported targets.",
false /* TODO: make this chained */ ); false /* TODO: make this chained */ );
cm->DefineProperty
("NO_SYSTEM_FROM_IMPORTED", cmProperty::TARGET,
"Do not treat includes from IMPORTED target interfaces as SYSTEM.",
"The contents of the INTERFACE_INCLUDE_DIRECTORIES of IMPORTED targets "
"are treated as SYSTEM includes by default. If this property is "
"enabled, the contents of the INTERFACE_INCLUDE_DIRECTORIES of IMPORTED "
"targets are not treated as system includes. "
"This property is initialized by the value of the variable "
"CMAKE_NO_SYSTEM_FROM_IMPORTED if it is set when a target is "
"created.");
cm->DefineProperty cm->DefineProperty
("OSX_ARCHITECTURES", cmProperty::TARGET, ("OSX_ARCHITECTURES", cmProperty::TARGET,
"Target specific architectures for OS X.", "Target specific architectures for OS X.",
@ -1637,6 +1648,7 @@ void cmTarget::SetMakefile(cmMakefile* mf)
this->SetPropertyDefault("WIN32_EXECUTABLE", 0); this->SetPropertyDefault("WIN32_EXECUTABLE", 0);
this->SetPropertyDefault("MACOSX_BUNDLE", 0); this->SetPropertyDefault("MACOSX_BUNDLE", 0);
this->SetPropertyDefault("MACOSX_RPATH", 0); this->SetPropertyDefault("MACOSX_RPATH", 0);
this->SetPropertyDefault("NO_SYSTEM_FROM_IMPORTED", 0);
// Collect the set of configuration types. // Collect the set of configuration types.
@ -2664,10 +2676,28 @@ void cmTarget::FinalizeSystemIncludeDirectories()
ge.Parse(it->Value); ge.Parse(it->Value);
std::string targetName = cge->Evaluate(this->Makefile, 0, std::string targetName = cge->Evaluate(this->Makefile, 0,
false, this, 0, 0); false, this, 0, 0);
if (!this->Makefile->FindTargetToUse(targetName.c_str())) cmTarget *tgt = this->Makefile->FindTargetToUse(targetName.c_str());
if (!tgt)
{ {
continue; continue;
} }
if (tgt->IsImported()
&& tgt->GetProperty("INTERFACE_INCLUDE_DIRECTORIES")
&& !this->GetPropertyAsBool("NO_SYSTEM_FROM_IMPORTED"))
{
std::string includeGenex = "$<TARGET_PROPERTY:" +
it->Value + ",INTERFACE_INCLUDE_DIRECTORIES>";
if (cmGeneratorExpression::Find(it->Value) != std::string::npos)
{
// Because it->Value is a generator expression, ensure that it
// evaluates to the non-empty string before being used in the
// TARGET_PROPERTY expression.
includeGenex = "$<$<BOOL:" + it->Value + ">:" + includeGenex + ">";
}
this->SystemIncludeDirectories.insert(includeGenex);
return; // The INTERFACE_SYSTEM_INCLUDE_DIRECTORIES are a subset
// of the INTERFACE_INCLUDE_DIRECTORIES
}
} }
std::string includeGenex = "$<TARGET_PROPERTY:" + std::string includeGenex = "$<TARGET_PROPERTY:" +
it->Value + ",INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>"; it->Value + ",INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>";

View File

@ -298,6 +298,14 @@ set_property(TARGET cmp0022OLD APPEND PROPERTY LINK_INTERFACE_LIBRARIES testLib3
add_library(noIncludesInterface empty.cpp) add_library(noIncludesInterface empty.cpp)
add_library(systemlib SHARED systemlib.cpp)
install(FILES systemlib.h DESTINATION include/systemlib)
target_include_directories(systemlib
INTERFACE
$<INSTALL_INTERFACE:include/systemlib>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
)
install(TARGETS testLibRequired install(TARGETS testLibRequired
EXPORT RequiredExp DESTINATION lib EXPORT RequiredExp DESTINATION lib
INCLUDES DESTINATION INCLUDES DESTINATION
@ -366,6 +374,7 @@ install(
testLib6 testLib6
testLibCycleA testLibCycleB testLibCycleA testLibCycleB
cmp0022NEW cmp0022OLD cmp0022NEW cmp0022OLD
systemlib
EXPORT exp EXPORT exp
RUNTIME DESTINATION bin RUNTIME DESTINATION bin
LIBRARY DESTINATION lib NAMELINK_SKIP LIBRARY DESTINATION lib NAMELINK_SKIP
@ -417,6 +426,7 @@ export(TARGETS testExe1 testLib1 testLib2 testLib3
testSharedLibRequired testSharedLibRequiredUser testSharedLibRequiredUser2 testSharedLibRequired testSharedLibRequiredUser testSharedLibRequiredUser2
testSharedLibDepends renamed_on_export testSharedLibDepends renamed_on_export
cmp0022NEW cmp0022OLD cmp0022NEW cmp0022OLD
systemlib
NAMESPACE bld_ NAMESPACE bld_
FILE ExportBuildTree.cmake FILE ExportBuildTree.cmake
) )

View File

@ -0,0 +1,7 @@
#include "systemlib.h"
SystemStruct::SystemStruct()
{
}

View File

@ -0,0 +1,22 @@
#ifndef SYSTEMLIB_H
#define SYSTEMLIB_H
#if defined(_WIN32) || defined(__CYGWIN__)
# define systemlib_EXPORT __declspec(dllexport)
#else
# define systemlib_EXPORT
#endif
struct systemlib_EXPORT SystemStruct
{
SystemStruct();
void someMethod()
{
int unused;
// unused warning not issued when this header is used as a system header.
}
};
#endif

View File

@ -265,3 +265,50 @@ foreach(_config ${_configs})
) )
endforeach() endforeach()
unset(_configs) unset(_configs)
if (((CMAKE_C_COMPILER_ID STREQUAL GNU AND CMAKE_C_COMPILER_VERSION VERSION_GREATER 4.4)
OR CMAKE_C_COMPILER_ID STREQUAL Clang)
AND (CMAKE_GENERATOR STREQUAL "Unix Makefiles" OR CMAKE_GENERATOR STREQUAL "Ninja"))
include(CheckCXXCompilerFlag)
check_cxx_compiler_flag(-Wunused-variable run_sys_includes_test)
if(run_sys_includes_test)
# The Bullseye wrapper appears to break the -isystem effect.
execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version OUTPUT_VARIABLE out ERROR_VARIABLE out)
if("x${out}" MATCHES "Bullseye")
set(run_sys_includes_test 0)
endif()
endif()
if (run_sys_includes_test)
add_executable(test_system_exp test_system.cpp)
target_link_libraries(test_system_exp exp_systemlib)
target_compile_options(test_system_exp PRIVATE -Wunused-variable -Werror=unused-variable)
unset(EXP_ERROR_VARIABLE CACHE)
try_compile(EXP_ERROR_VARIABLE
"${CMAKE_CURRENT_SOURCE_DIR}/test_system"
"${CMAKE_CURRENT_SOURCE_DIR}/test_system.cpp"
COMPILE_DEFINITIONS "-Wunused-variable -Werror=unused-variable"
LINK_LIBRARIES exp_systemlib
OUTPUT_VARIABLE OUTPUT
)
if(NOT EXP_ERROR_VARIABLE)
message(SEND_ERROR "EXP_ERROR_VARIABLE try_compile failed, but it was expected to succeed ${OUTPUT}.")
endif()
add_executable(test_system_bld test_system.cpp)
target_link_libraries(test_system_bld bld_systemlib)
target_compile_options(test_system_bld PRIVATE -Wunused-variable -Werror=unused-variable)
unset(BLD_ERROR_VARIABLE CACHE)
try_compile(BLD_ERROR_VARIABLE
"${CMAKE_CURRENT_SOURCE_DIR}/test_system"
"${CMAKE_CURRENT_SOURCE_DIR}/test_system.cpp"
COMPILE_DEFINITIONS "-Wunused-variable -Werror=unused-variable"
LINK_LIBRARIES bld_systemlib
OUTPUT_VARIABLE OUTPUT
)
if(NOT BLD_ERROR_VARIABLE)
message(SEND_ERROR "BLD_ERROR_VARIABLE try_compile failed, but it was expected to succeed.")
endif()
endif()
endif()

View File

@ -0,0 +1,9 @@
#include "systemlib.h"
int main()
{
SystemStruct s;
(void)s;
return 0;
}