"GetLibraryNames called on imported target" after install(TARGETS)
CMake produces the following error when trying to generate install rules for an imported global static library target:
CMake Internal Error (please report a bug) in CMakeLists.txt:
GetLibraryNames called on imported target: test
Note: The stack trace will not use advanced capabilities because this is a release build.
0x55a006d69ff9 : cmsys::SystemInformationImplementation::GetProgramStack[abi:cxx11](int, int) [(cmake) ???:-1]
0x55a006d6aa6d : cmsys::SystemInformation::GetProgramStack[abi:cxx11](int, int) [(cmake) ???:-1]
0x55a006cd4838 : displayMessage(cmake::MessageType, std::__cxx11::basic_ostringstream<char, std::char_traits<char>,
0x55a006cd4e56 : cmMessenger::DisplayMessage(cmake::MessageType, std::__cxx11::basic_string<char, std::char_traits<c
0x55a006c5cdf1 : cmGeneratorTarget::GetLibraryNames(std::__cxx11::basic_string<char, std::char_traits<char>, std::altring<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const [(cmake) ???:-1]
0x55a006ca3a0a : cmInstallTargetGenerator::GenerateScriptForConfig(std::ostream&, std::__cxx11::basic_string<char, s
0x55a006abe5c6 : cmScriptGenerator::GenerateScriptActionsOnce(std::ostream&, cmScriptGeneratorIndent) [(cmake) ???:-
0x55a006abe8b5 : cmScriptGenerator::GenerateScriptActionsPerConfig(std::ostream&, cmScriptGeneratorIndent) [(cmake)
0x55a006c9b667 : cmInstallGenerator::GenerateScript(std::ostream&) [(cmake) ???:-1]
0x55a006ca6098 : cmInstallTargetGenerator::GenerateScript(std::ostream&) [(cmake) ???:-1]
0x55a006abddcf : cmScriptGenerator::Generate(std::ostream&, std::__cxx11::basic_string<char, std::char_traits<char>,>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) [(cma
0x55a006a70428 : cmLocalGenerator::GenerateInstallRules() [(cmake) ???:-1]
0x55a006c83ba1 : cmGlobalGenerator::Generate() [(cmake) ???:-1]
0x55a006c91164 : cmGlobalUnixMakefileGenerator3::Generate() [(cmake) ???:-1]
0x55a006b0291b : cmake::Generate() [(cmake) ???:-1]
0x55a006b084d3 : cmake::Run(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<charmake) ???:-1]
0x55a006a3d355 : do_cmake(int, char const* const*) [(cmake) ???:-1]
0x55a006a34372 : main [(cmake) ???:-1]
0x7fc6fafaa223 : __libc_start_main [(libc.so.6) ???:-1]
0x55a006a3c72e : _start [(cmake) ???:-1]
Minimal reproduction:
touch CMakeLists.txt
touch libtest.a
Contents of CMakeLists.txt:
cmake_minimum_required(VERSION 3.13)
project(imported_lib_bug VERSION 1.0)
add_library(test STATIC IMPORTED GLOBAL)
set_target_properties(test PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_LIST_DIR}/libtest.a")
install(TARGETS test
ARCHIVE DESTINATION lib
)
Output of cmake --version:
cmake version 3.13.4
GenerateScriptForConfig does not check if the target is an imported target prior to calling GetLibraryNames(), unlike the users of the function in cmGeneratorTarget.cxx. Might be this one: https://gitlab.kitware.com/cmake/cmake/blob/master/Source/cmInstallTargetGenerator.cxx#L168
Edited by Bjørn Øivind Bjørnsen