我想在一个makefile文件中读取一个名为metafile的文件。读取makefile中的文件
图元文件看起来是这样的:
文件1
文件2
文件3
我需要通过线来阅读我的makefile线内这个图元文件,并检查里面提到的文件存在与否,只打印名字存在的文件。
我已经尝试了一些没有成功的事情。如:
FILE=`cat metafile`
for line in $(FILE); if [ -e $${line} ]; then echo $${line} fi; done;
我想在一个makefile文件中读取一个名为metafile的文件。读取makefile中的文件
图元文件看起来是这样的:
文件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
循环是循环遍历比for
循环与反引号shell脚本文件的线更安全,更习惯的方法,即使你看到很多。
(该@防止建立从呼应shell脚本命令;如果由于某种原因,你需要看到他们采取了这一点。)
更习惯的方法在一个Makefile要做到这一点是有一个目标依赖在这些文件上,并使用Make自己的逻辑:
target: file1 file2 file3
@echo $(filter-out $?,$^)
这是GNU Make语法;如果你想要移植到其他Make口味(可能shell脚本毕竟是可取的),它可能会变得更加复杂。它会在一行中回应所有内容,但如果你需要单独的行,那应该是一个小小的修复。
我只想建立一个小型的辅助Makefile文件片段,并包括相关性:
target: target.d
target.d: metafile
sed 's/^/target: /' $< >[email protected]
include target.d
这建立依赖关系的小单子,所以你不需要一一列举在target:
依赖性明确;所以不是file1 file2 file3
在上面的配方中,依赖性将会住在产生target.d
,其中将包括
target: file1
target: file2
target: file3
你需要滤除target.d
的依赖(或者离开它未申报的;我相信GNU使应处理)。
你是否正在尝试配方中的这两行?每行都在一个单独的子shell中执行。你可以通过将';'加入到下一行。 “最后。但是第一个变量是'$$ {LINE}'而不是'$(LINE)'。 – tripleee