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しかし、 myが次のようにエイリアスされていることを忘れていました:

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

そのため、肉眼では見えない配色エスケープ シーケンスもファイルに含まれていましたが、8 進ダンプで明らかになりました。

% 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 に答える