Makefile 笔记
Table of Contents
1 Makefile
Makefile 是 Linux 系统中的一个比较重要的工具,通常可以用来管理软件项目的编译, 连接等作用,但是功能不仅仅如此
2 语法
2.1 基本语法
Makefile 的基本语法是由目标、依赖和命令组成,它的语法如下:
target: dependencies
command
- target 执行目标,当在命令行中敲
make target
执行相应的目标 - dependencies 依赖项,通常是一个列表,中间使用空格分隔
- command 执行目标使用的命令,注意的是 command 的前面 只能是 tab 符号
2.2 变量
变量定义的方法是使用一个等于号连接变量和如下:
VAR_NAME = definition
2.2.1 读取文件名
SRCS = $(shell ls *.cc)
2.2.2 覆盖变量
首先在 Makefile 中定义 TEST 变量
TEST = apple all: echo $(TEST)
在 make 命令后面可以使用 VAR=value
的方式可以覆盖 Makefile 里面的变量
$ make all echo apple apple $ make all TEST=banana echo banana banana
3 综合运用
给一个可以管理一个简单 c 语言项目的 Makefile,个人使用完全够用
TARGET_EXEC ?= a.out BLD_DIR ?= ./build SRC_DIR ?= ./src SRCS := $(shell find $(SRC_DIR) -name *.cpp -or -name *.c -or -name *.s) OBJS := $(SRCS:%=$(BLD_DIR)/%.o) DEPS := $(OBJS:.o=.d) INC_DIRS := $(shell find $(SRC_DIR) -type d) INC_FLAGS := $(addprefix -I,$(INC_DIRS)) CPPFLAGS ?= $(INC_FLAGS) -MMD -MP $(BLD_DIR)/$(TARGET_EXEC): $(OBJS) $(CC) $(OBJS) -o $@ $(LDFLAGS) # assembly $(BLD_DIR)/%.s.o: %.s $(MKDIR_P) $(dir $@) $(AS) $(ASFLAGS) -c $< -o $@ # c source $(BLD_DIR)/%.c.o: %.c $(MKDIR_P) $(dir $@) $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ # c++ source $(BLD_DIR)/%.cpp.o: %.cpp $(MKDIR_P) $(dir $@) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@ .PHONY: clean clean: $(RM) -r $(BLD_DIR) -include $(DEPS) MKDIR_P ?= mkdir -p