0

我正在尝试找出我遇到的 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")'

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

4

1 回答 1

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 链接就会按预期工作。

于 2013-08-26T19:17:38.707 回答