2016-10-26 10 views
0

パラレルmakeの場合、target:dependencyは1:1でなければならないので、実行順序は-jのないmakeと同じになります。最初にパラレルメイクで依存関係のない偽のターゲットを実行しますか?

.PHONY: makeDirectories 
makeDirectories: 
    make -p /path-to-directory 

このターゲットは、任意の依存関係を必要としませんが、並列メイクで最初に実行する必要がある: は、私は前に他のすべてのターゲットに実行したい依存関係はありません偽の目標を持っています。私が発見した 解決策は次のとおりです。

-include makeDirectories 

動作します。しかし、PHONYターゲットmakeDirectoriesが最初に実行されることを確認する唯一の方法ですか?

答えて

1

もう1つの方法は、すべてのターゲットをそのディレクトリに依存させることです。例えば:

.SECONDEXPANSION: 
%.o : %.cc | $$(dir [email protected]) # <---- order-only dependency on the directory 

% : # must be the last pattern rule 
    mkdir -p [email protected] 

さらに別のアプローチは、$(shell ...)機能を使用してディレクトリを作成することです:

objdir := release 
$(shell mkdir -p ${objdir}) 
+0

私は最初の例では、「何にでもマッチ」パターンルールと非常に慎重になります。これらは複雑さを増し、確かにmakeを遅くします。私はこれが単なる例であることを知っていますが、実際には意味をなさない: '%.o:%.c'のような単純なパターンルールは '.o'ファイルが' .c'ファイルを作成し、mkdirの必要はありません。作成されたディレクトリを必要とするかもしれないパターンルールは、 'dir /%。o:%.c'のようになりますので、' dir /%。o:%.c | dir'を明示的に指定してください。二次展開とmatch-anythingのルールは必要ありません。 – MadScientist

+0

@MadScientist '$ {objdir} /%。o:$ {srcdir} /%。cc'のようなルールを持っていますが、通常' $ {srcdir} 'の下にあるディレクトリを再作成する必要があります。 $ {objdir} 'のようになります。実際のプロジェクトでは、ディレクトリに対する注文のみの依存関係が必要です。 –

+0

@MadScientist私はmakefile内の特定のターゲットをマークする方法について考えていました。そのため、 'make'は自動的にターゲットのディレクトリを作成します。 makefileのディレクトリ作成に対処することは、一般的な迷惑です。 –

関連する問題