首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CMAKE从特定行开始读取文件

使用CMAKE从特定行开始读取文件
EN

Stack Overflow用户
提问于 2022-02-16 10:45:54
回答 1查看 511关注 0票数 0

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

代码语言:javascript
复制
# -----------------------------------------------------------------------------
## TEST
# -----------------------------------------------------------------------------
TEST_COMPONENTS      ?= ABC DEF GHI

# SYMBOLS
SYMBOLS_PROJ ?= A002
SYMBOLS_LABEL   ?= TEST_A002_FINAL

我有一个cmake文件(函数来自internet,它与我的用例一起工作),其中我希望从“#符号”开始读取test.mak文件,以便忽略/跳过该行之前定义的宏,然后在当前cmake中设置宏:

代码语言:javascript
复制
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只是一个例子,在"#符号“之前有多行宏定义,我想跳过。感谢任何事先解决这一问题的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-16 18:49:07

使用file(STRINGS)将文本文件的行读入列表变量。然后可以使用list(POP_FRONT),直到遇到匹配的行为止。

代码语言:javascript
复制
# 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)调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71140370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档