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.",
|
"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.",
|
||||||
|
|
|
@ -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>";
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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()
|
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()
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
#include "systemlib.h"
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
SystemStruct s;
|
||||||
|
(void)s;
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue