2017-10-06 20 views
1

私はいくつかのディレクトリがあり、それぞれにmakefileが含まれているとしましょう。今度は、このディレクトリの中にディレクトリ(makefileもあります)があり、他のディレクトリのmakefileの中にそのディレクトリへの参照があるとしましょう。つまり、別のプロジェクトに依存しているプロジェクトがいくらかあります。今、-jオプションを使用してmakeユーティリティを実行すると、2つ以上の並列スレッドでlibを作成しようとする可能性があります。makeユーティリティが同じターゲットを同時に実行するのを防ぐには?

質問は非常に簡単です:この現象を防ぐ方法は?

+1

あなたの主張をバックアップするためのテスト状況がありますか?依存関係が正しくかつ完全である(これは多くの再帰的なメイクファイルで些細なことではない)場合、make *はターゲットを複数回構築しません。 – Vroomfondel

答えて

1

私は最善の解決策は.NOTPARALLELを使用することであると思う:

a: 
    @echo a 
    @sleep 1 
    @echo end a 

b: 
    @echo b 
    @sleep 1 
    @echo end b 

.NOTPARALLEL: 

.NOTPARALLELなし:

.NOTPARALLEL
$ gmake a b -j 2 
a 
b 
end a 
end b 

$ gmake a b -j 2 
a 
end a 
b 
end b 

GNU make's documentation

.NOTPARALLEL

.NOTPARALLELがターゲットとして言及されている場合は、メイク のこの呼び出しは「-j」オプションが指定されている場合でも、逐次実行されます。 再帰的に呼び出されるmakeコマンドは、(メークファイルにもこのターゲットが含まれていない限り)レシピを並列で実行します。 の前提条件はすべて無視されます。

FreeBSD's make documentation

.NOTPARALLEL 無効パラレルモード。

.NO_PARALLEL 他のpmakeバリアントとの互換性のために、.NOTPARALLELの同義語。

関連する問題