Skip to content

Commit 8f8b155

Browse files
committed
resolve #419: use cmake 'EVAL CODE' to forward arguments passed to 'module' cmake function
Signed-off-by: Benoit Dumas <[email protected]>
1 parent 2fbb824 commit 8f8b155

File tree

2 files changed

+27
-54
lines changed

2 files changed

+27
-54
lines changed

tcl/envmngt.tcl.in

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,13 +1178,10 @@ end}
11781178
}
11791179
cmake {
11801180
if {[getConf quarantine_support]} {
1181-
set pre_exec "\n execute_process(COMMAND \${_mlre} $tclshbin\
1182-
\"$::argv0\" cmake "
1181+
set pre_exec "COMMAND \${_mlre} $tclshbin \\\"$::argv0\\\" cmake "
11831182
} else {
1184-
set pre_exec "\n execute_process(COMMAND $tclshbin\
1185-
\"$::argv0\" cmake "
1183+
set pre_exec "COMMAND $tclshbin \\\"$::argv0\\\" cmake "
11861184
}
1187-
set post_exec "\n OUTPUT_FILE \${tempfile_name})\n"
11881185
set fdef {function(module)
11891186
cmake_policy(SET CMP0007 NEW)}
11901187
if {[getConf quarantine_support]} {
@@ -1211,23 +1208,17 @@ end}
12111208
execute_process(COMMAND mktemp -t moduleinit.cmake.XXXXXXXXXXXX
12121209
OUTPUT_VARIABLE tempfile_name
12131210
OUTPUT_STRIP_TRAILING_WHITESPACE)
1214-
if(${ARGC} EQUAL 1)}
1215-
# adapt command definition depending on the number of args to be
1216-
# able to pass to some extend (<5 args) empty string element to
1217-
# modulecmd (no other way as empty element in ${ARGV} are skipped
1218-
append fdef "$pre_exec\"\${ARGV0}\"$post_exec"
1219-
append fdef { elseif(${ARGC} EQUAL 2)}
1220-
append fdef "$pre_exec\"\${ARGV0}\" \"\${ARGV1}\"$post_exec"
1221-
append fdef { elseif(${ARGC} EQUAL 3)}
1222-
append fdef "$pre_exec\"\${ARGV0}\" \"\${ARGV1}\"\
1223-
\"\${ARGV2}\"$post_exec"
1224-
append fdef { elseif(${ARGC} EQUAL 4)}
1225-
append fdef "$pre_exec\"\${ARGV0}\" \"\${ARGV1}\"\
1226-
\"\${ARGV2}\" \"\${ARGV3}\"$post_exec"
1227-
append fdef { else()}
1228-
append fdef "$pre_exec\${ARGV}$post_exec"
1229-
append fdef { endif()
1230-
if(EXISTS ${tempfile_name})
1211+
}
1212+
append fdef " set(quotedArgs \"$pre_exec\")"
1213+
append fdef {
1214+
cmake_parse_arguments(PARSE_ARGV 0 FWD "" "" "")
1215+
foreach(arg IN LISTS FWD_UNPARSED_ARGUMENTS)
1216+
string(APPEND quotedArgs " [===[${arg}]===]")
1217+
endforeach()
1218+
string(APPEND quotedArgs " OUTPUT_FILE ${tempfile_name}")
1219+
cmake_language(EVAL CODE "execute_process(${quotedArgs})")
1220+
}
1221+
append fdef { if(EXISTS ${tempfile_name})
12311222
include(${tempfile_name})
12321223
file(REMOVE ${tempfile_name})
12331224
endif()

testsuite/modules.70-maint/120-autoinit.exp

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -427,22 +427,13 @@ set func_cmake "function\\\(module\\\)
427427
\\s*execute_process\\\(COMMAND mktemp -t moduleinit.cmake.XXXXXXXXXXXX
428428
\\s*OUTPUT_VARIABLE tempfile_name
429429
\\s*OUTPUT_STRIP_TRAILING_WHITESPACE\\\)
430-
\\s*if\\\(\\\${ARGC} EQUAL 1\\\)
431-
\\s*execute_process\\\(COMMAND \\\${_mlre} $tclshlocre \"$modulecmd_pathre\" cmake \"\\\${ARGV0}\"
432-
\\s*OUTPUT_FILE \\\${tempfile_name}\\\)
433-
\\s*elseif\\\(\\\${ARGC} EQUAL 2\\\)
434-
\\s*execute_process\\\(COMMAND \\\${_mlre} $tclshlocre \"$modulecmd_pathre\" cmake \"\\\${ARGV0}\" \"\\\${ARGV1}\"
435-
\\s*OUTPUT_FILE \\\${tempfile_name}\\\)
436-
\\s*elseif\\\(\\\${ARGC} EQUAL 3\\\)
437-
\\s*execute_process\\\(COMMAND \\\${_mlre} $tclshlocre \"$modulecmd_pathre\" cmake \"\\\${ARGV0}\" \"\\\${ARGV1}\" \"\\\${ARGV2}\"
438-
\\s*OUTPUT_FILE \\\${tempfile_name}\\\)
439-
\\s*elseif\\\(\\\${ARGC} EQUAL 4\\\)
440-
\\s*execute_process\\\(COMMAND \\\${_mlre} $tclshlocre \"$modulecmd_pathre\" cmake \"\\\${ARGV0}\" \"\\\${ARGV1}\" \"\\\${ARGV2}\" \"\\\${ARGV3}\"
441-
\\s*OUTPUT_FILE \\\${tempfile_name}\\\)
442-
\\s*else\\\(\\\)
443-
\\s*execute_process\\\(COMMAND \\\${_mlre} $tclshlocre \"$modulecmd_pathre\" cmake \\\${ARGV}
444-
\\s*OUTPUT_FILE \\\${tempfile_name}\\\)
445-
\\s*endif\\\(\\\)
430+
\\s*set\\\(quotedArgs \"COMMAND2 \\\${_mlre} $tclshlocre \\\\\"$modulecmd_pathre\\\\\" cmake \"\\\)
431+
\\s*cmake_parse_arguments\\\(PARSE_ARGV 0 FWD \"\" \"\" \"\"\\\)
432+
\\s*foreach\\\(arg IN LISTS FWD_UNPARSED_ARGUMENTS\\\)
433+
\\s*string\\\(APPEND quotedArgs \" \\\[===\\\[\\\${arg}\\\]===\\\]\"\\\)
434+
\\s*endforeach\\\(\\\)
435+
\\s*string\\\(APPEND quotedArgs \" OUTPUT_FILE \\\${tempfile_name}\"\\\)
436+
\\s*cmake_language\\\(EVAL CODE \"execute_process\\\(\\\${quotedArgs}\\\)\"\\\)
446437
\\s*if\\\(EXISTS \\\${tempfile_name}\\\)
447438
\\s*include\\\(\\\${tempfile_name}\\\)
448439
\\s*file\\\(REMOVE \\\${tempfile_name}\\\)
@@ -619,22 +610,13 @@ set func_cmake "function\\\(module\\\)
619610
\\s*execute_process\\\(COMMAND mktemp -t moduleinit.cmake.XXXXXXXXXXXX
620611
\\s*OUTPUT_VARIABLE tempfile_name
621612
\\s*OUTPUT_STRIP_TRAILING_WHITESPACE\\\)
622-
\\s*if\\\(\\\${ARGC} EQUAL 1\\\)
623-
\\s*execute_process\\\(COMMAND $tclshlocre \"$modulecmd_pathre\" cmake \"\\\${ARGV0}\"
624-
\\s*OUTPUT_FILE \\\${tempfile_name}\\\)
625-
\\s*elseif\\\(\\\${ARGC} EQUAL 2\\\)
626-
\\s*execute_process\\\(COMMAND $tclshlocre \"$modulecmd_pathre\" cmake \"\\\${ARGV0}\" \"\\\${ARGV1}\"
627-
\\s*OUTPUT_FILE \\\${tempfile_name}\\\)
628-
\\s*elseif\\\(\\\${ARGC} EQUAL 3\\\)
629-
\\s*execute_process\\\(COMMAND $tclshlocre \"$modulecmd_pathre\" cmake \"\\\${ARGV0}\" \"\\\${ARGV1}\" \"\\\${ARGV2}\"
630-
\\s*OUTPUT_FILE \\\${tempfile_name}\\\)
631-
\\s*elseif\\\(\\\${ARGC} EQUAL 4\\\)
632-
\\s*execute_process\\\(COMMAND $tclshlocre \"$modulecmd_pathre\" cmake \"\\\${ARGV0}\" \"\\\${ARGV1}\" \"\\\${ARGV2}\" \"\\\${ARGV3}\"
633-
\\s*OUTPUT_FILE \\\${tempfile_name}\\\)
634-
\\s*else\\\(\\\)
635-
\\s*execute_process\\\(COMMAND $tclshlocre \"$modulecmd_pathre\" cmake \\\${ARGV}
636-
\\s*OUTPUT_FILE \\\${tempfile_name}\\\)
637-
\\s*endif\\\(\\\)
613+
\\s*set\\\(quotedArgs \"COMMAND $tclshlocre \\\\\"$modulecmd_pathre\\\\\" cmake \"\\\)
614+
\\s*cmake_parse_arguments\\\(PARSE_ARGV 0 FWD \"\" \"\" \"\"\\\)
615+
\\s*foreach\\\(arg IN LISTS FWD_UNPARSED_ARGUMENTS\\\)
616+
\\s*string\\\(APPEND quotedArgs \" \\\[===\\\[\\\${arg}\\\]===\\\]\"\\\)
617+
\\s*endforeach\\\(\\\)
618+
\\s*string\\\(APPEND quotedArgs \" OUTPUT_FILE \\\${tempfile_name}\"\\\)
619+
\\s*cmake_language\\\(EVAL CODE \"execute_process\\\(\\\${quotedArgs}\\\)\"\\\)
638620
\\s*if\\\(EXISTS \\\${tempfile_name}\\\)
639621
\\s*include\\\(\\\${tempfile_name}\\\)
640622
\\s*file\\\(REMOVE \\\${tempfile_name}\\\)

0 commit comments

Comments
 (0)