UP | HOME

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

4 参考链接

Last Updated 2021-11-10 Wed 12:30. Created by Jinghui Hu at 2019-08-05 Mon 20:47.