在Makefile中链接动态先决条件

时间:2013-08-26 16:21:08

标签: makefile prerequisites

我正在试图弄清楚我得到的Makefile问题。我从telemetry/目录中的大量文件开始,对于每个文件,我需要在features/目录中创建相应的文件。

telemetry/目录中的文件名列表缓存在filelist文件中,我定义allfeats目标以包含所有文件级目标。除了allfeats目标实际上不起作用。

我的Makefile(严重修剪以显示此问题)如下所示:

MYSAMP:=$(shell cat filelist)

allfeats: $(patsubst %,features/%-feat.rds,$(MYSAMP))
        @echo done

features/%-feat.rds: telemetry/%
        Rscript -e 'saveRDS(process("$<"), "$@")'

print-%:
        @echo $* = $($*)

但我认为,关于变量传播时间的一些事情并不是让我按照我的意图来制定规则:

% make -n allfeats
make: *** No rule to make target `features/709731-feat.rds', needed by `allfeats'.  Stop.

如果我明确指定它,它确实知道如何创建该目标:

% make -n features/709731-feat.rds
Rscript -e 'saveRDS(process("telemetry/709731"), "features/709731-feat.rds")'

有没有不同的方法来定义可以按预期工作的规则(或变量)?

1 个答案:

答案 0 :(得分:0)

我弄明白了这个问题。我通过这样做生成了filelist文件:

% ls telemetry > filelist

但我忘记了我的ls是这样的别名:

% which ls
ls='ls -FG --color --hide="NTUSER.DAT*"'

所以我在文件中也有着色转义序列,肉眼看不见,但是在八进制转储中显示出来:

% head filelist | od -a
0000000 esc   [   0   m esc   [   0   m   7   0   9   7   3   1 esc   [
0000020   0   m  nl esc   [   0   m   8   0   0   3   3   3 esc   [   0
0000040   m  nl esc   [   0   m   8   0   0   3   3   4 esc   [   0   m
0000060  nl esc   [   0   m   8   0   0   3   3   5 esc   [   0   m  nl
0000100 esc   [   0   m   8   0   0   8   3   2 esc   [   0   m  nl esc
0000120   [   0   m   8   0   0   8   3   3 esc   [   0   m  nl esc   [
0000140   0   m   8   0   0   8   3   4 esc   [   0   m  nl esc   [   0
0000160   m   8   0   0   8   3   6 esc   [   0   m  nl esc   [   0   m
0000200   8   0   0   8   4   8 esc   [   0   m  nl esc   [   0   m   8
0000220   0   2   0   3   1 esc   [   0   m  nl

一旦我清除了那些,Makefile链就会按预期工作。