2010-10-14 8 views
123

यह मेरा 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 कई बार चलाने के लिए और प्राप्त

[email protected]:~/workspace/gm-controller/lib/erlang-sqlite$ make compile 
./rebar get-deps compile 
==> erlang-sqlite (get-deps) 
==> erlang-sqlite (compile) 

हालांकि कर सकते हैं, make test चल किसी कारण से हमेशा देता

[email protected]:~/workspace/gm-controller/lib/erlang-sqlite$ make test 
make: `test' is up to date. 

भले ही फ़ाइलें हैं संकलित नहीं सवाल यह है, क्यों?

समान आदेश चल रहा है सीधे काम करता है:

[email protected]:~/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) 
... 

उत्तर

265

हो सकता है कि आप एक फ़ाइल/निर्देशिका निर्देशिका में test नामित किया है। यदि यह निर्देशिका मौजूद है, और इसमें कोई निर्भरता नहीं है जो हाल ही में हैं, तो यह लक्ष्य पुनर्निर्माण नहीं किया जाता है।

नहीं फाइल संबंधी लक्ष्यों के ऐसे प्रकार पर पुनर्निर्माण के लिए मजबूर करने के लिए, आप उन्हें जाली इस प्रकार बनाना चाहिए:

.PHONY: all test clean 

नोट है कि आप अपने जाली लक्ष्यों की सब वहाँ घोषणा कर सकते हैं।

+0

मेरे पास बिल्ड नामक एक निर्देशिका थी और दूसरा जिसे lib कहा जाता था। अंत में, ये सही लक्ष्य नाम नहीं हैं। ओह ..... बनाते हैं। – MattD

+1

* जहां 'all',' test', और 'clear' आपके मेकफ़ाइल लक्ष्य नाम हैं – ThorSummoner

+0

एक और समाधान लेबल बदल रहा है। अपने मामले में, 'test_rule' या कुछ अलग के लिए 'test' बदलें। – auraham

8

संपादित करें: यह केवल make के कुछ संस्करणों पर लागू होता है - आपको अपना मैन पेज देखना चाहिए।

आप -B ध्वज make पर भी भेज सकते हैं। प्रति आदमी पेज के रूप में, यह करता है:

-B, --always-make बिना सोचे सभी लक्ष्यों बनाते हैं।

तो make -B test आपकी समस्या का समाधान यदि आप एक स्थिति है जहाँ आप Makefile को संपादित करने या अपने परीक्षण फ़ोल्डर का नाम बदलने के लिए नहीं करना चाहती में होने पर होता।

+0

'-B' मेरे लिए पिछड़ा-संगत मोड है ... (फ्रीबीएसडी, ओएस/जीएनयू टूलकिट प्रश्न में निर्दिष्ट प्रतीत नहीं होता है) –

+0

ओह रोचक ... क्या आपके लिए 'हमेशा काम करना' काम करता है? – jamesc

+0

नहीं। '.PHONY' लक्ष्य हालांकि पोर्टेबल लगता है ... (कम से कम फ्रीबीएसडी, सोलारिस जैसी चीजों के बारे में निश्चित नहीं) –

संबंधित मुद्दे