Browse Source

ExternalProject: Allow generator expressions in initial cache options

Use file(GENERATE) to write the initial cache file so that we can
evaluate generator expressions.  Use a per-config initial cache file
name in case the content varies by configuration.
Andrey Pokrovskiy 10 năm trước cách đây
mục cha
commit
7bd8cfb813

+ 6 - 5
Modules/ExternalProject.cmake

@@ -113,6 +113,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-generator-expressions(7)>`.
   ``CMAKE_CACHE_DEFAULT_ARGS <arg>...``
     Initial default cache arguments, of the form ``-Dvar:string=on``.
     These arguments are written in a pre-load a script that populates
@@ -121,6 +123,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 <cmake-generator-expressions(7)>`.
 
   Build step options are:
 
@@ -1126,10 +1130,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()
 
 
@@ -2054,7 +2055,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-$<CONFIG>.cmake")
       if(cmake_cache_args)
         _ep_command_line_to_initial_cache(script_initial_cache_force "${cmake_cache_args}" 1)
       endif()

+ 1 - 1
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")

+ 4 - 1
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>")

+ 1 - 1
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")

+ 4 - 1
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>")

+ 1 - 1
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")

+ 5 - 2
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>")