Browse Source

ExternalProject: Allow generator expressions with LOG_* options (#15287)

Use file(GENERATE) to write the logging wrapper scripts to evaluate
generator expressions.  Use a per-config script names in case the
content varies by configuration.
Andrey Pokrovskiy 10 years ago
parent
commit
0273ef1469

+ 10 - 4
Modules/ExternalProject.cmake

@@ -106,6 +106,8 @@ Create custom targets to build projects in external trees
     :manual:`CMake Options <cmake(1)>`. 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-generator-expressions(7)>`.
   ``CMAKE_CACHE_ARGS <arg>...``
     Initial cache arguments, of the form ``-Dvar:string=on``.
     These arguments are written in a pre-load a script that populates
@@ -271,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 ``<step>_COMMAND`` or ``COMMAND`` options may use
+:manual:`generator expressions <cmake-generator-expressions(7)>`.
+
 .. command:: ExternalProject_Get_Property
 
   The ``ExternalProject_Get_Property`` function retrieves external project
@@ -1303,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}-$<CONFIG>-impl.cmake" CONTENT "${code}")
+    set(command ${CMAKE_COMMAND} "-Dmake=\${make}" "-Dconfig=\${config}" -P ${stamp_dir}/${name}-${step}-$<CONFIG>-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}-$<CONFIG>.cmake)
   set(logbase ${stamp_dir}/${name}-${step})
-  file(WRITE ${script} "
+  set(code "
 ${code_cygpath_make}
 set(command \"${command}\")
 execute_process(
@@ -1331,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()

+ 1 - 1
Tests/ExternalProjectSubdir/CMakeLists.txt

@@ -6,7 +6,7 @@ ExternalProject_Add(Subdir1
   SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Subdir1
   BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/Subdir1
 
-  CMAKE_ARGS -DNORMAL_VAR=NORMAL_VALUE
+  CMAKE_ARGS -DNORMAL_VAR=NORMAL_VALUE -DGENEX_VAR=$<1:GENEX_VALUE>
   LOG_CONFIGURE 1
 
   BUILD_COMMAND ""

+ 4 - 0
Tests/ExternalProjectSubdir/Subdir1/CMakeLists.txt

@@ -4,3 +4,7 @@ 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()