Commit 4babc905 authored by Ben Boeckel's avatar Ben Boeckel

cmTargetPropCommandBase: check keywords after parsing

The following was disallowed:

   add_library(iface INTERFACE)
   target_link_libraries(iface PUBLIC)

just due to the mention of the `PUBLIC` keyword. Instead, only error if
there are actually `PUBLIC` dependencies specified (and analogously for
other restrictions).

Update tests to expect this new behavior.
parent 45a49ae5
......@@ -84,15 +84,6 @@ bool cmTargetPropCommandBase::ProcessContentArgs(
this->SetError("called with invalid arguments");
return false;
}
if (this->Target->GetType() == cmStateEnums::INTERFACE_LIBRARY &&
scope != "INTERFACE") {
this->SetError("may only set INTERFACE properties on INTERFACE targets");
return false;
}
if (this->Target->IsImported() && scope != "INTERFACE") {
this->SetError("may only set INTERFACE properties on IMPORTED targets");
return false;
}
++argIndex;
......@@ -105,6 +96,17 @@ bool cmTargetPropCommandBase::ProcessContentArgs(
}
content.push_back(args[i]);
}
if (!content.empty()) {
if (this->Target->GetType() == cmStateEnums::INTERFACE_LIBRARY &&
scope != "INTERFACE") {
this->SetError("may only set INTERFACE properties on INTERFACE targets");
return false;
}
if (this->Target->IsImported() && scope != "INTERFACE") {
this->SetError("may only set INTERFACE properties on IMPORTED targets");
return false;
}
}
return this->PopulateTargetProperies(scope, content, prepend, system);
}
......
CMake Error at empty_keyword_args.cmake:2 \(target_compile_definitions\):
target_compile_definitions may only set INTERFACE properties on INTERFACE
targets
Call Stack \(most recent call first\):
CMakeLists.txt:5 \(include\)
CMake Error at empty_keyword_args.cmake:2 \(target_compile_features\):
target_compile_features may only set INTERFACE properties on INTERFACE
targets
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
CMake Error at empty_keyword_args.cmake:2 \(target_compile_options\):
target_compile_options may only set INTERFACE properties on INTERFACE
targets
Call Stack \(most recent call first\):
CMakeLists.txt:5 \(include\)
CMake Error at empty_keyword_args.cmake:2 \(target_include_directories\):
target_include_directories may only set INTERFACE properties on INTERFACE
targets
Call Stack \(most recent call first\):
CMakeLists.txt:5 \(include\)
CMake Error at empty_keyword_args.cmake:2 \(target_link_directories\):
target_link_directories may only set INTERFACE properties on INTERFACE
targets
Call Stack \(most recent call first\):
CMakeLists.txt:5 \(include\)
CMake Error at empty_keyword_args.cmake:2 \(target_link_options\):
target_link_options may only set INTERFACE properties on INTERFACE targets
Call Stack \(most recent call first\):
CMakeLists.txt:5 \(include\)
CMake Error at empty_keyword_args.cmake:2 \(target_sources\):
target_sources may only set INTERFACE properties on INTERFACE targets
Call Stack \(most recent call first\):
CMakeLists.txt:5 \(include\)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment