evading
evading

Reputation: 3090

make clean with implicit rules in makefile

hen I do make clean it complains about missing files. In particular it complains about mapnameserver.hthat is included in nstest.cc and nstime.cc. I thought that doing make clean would ignore all other targets, even implicit ones.

What I want is to be able to do make clean and make vectornameserver without make complaining about the headers that nstest.cc and nstime.cc includes that I have not yet written. Is this possible?

Below is the files in the src dir

nameserverinterface.h
nstest.cc
nstime.cc
vectornameserver.cc
vectornameserver.h

And this is the Makefile

#
# Makefile for CPP
#

# Compiler and compiler options:
CC        = /usr/local/bin/clang++
CXX       = /usr/local/bin/clang++
CXXFLAGS  = -c -pipe -O2 -Wall -W -ansi -pedantic-errors
CXXFLAGS += -Wmissing-braces -Wparentheses -Wold-style-cast
CXXFLAGS += -std=c++11 -stdlib=libc++ -nostdinc++
CXXFLAGS += -I/Users/einar/devel/libcxx/include/

LDFLAGS   = -stdlib=libc++
LDLIBS    = -L/Users/einar/devel/libcxx/lib/


SRCDIR      = ../src
LIBDIR      = ../lib
BINDIR      = ../bin
DEPDIR      = ../dep
VPATH       = $(SRCDIR):$(LIBDIR):$(BINDIR):$(DEPDIR)
LIB_INSTALL =
BIN_INSTALL =

SRC       = $(wildcard $(SRCDIR)/*.cc)
OBJ       = $(notdir $(SRC:.cc=.o))
DEP       = $(addprefix $(DEPDIR)/, $(notdir $(SRC:.cc=.d)))
PROGS     = vectornameserver

MAKEDEPEND  = $(CXX) -MM $(CPPFLAGS) -o $*.d $<
CP          = /bin/cp

###
# 
# Phony targets
#
###
.PHONY: all
all: $(PROGS)

.PHONY: folder_setup
folder_setup:
    mkdir -p $(SRCDIR)
    mkdir -p $(LIBDIR)
    mkdir -p $(BINDIR)
    mkdir -p $(DEPDIR)

.PHONY: clean
clean:
    @$(RM) $(OBJ)

.PHONY: cleaner
cleaner:
    @$(RM) $(OBJ)
    @$(RM) $(PROGS)
    @$(RM) $(DEP)
    @$(RM) $(wildcard $(DEPDIR)/*.d*)

###
#
# Set up targets for program files in this section
# a rule should look like:
# program: obj1.o obj2.o ...
#
###
vectornameserver : vectornameserver.o

###
#
# In this section automatic dependencies are handled.
#
###
$(addprefix $(DEPDIR)/, %.d): %.cc
    @set -e; rm -f $@; \
    $(CXX) -MM $(CPPFLAGS) $< > $@.$$$$; \
    sed 's,\($*\)\.o[ :]*,\1.o $@: ,g' < $@.$$$$ \
    > $@; rm -f $@.$$$$

###
#
# Include the automatically generated dependency files
#
###
include $(DEP)

Thanks in advance.

Upvotes: 1

Views: 607

Answers (1)

Chris Dodd
Chris Dodd

Reputation: 126546

The problem is that you have an include directive in the makefile. This implicitly makes all the included dependency files implicit targets that must be refreshed BEFORE the primary target can be run. It is those rules that are running the compiler and giving you the errors.

Since generally you don't want/need the dependency files if you're just doing a make clean, the usual thing is to wrap appropriate ifs around the include:

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(MAKECMDGOALS),cleaner)
-include $(DEP)
endif
endif

This will avoid trying to include the depfiles (and thus regenerate them) if you do make clean or make cleaner. In addition, the - prefix on the include supresses warnings about the depfiles not existing when you first run make (it will (re)generate them and reread the makefile and depfiles if need be.)

Upvotes: 1

Related Questions