多文件Makefile组织

这几天要建一个linux工程,要用到多个文件目录。

需要makefile来组织这些文件。怎么才能直接make就能编译呢,怎么能在make clean的时候能把所以文件目录下的目标文件给清理掉呢。

 

然后在网上找了个通用的makefile。如下:

# The extra pre-processor and compiler options.
 EXTRA_CFLAGS =
 
# The extra linker options.
 EXTRA_LDFLAGS   =
 
# Specify the include dirs
 INCLUDE   = -I./inc
 
# The pre-processor options used by the cpp (man cpp for more).
 CPPFLAGS  = -Wall $(INCLUDE)
 
# The options used in linking as well as in any direct use of ld.
 LDFLAGS   =
 
# The directories in which source files reside.
# If not specified, all subdirectories of the current directory will be serached.
 SRCDIRS   :=
 
# The executable file name. Must be specified.
 PROGRAM   = example
 
## Implicit Section: change the following only when necessary.
##========================================================================
 
# The source file types (headers excluded).
# .c indicates C source files, and others C++ ones.
 SRCEXTS = .c .C .cc .cpp .CPP .c++ .cxx .cp
 
# The header file types.
 HDREXTS = .h .H .hh .hpp .HPP .h++ .hxx .hp
 
# The pre-processor and compiler options.
# Users can override those variables from the command line.
 CFLAGS  = -g -O2
 CXXFLAGS= -g -O2
 
# The C program compiler.
 CC     = gcc
 
# The C++ program compiler.
 CXX    = g++
 
# Un-comment the following line to compile C programs as C++ ones.
#CC     = $(CXX)
 
# The command used to delete file.
 RM     = rm -f
 
ETAGS = etags
ETAGSFLAGS =
 
CTAGS = ctags
CTAGSFLAGS =
 
## Stable Section: usually no need to be changed. But you can add more.
##==========================================================================
 ifeq ($(SRCDIRS),)
   SRCDIRS := $(shell find $(SRCDIRS) -type d)
 endif
 SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
 HEADERS = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(HDREXTS))))
 SRC_CXX = $(filter-out %.c,$(SOURCES))
 OBJS    = $(addsuffix .o, $(basename $(SOURCES)))
 #DEPS    = $(OBJS:%.o=%.d) #replace %.d with .%.d (hide dependency files)
 DEPS    = $(foreach f, $(OBJS), $(addprefix $(dir $(f))., $(patsubst %.o, %.d, $(notdir $(f)))))
 


## Define some useful variables.
 DEP_OPT = $(shell if `$(CC) --version | grep -i "GCC" >/dev/null`; then \
                   echo "-MM"; else echo "-M"; fi )
 DEPEND.d      = $(CC)  $(DEP_OPT)  $(EXTRA_CFLAGS) $(CFLAGS) $(CPPFLAGS)
 COMPILE.c   = $(CC)  $(EXTRA_CFLAGS) $(CFLAGS)   $(CPPFLAGS) -c
 COMPILE.cxx = $(CXX) $(EXTRA_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c
 LINK.c      = $(CC)  $(EXTRA_CFLAGS) $(CFLAGS)   $(CPPFLAGS) $(LDFLAGS)
 LINK.cxx    = $(CXX) $(EXTRA_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS)
 
.PHONY: all objs tags ctags clean distclean help show
 
# Delete the default suffixes
 .SUFFIXES:
 
all: $(PROGRAM)
 

# Rules for creating dependency files (.d).
#------------------------------------------
 
.%.d:%.c
 @echo -n $(dir $<) > $@
 @$(DEPEND.d) $< >> $@
 
.%.d:%.C
 @echo -n $(dir $<) > $@
 @$(DEPEND.d) $< >> $@
 
.%.d:%.cc
 @echo -n $(dir $<) > $@
 @$(DEPEND.d) $< >> $@
 
.%.d:%.cpp
 @echo -n $(dir $<) > $@
 @$(DEPEND.d) $< >> $@
 
.%.d:%.CPP
 @echo -n $(dir $<) > $@
 @$(DEPEND.d) $< >> $@
 
.%.d:%.c++
 @echo -n $(dir $<) > $@
 @$(DEPEND.d) $< >> $@
 
.%.d:%.cp
 @echo -n $(dir $<) > $@
 @$(DEPEND.d) $< >> $@
 
.%.d:%.cxx
 @echo -n $(dir $<) > $@
 @$(DEPEND.d) $< >> $@
 
# Rules for generating object files (.o).
#----------------------------------------
 objs:$(OBJS)
 
%.o:%.c
 $(COMPILE.c) $< -o $@
 
%.o:%.C
 $(COMPILE.cxx) $< -o $@
 
%.o:%.cc
 $(COMPILE.cxx) $< -o $@
 
%.o:%.cpp
 $(COMPILE.cxx) $< -o $@
 
%.o:%.CPP
 $(COMPILE.cxx) $< -o $@
 
%.o:%.c++
 $(COMPILE.cxx) $< -o $@
 
%.o:%.cp
 $(COMPILE.cxx) $< -o $@
 
%.o:%.cxx
 $(COMPILE.cxx) $< -o $@
 
# Rules for generating the tags.
#-------------------------------------
 tags: $(HEADERS) $(SOURCES)
 $(ETAGS) $(ETAGSFLAGS) $(HEADERS) $(SOURCES)
 
ctags: $(HEADERS) $(SOURCES)
 $(CTAGS) $(CTAGSFLAGS) $(HEADERS) $(SOURCES)
 
# Rules for generating the executable.
#-------------------------------------
 $(PROGRAM):$(OBJS)
 ifeq ($(SRC_CXX),)              # C program
 $(LINK.c)   $(OBJS) $(EXTRA_LDFLAGS) -o $@
 @echo Type ./$@ to execute the program.
 else                            # C++ program
 $(LINK.cxx) $(OBJS) $(EXTRA_LDFLAGS) -o $@
 @echo Type ./$@ to execute the program.
 endif
 
ifndef NODEP
 ifneq ($(DEPS),)
   sinclude $(DEPS)
 endif
 endif
 
clean:
 $(RM) $(OBJS) $(PROGRAM) $(PROGRAM).exe
 
distclean: clean
 $(RM) $(DEPS) TAGS
 
 
## End of the Makefile ##  Suggestions are welcome  ## All rights reserved ##

各个目录下面都可以用。还不需要改动。

你可能感兴趣的:(makefile)