文章目录
- 1、规划makefile编写
- 2、makefile文件
- 2.1、根目录下common.mk
- 2.2、config.mk
- 2.3、根目录makefile
- 2.4、其他目录下
1、规划makefile编写
a、根目录下放三个文件:
1、makefile:是咱们编译项目的入口脚本,编译项目从这里开始,起总体控制作用。
2、config.mk:配置脚本,被makefile包含,单独分处理,为了应付一些可变的东西。
3、common.mk:最核心的编译脚本,定义makefile编译规则,并且各个子目录中都用到这个来编译.c文件的编译
b、每个子目录下
都有一个叫做makefile的文件,每个makefile文件,都会包含根目录下的common.mk。
现在不支持目录中嵌套子目录
2、makefile文件
2.1、根目录下common.mk
ifeq ($(DEBUG),true)
CC = g++ -std=c++11 -g
VERSION = debug
else
CC = g++ -std=c++11
VERSION = release
endif
SRCS = $(wildcard *.cxx)
OBJS = $(SRCS:.cxx=.o)
DEPS = $(SRCS:.cxx=.d)
BIN := $(addprefix $(BUILD_ROOT)/,$(BIN))
LINK_OBJ_DIR = $(BUILD_ROOT)/app/link_obj
DEP_DIR = $(BUILD_ROOT)/app/dep
$(shell mkdir -p $(LINK_OBJ_DIR))
$(shell mkdir -p $(DEP_DIR))
OBJS := $(addprefix $(LINK_OBJ_DIR)/,$(OBJS))
DEPS := $(addprefix $(DEP_DIR)/,$(DEPS))
LINK_OBJ = $(wildcard $(LINK_OBJ_DIR)/*.o)
LINK_OBJ += $(OBJS)
all:$(DEPS) $(OBJS) $(BIN)
ifneq ("$(wildcard $(DEPS))","")
include $(DEPS)
endif
$(BIN):$(LINK_OBJ)
@echo "------------------------build $(VERSION) mode--------------------------------!!!"
$(CC) -o $@ $^ -lpthread
$(LINK_OBJ_DIR)/%.o:%.cxx
$(CC) -I$(INCLUDE_PATH) -o $@ -c $(filter %.cxx,$^)
$(DEP_DIR)/%.d:%.cxx
echo -n $(LINK_OBJ_DIR)/ > $@
$(CC) -I$(INCLUDE_PATH) -MM $^ >> $@
2.2、config.mk
export BUILD_ROOT = $(shell pwd)
export INCLUDE_PATH = $(BUILD_ROOT)/_include
BUILD_DIR = $(BUILD_ROOT)/signal/ \
$(BUILD_ROOT)/proc/ \
$(BUILD_ROOT)/net/ \
$(BUILD_ROOT)/misc/ \
$(BUILD_ROOT)/logic/ \
$(BUILD_ROOT)/app/
export DEBUG = true
2.3、根目录makefile
include config.mk
all:
@for dir in $(BUILD_DIR); \
do \
make -C $$dir; \
done
clean:
rm -rf app/link_obj app/dep nginx
rm -rf signal/*.gch app/*.gch
2.4、其他目录下
BIN = nginx
include $(BUILD_ROOT)/common.mk
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)