1. ホーム
  2. makefile

[解決済み】なぜmakeはターゲットが最新だと思うのですか?

2022-01-27 08:36:59

質問

これは私のMakefileです。

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)
...

解決方法は?

という名前のファイル/ディレクトリがあるかもしれません。 test をディレクトリに追加します。このディレクトリが存在し、より新しい依存関係がない場合、このターゲットはリビルドされません。

このようなファイルとは関係のないターゲットを強制的にリビルドするには、次のようにニセモノにする必要があります。

.PHONY: all test clean

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

ニセモノのターゲットとは、実際にはファイル名ではなく、明示的なリクエストをしたときに実行されるレシピの名前に過ぎないものです。