2012-11-28 39 views
5

我想在一个makefile文件中读取一个名为metafile的文件。读取makefile中的文件

图元文件看起来是这样的:
文件1
文件2
文件3

我需要通过线来阅读我的makefile线内这个图元文件,并检查里面提到的文件存在与否,只打印名字存在的文件。

我已经尝试了一些没有成功的事情。如:

FILE=`cat metafile` 
for line in $(FILE); if [ -e $${line} ]; then echo $${line} fi; done; 
+0

你是否正在尝试配方中的这两行?每行都在一个单独的子shell中执行。你可以通过将';'加入到下一行。 “最后。但是第一个变量是'$$ {LINE}'而不是'$(LINE)'。 – tripleee

回答

11

您可以在目标中放入任意一段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使应处理)。

+0

感谢您的详细回复。我正在尝试你提到的第一个while循环,但没有得到任何东西o/p。第二个“$文件”应该是“$$文件”?? – hari

+0

不用担心,它工作。 – hari