2017-02-01 14 views
0

私のMakefileでは、特定のファイルが存在するかどうかを確認して何かを行い、再度確認したいと考えています。 gnu makeを使うと、私はできません。ここでは簡単な例です:makeでワイルドカードを再評価する

$(info $(wildcard OK)) 
$(shell touch OK) 
$(info $(wildcard OK)) 

私は一度makeを実行した場合、私は2つの空の行を参照してください。 makeを再度実行すると、両方の行がOKになります。

私は考えましたが、おそらく$(eval)は私に最新の答えを聞かせてくれます。 makeが、それは他のコマンドを評価する開始する前に、すべてのワイルドカードの計算を予測するいくつかの方法を持っているかのようにああ、

$(eval $$(info $$(wildcard OK))) 

は、同じ答えを生成します。

Android NDKのチェックを満たすには、これを必要とします:私はprebuilt shared libraryをオンザフライで生成する必要があります。

答えて

2

パフォーマンスのために、ディレクトリの内容の内部キャッシュを維持するため、これは機能しません。現在、キャッシュは、makeがルールを実行するときにのみ更新されます。作成するルールが定義されているターゲットがキャッシュに追加されます。あなたの状況では、makeはファイルシステムが変更されたことを知る方法がないので、キャッシュを更新しません。

wildcardではなくシェルを使用する必要があります。シェルはmakeの内部キャッシュを知っていません:

$(info $(wildcard OK)) 
$(shell touch OK) 
$(info $(shell [ -f OK ] && echo OK)) 

は、これは明らかに偽の一例ですが、私はあなたの実際のコードは、これよりも大幅に異なっていることを確認しています。

唯一の代替方法は、ルールを実行する必要があるコマンドを有効にすることです。しかし、もう一度、質問はあなたが実際にしようとしていることとはほとんど関係がないので、私はそのために働く解決策を提案することはできません。

+0

私の目標はAndroid NDKの[prebuilt_shared_library.mk](https://android.googlesource.com/platform/ndk/+/master/build/core/prebuilt-shared-library.mk)スクリプトを利用することです私は自分自身を構築しなければならない図書館です。 NDKフレームワークは$(ワイルドカード)関数を使用してライブラリファイルが存在することを確認しますが、自分でビルドします。 –

+0

キャッシュはディレクトリごとです。 '$(ワイルドカード)'関数がこのディレクトリに対して最初に評価されるときに作成されます。これはおそらく私が回避策を生み出すためには十分です。 –

+0

私はあなたの例とは正反対のことを行います:まず、キャッシュを使わずに '$(shell)'を使います。私はNDKにワイルドカードを使用させてもらいますが、私のロジックはポスト・トゥルーを準備する機会を与えます。 –

関連する問題