なぜターゲットは最新であると思わせるのですか?


224

これは私のメイクファイルです:

REBAR=./rebar
REBAR_COMPILE=$(REBAR) get-deps compile

all: compile

compile:
    $(REBAR_COMPILE)

test:
    $(REBAR_COMPILE) skip_deps=true eunit

clean:
    -rm -rf deps ebin priv doc/*

docs:
    $(REBAR_COMPILE) doc

ifeq ($(wildcard dialyzer/sqlite3.plt),)
static:
    $(REBAR_COMPILE) build_plt analyze
else
static:
    $(REBAR_COMPILE) analyze
endif

make compile複数回実行して取得できます

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ make compile
./rebar get-deps compile
==> erlang-sqlite (get-deps)
==> erlang-sqlite (compile)

ただし、何らかの理由で実行するとmake test常に

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ make test
make: `test' is up to date.

ファイルがコンパイルされていなくても。問題は、なぜですか?

同じコマンドを実行すると直接機能します:

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ ./rebar get-deps compile skip_deps=true eunit
==> erlang-sqlite (get-deps)
==> erlang-sqlite (compile)
Compiled src/sqlite3_lib.erl
Compiled src/sqlite3.erl
==> erlang-sqlite (eunit)
...

回答:


460

多分あなたはディレクトリで名前が付けられたファイル/ディレクトリを持っていますtest。このディレクトリが存在し、より新しい依存関係がない場合、このターゲットは再構築されません。

これらの種類のファイルに関係のないターゲットを強制的に再構築するには、次のように偽のターゲットにする必要があります。

.PHONY: all test clean

ここですべての偽のターゲットを宣言できることに注意してください。


2
私はビルドと呼ばれるディレクトリとlibと呼ばれる別のディレクトリを持っていました。後から考えると、これらは完全なターゲット名ではありません。うーん.....メイク。
MattD 2013年

9
*ここalltestclear
、、、

別の解決策は、ラベルを変更することです。お使いの場合には、変更testのためのtest_ruleまたは別の何か。
オーラハム2015年

@MattDは私もそうですか、それはmakeの問題ですか?
gromit190 2016年

@Birger「make build」や「make lib」のように呼び出したいターゲットがあり、それらのディレクトリが存在する場合、この戦略またはそれに似た戦略を使用する必要があります。
MattD

34

編集:これは一部のバージョンにのみ適用されますmake-マニュアルページを確認してください。

-Bフラグをに渡すこともできmakeます。マニュアルページによると、これは次のことを行います:

-B, --always-make 無条件にすべてのターゲットを作成します。

したがって、テストフォルダーの名前make -B testを編集しMakefileたり、名前を変更したりしたくない場合は、問題を解決します。


-B私にとって下位互換モードです...(FreeBSD、OS / GNUツールキットは問題のように指定されていないようです)
Gert van den Berg

おもしろい…あなたの--always-makeために働きますか?
jamesc

いいえ。.PHONYターゲットは親切しかし、ポータブルのようだ...(少なくともFreeBSDのにではなく、必ずSolarisのようなものについて)
ゲルトファンデンベルグ

1
これはmakeの目的に反します-変更後にプログラムのどの部分を再構築する必要があるかを自動的に決定します。makefileが機能する--always-makeオプションが必要な場合、makefile は壊れています。
osvein 2017

1
@GertvandenBerg .PHONYは、POSIX標準の第8号の一部になりますaustingroupbugs.net/view.php?id=523
osvein


1

私の間違いは、単に「filename:」ではなく、ターゲット名を「filename.c:」にすることでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.