编译器有关的Makefile语法
在 Makefile 中,与编译器相关的语法通常用于定义编译规则和链接规则,以及设置编译器选项等。
编译器相关的 Makefile 语法
- 定义变量
CFLAGS = -Wall -O2
- 编译规则
%.o: %.c $(CC) $(CFLAGS) -c $< -o $@
- 链接规则
program: file1.o file2.o $(CC) $^ -o $@
- 使用编译器变量和选项
$(CC) $(CFLAGS) -c source.c -o object.o
- 指定头文件搜索路径
CPPFLAGS = -I/path/to/include
- 指定库文件搜索路径
LDFLAGS = -L/path/to/lib LDLIBS = -lmylib
- 指定交叉编译器
CROSS_COMPILE=aarch64-linux-gnu-
CROSS_COMPILE=$CROSS_COMPILETOOL
- 指定生成目录
O=build
- 指定架构
ARCH=arm64
CCFLAGS和CFLAGS的概念
在 Makefile 中,CCFLAGS 和 CFLAGS 变量都可以用来指定编译器选项。它们的区别在于用途和命名习惯。
- CFLAGS:通常用来指定 C 语言的编译器选项,如警告级别、优化级别等。它是一个常见的约定俗成的变量名,用于存储与 C 语言编译相关的选项。
- CCFLAGS:是一个更通用的变量名,可以用来指定任何编译器(包括 C、C++、Objective-C 等)的选项。它不限于特定语言,可以包含更广泛的编译器选项。
实际上,CCFLAGS 变量在某些 Makefile 中可能被用作 C 编译器选项的别名。这样做的目的是为了与其他语言的编译器选项变量保持一致,或者为了方便将同一组选项同时应用于多个编译器。
总而言之,CFLAGS 更常见且特定于 C 语言的编译器选项,而 CCFLAGS 则更通用、更灵活,可以适用于其他编译器。
CFLAGS可选项
CFLAGS 是在 Makefile 中用来存储 C 编译器选项的变量,可以包含一系列用于编译 C 代码的选项。以下是一些常见的 C 编译器选项,可以添加到 CFLAGS 中:
- -Wall:启用大多数警告信息。
- -Werror:将警告视为错误。
- -g:生成调试信息。
- -O2 或 -O3:开启优化级别 2 或 3。
- -std=c11:指定使用 C11 标准进行编译。
- -I:添加头文件搜索路径。
- -L:添加库文件搜索路径。
- -l:链接指定的库。
- -D:定义预处理宏。
- -c:只编译不链接,生成目标文件。
- -o :指定输出文件名。
这些选项可以根据具体需求进行组合和调整,以满足不同的编译需求。通过合理设置 CFLAGS 变量,可以简化 Makefile 中的编译规则,并确保代码按照预期方式进行编译
CCFLAGS-y
CCFLAGS-y 是一个自定义的编译器选项,它在 Makefile 中可能被用来指示特定的条件编译。
在 Makefile 中,CCFLAGS-y 的约定通常是用于条件编译的情况。条件编译可以根据某些条件来选择性地包含或排除代码的一部分。 CCFLAGS-y 可能会被用作一个标志,用于启用或禁用特定的编译器选项。
具体来说,当某个条件满足时,CCFLAGS-y 变量中的选项会被添加到编译器选项中。而当该条件不满足时,这些选项则不会被包含在编译器选项中。
举个例子:
ccflags-y += -D__CCFLAGS_TEST__ __CCFLAGS_TEST__:=1 export __CCFLAGS_TEST__ // 导出了__CCFLAGS_TEST__宏,使得在 Makefile 中定义的宏可以在子进程中使用
通过以上的代码,编译过程中会将 __CCFLAGS_TEST__宏定义为1,从而在代码中可以根据这个宏的取值进行条件编译,实现不同的编译选项和行为。
ccflags-$(CONFIG_DEBUG_TEST) := -DDEBUG
ccflags-$(CONFIG_DEBUG_TEST) := -DDEBUG 的含义是根据名为 CONFIG_DEBUG_TEST 的配置选项来设置编译器选项。
- 如果 CONFIG_DEBUG_TEST 配置选项被定义了(即非空),那么 ccflags-$(CONFIG_DEBUG_TEST) 将被设置为 -DDEBUG。-DDEBUG 是一个 C 编译器选项,用于在预处理阶段定义名为 DEBUG 的宏。
- 如果 CONFIG_DEBUG_TEST 配置选项未定义或为空,那么 ccflags-$(CONFIG_DEBUG_TEST) 将为空,不会设置任何额外的编译器选项。
还需要在Kconfig中添加CONFIG_DEBUG_TEST 的配置选项
make clean
在Makefile中有以下定义:
clean: archclean bootclean
这行代码片段实际上定义了一个规则,说明了当执行 make clean
命令时,需要先执行 archclean
和 bootclean 这两个目标。这样做的目的是确保在执行清理操作时,先执行与特定架构相关的清理操作(archclean
),然后再执行清除boot启动相关的文件(bootclean)
CRYPTO=yes
表示开启某种加密模块
make distclean
在 Makefile 中,distclean
是一个目标(target),通常用于执行清理操作,将项目恢复到一个“干净”的状态。具体来说,distclean
目标通常会删除构建过程中生成的所有文件,包括编译生成的目标文件、可执行文件、库文件,以及其它中间文件和生成的配置文件等。
使用 distclean
目标可以帮助开发者在项目中进行彻底的清理,以便重新开始构建整个项目。这在需要重置构建状态、解决构建问题或者进行完全的清理时非常有用