我想从一个特定的行开始读取一个文件。Cmake官方文档建议使用带偏移量的file(),但我不确定它的用法。我想读取的文件是test.mak。
# -----------------------------------------------------------------------------
## TEST
# -----------------------------------------------------------------------------
TEST_COMPONENTS ?= ABC DEF GHI
# SYMBOLS
SYMBOLS_PROJ ?= A002
SYMBOLS_LABEL ?= TEST_A002_FINAL我有一个cmake文件(函数来自internet,它与我的用例一起工作),其中我希望从“#符号”开始读取test.mak文件,以便忽略/跳过该行之前定义的宏,然后在当前cmake中设置宏:
function(Fileread MKFile)
file(READ "${MKFile}" FileContents [OFFSET "# SYMBOLS"])
string(REPLACE "?" "" FileContents ${FileContents})
string(REPLACE "\\\n" "" FileContents ${FileContents})
string(REPLACE "\n" ";" FileLines ${FileContents})
list(REMOVE_ITEM FileLines "")
foreach(line ${FileLines})
string(REPLACE "=" ";" line_split ${line})
list(LENGTH line_split count)
if (count LESS 2)
message(STATUS "Skipping ${line}")
continue()
endif()
list(GET line_split -1 value)
string(STRIP "${value}" value)
separate_arguments(value)
list(REMOVE_AT line_split -1)
foreach(var_name ${line_split})
string(STRIP ${var_name} var_name)
set(${var_name} ${value} PARENT_SCOPE)
endforeach()
endforeach()
endfunction()
Fileread("test.mak")偏移设置不起作用,因此我也得到了我不需要的宏TEST_COMPONENTS。注意: TEST_COMPONENTS只是一个例子,在"#符号“之前有多行宏定义,我想跳过。感谢任何事先解决这一问题的建议。
发布于 2022-02-16 18:49:07
使用file(STRINGS)将文本文件的行读入列表变量。然后可以使用list(POP_FRONT),直到遇到匹配的行为止。
# Line 1
# Line 2
# Line 3
# Line 4
file(STRINGS ${CMAKE_CURRENT_LIST_FILE} THIS_FILE)
set(REDUCTION_SUCCESS False)
while(THIS_FILE)
list(POP_FRONT THIS_FILE LINE)
if (LINE MATCHES "^# SYMBOLS.*")
set(REDUCED_FILE ${LINE} ${THIS_FILE})
set(REDUCTION_SUCCESS True)
break()
endif()
endwhile()
if (REDUCTION_SUCCESS)
# use the contents of the REDUCED_FILE variable
# (print all remaining lines for the purpose of demonstation)
foreach(_LINE IN LISTS REDUCED_FILE)
message(STATUS "${_LINE}")
endforeach()
else()
message(FATAL_ERROR "No line containing '# SYMBOLS' found")
endif()将# Line 1注释中的一个替换为# SYMBOLS以获得成功的结果。为了简单起见,这只是一个可以使用cmake -P script.cmake运行的cmake脚本。脚本文件解析自身。
如果已知要跳过的行数,则可以将file(STRINGS)命令后的逻辑简化为单个list(SUBLIST)调用。
https://stackoverflow.com/questions/71140370
复制相似问题