mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-05 21:31:08 -06:00
try_compile: Add support for using ALIAS targets
Fixes: #25337 Signed-off-by: Cristian Le <cristian.le@mpsd.mpg.de>
This commit is contained in:
@@ -177,6 +177,9 @@ The options for the above signatures are:
|
|||||||
If this option is specified, any ``-DLINK_LIBRARIES=...`` value
|
If this option is specified, any ``-DLINK_LIBRARIES=...`` value
|
||||||
given to the ``CMAKE_FLAGS`` option will be ignored.
|
given to the ``CMAKE_FLAGS`` option will be ignored.
|
||||||
|
|
||||||
|
.. versionadded:: 3.29
|
||||||
|
Alias targets to imported libraries are also supported.
|
||||||
|
|
||||||
``LINK_OPTIONS <options>...``
|
``LINK_OPTIONS <options>...``
|
||||||
.. versionadded:: 3.14
|
.. versionadded:: 3.14
|
||||||
|
|
||||||
|
|||||||
@@ -856,8 +856,30 @@ cm::optional<cmTryCompileResult> cmCoreTryCompile::TryCompileCode(
|
|||||||
fclose(fout);
|
fclose(fout);
|
||||||
return cm::nullopt;
|
return cm::nullopt;
|
||||||
}
|
}
|
||||||
fprintf(fout, "\ninclude(\"${CMAKE_CURRENT_LIST_DIR}/%s\")\n\n",
|
fprintf(fout, "\ninclude(\"${CMAKE_CURRENT_LIST_DIR}/%s\")\n",
|
||||||
fname.c_str());
|
fname.c_str());
|
||||||
|
// Create all relevant alias targets
|
||||||
|
if (arguments.LinkLibraries) {
|
||||||
|
const auto& aliasTargets = this->Makefile->GetAliasTargets();
|
||||||
|
for (std::string const& i : *arguments.LinkLibraries) {
|
||||||
|
auto alias = aliasTargets.find(i);
|
||||||
|
if (alias != aliasTargets.end()) {
|
||||||
|
const auto& aliasTarget =
|
||||||
|
this->Makefile->FindTargetToUse(alias->second);
|
||||||
|
// Create equivalent library/executable alias
|
||||||
|
if (aliasTarget->GetType() == cmStateEnums::EXECUTABLE) {
|
||||||
|
fprintf(fout, "add_executable(\"%s\" ALIAS \"%s\")\n", i.c_str(),
|
||||||
|
alias->second.c_str());
|
||||||
|
} else {
|
||||||
|
// Other cases like UTILITY and GLOBAL_TARGET are excluded when
|
||||||
|
// arguments.LinkLibraries is initially parsed in this function.
|
||||||
|
fprintf(fout, "add_library(\"%s\" ALIAS \"%s\")\n", i.c_str(),
|
||||||
|
alias->second.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(fout, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the appropriate policy information for ENABLE_EXPORTS */
|
/* Set the appropriate policy information for ENABLE_EXPORTS */
|
||||||
|
|||||||
@@ -518,6 +518,91 @@ if (((CMAKE_C_COMPILER_ID STREQUAL GNU AND CMAKE_C_COMPILER_VERSION VERSION_GREA
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Testing try_compile with ALIAS targets.
|
||||||
|
# These assume that previous test were successful, or at least the failures will be at the linking stage
|
||||||
|
# with symbol not found errors
|
||||||
|
|
||||||
|
# First make sure that if the test run without appropriate alias targets, they should error out
|
||||||
|
try_compile(FAILING_LIBRARY_ALIAS_ERROR_VARIABLE
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/test_failing_library_alias"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/test_system.cpp"
|
||||||
|
LINK_LIBRARIES not_existing_library
|
||||||
|
OUTPUT_VARIABLE OUTPUT
|
||||||
|
NO_CACHE
|
||||||
|
)
|
||||||
|
if(FAILING_LIBRARY_ALIAS_ERROR_VARIABLE)
|
||||||
|
message(SEND_ERROR "FAILING_LIBRARY_ALIAS_ERROR_VARIABLE try_compile succeeded, but it was expected to fail ${OUTPUT}.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# FIXME: CMAKE_TRY_COMPILE_TARGET_TYPE=MODULE is needed to properly link and test targets linked to an executable
|
||||||
|
# set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
||||||
|
# try_compile(FAILING_EXE_ALIAS_ERROR_VARIABLE
|
||||||
|
# "${CMAKE_CURRENT_BINARY_DIR}/test_failing_exe_alias"
|
||||||
|
# "${CMAKE_CURRENT_SOURCE_DIR}/imp_mod1.c"
|
||||||
|
# LINK_LIBRARIES not_existing_executable
|
||||||
|
# OUTPUT_VARIABLE OUTPUT
|
||||||
|
# NO_CACHE
|
||||||
|
# )
|
||||||
|
# unset(CMAKE_TRY_COMPILE_TARGET_TYPE)
|
||||||
|
# if(FAILING_EXE_ALIAS_ERROR_VARIABLE)
|
||||||
|
# message(SEND_ERROR "FAILING_EXE_ALIAS_ERROR_VARIABLE try_compile succeeded, but it was expected to fail ${OUTPUT}.")
|
||||||
|
# endif()
|
||||||
|
|
||||||
|
# Do the actual try_compile tests for ALIAS targets
|
||||||
|
add_library(exp_systemlib_alias ALIAS exp_systemlib)
|
||||||
|
try_compile(EXP_LIBRARY_ALIAS_ERROR_VARIABLE
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/test_library_alias"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/test_system.cpp"
|
||||||
|
LINK_LIBRARIES exp_systemlib_alias
|
||||||
|
OUTPUT_VARIABLE OUTPUT
|
||||||
|
NO_CACHE
|
||||||
|
)
|
||||||
|
if(NOT EXP_LIBRARY_ALIAS_ERROR_VARIABLE)
|
||||||
|
message(SEND_ERROR "EXP_LIBRARY_ALIAS_ERROR_VARIABLE try_compile failed with library aliased target, but it was expected to succeed ${OUTPUT}.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# FIXME: CMAKE_TRY_COMPILE_TARGET_TYPE=MODULE is needed to properly link and test targets linked to an executable
|
||||||
|
# set(CMAKE_TRY_COMPILE_TARGET_TYPE MODULE)
|
||||||
|
# add_executable(exp_exe_alias ALIAS exp_testExe2)
|
||||||
|
# try_compile(EXP_EXE_ALIAS_ERROR_VARIABLE
|
||||||
|
# "${CMAKE_CURRENT_BINARY_DIR}/test_exe_alias"
|
||||||
|
# "${CMAKE_CURRENT_SOURCE_DIR}/imp_mod1.c"
|
||||||
|
# LINK_LIBRARIES exp_exe_alias
|
||||||
|
# OUTPUT_VARIABLE OUTPUT
|
||||||
|
# NO_CACHE
|
||||||
|
# )
|
||||||
|
# unset(CMAKE_TRY_COMPILE_TARGET_TYPE)
|
||||||
|
# if(NOT EXP_EXE_ALIAS_ERROR_VARIABLE)
|
||||||
|
# message(SEND_ERROR "EXP_EXE_ALIAS_ERROR_VARIABLE try_compile failed with executable aliased target, but it was expected to succeed ${OUTPUT}.")
|
||||||
|
# endif()
|
||||||
|
|
||||||
|
add_library(bld_systemlib_alias ALIAS bld_systemlib)
|
||||||
|
try_compile(BLD_LIBRARY_ALIAS_ERROR_VARIABLE
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/test_library_alias"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/test_system.cpp"
|
||||||
|
LINK_LIBRARIES bld_systemlib_alias
|
||||||
|
OUTPUT_VARIABLE OUTPUT
|
||||||
|
NO_CACHE
|
||||||
|
)
|
||||||
|
if(NOT BLD_LIBRARY_ALIAS_ERROR_VARIABLE)
|
||||||
|
message(SEND_ERROR "BLD_LIBRARY_ALIAS_ERROR_VARIABLE try_compile failed with library aliased target, but it was expected to succeed. ${OUTPUT}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# FIXME: CMAKE_TRY_COMPILE_TARGET_TYPE=MODULE is needed to properly link and test targets linked to an executable
|
||||||
|
# set(CMAKE_TRY_COMPILE_TARGET_TYPE MODULE)
|
||||||
|
# add_executable(bld_exe_alias ALIAS bld_testExe2)
|
||||||
|
# try_compile(BLD_EXE_ALIAS_ERROR_VARIABLE
|
||||||
|
# "${CMAKE_CURRENT_BINARY_DIR}/test_exe_alias"
|
||||||
|
# "${CMAKE_CURRENT_SOURCE_DIR}/imp_mod1.c"
|
||||||
|
# LINK_LIBRARIES bld_exe_alias
|
||||||
|
# OUTPUT_VARIABLE OUTPUT
|
||||||
|
# NO_CACHE
|
||||||
|
# )
|
||||||
|
# unset(CMAKE_TRY_COMPILE_TARGET_TYPE)
|
||||||
|
# if(NOT BLD_EXE_ALIAS_ERROR_VARIABLE)
|
||||||
|
# message(SEND_ERROR "BLD_EXE_ALIAS_ERROR_VARIABLE try_compile failed with executable aliased target, but it was expected to succeed. ${OUTPUT}")
|
||||||
|
# endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user