Hedefin neden güncel olduğunu düşünüyoruz?


224

Bu benim Makefile'm:

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 compileBirden çok kez koşup alabilirim

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

Ancak, bir sebepten dolayı koşmak make testdaima

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

dosyalar derlenmemiş olsa bile. Soru, neden?

Aynı komutu çalıştırmak doğrudan çalışır:

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

Yanıtlar:


460

Belki dizinde bir dosya / testdizin var. Bu dizin varsa ve daha yeni bağımlılıkları yoksa, bu hedef yeniden oluşturulmaz.

Dosyayla ilgili olmayan bu tür hedefler üzerinde yeniden oluşturmaya zorlamak için onları aşağıdaki gibi sahte yapmalısınız:

.PHONY: all test clean

Burada tüm sahte hedeflerinizi beyan edebileceğinizi unutmayın.


2
Ben build adında bir dizin ve lib adında bir dizin vardı. Gez, bunlar mükemmel hedef isimleri değildir. Ahh ..... olun.
MattD

9
* Nerede all, testve clearmakefile hedef isimleriniz
ThorSummoner

Başka bir çözüm de etiketi değiştirmek. Senin durumunda, değiştirmek testiçin test_ruleveya farklı bir şey.
auraham

@MattD ben de, bu yapmak için bir sorun mu?
gromit190

@Birger, "make build" ve "lib" yapmak gibi çağırmak istediğiniz hedefleriniz varsa ve bu dizinlere sahipseniz, bu stratejiyi veya buna benzer bir stratejiyi kullanmanız gerekir.
MattD

34

EDIT: Bu sadece bazı sürümleri için geçerlidir make- adam sayfanızı kontrol etmelisiniz.

-BBayrağı adresine de iletebilirsiniz make. Man sayfasına göre, bu şunları yapar:

-B, --always-make Koşulsuz olarak tüm hedefleri yapın.

Yani make -B testDüzenlemeye istemiyoruz nerede bir durumda olsaydı sorununuzu çözecek Makefileya test klasörünün adını değiştirin.


-Bbenim için geriye dönük uyumlu bir mod ... (FreeBSD, OS / GNU araç seti söz konusu değil gibi görünüyor)
Gert van den Berg

Ah ilginç ... --always-makeSenin için çalışıyor mu ?
jamesc

Hayır! .PHONYHedef (En azından FreeBSD'ye, emin Solaris gibi şeyler hakkında) ... tür taşınabilir olsa bir görünüyor
Gert van Berg den

1
Bu, bir programdan sonra hangi program parçalarının yeniden oluşturulması gerektiğini otomatik olarak belirleme amacını karşılar. Marka dosyanızın --always-makeçalışma seçeneğine ihtiyacı varsa, marka dosyanız bozulur.
osvein

1
@GertvandenBerg .PHONY, POSIX standardı austingroupbugs.net/view.php?id=523
osvein


1

benim hatam sadece "dosyaadı:" yerine "dosyaadı.c:" hedef adını yapmaktı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.