如何在CMake';我们执行什么程序?
我想在带有如何在CMake';我们执行什么程序?,cmake,Cmake,我想在带有execute\u process的子目录中执行CMake命令,并将一些缓存变量作为-D选项传递 如果变量的类型为string,则它可以工作。但是,如果变量是列表,则在命令行中传递列表的方法似乎不起作用 我尝试了答案中列出的所有组合。我甚至试着用“\\;”或“\\\\;”加入我的列表。但是,execute_进程似乎总是解包'-DVal2=a\\;b\\;c\\;'或'-DVal2=a;Bc'至-Dval2=a b c 我怎样才能防止这种情况?仅-DVal2=a\\;b\\;c可以工作,
execute\u process
的子目录中执行CMake命令,并将一些缓存变量作为-D
选项传递
如果变量的类型为string,则它可以工作。但是,如果变量是列表,则在命令行中传递列表的方法似乎不起作用
我尝试了答案中列出的所有组合。我甚至试着用“\\;”
或“\\\\;”
加入我的列表。但是,execute_进程
似乎总是解包'-DVal2=a\\;b\\;c\\;'代码>或'-DVal2=a;Bc'
至-Dval2=a b c
我怎样才能防止这种情况?仅-DVal2=a\\;b\\;c
可以工作,但很烦人
set(
mylist
a
b
c
)
set(
cmake_args
"-DVal1=abc"
"'-DVal2=${mylist}'" #does not work, the execute_process will unpack it into seperated args
)
execute_process(
COMMAND ${CMAKE_COMMAND} ${cmake_args} ${CMAKE_SOURCE_DIR}/subproject
OUTPUT_FILE ${CMAKE_BINARY_DIR}/config.log
ERROR_FILE ${CMAKE_BINARY_DIR}/config.log
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/subproject
RESULT_VARIABLE config_result
)
我认为你需要逃离代码>字符,这是CMake中列表的默认分隔符,但不清楚如何执行,因此它不适用于您
那么,试试这样吧
set(mylist_str "")
foreach(item ${mylist})
string(APPEND mylist_str ${item} "\;")
endforeach()
# this is for debugging
message(STATUS "List as string: ${mylist_str}")
set(cmake_args
"-DVal1=abc"
"-DVal2=${mylist_str}"
"-DVal3=\"${mylist_str}\"" # this has quotes around it
)
# this is for debugging
foreach(item ${cmake_args})
message(STATUS "A list item: ${item}")
endforeach()
在传递列表之前,请在其上运行以下行:
string(REPLACE ";" "\\;" escaped_list "${my_list}")
然后通过转义列表。在另一端,它将有
与我的_列表的值完全相同
比如说,
set(my_list "a\;b" "c" "d")
string(REPLACE ";" "\\;" escaped_list "${my_list}")
execute_process(COMMAND ${CMAKE_COMMAND} -Dmy_list=${escaped_list} -P test.cmake)
(使用cmake 3.17进行测试)
当将第一个参数分配给cmake_args
并传递该参数时,这也起作用。
比如说,
set(my_list "a\;b" "c" "d")
string(REPLACE ";" "\\;" escaped_list "${my_list}")
execute_process(COMMAND ${CMAKE_COMMAND} -Dmy_list=${escaped_list} -P test.cmake)
test1.cmake
# Construction.
set(my_list "a\;b" "c" "d")
set(other_list "e" "f\;g" "h")
# For debugging purposes.
message("my_list = \"${my_list}\".")
foreach(arg ${my_list})
message("-> ${arg}")
endforeach()
message("other_list = \"${other_list}\".")
foreach(arg ${other_list})
message("-> ${arg}")
endforeach()
# Encoding.
string(REPLACE ";" "\\;" escaped_list "${my_list}")
message("escaped_list = \"${escaped_list}\".")
string(REPLACE ";" "\\;" other_escaped_list "${other_list}")
message("other_escaped_list = \"${other_escaped_list}\".")
set(cmake_args "-Dother_list=${other_escaped_list}" "-Dmy_list=${escaped_list}")
execute_process(
COMMAND
${CMAKE_COMMAND} ${cmake_args} -P test2.cmake
)
test2.cmake
# For debugging purpose.
message("my_list = \"${my_list}\".")
foreach(arg ${my_list})
message("-> ${arg}")
endforeach()
message("other_list = \"${other_list}\".")
foreach(arg ${other_list})
message("-> ${arg}")
endforeach()
运行cmake-p test1.cmake的输出
my_list = "a\;b;c;d".
-> a;b
-> c
-> d
other_list = "e;f\;g;h".
-> e
-> f;g
-> h
escaped_list = "a\\;b\;c\;d".
other_escaped_list = "e\;f\\;g\;h".
my_list = "a\;b;c;d".
-> a;b
-> c
-> d
other_list = "e;f\;g;h".
-> e
-> f;g
-> h
请仔细观察双引号的使用和未使用位置