help-make
[Top][All Lists]
Advanced

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

Targets beginning with a dot are special?


From: PRC
Subject: Targets beginning with a dot are special?
Date: Fri, 11 Jan 2008 13:36:22 +0800

Here is my makefile script:
--------------------------------------------------
OBJDIR=obj-dir

TARGET1 = .target1
TARGET2 = .target2

.PHONY : all $(TARGET1) $(TARGET2) .mkdir

$(TARGET1): .mkdir $(OBJDIR)/1.o
    @cat $(OBJDIR)/1.o

$(TARGET2): .mkdir $(OBJDIR)/2.o
    @cat $(OBJDIR)/1.o

.mkdir:
    @if [ ! -d $(OBJDIR) ]; then \
        mkdir $(OBJDIR) 2>/dev/null; \
        if [ ! -d $(OBJDIR) ]; then \
            exit 1; \
        fi \
    fi 

$(OBJDIR)/1.o:
    echo This is $@ > $@

$(OBJDIR)/2.o:
    echo This is $@ > $@
--------------------------------------------------

$make -d -r -f 1.mak  
shows

GNU Make 3.80
Copyright (C) 2002  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Reading makefiles...
Reading makefile `1.mak'...
Updating makefiles....
 Considering target file `1.mak'.
  Looking for an implicit rule for `1.mak'.
  No implicit rule found for `1.mak'.
  Finished prerequisites of target file `1.mak'.
 No need to remake target `1.mak'.
Updating goal targets....
Considering target file `obj-dir/1.o'.
 File `obj-dir/1.o' does not exist.
 Finished prerequisites of target file `obj-dir/1.o'.
Must remake target `obj-dir/1.o'.
echo This is obj-dir/1.o > obj-dir/1.o
Putting child 0x080746a8 (obj-dir/1.o) PID 12691 on the chain.
Live child 0x080746a8 (obj-dir/1.o) PID 12691 
/bin/sh: obj-dir/1.o: No such file or directory
Got a SIGCHLD; 1 unreaped children.
Reaping losing child 0x080746a8 PID 12691 
make: *** [obj-dir/1.o] Error 1
Removing child 0x080746a8 PID 12691 from chain.

It seems `make' uses the rule `$(OBJDIR)/1.o:' as default for this
makefile script, not the first rule `$(TARGET1): .mkdir $(OBJDIR)/1.o'.

If I do a little change to the makefile (removing the leading dot from the 
target name):
TARGET1 = target1
TARGET2 = target2

`make' executes the first rule `$(TARGET1): .mkdir $(OBJDIR)/1.o' as expected.

So I guess `make' considers the targets beginning with a dot hidden, just as 
`bash' does.
Is it that? Does the manual document this? I just can't find the answer in the 
manual.
Maybe I haven't read the manual carefully enough.


PRC
2007/1/11





reply via email to

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