跟我学Makefile(二)
在上一篇跟我学Makefile中,我们学习了一些基础的Makefile语法和命令。在本文中,我们将继续深入了解如何使用Makefile自动化构建我们的代码。
变量
Makefile支持定义变量,可以提高代码的复用性和可维护性。变量可以用于定义命令、文件列表等。
变量的定义格式是变量名 = 值
。例如:
CC = gcc
CFLAGS = -Wall -O2
可以用$()
或${}
使用变量。例如:
$(CC) $(CFLAGS) -o main main.c
函数
Makefile支持多种内置函数,可以用于字符串操作、文件操作等。
一些常用函数:
-
shell
: 执行shell命令并返回结果。 -
foreach
: 遍历一个列表并执行命令。 -
wildcard
: 列出符合某种模式的文件列表。 -
notdir
: 返回去掉目录部分的文件名。 -
subst
: 用一个字符串替换另一个字符串。 -
strip
: 去掉字符串中的空格。 -
patsubst
: 将符合某种模式的文件名替换为另一种模式。
我们可以用函数来定义变量、执行命令等。例如:
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRCS))
target: $(OBJS)
$(CC) $(CFLAGS) -o target $(OBJS)
命令
在Makefile中可以定义一组命令,用于构建、清理代码等。一个命令通常包括若干行shell命令。
命令的格式是:
target: dependencies
command
其中target
是一个目标,dependencies
是依赖项,command
是命令。例如:
target: a.o b.o
$(CC) $(CFLAGS) -o target a.o b.o
Makefile会自动根据依赖关系确定构建顺序。
实战
我们来看一个示例,用Makefile编译一个C程序,并支持单元测试。
CC = gcc
CFLAGS = -Wall -O2
LDFLAGS = -lm
TEST_FLAGS = -lcunit
SRCS = main.c math.c
OBJS = $(patsubst %.c, %.o, $(SRCS))
test: test_math
./test_math
test_math: math.o test_math.c
$(CC) $(CFLAGS) $(TEST_FLAGS) -o test_math math.o test_math.c
$(OBJS): $(SRCS)
$(CC) $(CFLAGS) -c $(SRCS)
clean:
rm -f $(OBJS) test_math
在这个Makefile中,我们定义了四个目标:
-
test
: 运行单元测试。 -
test_math
: 编译单元测试程序。 -
$(OBJS)
: 编译目标程序。 -
clean
: 清理编译产生的文件。
test_math
依赖于math.o
和test_math.c
,执行命令来构建单元测试程序。
$(OBJS)
依赖于$(SRCS)
,执行命令来编译目标程序。
clean
只是执行命令清理编译产生的文件。
我们可以使用make
命令来构建代码和运行单元测试。
总结
本文介绍了Makefile中的变量、函数和命令以及如何通过它们来自动化构建代码。通过Makefile可以实现自动化、可重复、可维护的代码构建流程,提高代码质量和开发效率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:跟我学Makefile(二) - Python技术站