diff options
author | Nathan Lanza <nathan@lanza.io> | 2020-03-30 20:22:52 -0400 |
---|---|---|
committer | Nathan Lanza <nathan@lanza.io> | 2020-04-01 23:29:01 -0400 |
commit | 7f5fe30a150e7e87d3fbe4da4ab0e76ec38b40b9 (patch) | |
tree | 4cd1cc3b128f63ba72e72f5141db921d7da38bcb | |
parent | bcd8009369f86be8649307692f5ba57aad5ca29b (diff) | |
download | llvm-7f5fe30a150e7e87d3fbe4da4ab0e76ec38b40b9.zip llvm-7f5fe30a150e7e87d3fbe4da4ab0e76ec38b40b9.tar.gz llvm-7f5fe30a150e7e87d3fbe4da4ab0e76ec38b40b9.tar.bz2 |
[cmake] Only set deps for an ExternalProject if the type is executable or library
Summary:
cmake fails with an error when attempting to evaluate $<TARGET_FILE:tgt>
where `tgt` is defined via an `add_custom_target` and thus the `TYPE`
is `UTILITY`. Requesting a TARGET_FILE only works on an `EXECUTABLE`
or one of a few differetnt types of `X_LIBRARY` (e.g. added via
`add_library` or `add_executable`). The logic as implemented in cmake
is below:
enum TargetType
{
EXECUTABLE,
STATIC_LIBRARY,
SHARED_LIBRARY,
MODULE_LIBRARY,
OBJECT_LIBRARY,
UTILITY,
GLOBAL_TARGET,
INTERFACE_LIBRARY,
UNKNOWN_LIBRARY
};
if (target->GetType() >= cmStateEnums::OBJECT_LIBRARY &&
target->GetType() != cmStateEnums::UNKNOWN_LIBRARY) {
::reportError(context, content->GetOriginalExpression(),
"Target \"" + name +
"\" is not an executable or library.");
return nullptr;
}
This has always been the case back to at least 3.12 (furthest I
checked) but this is causing a new failure in cmake 3.17 while
evaluating ExternalProjectAdd.
Subscribers: mgorny, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D77284
-rw-r--r-- | llvm/cmake/modules/LLVMExternalProjectUtils.cmake | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/llvm/cmake/modules/LLVMExternalProjectUtils.cmake b/llvm/cmake/modules/LLVMExternalProjectUtils.cmake index 29f4fcb..4eb5fad 100644 --- a/llvm/cmake/modules/LLVMExternalProjectUtils.cmake +++ b/llvm/cmake/modules/LLVMExternalProjectUtils.cmake @@ -62,7 +62,17 @@ function(llvm_ExternalProject_Add name source_dir) foreach(tool ${ARG_TOOLCHAIN_TOOLS}) if(TARGET ${tool}) list(APPEND TOOLCHAIN_TOOLS ${tool}) - list(APPEND TOOLCHAIN_BINS $<TARGET_FILE:${tool}>) + + # $<TARGET_FILE:tgt> only works on add_executable or add_library targets + # The below logic mirrors cmake's own implementation + get_target_property(target_type "${tool}" TYPE) + if(NOT target_type STREQUAL "OBJECT_LIBRARY" AND + NOT target_type STREQUAL "UTILITY" AND + NOT target_type STREQUAL "GLOBAL_TARGET" AND + NOT target_type STREQUAL "INTERFACE_LIBRARY") + list(APPEND TOOLCHAIN_BINS $<TARGET_FILE:${tool}>) + endif() + endif() endforeach() |