1

それぞれに 2 つのファイル ( .so.dll) があるライブラリのリストがあります。両方のファイルが欠落している場合、またはいずれかが欠落している場合に、レシピを 1 回だけ実行する make ルールを作成するにはどうすればよいですか。

LIBS = alib blib
LIBS_SO = $(patsubst %, %.so, $(LIBS))
LIBS_DLL = $(patsubst %, %.dll, $(LIBS))

この目標を立てたら

$(LIBS_SO) $(LIBS_DSS):
    cp .....

すべての可能性に対して一度だけコピーします。

私がこれを作るなら:

all : $(LIBS_SO) $(LIBS_DSS):
$(LIBS_SO) $(LIBS_DSS):
     cp .....

欠落しているファイルがある場合は常にコピーします。alibファイルalib.dll/の両方またはいずれかalib.soが見つからない場合は、ディレクトリをコピーします。と同じblibです。

4

2 に答える 2

1

LIBS_DSSあなたは(おそらく)あなたが意味した場所の一貫したタイプミスを持っていますLIBS_DLL

最初の「ルール」は次の省略形です。

alib.so:
    cp ...
blib.so:
    cp ...
alib.dll:
    cp ...
blib.dll:
    cp ...

したがって、ビルドを要求されるmakeと、ファイル内の最初のターゲットである。をビルドしますalib.so。それが一度それをする理由です。

2番目のバージョンは、余分なコロンとタイプミスを削除するように修正すると、機能するはずです。

all: $(LIBS_SO) $(LIBS_DLL)

$(LIBS_SO) $(LIBS_DLL):
     cp .....

デフォルトのルールはall;です。を作成するallmakeは、各ファイル、、、alib.soblib.so存在しalib.dllblib.dll最新であることを確認します。欠落しているターゲットごとに1回コマンドを実行する必要があります。

並列を実行すると、問題が発生する可能性がありますmakemake -j4または同様のもの。各ターゲットを作成するために、ほぼ同時に4つのコピーコマンドを起動する場合があります。ただし、非並列ビルドでは、最新でalib.soあることを確認します(そうでない場合は、コピーを実行します)。そのコピーもコピーする場合、最新であることを確認しalib.dllたときに再コピーされませんalib.dll

于 2012-07-01T14:17:06.013 に答える
1

あなたは私たちに多くの情報を提供していませんが、これはあなたが望むことをすると思います:

all : $(LIBS_SO) $(LIBS_DLL):
%.so %.dll:
    cp $* directory ...

alib.soとの両方alib.dllがない場合、Make はこのルールを 1 回だけ実行します。

編集:タイプミスを見つけてくれたJonathan Lefflerに感謝します。

于 2012-07-01T14:07:27.883 に答える