2015-11-10 19 views
5

私は長い間このような奇妙なルールを使用してきましたが、突然彼らは新しい環境を壊しています。%と*一緒に依存関係の行

これを行うには堅牢な方法がありますか?私のボックスで

all: test.1.out 

test.%.out: %/test*.out 
    /bin/cp -f $< [email protected] 

(Ubuntuの):

alishan:~/Dropbox/make_insanity> make --version 
GNU Make 3.81 
Copyright (C) 2006 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. 
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE. 

This program built for x86_64-pc-linux-gnu 
alishan:~/Dropbox/make_insanity> make 
/bin/cp -f 1/test.out test.1.out 

他の人のMacのコードは、Ubuntuマシン、Ubuntuの仮想マシンのこの種には問題はありません。 makeのバージョンはすべてわからないが、OKコードのようだ。

私のmageiaサーバーで、クリア後も同じディレクトリにあります。

[dus[email protected] make_insanity]$ make --version 
GNU Make 3.82 
Built for x86_64-mageia-linux-gnu 
Copyright (C) 2010 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 
[[email protected] make_insanity]$ make 
make: *** No rule to make target `test.1.out', needed by `all'. Stop. 
[[email protected] make_insanity]$ 

問題の適切なテキスト「修正」に%または*のいずれかを変更するが、もちろん必要な一般性を生成しません。

+0

私は、3.81から3.82への変更が起こりそうなことが示唆されています。私はリリースノートを見ましたが、適用されたようなものは見つかりませんでした。 https://lists.gnu.org/archive/html/make-alpha/2010-07/msg00025.html –

答えて

1

私は絶対にわからないが、私はあなたが

test.<name>.out 

<name>/test.out 

(存在する場合)から作ることにしたいと思います。そうだとすれば、ターゲットの名前から各ターゲットの前提条件の名前をリバースエンジニアリングすることで、堅牢に行うことができます。

targs := test.1.out test.a.out 

define src_of = 
$(patsubst .%,%,$(suffix $(basename $(1))))/$(basename $(basename $(1)))$(suffix $(1)) 
endef 

all: $(targs) 

test.%.out: $(call src_of,test.%.out) 
    cp -f $< [email protected] 

clean: 
    rm -f *.*.out 

ちょっと口が開いています。

我々があれば、前提条件が存在し、デモの事前手配:

$ ls -LR 
.: 
1 a Makefile 

./1: 
test.out 

./a: 
test.out 
$ make 
cp -f 1/test.out test.1.out 
cp -f a/test.out test.a.out 
+0

ありがとうございます。それはmakeについてのクールなものを学ぶという面では便利ですが、*を付けずに元のルールを使って達成することができます。また、この特定のアプリケーションでは、ルールを読みやすくすることが重要です。 この単純なルールは、さまざまなプラットフォームでしばらく働いていました。私が何か簡単にそれを救うことができればいいと思う。おかげさまで –

0

あなたがsecondary expansionとワイルドカード機能を使用してこれを行うことができます。これがなければ決して有効ではなかったことに注意してください。

.SECONDEXPANSION: 

all: test.1.out 

test.%.out: $$(wildcard $$*/test*.out) 
    @echo Prerequisites found: $^ 

$*ではなく、パターンマッチのための%の使用(automatic variablesを参照してください)余分$でエスケープされており、全体のことは、値の両方のセットが拡張されますので、二度拡大に設定されています。

この全体のレイアウトは間違っています。ワイルドカードを使用している場合でも、前提条件の最初の単語にのみ一致する$<を使用していました。 Mike's answerは、あなたのMakefileを実際に頑強にするために、より良い賭けになるでしょう。

+0

それが私が望んだことです。 私はあなたの両方が構造について何を言っているのか理解しています。 この場合、リアルタイムで少し矛盾した名前のファイルを提供する人が関わったので、私は悪い構造に悩まされていました(もちろん、makeの上流を修正しようとする可能性もありましたが、私は最初にそれを言っていたはずです。 –