我正在试图弄清楚我得到的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")'
有没有不同的方法来定义可以按预期工作的规则(或变量)?
答案 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链就会按预期工作。