Я не уверен, что можно манипулировать всей строкой, как вы просили, с помощью одного вызова CMake, но вот одно решение, которое требует нескольких вызовов.
Здесь мы разбиваем начальную строку на двойную -цифры:
#define TEST_1 "Test String"
на два раздела: #define TEST_1
и Test String
. Затем мы вызвали string(REGEX REPLACE ...)
для каждого раздела строки, чтобы управлять им соответствующим образом. Затем мы объединили две части обратно вместе в конце:
# Define an initial string, for testing.
set(MYSTRING "#define TEST_1 \"Test String\"")
message("${MYSTRING}")
# Split the string into the unquoted and quoted portions.
string(REPLACE "\"" ";" MYSTRING_LIST ${MYSTRING})
list(GET MYSTRING_LIST 0 MYSTRING_BEGIN)
list(GET MYSTRING_LIST 1 MYSTRING_QUOTED)
# Perform regex replace to match the '#define TEST_N ' portion, and
# replace it with 'char TEST_N[] = { '.
string(REGEX REPLACE "^#define TEST_([0-9]+)([ \t\r\n]*)" "char TEST_\\1[] = { " STR_OUTPUT_BEGIN ${MYSTRING_BEGIN})
message("${STR_OUTPUT_BEGIN}")
# Perform regex replace on the quoted string portion, matching every
# character in the string, single-quoting and comma-separating each.
string(REGEX REPLACE "(.)" "'\\1'," STR_OUTPUT_QUOTED ${MYSTRING_QUOTED})
# Remove the trailing comma appended in the previous regex-replace.
string(REGEX REPLACE ",$" "" STR_OUTPUT_QUOTED2 ${STR_OUTPUT_QUOTED})
message("${STR_OUTPUT_QUOTED2}")
# Concatenate them back together, appending the ' };' to the end.
string(CONCAT FINAL_STRING ${STR_OUTPUT_BEGIN} ${STR_OUTPUT_QUOTED2} " };")
message("${FINAL_STRING}")
Итак, вы можете видеть, что происходит, это печатает:
#define TEST_1 "Test String"
char TEST_1[] = {
'T','e','s','t',' ','S','t','r','i','n','g'
char TEST_1[] = { 'T','e','s','t',' ','S','t','r','i','n','g' };
Это должно быть довольно легко logi c в CMake function
и вызовите функцию в al oop, если вам нужно обработать несколько строк, как указано в вашем примере.