Add support for IMPORTED GLOBAL targets to be aliased

Issue: #15569
Issue: #17197
This commit is contained in:
Deniz Bahadir 2017-09-14 13:15:08 +02:00 committed by Brad King
parent fe4b25ec2f
commit 494906a8a2
9 changed files with 109 additions and 22 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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)

View File

@ -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'.$

View 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()

View File

@ -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![?]$

View File

@ -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()