From e1c6df392bae4f807bbc56f2c4320de412f48721 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 21 Apr 2015 11:32:22 -0400 Subject: [PATCH] ExternalProject: Allow dependencies on INTERFACE libraries Respect INTERFACE library property whitelist. Check that a target has type "UTILITY" before querying other properties. --- Modules/ExternalProject.cmake | 20 +++++++++++++++---- Tests/ExternalProjectSubdir/CMakeLists.txt | 15 ++++++++++++++ .../Subdir1/CMakeLists.txt | 4 ++++ .../Add_StepDependencies_iface-result.txt | 1 + .../Add_StepDependencies_iface-stderr.txt | 5 +++++ .../Add_StepDependencies_iface.cmake | 4 ++++ ...Add_StepDependencies_iface_step-result.txt | 1 + ...Add_StepDependencies_iface_step-stderr.txt | 5 +++++ .../Add_StepDependencies_iface_step.cmake | 11 ++++++++++ .../ExternalProject/RunCMakeTest.cmake | 2 ++ 10 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 Tests/RunCMake/ExternalProject/Add_StepDependencies_iface-result.txt create mode 100644 Tests/RunCMake/ExternalProject/Add_StepDependencies_iface-stderr.txt create mode 100644 Tests/RunCMake/ExternalProject/Add_StepDependencies_iface.cmake create mode 100644 Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step-result.txt create mode 100644 Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step-stderr.txt create mode 100644 Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step.cmake diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake index db3086c07..97bebc029 100644 --- a/Modules/ExternalProject.cmake +++ b/Modules/ExternalProject.cmake @@ -1539,6 +1539,11 @@ function(ExternalProject_Add_StepDependencies name step) message(FATAL_ERROR "Cannot find target \"${name}\". Perhaps it has not yet been created using ExternalProject_Add.") endif() + get_property(type TARGET ${name} PROPERTY TYPE) + if(NOT type STREQUAL "UTILITY") + message(FATAL_ERROR "Target \"${name}\" was not generated by ExternalProject_Add.") + endif() + get_property(is_ep TARGET ${name} PROPERTY _EP_IS_EXTERNAL_PROJECT) if(NOT is_ep) message(FATAL_ERROR "Target \"${name}\" was not generated by ExternalProject_Add.") @@ -1551,6 +1556,10 @@ function(ExternalProject_Add_StepDependencies name step) endif() if(TARGET ${name}-${step}) + get_property(type TARGET ${name}-${step} PROPERTY TYPE) + if(NOT type STREQUAL "UTILITY") + message(FATAL_ERROR "Target \"${name}-${step}\" was not generated by ExternalProject_Add_StepTargets.") + endif() get_property(is_ep_step TARGET ${name}-${step} PROPERTY _EP_IS_EXTERNAL_PROJECT_STEP) if(NOT is_ep_step) message(FATAL_ERROR "Target \"${name}-${step}\" was not generated by ExternalProject_Add_StepTargets.") @@ -2034,10 +2043,13 @@ function(_ep_add_configure_command name) set(file_deps) get_property(deps TARGET ${name} PROPERTY _EP_DEPENDS) foreach(dep IN LISTS deps) - get_property(is_ep TARGET ${dep} PROPERTY _EP_IS_EXTERNAL_PROJECT) - if(is_ep) - _ep_get_step_stampfile(${dep} "done" done_stamp_file) - list(APPEND file_deps ${done_stamp_file}) + get_property(dep_type TARGET ${dep} PROPERTY TYPE) + if(dep_type STREQUAL "UTILITY") + get_property(is_ep TARGET ${dep} PROPERTY _EP_IS_EXTERNAL_PROJECT) + if(is_ep) + _ep_get_step_stampfile(${dep} "done" done_stamp_file) + list(APPEND file_deps ${done_stamp_file}) + endif() endif() endforeach() diff --git a/Tests/ExternalProjectSubdir/CMakeLists.txt b/Tests/ExternalProjectSubdir/CMakeLists.txt index 013b4185c..e65087a8c 100644 --- a/Tests/ExternalProjectSubdir/CMakeLists.txt +++ b/Tests/ExternalProjectSubdir/CMakeLists.txt @@ -2,6 +2,19 @@ cmake_minimum_required(VERSION 3.2) project(ExternalProjectSubdir NONE) include(ExternalProject) +# Remove the custom target output to be sure it runs in an +# incremental test. Skip this on VS 6 because it sometimes +# re-runs CMake after the custom command runs. +if(NOT CMAKE_GENERATOR STREQUAL "Visual Studio 6") + file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/PreSubdir1.txt) +endif() + +add_custom_target(PreSubdir1 + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/PreSubdir1.txt + ) +add_library(PreSubdir1Interface INTERFACE) +add_dependencies(PreSubdir1Interface PreSubdir1) + ExternalProject_Add(Subdir1 SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Subdir1 BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/Subdir1 @@ -11,4 +24,6 @@ ExternalProject_Add(Subdir1 BUILD_COMMAND "" INSTALL_COMMAND "" + + DEPENDS PreSubdir1Interface ) diff --git a/Tests/ExternalProjectSubdir/Subdir1/CMakeLists.txt b/Tests/ExternalProjectSubdir/Subdir1/CMakeLists.txt index 28107f070..2303c3e88 100644 --- a/Tests/ExternalProjectSubdir/Subdir1/CMakeLists.txt +++ b/Tests/ExternalProjectSubdir/Subdir1/CMakeLists.txt @@ -8,3 +8,7 @@ endif() if(NOT "${GENEX_VAR}" STREQUAL "GENEX_VALUE") message(SEND_ERROR "GENEX_VAR != 'GENEX_VALUE'") endif() + +if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/../PreSubdir1.txt") + message(SEND_ERROR "../PreSubdir1.txt not provided!") +endif() diff --git a/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface-result.txt b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface-result.txt new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface-stderr.txt b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface-stderr.txt new file mode 100644 index 000000000..1c0b6017b --- /dev/null +++ b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface-stderr.txt @@ -0,0 +1,5 @@ +^CMake Error at .*/Modules/ExternalProject.cmake:[0-9]+ \(message\): + Target "SomeInterface" was not generated by ExternalProject_Add. +Call Stack \(most recent call first\): + Add_StepDependencies_iface.cmake:[0-9]+ \(ExternalProject_Add_StepDependencies\) + CMakeLists.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface.cmake b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface.cmake new file mode 100644 index 000000000..f7cfde1c2 --- /dev/null +++ b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface.cmake @@ -0,0 +1,4 @@ +include(ExternalProject) + +add_library(SomeInterface INTERFACE) +ExternalProject_Add_StepDependencies(SomeInterface step dep) diff --git a/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step-result.txt b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step-result.txt new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step-stderr.txt b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step-stderr.txt new file mode 100644 index 000000000..22e13bf9a --- /dev/null +++ b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step-stderr.txt @@ -0,0 +1,5 @@ +^CMake Error at .*/Modules/ExternalProject.cmake:[0-9]+ \(message\): + Target "MyProj-IFace" was not generated by ExternalProject_Add_StepTargets. +Call Stack \(most recent call first\): + Add_StepDependencies_iface_step.cmake:[0-9]+ \(ExternalProject_Add_StepDependencies\) + CMakeLists.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step.cmake b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step.cmake new file mode 100644 index 000000000..02894939b --- /dev/null +++ b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step.cmake @@ -0,0 +1,11 @@ +include(ExternalProject) + +ExternalProject_Add(MyProj + DOWNLOAD_COMMAND "" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + ) + +add_library(MyProj-IFace INTERFACE) +ExternalProject_Add_StepDependencies(MyProj IFace dep) diff --git a/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake b/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake index 0f5dcefb7..a82ffc96c 100644 --- a/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake +++ b/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake @@ -5,4 +5,6 @@ run_cmake(CMAKE_CACHE_DEFAULT_ARGS) run_cmake(CMAKE_CACHE_mix) run_cmake(NO_DEPENDS) run_cmake(Add_StepDependencies) +run_cmake(Add_StepDependencies_iface) +run_cmake(Add_StepDependencies_iface_step) run_cmake(Add_StepDependencies_no_target)