Skip to content

Commit 9615927

Browse files
benoitduduxdelaruelle
authored andcommitted
Use cmake 'EVAL CODE' to forward arguments passed to 'module' cmake function
Use cmake 'EVAL CODE' to handle any number of arguments. This change mandates use of cmake >= 3.18. The solution comes from the following blog post: https://crascit.com/2019/01/29/forwarding-command-arguments-in-cmake/ Fixes #419 Signed-off-by: Benoit Dumas <[email protected]>
1 parent 2fbb824 commit 9615927

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)