速读《跟我一起学Makefile》(陈皓 著),查缺补漏,备忘。
关于内嵌shell时分号的使用,比如if[]; then xxx; fi, 区分shell的分号在单行与多行中的作用;
Makefile内部执行make -f时,当前Makefile定义的变量不会传递到指定的make -f指定的文件中,如果需要传递,则要用export导出,如下:
CC = gcc CFLAGS = "-Iinclude -O2 -fomit-frame-pointer -fPIC -ffunction-sections -fdata-sections" CXX = g++ CXXFLAGS = "-Iinclude -O2 -fomit-frame-pointer -fPIC -ffunction-sections -fdata-sections" export CC CFLAGS CXX CXXFLAGS all: make -f linux.mk clean: make -f linux.mk clean |
关于VPATH与头文件自动生成:
# VPATH 指定所有的源码路径 VPATH := $(SRCDIR) # 提取VPATH路径中的C和C++源文件,注意这里提取的是带完整路径的,也就是不同路径下面有相同名称的源文件也不影响 SOURCES = $(foreach dir,$(VPATH),$(wildcard $(dir)/*)) C_SRCS = $(filter %.c,$(SOURCES)) CPP_SRCS = $(filter %.cpp,$(SOURCES)) # 生成对应的.o和.d文件名称 C_OBJS = $(C_SRCS:%.c=%.o) CPP_OBJS = $(CPP_SRCS:%.cpp=%.o) LIB_OBJS = $(C_OBJS) $(CPP_OBJS) LIB_DEPS = $(LIB_OBJS:.o=.d) # 包含头文件依赖 -include $(LIB_DEPS) # -MMD用于生成.d依赖文件 .c.o: $(CC) $(CFLAGS) -c -MMD -o $@ $< .cpp.o: $(GPP) $(CPPFLAGS) -c -MMD -o $@ $< |