aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Lanza <nathan@lanza.io>2020-03-30 20:22:52 -0400
committerNathan Lanza <nathan@lanza.io>2020-04-01 23:29:01 -0400
commit7f5fe30a150e7e87d3fbe4da4ab0e76ec38b40b9 (patch)
tree4cd1cc3b128f63ba72e72f5141db921d7da38bcb
parentbcd8009369f86be8649307692f5ba57aad5ca29b (diff)
downloadllvm-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.cmake12
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()