Browse Source

Merge topic 'ExternalProject-non-cmake-source-subdir'

c09ec79981 ExternalProject: support SOURCE_SUBDIR for BUILD_IN_SOURCE

Acked-by: Kitware Robot <[email protected]>
Merge-request: !2823
Brad King 6 years ago
parent
commit
02f7e997e9

+ 7 - 0
Help/release/dev/ExternalProject-non-cmake-source-subdir.rst

@@ -0,0 +1,7 @@
+ExternalProject-non-cmake-source-subdir
+---------------------------------------
+
+* The :module:`ExternalProject` module's ``ExternalProject_Add`` command
+  learned to apply ``SOURCE_SUBDIR`` when ``BUILD_IN_SOURCE`` is also used.
+  The ``BUILD_COMMAND`` is run in the given ``SOURCE_SUBDIR`` of the
+  ``SOURCE_DIR``.

+ 8 - 2
Modules/ExternalProject.cmake

@@ -425,7 +425,9 @@ External Project Definition
       can be used to point to an alternative directory within the source tree
       to use as the top of the CMake source tree instead. This must be a
       relative path and it will be interpreted as being relative to
-      ``SOURCE_DIR``.
+      ``SOURCE_DIR``.  When ``BUILD_IN_SOURCE 1`` is specified, the
+      ``BUILD_COMMAND`` is used to point to an alternative directory within the
+      source tree.
 
   **Build Step Options:**
     If the configure step assumed the external project uses CMake as its build
@@ -1676,7 +1678,11 @@ function(_ep_set_directories name)
   endif()
   if(build_in_source)
     get_property(source_dir TARGET ${name} PROPERTY _EP_SOURCE_DIR)
-    set_property(TARGET ${name} PROPERTY _EP_BINARY_DIR "${source_dir}")
+    if(source_subdir)
+      set_property(TARGET ${name} PROPERTY _EP_BINARY_DIR "${source_dir}/${source_subdir}")
+    else()
+      set_property(TARGET ${name} PROPERTY _EP_BINARY_DIR "${source_dir}")
+    endif()
   endif()
 
   # Make the directories at CMake configure time *and* add a custom command

+ 12 - 0
Tests/CMakeLists.txt

@@ -1638,6 +1638,18 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
     )
   list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/ExternalProjectSourceSubdir")
 
+  add_test(NAME ExternalProjectSourceSubdirNotCMake
+    COMMAND ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+    --build-and-test
+    "${CMake_SOURCE_DIR}/Tests/ExternalProjectSourceSubdirNotCMake"
+    "${CMake_BINARY_DIR}/Tests/ExternalProjectSourceSubdirNotCMake"
+    ${build_generator_args}
+    --build-project ExternalProjectSourceSubdirNotCMake
+    --force-new-ctest-process
+    --build-options ${build_options}
+    )
+  list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/ExternalProjectSourceSubdirNotCMake")
+
   add_test(ExternalProjectLocal ${CMAKE_CTEST_COMMAND}
     --build-and-test
     "${CMake_SOURCE_DIR}/Tests/ExternalProjectLocal"

+ 20 - 0
Tests/ExternalProjectSourceSubdirNotCMake/CMakeLists.txt

@@ -0,0 +1,20 @@
+cmake_minimum_required(VERSION 3.6)
+project(ExternalProjectSourceSubdirNotCMake NONE)
+include(ExternalProject)
+
+find_program(MAKE_EXECUTABLE
+  NAMES gmake make)
+
+if (NOT MAKE_EXECUTABLE)
+  message("No `make` executable found; skipping")
+  return ()
+endif ()
+
+ExternalProject_Add(Example
+  SOURCE_SUBDIR subdir
+  BUILD_IN_SOURCE 1
+  SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Example
+  CONFIGURE_COMMAND ""
+  BUILD_COMMAND "${MAKE_EXECUTABLE}"
+  INSTALL_COMMAND ""
+  )

+ 2 - 0
Tests/ExternalProjectSourceSubdirNotCMake/Example/subdir/Makefile

@@ -0,0 +1,2 @@
+all:
+	echo "complete"