加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 读取makefile中的文件

发布时间:2020-12-16 01:25:20 所属栏目:安全 来源:网络整理
导读:我想在makefile中读取一个名为metafile的文件. 元文件看起来像这样: 文件1 文件2 文件3 我需要逐行读取makefile中的这个元文件,检查里面提到的文件是否存在,只打印存在的文件名. 我尝试了一些没有成功的事情.喜欢: FILE=`cat metafile`for line in $(FILE)
我想在makefile中读取一个名为metafile的文件.

元文件看起来像这样:
文件1
文件2
文件3

我需要逐行读取makefile中的这个元文件,检查里面提到的文件是否存在,只打印存在的文件名.

我尝试了一些没有成功的事情.喜欢:

FILE=`cat metafile`
for line in $(FILE); if [ -e $${line} ]; then echo $${line} fi; done;
您可以在目标中放置任意一块shell脚本.将文件内容保存在Makefile变量中对我没有任何意义,除非您出于其他原因需要其他目标中的数据. (如果是这样,你无论如何都不能使用反引号.)
target:
        @while read -r file; do 
            test -e "$$file" && echo "$$file"; 
        done <metafile

对于它的价值,while循环是一种更安全,更惯用的方式来循环shell脚本中的文件行而不是带有反引号的for循环,即使你看到了很多.

(@阻止Make回显shell脚本命令;如果出于某种原因需要查看它们,请将其取出.)

在Makefile中执行此操作的更惯用的方法是让目标依赖于这些文件,并使用Make自己的逻辑:

target: file1 file2 file3
        @echo $(filter-out $?,$^)

这是GNU Make语法;如果你想要移植到其他Make口味(可能最终可能是shell脚本),它可能会变得更复杂.它将在一行上回显所有内容,但如果您需要单独的行,那应该是一个简单的修复.

我只是构建一个小的辅助Makefile片段并包含依赖项:

target: target.d
target.d: metafile
        sed 's/^/target: /' $< >$@
include target.d

这会构建一个小的依赖项列表,因此您无需在目标中明确列出它们:依赖项;因此,在上面的配方中,不是file1 file2 file3,依赖关系将存在于生成的target.d中

target: file1
target: file2
target: file3

你需要过滤掉对target.d的依赖(或者保持未声明;我相信GNU Make应该应对).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读