# 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) |