Chinaunix首页 | 论坛 | 博客
  • 博客访问: 73641
  • 博文数量: 30
  • 博客积分: 2142
  • 博客等级: 大尉
  • 技术积分: 351
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 10:24
文章分类

全部博文(30)

文章存档

2011年(12)

2010年(14)

2009年(2)

2008年(2)

我的朋友

分类: C/C++

2009-02-25 10:19:40

#  A simple Makefile Template
#  By PRC
#  Feb 25, 2009
#  --------------------------------------
#  此Makefile的功能是自动搜寻$(SRC_DIR)目录下所有的.c和.cpp文件,编译连接生成
#  可执行的exe程序,编译过程中生产的.o文件放在$(OBJ_DIR)目录下
#  --------------------------------------
#  各个变量的含义
#  CC: C编译器
#  CXX: C++编译器
#  OPTI: 编译器优化参数
#  DEFS: 宏定义
#  WARNINGS: 编译器的警告选项
#  INCLUDE:  包含头文件的目录
#  SRC_DIR:  源文件目录(空白表示当前目录)
#  OBJ_DIR:  输入.o文件的目录(空白表示当前目录)
#  TARGET:   最终生成的目标程序
#  --------------------------------------
#  Makefile中定义的目标:
#  all: 编译连接生成$(TARGET)程序
#  clean: 清除所有的.o以及$(TARGET)
#  depend: 生成依赖文件depend.mk



ifeq ($(TERM),cygwin)
TERM = linux
endif

CC  = gcc
CXX = g++

OPTI   = -O0 -g
OPTI   = -O3
DEFS   = -D_DEBUG=1
WARNINGS = -Wall -Wno-unused -Wno-format
CFLAGS = $(WARNINGS) $(OPTI) $(DEFS) $(inc)
INCLUDES = src/stub

SRC_DIR = src
OBJ_DIR = obj

src_c   = $(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.c))   $(wildcard *.c)
src_cxx = $(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.cpp)) $(wildcard *.cpp)

obj_c   = $(foreach file,$(src_c),$(patsubst %.c,%.o,$(notdir $(file))))
obj_cxx = $(foreach file,$(src_cxx),$(patsubst %.cpp,%.o,$(notdir $(file))))
ifneq ($(OBJ_DIR),)
obj_c   := $(foreach file,$(obj_c),$(OBJ_DIR)/$(file))
obj_cxx := $(foreach file,$(obj_cxx),$(OBJ_DIR)/$(file))
obj_dir := $(OBJ_DIR)/##
endif

inc = $(foreach dir,$(INCLUDES) $(SRC_DIR),-I$(dir))

define dir-to-vpath
#X
vpath %.c $1
vpath %.cpp $1
#Z
endef

ifneq ($(SRC_DIR),)
cmd = $(foreach dir,$(SRC_DIR),$(call dir-to-vpath,$(dir)))
endif
$(eval $(cmd))

.PHONY: all .mkdir
TARGET = go.exe

all: .mkdir $(TARGET)
#        @echo $(obj_dir); echo $(src_c) $(src_cxx); echo $(obj_c) $(obj_cxx)

$(TARGET): $(obj_c) $(obj_cxx)
        $(CXX) $(CFLAGS) -o $@ $^

$(obj_c): $(obj_dir)%.o: %.c $(MAKEFILE_LIST)
        $(CC) $(CFLAGS) -c -o $@ $<

$(obj_cxx): $(obj_dir)%.o: %.cpp $(MAKEFILE_LIST)
        $(CXX) $(CFLAGS) -c -o $@ $<

depend: inc = $(foreach file,$(src_c) $(src_cxx),-I$(dir $(file)))\
$(foreach dir,$(SRC_DIR),-I$(dir)) -I. $(foreach dir,$(INCLUDES),-I$(dir))
depend:
        $(CC) $(CFLAGS) -M $(src_c) $(src_cxx) -MM | \
gawk '{if($$1~/^.*[.]o:/)print "$(obj_dir)"$$0;else print $$0;}' >depend.mk

.mkdir:
ifeq ($(TERM),linux)
ifneq ($(OBJ_DIR),)
        @if [ ! -d $(OBJ_DIR) ]; then mkdir $(OBJ_DIR); fi
endif
endif

clean:
ifeq ($(TERM),linux)
        rm -f $(obj_dir)*.o *.exe
else
        del /Q $(OBJ_DIR)\*.o *.exe
endif

-include depend.mk
阅读(1224) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~