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:
parent
9bcf6adc38
commit
a63fcbcb9f
|
@ -1562,6 +1562,14 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
|
|||
"See that target property for additional information.",
|
||||
false,
|
||||
"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
|
||||
("CMAKE_<LANG>_VISIBILITY_PRESET", cmProperty::VARIABLE,
|
||||
"Default value for <LANG>_VISIBILITY_PRESET of targets.",
|
||||
|
|
|
@ -927,6 +927,17 @@ void cmTarget::DefineProperties(cmake *cm)
|
|||
"to be not found. This property is ignored for non-imported targets.",
|
||||
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
|
||||
("OSX_ARCHITECTURES", cmProperty::TARGET,
|
||||
"Target specific architectures for OS X.",
|
||||
|
@ -1637,6 +1648,7 @@ void cmTarget::SetMakefile(cmMakefile* mf)
|
|||
this->SetPropertyDefault("WIN32_EXECUTABLE", 0);
|
||||
this->SetPropertyDefault("MACOSX_BUNDLE", 0);
|
||||
this->SetPropertyDefault("MACOSX_RPATH", 0);
|
||||
this->SetPropertyDefault("NO_SYSTEM_FROM_IMPORTED", 0);
|
||||
|
||||
|
||||
// Collect the set of configuration types.
|
||||
|
@ -2664,10 +2676,28 @@ void cmTarget::FinalizeSystemIncludeDirectories()
|
|||
ge.Parse(it->Value);
|
||||
std::string targetName = cge->Evaluate(this->Makefile, 0,
|
||||
false, this, 0, 0);
|
||||
if (!this->Makefile->FindTargetToUse(targetName.c_str()))
|
||||
cmTarget *tgt = this->Makefile->FindTargetToUse(targetName.c_str());
|
||||
if (!tgt)
|
||||
{
|
||||
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:" +
|
||||
it->Value + ",INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>";
|
||||
|
|
|
@ -298,6 +298,14 @@ set_property(TARGET cmp0022OLD APPEND PROPERTY LINK_INTERFACE_LIBRARIES testLib3
|
|||
|
||||
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
|
||||
EXPORT RequiredExp DESTINATION lib
|
||||
INCLUDES DESTINATION
|
||||
|
@ -366,6 +374,7 @@ install(
|
|||
testLib6
|
||||
testLibCycleA testLibCycleB
|
||||
cmp0022NEW cmp0022OLD
|
||||
systemlib
|
||||
EXPORT exp
|
||||
RUNTIME DESTINATION bin
|
||||
LIBRARY DESTINATION lib NAMELINK_SKIP
|
||||
|
@ -417,6 +426,7 @@ export(TARGETS testExe1 testLib1 testLib2 testLib3
|
|||
testSharedLibRequired testSharedLibRequiredUser testSharedLibRequiredUser2
|
||||
testSharedLibDepends renamed_on_export
|
||||
cmp0022NEW cmp0022OLD
|
||||
systemlib
|
||||
NAMESPACE bld_
|
||||
FILE ExportBuildTree.cmake
|
||||
)
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
#include "systemlib.h"
|
||||
|
||||
SystemStruct::SystemStruct()
|
||||
{
|
||||
|
||||
}
|
|
@ -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
|
|
@ -265,3 +265,50 @@ foreach(_config ${_configs})
|
|||
)
|
||||
endforeach()
|
||||
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()
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
#include "systemlib.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
SystemStruct s;
|
||||
(void)s;
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue