2010-02-26 74 views
3

我有一个目录,其中包含以下文件 “FS2” 文件:Makefile的问题,开始以 “#”

  • 哎呀

我有具有以下内容的makefile。

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

当我运行“clearmake -C太阳”和文件“都”不存在,我得到下面的输出:

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

修改或者“这个”或“说”不导致“全部”重新生成。当使用“-d”进行调试时,“all”目标仅取决于目录“./FS2”,而不是目录中的三个文件。我确定,当它扩展“模板”时,“#”被视为评论的开始,并且该行的其余部分被忽略!

这个问题是由一个编辑器在杀死在以“#”开头的文件周围造成的。如果其中一个文件存在,则不会修改目录中的文件导致“全部”重新生成。

尽管我不想根据临时文件是否被修改来进行编译,并且将从“模板”变量中删除该文件,但我仍然很好奇如何让这个工作起作用确实希望将“#ARGH#”视为规则“全部”所依赖的文件名。这甚至有可能吗?

+1

你在说你想编译依赖于特定编辑器留下的工件文件。你确定这是你想要做的吗?通常,make目标的唯一依赖项是构建它所需的源文件。你会冒险让你的代码不可预知地重新编译(意味着编辑感觉就像更新它的工件文件)。 – bta 2010-02-26 22:30:04

+0

现在想象一下你的名字中间有一个空格的文件... – 2010-02-27 07:51:56

+0

bta - 我编辑了这个问题,以反映这样一个事实,即我真的不希望编译依赖于临时工件编辑器,但想知道如何做到这一点,如果我有另一个名称中的“#”的文件,我确实希望目标依赖。谢谢! – 2010-02-28 14:22:09

回答

0

如果我真的想要的文件#ARGH#作出贡献的目标all是否应该重建,以及被包括在规则所产生的假象,在Makefile应该被修改以使该行

Template:sh= ls ./FS2/* 

all后在扩张改为

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

这工作,因为$(Template)将通过文字串./FS2/*被替换210。

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

1

'#'是一个有效的Makefile注释char,所以第二行被make程序忽略。

您可以过滤(使用grep)以#开头的文件并分别处理它们吗?

+0

在这种情况下,我可以过滤掉以“#”开头的文件,但我也认为如果不行的话,一定有办法做到这一点。 – 2010-02-28 14:24:56

1

我不熟悉clearmake,但尝试

Template:sh= ls ./FS2/* | grep -v '#' 

使不包括在$(Template)#名更换你的模板定义。

3

我有一个目录 “FS2” 包含以下文件:#哎呀...#

潜藏您的问题。在我看来,在文件名中使用“有趣”的字符是不明智的。现在我知道这些字符是允许的,但这并不是一个好主意(ASCII控制字符,如退格键也允许有类似的恼人结果)。

我甚至不喜欢文件名中的空格,而宁愿使用SomethingLikeThis来显示文件名中的独立单词,但至少在许多UNIX工具中用于处理空格的工具已相当熟悉。

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

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

+1

即使只将'*'更改为'* .c'(或源文件使用的任何文件扩展名),使您的模板更具体也是最简单的方法。 – bta 2010-02-26 22:31:57

0

如果clearmake遵循与GNU make相同的规则,那么你也可以使用类似Template := $(wildcard *.c)的东西来重写你的目标,这对于具有古怪名称的文件来说会更聪明一些。

+0

在clearmake中有一个GNU模式,但是当我尝试它时,它有相同的行为。 – 2010-02-28 14:13:35