Makefile

Makefile 培训教程

Chapter 1: Makefile 简介和必要性

1.1 什么是 Makefile

Makefile 是一种文本文件,用于定义如何构建和编译软件项目。它包含了一系列规则,描述了源文件如何转化为目标文件,以及构建过程中使用的命令。

1.2 为什么需要 Makefile

Makefile 自动化了构建过程,减少了手动编译的复杂性,提高了开发效率。它能够根据文件的依赖关系自动决定哪些文件需要重新构建,从而确保项目的正确编译和构建。

1.3 Makefile vs CMake vs XMake

Makefile、CMake 和 XMake 都是构建工具,用于管理软件项目的构建过程。它们之间的主要区别在于语法和功能上的差异。Makefile 是一种基本的构建工具,CMake 提供了更高级的构建和配置功能,而 XMake 则专注于跨平台构建。

1.4 Makefile 的优点

  • 简单:Makefile 的语法相对简单,易于学习和使用。
  • 高效:通过自动化构建过程,减少了手动操作,提高了编译效率。
  • 灵活:可以根据项目的需要定制构建规则和命令。
  • 可移植性高:Makefile 在不同的操作系统和环境中都能工作,确保了项目在不同平台上的一致性。

1.5 Makefile 的历史和演进

GNU Make 是一个常用的 Make 工具,它是在 Unix 系统上发展起来的。随着软件开发的发展,出现了许多改进版本和替代工具,如 BSD Make、GNU Make、XMake 等,以满足不同项目的需求。

Chapter 2: Makefile 的基本结构和语法

2.1 Makefile 的基本结构详解

Makefile 由一系列规则组成,每个规则描述了如何将源文件转换为目标文件。规则由目标、依赖和命令三部分组成。

  • 目标(target):表示要生成的文件,可以是可执行文件、中间文件等。
  • 依赖(dependencies):表示生成目标所需的文件,当依赖文件发生变化时,目标将被重新构建。
  • 命令(commands):表示生成目标的具体步骤,使用制表符开头,并在命令之间用换行分隔。

示例:

1
2
3
# 规则:生成目标文件 main.o
main.o: main.c
$(CC) $(CFLAGS) -c $< -o $@

2.2 注释和变量

  • 注释使用#符号,用于添加解释和注释,提高 Makefile 的可读性。
  • 变量用于存储数据,可以是文件名、编译器选项等,以便在 Makefile 中重复使用。

Makefile使用Tips

怎么把换行符CRLF替换为LF

sed -i ‘s/\r$///‘ file1.sh

递归查找源文件和头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
//Common.mk
#define find_c_files
$(wildcard $(1)/*.c) $(foreach dir,$(wildcard $(1)/*),$(call find_c_files,$(dir)))
#endef

#define find_h_files
$(wildcard $(1)/*.h) $(foreach dir,$(wildcard $(1)/*),$(call find_h_files,$(dir)))
#endef

//Makefile
SRC := $(call find_c_files,$(DIR)/code)
INC := $(call find_h_files,$(DIR)/code)
INC_DIR := $(sort $(dir $(call find_h_files,$(DIR)/code)))