대상이 최신이라고 생각하는 이유는 무엇입니까?


224

이것은 내 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)
...

답변:


460

디렉토리에 이름이 지정된 파일 / 디렉토리가있을 수 있습니다 test. 이 디렉토리가 존재하고 최신 종속성이없는 경우이 대상은 재 구축되지 않습니다.

이러한 종류의 파일과 관련되지 않은 대상을 강제로 다시 빌드하려면 다음과 같이 가짜로 만들어야합니다.

.PHONY: all test clean

모든 가짜 대상을 선언 할 수 있습니다.


2
build라는 디렉토리와 lib라는 디렉토리가 있습니다. 뒤늦게, 이들은 완벽한 대상 이름이 아닙니다. 어 ..... 확인하십시오.
MattD

9
* 어디에서 all, test그리고 clear있습니다 당신의 메이크 대상 이름
ThorSummoner

다른 해결책은 레이블을 변경하는 것입니다. 귀하의 경우에는, 변경 test을 위해 test_rule또는 뭔가 다른.
auraham

@MattD 나도 그래, 그게 문제가 되는거야?
gromit190

@Birger "make build"및 "make lib"와 같이 호출하려는 대상이 있고 해당 디렉토리가 있으면이 전략 또는 이와 유사한 전략을 사용해야합니다.
MattD

34

편집 : 이것은 일부 버전에만 적용됩니다 make-맨 페이지를 확인해야합니다.

-B플래그를에 전달할 수도 있습니다 make. 매뉴얼 페이지에 따르면 다음과 같습니다.

-B, --always-make 무조건 모든 대상을 만드십시오.

그래서 make -B test당신은 편집하지 않으려는 어디 상황에서 인 경우에 문제를 해결할 것 Makefile또는 테스트 폴더의 이름을 변경합니다.


-B나를 위해 이전 버전과 호환되는 모드입니다 (FreeBSD는, OS / GNU 도구 키트는 질문에 지정하지 않는 것)
거트 반 베르그 덴

재미 있군요. 당신을 --always-make위해 일 합니까 ?
jamesc

아니. .PHONY목표는 (적어도 FreeBSD의에, 확실하지 솔라리스와 같은 것들에 대해) ... 종류의 휴대용 생각으로 보인다
게르트 반 베르그 덴

1
이것은 변경 후 어떤 프로그램을 재 구축해야하는지 자동으로 결정하는 목적을 무시합니다. --always-makemakefile이 작동 하는 옵션이 필요하면 makefile이 손상된 것입니다.
osvein

1
@GertvandenBerg .PHONY는 POSIX 표준 austingroupbugs.net/view.php?id=523
osvein


1

실수로 "filename :"대신 대상 이름을 "filename.c :"로 만들었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.