diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake index c575a7315..542dbc2bf 100644 --- a/Modules/ExternalProject.cmake +++ b/Modules/ExternalProject.cmake @@ -554,23 +554,36 @@ function(_ep_write_initial_cache script_filename args) # Write out values into an initial cache, that will be passed to CMake with -C set(script_initial_cache "") set(regex "^([^:]+):([^=]+)=(.*)$") + set(setArg "") foreach(line ${args}) - string(REGEX REPLACE "^-D" "" line ${line}) - if("${line}" MATCHES "${regex}") - string(REGEX MATCH "${regex}" match "${line}") - set(name "${CMAKE_MATCH_1}") - set(type "${CMAKE_MATCH_2}") - set(value "${CMAKE_MATCH_3}") - set(setArg "set(${name} \"${value}\" CACHE ${type} \"Initial cache\" FORCE)") - set(script_initial_cache "${script_initial_cache}\n${setArg}") + if("${line}" MATCHES "^-D") + if(setArg) + # This is required to build up lists in variables, or complete an entry + set(setArg "${setArg}${accumulator}\" CACHE ${type} \"Initial cache\" FORCE)") + set(script_initial_cache "${script_initial_cache}\n${setArg}") + set(accumulator "") + set(setArg "") + endif() + string(REGEX REPLACE "^-D" "" line ${line}) + if("${line}" MATCHES "${regex}") + string(REGEX MATCH "${regex}" match "${line}") + set(name "${CMAKE_MATCH_1}") + set(type "${CMAKE_MATCH_2}") + set(value "${CMAKE_MATCH_3}") + set(setArg "set(${name} \"${value}") + else() + message(WARNING "Line '${line}' does not match regex. Ignoring.") + endif() + else() + # Assume this is a list to append to the last var + set(accumulator "${accumulator};${line}") endif() endforeach() # 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") + file(WRITE "${script_filename}.in" "\@script_initial_cache\@\n") endif() configure_file("${script_filename}.in" "${script_filename}") - endfunction(_ep_write_initial_cache) @@ -1251,7 +1264,7 @@ function(_ep_add_configure_command name) # If there are any CMAKE_CACHE_ARGS, write an initial cache and use it get_property(cmake_cache_args TARGET ${name} PROPERTY _EP_CMAKE_CACHE_ARGS) if(cmake_cache_args) - set(_ep_cache_args_script "${CMAKE_CURRENT_BINARY_DIR}/${name}-cache.cmake") + set(_ep_cache_args_script "${tmp_dir}/${name}-cache.cmake") _ep_write_initial_cache("${_ep_cache_args_script}" "${cmake_cache_args}") list(APPEND cmd "-C${_ep_cache_args_script}") endif() @@ -1274,7 +1287,7 @@ function(_ep_add_configure_command name) # Fixes issue http://public.kitware.com/Bug/view.php?id=10258 # if(NOT EXISTS ${tmp_dir}/${name}-cfgcmd.txt.in) - file(WRITE ${tmp_dir}/${name}-cfgcmd.txt.in "cmd='@cmd@'\n") + file(WRITE ${tmp_dir}/${name}-cfgcmd.txt.in "cmd='\@cmd\@'\n") endif() configure_file(${tmp_dir}/${name}-cfgcmd.txt.in ${tmp_dir}/${name}-cfgcmd.txt) list(APPEND file_deps ${tmp_dir}/${name}-cfgcmd.txt)