Skip to content

Commit d894760

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 d894760

File tree

2 files changed

+35
-60
lines changed

2 files changed

+35
-60
lines changed

tcl/envmngt.tcl.in

Lines changed: 17 additions & 25 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]} {
@@ -1195,14 +1192,15 @@ end}
11951192
foreach(_mlv ${_mlv_list})
11961193
if(${_mlv} MATCHES "^[A-Za-z_][A-Za-z0-9_]*$")
11971194
if(DEFINED ENV{${_mlv}})
1198-
set(_mlre "${_mlre}__MODULES_QUAR_${_mlv}=$ENV{${_mlv}};")
1195+
string(APPEND _mlre
1196+
" [===[__MODULES_QUAR_${_mlv}=$ENV{${_mlv}}]===]")
11991197
endif()
12001198
set(_mlrv "MODULES_RUNENV_${_mlv}")
1201-
set(_mlre "${_mlre}${_mlv}=$ENV{${_mlrv}};")
1199+
string(APPEND _mlre " [===[${_mlv}=$ENV{${_mlrv}}]===]")
12021200
endif()
12031201
endforeach()
12041202
if (NOT "${_mlre}" STREQUAL "")
1205-
set(_mlre "env;${_mlre}__MODULES_QUARANTINE_SET=1;")
1203+
set(_mlre "env ${_mlre} __MODULES_QUARANTINE_SET=1")
12061204
endif()
12071205
endif()}
12081206
}
@@ -1211,23 +1209,17 @@ end}
12111209
execute_process(COMMAND mktemp -t moduleinit.cmake.XXXXXXXXXXXX
12121210
OUTPUT_VARIABLE tempfile_name
12131211
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})
1212+
}
1213+
append fdef " set(quotedArgs \"$pre_exec\")"
1214+
append fdef {
1215+
cmake_parse_arguments(PARSE_ARGV 0 FWD "" "" "")
1216+
foreach(arg IN LISTS FWD_UNPARSED_ARGUMENTS)
1217+
string(APPEND quotedArgs " [===[${arg}]===]")
1218+
endforeach()
1219+
string(APPEND quotedArgs " OUTPUT_FILE ${tempfile_name}")
1220+
cmake_language(EVAL CODE "execute_process(${quotedArgs})")
1221+
}
1222+
append fdef { if(EXISTS ${tempfile_name})
12311223
include(${tempfile_name})
12321224
file(REMOVE ${tempfile_name})
12331225
endif()

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

Lines changed: 18 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -413,36 +413,28 @@ set func_cmake "function\\\(module\\\)
413413
\\s*foreach\\\(_mlv \\\${_mlv_list}\\\)
414414
\\s*if\\\(\\\${_mlv} MATCHES \"\\\^\\\[A-Za-z_\\\]\\\[A-Za-z0-9_\\\]\\\*\\\$\"\\\)
415415
\\s*if\\\(DEFINED ENV{\\\${_mlv}}\\\)
416-
\\s*set\\\(_mlre \"\\\${_mlre}__MODULES_QUAR_\\\${_mlv}=\\\$ENV{\\\${_mlv}};\"\\\)
416+
\\s*string\\\(APPEND _mlre
417+
\\s*\" \\\[===\\\[__MODULES_QUAR_\\\${_mlv}=\\\$ENV{\\\${_mlv}}\\\]===\\\]\"\\\)
417418
\\s*endif\\\(\\\)
418419
\\s*set\\\(_mlrv \"MODULES_RUNENV_\\\${_mlv}\"\\\)
419-
\\s*set\\\(_mlre \"\\\${_mlre}\\\${_mlv}=\\\$ENV{\\\${_mlrv}};\"\\\)
420+
\\s*string\\\(APPEND _mlre \" \\\[===\\\[\\\${_mlv}=\\\$ENV{\\\${_mlrv}}\\\]===\\\]\"\\\)
420421
\\s*endif\\\(\\\)
421422
\\s*endforeach\\\(\\\)
422423
\\s*if \\\(NOT \"\\\${_mlre}\" STREQUAL \"\"\\\)
423-
\\s*set\\\(_mlre \"env;\\\${_mlre}__MODULES_QUARANTINE_SET=1;\"\\\)
424+
\\s*set\\\(_mlre \"env \\\${_mlre} __MODULES_QUARANTINE_SET=1\"\\\)
424425
\\s*endif\\\(\\\)
425426
\\s*endif\\\(\\\)
426427
\\s*set\\\(_mlstatus TRUE\\\)
427428
\\s*execute_process\\\(COMMAND mktemp -t moduleinit.cmake.XXXXXXXXXXXX
428429
\\s*OUTPUT_VARIABLE tempfile_name
429430
\\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\\\(\\\)
431+
\\s*set\\\(quotedArgs \"COMMAND \\\${_mlre} $tclshlocre \\\\\"$modulecmd_pathre\\\\\" cmake \"\\\)
432+
\\s*cmake_parse_arguments\\\(PARSE_ARGV 0 FWD \"\" \"\" \"\"\\\)
433+
\\s*foreach\\\(arg IN LISTS FWD_UNPARSED_ARGUMENTS\\\)
434+
\\s*string\\\(APPEND quotedArgs \" \\\[===\\\[\\\${arg}\\\]===\\\]\"\\\)
435+
\\s*endforeach\\\(\\\)
436+
\\s*string\\\(APPEND quotedArgs \" OUTPUT_FILE \\\${tempfile_name}\"\\\)
437+
\\s*cmake_language\\\(EVAL CODE \"execute_process\\\(\\\${quotedArgs}\\\)\"\\\)
446438
\\s*if\\\(EXISTS \\\${tempfile_name}\\\)
447439
\\s*include\\\(\\\${tempfile_name}\\\)
448440
\\s*file\\\(REMOVE \\\${tempfile_name}\\\)
@@ -619,22 +611,13 @@ set func_cmake "function\\\(module\\\)
619611
\\s*execute_process\\\(COMMAND mktemp -t moduleinit.cmake.XXXXXXXXXXXX
620612
\\s*OUTPUT_VARIABLE tempfile_name
621613
\\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\\\(\\\)
614+
\\s*set\\\(quotedArgs \"COMMAND $tclshlocre \\\\\"$modulecmd_pathre\\\\\" cmake \"\\\)
615+
\\s*cmake_parse_arguments\\\(PARSE_ARGV 0 FWD \"\" \"\" \"\"\\\)
616+
\\s*foreach\\\(arg IN LISTS FWD_UNPARSED_ARGUMENTS\\\)
617+
\\s*string\\\(APPEND quotedArgs \" \\\[===\\\[\\\${arg}\\\]===\\\]\"\\\)
618+
\\s*endforeach\\\(\\\)
619+
\\s*string\\\(APPEND quotedArgs \" OUTPUT_FILE \\\${tempfile_name}\"\\\)
620+
\\s*cmake_language\\\(EVAL CODE \"execute_process\\\(\\\${quotedArgs}\\\)\"\\\)
638621
\\s*if\\\(EXISTS \\\${tempfile_name}\\\)
639622
\\s*include\\\(\\\${tempfile_name}\\\)
640623
\\s*file\\\(REMOVE \\\${tempfile_name}\\\)

0 commit comments

Comments
 (0)