以“#”开头的文件的Makefile问题

时间:2010-02-26 22:05:21

标签: makefile

我有一个目录“FS2”,其中包含以下文件:

  • 哎呀

我有一个包含以下内容的makefile。

Template:sh= ls ./FS2/*
#all: $(Template)
        echo "Template is: $(Template)"
        touch all

当我运行“clearmake -C sun”并且文件“all”不存在时,我得到以下输出:

"Template is: ./FS2/#ARGH# ./FS2/that ./FS2/this"

修改“this”或“that”不会导致“all”重新生成。当使用“-d”运行调试时,“all”目标仅依赖于目录“./FS2”,而不是目录中的三个文件。我确定当它扩展“模板”时,“#”被视为注释的开头,而其余部分将被忽略!

问题是由编辑器引起的,当被杀死时会留下以“#”开头的文件。如果存在其中一个文件,则对目录中文件的修改不会导致“全部”重新生成。

虽然,我不想根据临时文件是否被修改而进行编译,并且将从“模板”变量中删除该文件,但我仍然很好奇如果我做了如何让它工作想要将“#ARGH#”视为规则“all”所依赖的文件名。这甚至可能吗?

5 个答案:

答案 0 :(得分:3)

  

我有一个目录“FS2”,其中包含以下文件:#ARGH#...

这就是你的问题所在。在我看来,在文件名中使用“有趣”字符是不明智的。现在我知道这些字符是允许的,但这并不能让它们成为一个好主意(像Backspace这样的ASCII控制字符也允许有类似令人讨厌的结果)。

我甚至不喜欢文件名中的空格,而是更喜欢SomethingLikeThis来显示文件名中的独立单词,但至少在很多UNIX工具中处理空格的工具已经相当清楚。

我的建议是重命名文件,如果它是你的一个并节省一些焦虑。但是,由于它们是编辑器崩溃导致的临时文件,因此在规则开始在makefile中运行之前删除它们。无论如何,您可能不应该基于编辑器临时文件进行重建。

或者使用更具针对性的模板,例如:Template:sh= ls ./FS2/[A-Za-z0-9]*完全绕过这些文件(这只是一个示例,您应该确保它不会排除应该包含的文件)。

答案 1 :(得分:1)

'#'是一个有效的Makefile注释字符,因此make程序会忽略第二行。

你可以过滤掉(用grep)以#开头的文件并单独处理它们吗?

答案 2 :(得分:1)

我不熟悉clearmake,但尝试用

替换模板定义
Template:sh= ls ./FS2/* | grep -v '#'

以便包含#的文件名不包含在$(Template)

答案 3 :(得分:0)

如果clearmake遵循与GNU make相同的规则,那么您也可以使用类似Template := $(wildcard *.c)的内容重新编写目标,这对于具有奇数名称的文件会更加智能。

答案 4 :(得分:0)

如果我真的希望文件#ARGH#有助于重建目标all以及是否包含在规则生成的工件中,则应修改Makefile以使该行

Template:sh= ls ./FS2/*

更改为

Template=./FS2/*
Template_files:sh= ls $(Template)

这是有效的,因为$(Template)将在./FS2/*之后和all的扩展中替换为文字字符串$(Template_files)

Clearmake(和GNU make)然后在评估依赖关系时使用./FS2/*作为包含通配符的路径名,扩展到文件名./FS2/#ARGH# ./FS2/that ./FS2/this并且$(Template_files)可以在规则中使用其中需要一个文件名列表。