Add support for IMPORTED GLOBAL targets to be aliased
Issue: #15569 Issue: #17197
This commit is contained in:
parent
fe4b25ec2f
commit
494906a8a2
@ -74,8 +74,9 @@ properties for more information.
|
||||
Creates an :ref:`Alias Target <Alias Targets>`, such that ``<name>`` can
|
||||
be used to refer to ``<target>`` in subsequent commands. The ``<name>``
|
||||
does not appear in the generated buildsystem as a make target. The
|
||||
``<target>`` may not be an :ref:`Imported Target <Imported Targets>` or an
|
||||
``ALIAS``. ``ALIAS`` targets can be used as targets to read properties
|
||||
``<target>`` may not be a non-``GLOBAL``
|
||||
:ref:`Imported Target <Imported Targets>` or an ``ALIAS``.
|
||||
``ALIAS`` targets can be used as targets to read properties
|
||||
from, executables for custom commands and custom targets. They can also be
|
||||
tested for existence with the regular :command:`if(TARGET)` subcommand.
|
||||
The ``<name>`` may not be used to modify properties of ``<target>``, that
|
||||
|
@ -125,7 +125,8 @@ Alias Libraries
|
||||
Creates an :ref:`Alias Target <Alias Targets>`, such that ``<name>`` can be
|
||||
used to refer to ``<target>`` in subsequent commands. The ``<name>`` does
|
||||
not appear in the generated buildsystem as a make target. The ``<target>``
|
||||
may not be an :ref:`Imported Target <Imported Targets>` or an ``ALIAS``.
|
||||
may not be a non-``GLOBAL`` :ref:`Imported Target <Imported Targets>` or an
|
||||
``ALIAS``.
|
||||
``ALIAS`` targets can be used as linkable targets and as targets to
|
||||
read properties from. They can also be tested for existence with the
|
||||
regular :command:`if(TARGET)` subcommand. The ``<name>`` may not be used
|
||||
|
@ -140,8 +140,7 @@ bool cmAddExecutableCommand::InitialPass(std::vector<std::string> const& args,
|
||||
if (!aliasedTarget) {
|
||||
std::ostringstream e;
|
||||
e << "cannot create ALIAS target \"" << exename << "\" because target \""
|
||||
<< aliasedName << "\" does not already "
|
||||
"exist.";
|
||||
<< aliasedName << "\" does not already exist.";
|
||||
this->SetError(e.str());
|
||||
return false;
|
||||
}
|
||||
@ -149,15 +148,15 @@ bool cmAddExecutableCommand::InitialPass(std::vector<std::string> const& args,
|
||||
if (type != cmStateEnums::EXECUTABLE) {
|
||||
std::ostringstream e;
|
||||
e << "cannot create ALIAS target \"" << exename << "\" because target \""
|
||||
<< aliasedName << "\" is not an "
|
||||
"executable.";
|
||||
<< aliasedName << "\" is not an executable.";
|
||||
this->SetError(e.str());
|
||||
return false;
|
||||
}
|
||||
if (aliasedTarget->IsImported()) {
|
||||
if (aliasedTarget->IsImported() &&
|
||||
!aliasedTarget->IsImportedGloballyVisible()) {
|
||||
std::ostringstream e;
|
||||
e << "cannot create ALIAS target \"" << exename << "\" because target \""
|
||||
<< aliasedName << "\" is IMPORTED.";
|
||||
<< aliasedName << "\" is imported but not globally visible.";
|
||||
this->SetError(e.str());
|
||||
return false;
|
||||
}
|
||||
|
@ -256,13 +256,6 @@ bool cmAddLibraryCommand::InitialPass(std::vector<std::string> const& args,
|
||||
this->SetError(e.str());
|
||||
return false;
|
||||
}
|
||||
if (aliasedTarget->IsImported()) {
|
||||
std::ostringstream e;
|
||||
e << "cannot create ALIAS target \"" << libName << "\" because target \""
|
||||
<< aliasedName << "\" is IMPORTED.";
|
||||
this->SetError(e.str());
|
||||
return false;
|
||||
}
|
||||
this->Makefile->AddAlias(libName, aliasedName);
|
||||
return true;
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ run_cmake(exclude-from-all)
|
||||
run_cmake(imported)
|
||||
run_cmake(invalid-name)
|
||||
run_cmake(invalid-target)
|
||||
run_cmake(imported-global-target)
|
||||
run_cmake(imported-target)
|
||||
run_cmake(alias-target)
|
||||
run_cmake(set_property)
|
||||
|
@ -0,0 +1,2 @@
|
||||
^'alias-test-exe' is an alias for 'test-exe' and its name-property contains 'test-exe'.
|
||||
'alias-test-lib' is an alias for 'test-lib' and its name-property contains 'test-lib'.$
|
46
Tests/RunCMake/alias_targets/imported-global-target.cmake
Normal file
46
Tests/RunCMake/alias_targets/imported-global-target.cmake
Normal file
@ -0,0 +1,46 @@
|
||||
|
||||
enable_language(CXX)
|
||||
|
||||
|
||||
add_executable(test-exe IMPORTED GLOBAL)
|
||||
add_executable(alias-test-exe ALIAS test-exe)
|
||||
|
||||
if(TARGET alias-test-exe)
|
||||
get_target_property(aliased-target alias-test-exe ALIASED_TARGET)
|
||||
if("${aliased-target}" STREQUAL "test-exe")
|
||||
get_target_property(aliased-name alias-test-exe NAME)
|
||||
if("${aliased-name}" STREQUAL "test-exe")
|
||||
message("'alias-test-exe' is an alias for '${aliased-target}'"
|
||||
" and its name-property contains '${aliased-name}'.")
|
||||
else()
|
||||
message("'alias-test-exe' is an alias for '${aliased-target}'"
|
||||
" but its name-property contains '${aliased-name}'!?")
|
||||
endif()
|
||||
else()
|
||||
message("'alias-test-exe' is something but not a real target!?")
|
||||
endif()
|
||||
else()
|
||||
message("'alias-test-exe' does not exist!?")
|
||||
endif()
|
||||
|
||||
|
||||
add_library(test-lib SHARED IMPORTED GLOBAL)
|
||||
add_library(alias-test-lib ALIAS test-lib)
|
||||
|
||||
if(TARGET alias-test-lib)
|
||||
get_target_property(aliased-target alias-test-lib ALIASED_TARGET)
|
||||
if("${aliased-target}" STREQUAL "test-lib")
|
||||
get_target_property(aliased-name alias-test-lib NAME)
|
||||
if("${aliased-name}" STREQUAL "test-lib")
|
||||
message("'alias-test-lib' is an alias for '${aliased-target}'"
|
||||
" and its name-property contains '${aliased-name}'.")
|
||||
else()
|
||||
message("'alias-test-lib' is an alias for '${aliased-target}'"
|
||||
" but its name-property contains '${aliased-name}'!?")
|
||||
endif()
|
||||
else()
|
||||
message("'alias-test-lib' is something but not a real target!?")
|
||||
endif()
|
||||
else()
|
||||
message("'alias-test-lib' does not exist!?")
|
||||
endif()
|
@ -1,5 +1,9 @@
|
||||
CMake Error at imported-target.cmake:6 \(add_library\):
|
||||
add_library cannot create ALIAS target "alias" because target "foo" is
|
||||
IMPORTED.
|
||||
^CMake Error at imported-target.cmake:[0-9]+ \(add_executable\):
|
||||
add_executable cannot create ALIAS target \"alias-test-exe\" because target
|
||||
\"test-exe\" is imported but not globally visible.
|
||||
Call Stack \(most recent call first\):
|
||||
CMakeLists.txt:3 \(include\)
|
||||
CMakeLists.txt:[0-9]+ \(include\)
|
||||
|
||||
|
||||
'alias-test-exe' does not exist![?]
|
||||
'alias-test-lib' does not exist![?]$
|
||||
|
@ -1,6 +1,46 @@
|
||||
|
||||
enable_language(CXX)
|
||||
|
||||
add_library(foo SHARED IMPORTED)
|
||||
|
||||
add_library(alias ALIAS foo)
|
||||
add_executable(test-exe IMPORTED)
|
||||
add_executable(alias-test-exe ALIAS test-exe)
|
||||
|
||||
if(TARGET alias-test-exe)
|
||||
get_target_property(aliased-target alias-test-exe ALIASED_TARGET)
|
||||
if("${aliased-target}" STREQUAL "test-exe")
|
||||
get_target_property(aliased-name alias-test-exe NAME)
|
||||
if("${aliased-name}" STREQUAL "test-exe")
|
||||
message("'alias-test-exe' is an alias for '${aliased-target}'"
|
||||
" and its name-property contains '${aliased-name}'.")
|
||||
else()
|
||||
message("'alias-test-exe' is an alias for '${aliased-target}'"
|
||||
" but its name-property contains '${aliased-name}'!?")
|
||||
endif()
|
||||
else()
|
||||
message("'alias-test-exe' is something but not a real target!?")
|
||||
endif()
|
||||
else()
|
||||
message("'alias-test-exe' does not exist!?")
|
||||
endif()
|
||||
|
||||
|
||||
add_library(test-lib SHARED IMPORTED)
|
||||
add_library(alias-test-lib ALIAS test-lib)
|
||||
|
||||
if(TARGET alias-test-lib)
|
||||
get_target_property(aliased-target alias-test-lib ALIASED_TARGET)
|
||||
if("${aliased-target}" STREQUAL "test-lib")
|
||||
get_target_property(aliased-name alias-test-lib NAME)
|
||||
if("${aliased-name}" STREQUAL "test-lib")
|
||||
message("'alias-test-lib' is an alias for '${aliased-target}'"
|
||||
" and its name-property contains '${aliased-name}'.")
|
||||
else()
|
||||
message("'alias-test-lib' is an alias for '${aliased-target}'"
|
||||
" but its name-property contains '${aliased-name}'!?")
|
||||
endif()
|
||||
else()
|
||||
message("'alias-test-lib' is something but not a real target!?")
|
||||
endif()
|
||||
else()
|
||||
message("'alias-test-lib' does not exist!?")
|
||||
endif()
|
||||
|
Loading…
Reference in New Issue
Block a user