0

我想从特定行开始读取文件。Cmake 官方文档建议使用带有偏移量的 file()但我不确定它的用法。我要阅读的文件是test.mak

# -----------------------------------------------------------------------------
## TEST
# -----------------------------------------------------------------------------
TEST_COMPONENTS      ?= ABC DEF GHI

# SYMBOLS
SYMBOLS_PROJ ?= A002
SYMBOLS_LABEL   ?= TEST_A002_FINAL

我有一个 cmake 文件(该函数来自互联网,它适用于我的用例),我想从“#SYMBOLS”开始读取 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 只是一个示例,在“# SYMBOLS”之前有多行宏定义我想跳过。感谢您提前解决此问题的任何建议。

4

1 回答 1

1

用于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 脚本cmake -P script.cmake。脚本文件会自行解析。


如果要跳过的行数已知,则可以将file(STRINGS)命令后的逻辑简化为单个list(SUBLIST)调用。

于 2022-02-16T18:49:07.023 回答