速读《跟我一起学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 $@ $<

关于隐藏gcc编译参数:

CROSS = arm-linux-
CC = @echo " GCC	$@"; $(CROSS)gcc

.c.o:
	$(CC)  $(CFLAGS) -c -MMD -o $@ $<

以上只会显示arm-linux-gcc xx.o,而不会显示CFLAGS。

  • 无标签