Tại sao làm cho nghĩ rằng mục tiêu được cập nhật?


224

Đây là Makefile của tôi:

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

Tôi có thể chạy make compilenhiều lần và nhận được

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

Tuy nhiên, vì một số lý do, việc chạy make testluôn mang lại

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

ngay cả khi các tập tin không được biên dịch. Câu hỏi là tại sao?

Chạy cùng một lệnh trực tiếp hoạt động:

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

Câu trả lời:


460

Có thể bạn có một tập tin / thư mục có tên testtrong thư mục. Nếu thư mục này tồn tại và không có phụ thuộc nào gần đây hơn, thì mục tiêu này không được xây dựng lại.

Để buộc xây dựng lại các loại mục tiêu không liên quan đến tệp này, bạn nên đặt chúng giả mạo như sau:

.PHONY: all test clean

Lưu ý rằng bạn có thể khai báo tất cả các mục tiêu giả mạo của bạn ở đó.


2
Tôi đã có một thư mục được gọi là build và một cái khác gọi là lib. Nhìn chung, đây không phải là tên mục tiêu hoàn hảo. Ừ ..... làm.
MattD

9
* Ở đâu all, testclearlà tên mục tiêu dễ kiếm của bạn
ThorSummoner

Một giải pháp khác là thay đổi nhãn hiệu. Trong trường hợp của bạn, thay đổi testcho test_rulehoặc một cái gì đó khác nhau.
auraham

@MattD vậy tôi có phải là vấn đề không?
gromit190

@Birger nếu bạn có các mục tiêu mà bạn muốn gọi như "tạo bản dựng" và "tạo lib" và bạn có các thư mục đó, thì bạn sẽ cần sử dụng chiến lược này hoặc một mục tiêu tương tự.
MattD

34

EDIT: Điều này chỉ áp dụng cho một số phiên bản của make- bạn nên kiểm tra trang người đàn ông của mình.

Bạn cũng có thể truyền -Bcờ đến make. Theo trang người đàn ông, điều này không:

-B, --always-make Vô điều kiện làm cho tất cả các mục tiêu.

Vì vậy, make -B testsẽ giải quyết vấn đề của bạn nếu bạn ở trong tình huống bạn không muốn chỉnh sửa Makefilehoặc thay đổi tên của thư mục kiểm tra của mình.


-Blà chế độ tương thích ngược với tôi ... (FreeBSD, bộ công cụ OS / GNU dường như không được chỉ định trong câu hỏi)
Gert van den Berg

Oh thú vị ... Có --always-makelàm việc cho bạn?
jamesc

Không. Các .PHONYmục tiêu dường như loại dù cầm tay ... (Ít nhất để FreeBSD, không chắc chắn về những thứ như Solaris)
Gert van den Berg

1
Điều này bất chấp mục đích thực hiện - tự động xác định phần nào của chương trình cần được xây dựng lại sau khi thay đổi. Nếu tệp Makefile của bạn cần --always-maketùy chọn để hoạt động, tệp Makefile của bạn bị hỏng.
osvein

1
@GertvandenBerg .PHONY sẽ là một phần của vấn đề 8 của tiêu chuẩn POSIX austingroupbugs.net/view.php?id=523
osvein

10

Nó xảy ra khi bạn có một tệp có cùng tên với tên đích Makefile trong thư mục có Makefile.

nhập mô tả hình ảnh ở đây


Đây là vấn đề của tôi. Cảm ơn!
Aidan Rosswood

1

lỗi của tôi là làm cho tên đích "filename.c:" thay vì chỉ "tên tệp:"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.