ऐसा क्यों लगता है कि लक्ष्य अप टू डेट है?


223

यह मेरा मेकफाइल है:

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

जवाबों:


459

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

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

.PHONY: all test clean

ध्यान दें कि आप अपने सभी लक्ष्य लक्ष्यों को वहां घोषित कर सकते हैं।


2
मेरे पास एक निर्देशिका थी जिसे बिल्ड कहा जाता था और दूसरा लीब कहा जाता था। दृष्टिबाधित होने में, ये सही लक्ष्य नाम नहीं हैं। ओह ..... बनाते हैं।
मैट

9
* कहां all, testऔर clearआपके
मेकाइल

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

@ एमटीडी तो मैं करता हूं, क्या यह समस्या है?
gromit190

@Birger यदि आपके पास ऐसे लक्ष्य हैं जो आप "make build" और "lib करें" जैसे आह्वान करना चाहते हैं और आपके पास उन निर्देशिकाएं मौजूद हैं, तो आपको इस रणनीति या इस तरह के एक का उपयोग करने की आवश्यकता होगी।
मैट

34

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

आप -Bध्वज को भी पास कर सकते हैं make। मैन पेज के अनुसार, यह करता है:

-B, --always-make बिना शर्त सभी को निशाना बनाते हैं।

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


-Bमेरे लिए पिछड़ा-संगत मोड है ... (FreeBSD, OS / GNU टूलकिट प्रश्न में निर्दिष्ट नहीं लगता है)
Gert van den Berg

ओह दिलचस्प ... क्या --always-makeआपके लिए काम करता है ?
13:15 बजे jamesc

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

1
यह परिवर्तन के उद्देश्य को निर्धारित करता है - स्वचालित रूप से यह निर्धारित करता है कि परिवर्तन के बाद किसी कार्यक्रम के किन टुकड़ों को फिर से बनाया जाना है। यदि आपके मेकफाइल --always-makeको काम करने के विकल्प की आवश्यकता है , तो आपका मेकफाइल टूट गया है।
ऑसविन

1
@GertvandenBerg .PHONY POSIX मानक के 8 मुद्दे का हिस्सा बनने के लिए जा रहा है austingroupbugs.net/view.php?id=523
osvein

9

यह तब होता है जब आपके पास निर्देशिका में Makefile लक्ष्य नाम के समान फ़ाइल होती है, जहाँ Makefile मौजूद होता है।

यहां छवि विवरण दर्ज करें


यह मेरी समस्या थी। धन्यवाद!
ऐदन रॉसवुड

1

मेरी गलती लक्ष्य नाम "filename.c:" बनाने के बजाय सिर्फ "फ़ाइल नाम:" कर रही थी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.