diff --git a/Help/release/dev/ExternalProject-genex.rst b/Help/release/dev/ExternalProject-genex.rst new file mode 100644 index 000000000..2c7bf8adb --- /dev/null +++ b/Help/release/dev/ExternalProject-genex.rst @@ -0,0 +1,6 @@ +ExternalProject-genex +--------------------- + +* The :module:`ExternalProject` module APIs learned to support + :manual:`generator expressions ` + when using ``LOG_*`` options and in CMake initial cache options. diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake index 0c73d41a2..d9b6842b5 100644 --- a/Modules/ExternalProject.cmake +++ b/Modules/ExternalProject.cmake @@ -106,6 +106,8 @@ Create custom targets to build projects in external trees :manual:`CMake Options `. Arguments in the form ``-Dvar:string=on`` are always passed to the command line, and therefore cannot be changed by the user. + Arguments may use + :manual:`generator expressions `. ``CMAKE_CACHE_ARGS ...`` Initial cache arguments, of the form ``-Dvar:string=on``. These arguments are written in a pre-load a script that populates @@ -113,6 +115,8 @@ Create custom targets to build projects in external trees overcome command line length limits. These arguments are :command:`set` using the ``FORCE`` argument, and therefore cannot be changed by the user. + Arguments may use + :manual:`generator expressions `. ``CMAKE_CACHE_DEFAULT_ARGS ...`` Initial default cache arguments, of the form ``-Dvar:string=on``. These arguments are written in a pre-load a script that populates @@ -121,6 +125,8 @@ Create custom targets to build projects in external trees These arguments can be used as default value that will be set if no previous value is found in the cache, and that the user can change later. + Arguments may use + :manual:`generator expressions `. Build step options are: @@ -267,6 +273,9 @@ specifies to run ``make`` and then ``echo done`` during the build step. Whether the current working directory is preserved between commands is not defined. Behavior of shell operators like ``&&`` is not defined. +Arguments to ``_COMMAND`` or ``COMMAND`` options may use +:manual:`generator expressions `. + .. command:: ExternalProject_Get_Property The ``ExternalProject_Get_Property`` function retrieves external project @@ -1126,10 +1135,7 @@ function(_ep_write_initial_cache target_name script_filename script_initial_cach # Replace location tags. _ep_replace_location_tags(${target_name} script_initial_cache) # Write out the initial cache file to the location specified. - if(NOT EXISTS "${script_filename}.in") - file(WRITE "${script_filename}.in" "\@script_initial_cache\@\n") - endif() - configure_file("${script_filename}.in" "${script_filename}") + file(GENERATE OUTPUT "${script_filename}" CONTENT "${script_initial_cache}") endfunction() @@ -1302,14 +1308,14 @@ endif() endif() endforeach() set(code "${code}set(command \"${cmd}\")${code_execute_process}") - file(WRITE ${stamp_dir}/${name}-${step}-impl.cmake "${code}") - set(command ${CMAKE_COMMAND} "-Dmake=\${make}" "-Dconfig=\${config}" -P ${stamp_dir}/${name}-${step}-impl.cmake) + file(GENERATE OUTPUT "${stamp_dir}/${name}-${step}-$-impl.cmake" CONTENT "${code}") + set(command ${CMAKE_COMMAND} "-Dmake=\${make}" "-Dconfig=\${config}" -P ${stamp_dir}/${name}-${step}-$-impl.cmake) endif() # Wrap the command in a script to log output to files. - set(script ${stamp_dir}/${name}-${step}.cmake) + set(script ${stamp_dir}/${name}-${step}-$.cmake) set(logbase ${stamp_dir}/${name}-${step}) - file(WRITE ${script} " + set(code " ${code_cygpath_make} set(command \"${command}\") execute_process( @@ -1330,6 +1336,7 @@ else() message(STATUS \"\${msg}\") endif() ") + file(GENERATE OUTPUT "${script}" CONTENT "${code}") set(command ${CMAKE_COMMAND} ${make} ${config} -P ${script}) set(${cmd_var} "${command}" PARENT_SCOPE) endfunction() @@ -2054,7 +2061,7 @@ function(_ep_add_configure_command name) get_property(cmake_cache_default_args TARGET ${name} PROPERTY _EP_CMAKE_CACHE_DEFAULT_ARGS) if(cmake_cache_args OR cmake_cache_default_args) - set(_ep_cache_args_script "${tmp_dir}/${name}-cache.cmake") + set(_ep_cache_args_script "${tmp_dir}/${name}-cache-$.cmake") if(cmake_cache_args) _ep_command_line_to_initial_cache(script_initial_cache_force "${cmake_cache_args}" 1) endif() diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index d568a6418..eb4dd6b73 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -1326,6 +1326,18 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release set_tests_properties(ExternalProject PROPERTIES TIMEOUT ${CMAKE_LONG_TEST_TIMEOUT}) + add_test(NAME ExternalProjectSubdir + COMMAND ${CMAKE_CTEST_COMMAND} -C $ + --build-and-test + "${CMake_SOURCE_DIR}/Tests/ExternalProjectSubdir" + "${CMake_BINARY_DIR}/Tests/ExternalProjectSubdir" + ${build_generator_args} + --build-project ExternalProjectSubdir + --force-new-ctest-process + --build-options ${build_options} + ) + list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/ExternalProjectSubdir") + add_test(ExternalProjectLocal ${CMAKE_CTEST_COMMAND} --build-and-test "${CMake_SOURCE_DIR}/Tests/ExternalProjectLocal" diff --git a/Tests/ExternalProjectSubdir/CMakeLists.txt b/Tests/ExternalProjectSubdir/CMakeLists.txt new file mode 100644 index 000000000..013b4185c --- /dev/null +++ b/Tests/ExternalProjectSubdir/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.2) +project(ExternalProjectSubdir NONE) +include(ExternalProject) + +ExternalProject_Add(Subdir1 + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Subdir1 + BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/Subdir1 + + CMAKE_ARGS -DNORMAL_VAR=NORMAL_VALUE -DGENEX_VAR=$<1:GENEX_VALUE> + LOG_CONFIGURE 1 + + BUILD_COMMAND "" + INSTALL_COMMAND "" + ) diff --git a/Tests/ExternalProjectSubdir/Subdir1/CMakeLists.txt b/Tests/ExternalProjectSubdir/Subdir1/CMakeLists.txt new file mode 100644 index 000000000..28107f070 --- /dev/null +++ b/Tests/ExternalProjectSubdir/Subdir1/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.2) +project(Subdir1 NONE) + +if(NOT "${NORMAL_VAR}" STREQUAL "NORMAL_VALUE") + message(SEND_ERROR "NORMAL_VAR != 'NORMAL_VALUE'") +endif() + +if(NOT "${GENEX_VAR}" STREQUAL "GENEX_VALUE") + message(SEND_ERROR "GENEX_VAR != 'GENEX_VALUE'") +endif() diff --git a/Tests/RunCMake/ExternalProject/CMAKE_CACHE_ARGS-check.cmake b/Tests/RunCMake/ExternalProject/CMAKE_CACHE_ARGS-check.cmake index c1e42043d..c350a63fc 100644 --- a/Tests/RunCMake/ExternalProject/CMAKE_CACHE_ARGS-check.cmake +++ b/Tests/RunCMake/ExternalProject/CMAKE_CACHE_ARGS-check.cmake @@ -1,4 +1,4 @@ -set(_cache_file "${RunCMake_TEST_BINARY_DIR}/tmp/FOO-cache.cmake") +set(_cache_file "${RunCMake_TEST_BINARY_DIR}/tmp/FOO-cache-Debug.cmake") if(NOT EXISTS "${_cache_file}") set(RunCMake_TEST_FAILED "Initial cache not created") diff --git a/Tests/RunCMake/ExternalProject/CMAKE_CACHE_ARGS.cmake b/Tests/RunCMake/ExternalProject/CMAKE_CACHE_ARGS.cmake index 5e37eece6..62b164040 100644 --- a/Tests/RunCMake/ExternalProject/CMAKE_CACHE_ARGS.cmake +++ b/Tests/RunCMake/ExternalProject/CMAKE_CACHE_ARGS.cmake @@ -1,5 +1,8 @@ +if(NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE Debug) +endif() include(ExternalProject) ExternalProject_Add(FOO TMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/tmp" DOWNLOAD_COMMAND "" - CMAKE_CACHE_ARGS "-DFOO:STRING=BAR") + CMAKE_CACHE_ARGS "-DFOO:STRING=$<1:BAR>$<0:BAD>") diff --git a/Tests/RunCMake/ExternalProject/CMAKE_CACHE_DEFAULT_ARGS-check.cmake b/Tests/RunCMake/ExternalProject/CMAKE_CACHE_DEFAULT_ARGS-check.cmake index ec1cafb1e..aeee11fa0 100644 --- a/Tests/RunCMake/ExternalProject/CMAKE_CACHE_DEFAULT_ARGS-check.cmake +++ b/Tests/RunCMake/ExternalProject/CMAKE_CACHE_DEFAULT_ARGS-check.cmake @@ -1,4 +1,4 @@ -set(_cache_file "${RunCMake_TEST_BINARY_DIR}/tmp/FOO-cache.cmake") +set(_cache_file "${RunCMake_TEST_BINARY_DIR}/tmp/FOO-cache-Debug.cmake") if(NOT EXISTS "${_cache_file}") set(RunCMake_TEST_FAILED "Initial cache not created") diff --git a/Tests/RunCMake/ExternalProject/CMAKE_CACHE_DEFAULT_ARGS.cmake b/Tests/RunCMake/ExternalProject/CMAKE_CACHE_DEFAULT_ARGS.cmake index 8e984706b..3a83dbe38 100644 --- a/Tests/RunCMake/ExternalProject/CMAKE_CACHE_DEFAULT_ARGS.cmake +++ b/Tests/RunCMake/ExternalProject/CMAKE_CACHE_DEFAULT_ARGS.cmake @@ -1,5 +1,8 @@ +if(NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE Debug) +endif() include(ExternalProject) ExternalProject_Add(FOO TMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/tmp" DOWNLOAD_COMMAND "" - CMAKE_CACHE_DEFAULT_ARGS "-DFOO:STRING=BAR") + CMAKE_CACHE_DEFAULT_ARGS "-DFOO:STRING=$<1:BAR>$<0:BAD>") diff --git a/Tests/RunCMake/ExternalProject/CMAKE_CACHE_mix-check.cmake b/Tests/RunCMake/ExternalProject/CMAKE_CACHE_mix-check.cmake index 2a07f27e5..04d49b9e4 100644 --- a/Tests/RunCMake/ExternalProject/CMAKE_CACHE_mix-check.cmake +++ b/Tests/RunCMake/ExternalProject/CMAKE_CACHE_mix-check.cmake @@ -1,4 +1,4 @@ -set(_cache_file "${RunCMake_TEST_BINARY_DIR}/tmp/FOO-cache.cmake") +set(_cache_file "${RunCMake_TEST_BINARY_DIR}/tmp/FOO-cache-Debug.cmake") if(NOT EXISTS "${_cache_file}") set(RunCMake_TEST_FAILED "Initial cache not created") diff --git a/Tests/RunCMake/ExternalProject/CMAKE_CACHE_mix.cmake b/Tests/RunCMake/ExternalProject/CMAKE_CACHE_mix.cmake index e7f26ae0a..192776ba7 100644 --- a/Tests/RunCMake/ExternalProject/CMAKE_CACHE_mix.cmake +++ b/Tests/RunCMake/ExternalProject/CMAKE_CACHE_mix.cmake @@ -1,6 +1,9 @@ +if(NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE Debug) +endif() include(ExternalProject) ExternalProject_Add(FOO TMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/tmp" DOWNLOAD_COMMAND "" - CMAKE_CACHE_ARGS "-DFOO:STRING=BAR" - CMAKE_CACHE_DEFAULT_ARGS "-DBAR:STRING=BAZ") + CMAKE_CACHE_ARGS "-DFOO:STRING=$<1:BAR>$<0:BAD>" + CMAKE_CACHE_DEFAULT_ARGS "-DBAR:STRING=$<1:BAZ>$<0:BAD>")