以“开始”的文件出现Makefile问题#&引用;

以“开始”的文件出现Makefile问题#&引用;,makefile,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”,其中包含以下文件:

  • 这个
我有一个包含以下内容的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”,而不是目录中的三个文件。我确定当它展开“模板”时,“#”将被视为注释的开头,而行的其余部分将被忽略

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

尽管我不想让编译依赖于临时文件是否已被修改,并将从“Template”变量中删除该文件,但如果我确实想将“#ARGH#”作为规则“all”依赖的文件名,我仍然很好奇如何使其工作。这可能吗?

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


你能(用grep)过滤掉以#开头的文件并分别处理它们吗?

我不熟悉clearmake,但试着用

Template:sh= ls ./FS2/* | grep -v '#'
因此包含
#
的文件名不包括在
$(模板)

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

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

我甚至不喜欢文件名中的空格,而是更喜欢在文件名中显示独立的单词,但至少许多UNIX工具中处理空格的工具是众所周知的

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


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

如果clearmake遵循与GNU make相同的规则,然后,您还可以使用
Template:=$(通配符*.c)之类的方法重新编写目标
对于名称古怪的文件,这会更智能一些。

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

Template:sh= ls ./FS2/*
改为

Template=./FS2/*
Template_files:sh= ls $(Template)
这是因为
$(模板)
将在
all
之后以及在
$(模板文件)
的扩展中被文本字符串
/FS2/*
替换


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

您是说要使编译依赖于特定编辑器留下的工件文件。你确定这就是你想做的吗?通常,make目标的唯一依赖项是构建它所需的源文件。你可能会让你的代码不可预测地重新编译(这意味着每当编辑器想更新它的工件文件)。现在假设你有一个文件,它的名字中间有一个空格……BTA-我编辑了这个问题来反映一个事实,我不希望编译依赖于一个编辑器留下的临时工件,但是我想知道,如果我有另一个文件的名称中有“#”,并且我确实希望目标依赖于该文件,该如何做。谢谢使您的模板更具体是最简单的方法,即使您只将
*
更改为
*.c
(或源文件使用的任何文件扩展名)。clearmake中有GNU模式,但这与我尝试时的行为相同。在这种情况下,我可以过滤掉以“#”开头的文件,但我也认为,如果我做不到的话,一定有办法做到这一点。