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 7 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
       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
       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
       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:**
   **Build Step Options:**
     If the configure step assumed the external project uses CMake as its build
     If the configure step assumed the external project uses CMake as its build
@@ -1676,7 +1678,11 @@ function(_ep_set_directories name)
   endif()
   endif()
   if(build_in_source)
   if(build_in_source)
     get_property(source_dir TARGET ${name} PROPERTY _EP_SOURCE_DIR)
     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()
   endif()
 
 
   # Make the directories at CMake configure time *and* add a custom command
   # 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")
   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}
   add_test(ExternalProjectLocal ${CMAKE_CTEST_COMMAND}
     --build-and-test
     --build-and-test
     "${CMake_SOURCE_DIR}/Tests/ExternalProjectLocal"
     "${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"