bug-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Order-only Prerequisites Suppress some Error Checking


From: Tony Strauss
Subject: Order-only Prerequisites Suppress some Error Checking
Date: Sun, 20 Apr 2008 12:46:36 -0400

My targets live in a different directory than my source, and so I want to ensure that the target directory exists before building the target.  This can be accomplished in lots of ways, but one way that I thought of was to use order-only prerequisites for this (actually, originally I just was using normal prerequisites, but I quickly found out that $^ was getting polluted).  A scaled down example appears below (and also is attached as example1.mk, as my email client does not handle tabs very well):
 
DERIVED_OBJ_DIR = _linux
 
$(DERIVED_OBJ_DIR)/%.o: %.cc
        g++ -o $@ $<
 
.PHONY: all
all: $(DERIVED_OBJ_DIR)/test.o
 
$(DERIVED_OBJ_DIR):
        mkdir -p $(DERIVED_OBJ_DIR)
 
$(DERIVED_OBJ_DIR)/test.o: | $(DERIVED_OBJ_DIR)
This works very well.  Now, suppose that I comment out the implicit rule and the order-only prerequisite (attached as example2.mk):
DERIVED_OBJ_DIR = _linux
 
#$(DERIVED_OBJ_DIR)/%.o: %.cc
#        g++ -o $@ $<
 
.PHONY: all
all: $(DERIVED_OBJ_DIR)/test.o
 
$(DERIVED_OBJ_DIR):
        mkdir -p $(DERIVED_OBJ_DIR)
 
#$(DERIVED_OBJ_DIR)/test.o: | $(DERIVED_OBJ_DIR)
 
Make correctly dies with:
gmake: *** No rule to make target `_linux/test.o', needed by `all'.  Stop.
 
Now, if I uncomment out the order-only prerequisite (example3.mk):
DERIVED_OBJ_DIR = _linux
 
#$(DERIVED_OBJ_DIR)/%.o: %.cc
#        g++ -o $@ $<
 
.PHONY: all
all: $(DERIVED_OBJ_DIR)/test.o
 
$(DERIVED_OBJ_DIR):
        mkdir -p $(DERIVED_OBJ_DIR)
 
$(DERIVED_OBJ_DIR)/test.o: | $(DERIVED_OBJ_DIR)
 
Make exits successfully, but does *not* build anything (because it does not know how to build $(DERIVED_OBJECT)/test.o, since test.cc (attached) is in the current directory.  Specifying the order-only prerequisite, even though it is not a "real" rule (in that there is no command, and I have not specified any normal prerequisites for $(DERIVED_OBJECT)/test.o) has given make the idea that it knows how to build $(DERIVED_OBJECT)/test.o, even though it has no more idea than before.  I think that make should exit with the same error code in the second and third examples (that a target just having order-only prerequisites should not count as a "real" rule to make).  Thank you!
 
Tony

Attachment: example1.mk
Description: Text document

Attachment: example2.mk
Description: Text document

Attachment: example3.mk
Description: Text document

Attachment: test.cc
Description: Text document


reply via email to

[Prev in Thread] Current Thread [Next in Thread]