一、makefile 变量概述
makefile 变量是一些被赋值的标识符(Identifier),它们用于储存各种用到的字符串或者数值。这些变量可以是自己定义的,也可以是系统默认的。在 makefile 中,变量是用于存放一些封装的命令或者路径信息等动态的信息。
默认情况下,make 命令会根据系统环境变量的不同而提供一些默认变量,我们也可以通过 makefile 进行自定义变量,从而实现模块化的编程思路。
二、变量的赋值和引用
makefile 变量的基本操作包括其赋值和引用。变量的赋值使用“=”符号,如下所示:
CC=gcc
这段代码为 CC 赋值为 gcc。
变量的引用则使用“$”符号,如下所示:
$(CC) -o test test.c
这段代码中,将通过变量 CC 来引用 gcc 编译器。
在 makefile 中,还可以通过“:=”符号进行变量的延迟赋值。如下所示:
OBJECTS := OBJECTS += main.o
这段代码中,OBJECTS 变量先被赋值为空,后来 += 符号是在不断地向 OBJECTS 变量中添加 main.o 目标文件。这样就可以通过变量 OBJECTS 直接引用所有目标文件了。
三、预定义变量
为了方便程序员编写 makefile,GNU make 已经提供了一些预定义变量,程序员可以直接引用这些变量。下面是一些 GNU make 的常用预定义变量:
$(CC)
:C 语言编译器$(CFLAGS)
:C 语言编译器参数$(CPP)
:C++ 语言编译器$(CXXFLAGS)
:C++ 语言编译器参数$(AR)
:C 语言库文件打包命令$(ARFLAGS)
:C 语言库文件打包命令参数$(LD)
:链接器$(LDFLAGS)
:链接器参数
四、函数式变量
makefile 中还提供了很多系统内置的函数,通过这些函数可以实现很多高级的功能。比如 $(wildcard)
函数可以查找当前工作目录下的所有文件,$(patsubst)
函数可以将源文件路径和目标文件路径匹配。
函数式变量的语法形式如下:
$(function arguments)
其中,function 代表函数名,arguments 代表参数。下面是系统内置的一些函数:
$(strip string)
:去除字符串中的空格$(subst old,new,text)
:将 text 字符串中的 old 字符串替换成 new 字符串$(patsubst pattern,replacement,text)
:将 text 字符串中按照 pattern 模式匹配的内容替换成 replacement 字符串$(wildcard pattern)
:查找当前工作目录下所有符合 pattern 模式的文件名$(foreach var,list,text)
:将 list 中每个元素进行处理,并赋值给 var 变量,并将结果拼接起来$(shell command)
:执行一个 shell 命令,并返回其结果
五、自定义变量
为了使 makefile 更加模块化,我们可以在 makefile 中自定义一些变量。
下面是一个例子,展示在 makefile 中如何自定义变量:
INC_DIR = include LIB_DIR = lib SRC_DIR = src CFLAGS = -I$(INC_DIR) all:$(LIB_DIR)/libfoo.a $(LIB_DIR)/libfoo.a:$(SRC_DIR)/foo.c gcc -c $(SRC_DIR)/foo.c $(CFLAGS) -o $(LIB_DIR)/foo.o ar r $(LIB_DIR)/libfoo.a $(LIB_DIR)/foo.o
这段代码中,定义了三个自定义变量:INC_DIR,LIB_DIR 和 SRC_DIR,分别表示头文件目录,库文件目录和源代码目录。另外,CFLAGS 变量也被设置为了 -I$(INC_DIR),这样就可以使编译器能够找到 INC_DIR 目录中的头文件。
在 all 发展中,引用了 $(LIB_DIR)/libfoo.a 变量,并将其作为 all 的最终目标。
六、总结
本文对 makefile 变量进行了详细的剖析,包括了变量的赋值和引用,预定义变量,函数式变量和自定义变量等方面的内容。了解这些知识点,可以让我们更好地编写 makefile,提高编程效率。