📜  自记录 makefile - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:11:48.071000             🧑  作者: Mango

自记录 Makefile - Shell/Bash

在软件开发的过程中,makefile是不可或缺的一部分。它是编译源代码并生成可执行文件、库文件或者其它形式的文件的重要工具。然而,在开发过程中,我们常常需要手动修改makefile,以适应不同的情况。这时候,自记录makefile就成为了一个不错的选择。

什么是自记录makefile

自记录makefile是一种能够自动解析源文件及其依赖关系,并生成编译规则的makefile。使用这种makefile,我们可以省去手动修改makefile的烦恼,同时也可以加快代码的编译速度。

如何使用自记录makefile

使用自记录makefile,需要安装相应的工具。在Linux、macOS系统上,可以使用GNU的Make工具,而在Windows系统上,可以使用Microsoft的NMake工具。

使用GNU Make

假设我们有一个C语言项目,源文件目录为src,头文件目录为include,可执行文件为bin/myapp,那么我们可以编写如下的Makefile:

# 声明变量
CC = gcc
CFLAGS = -I include
LDFLAGS = -lm

# 编译规则
all: build/myapp

build/myapp: $(shell find src -name "*.c")
	mkdir -p build && $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

# 清理规则
clean:
	rm -rf build

通过上述Makefile,我们声明了变量CC(编译器名)、CFLAGS(编译选项)和LDFLAGS(链接选项),然后定义了all(编译目标)和clean(清理目标)规则。其中,all规则依赖于build/myapp目标,build/myapp目标则依赖于src目录下所有的.c文件。在build/myapp目标中,我们首先使用mkdir命令创建build目录,并使用$(CC)编译器将所有的.c文件编译成可执行文件myapp。最后,我们定义了clean规则,用于清理build目录。

使用Microsoft NMake

NMake是微软自带的Make工具,它跟GNU Make的使用方式类似,但是存在一些差别。如果我们要使用NMake实现自记录makefile,可以编写如下的Makefile:

# 声明变量
CC = cl
CFLAGS = /I include
LDFLAGS = /link /out:bin\myapp.exe

# 编译规则
all: bin\myapp.exe

bin\myapp.exe: $(shell dir /b /s src\*.c)
	@if not exist bin mkdir bin
	$(CC) $(CFLAGS) /Fe$@ $^ $(LDFLAGS)

# 清理规则
clean:
	del /q /s bin

通过上述Makefile,我们同样声明了变量CC(编译器名)、CFLAGS(编译选项)和LDFLAGS(链接选项),然后定义了all(编译目标)和clean(清理目标)规则。其中,all规则依赖于bin\myapp.exe目标,bin\myapp.exe目标则依赖于src目录下所有的.c文件。在bin\myapp.exe目标中,我们首先使用@if not exist命令创建bin目录,并使用$(CC)编译器将所有的.c文件编译成可执行文件myapp.exe。最后,我们定义了clean规则,用于清理bin目录。

总结

自记录makefile是一个非常有用的工具,它可以帮助程序员节省大量时间,并提高代码的编译速度。使用自记录makefile需要掌握GNU Make或Microsoft NMake等工具的基本使用方法,以及如何编写Makefile文件。通过合理使用自记录makefile,我们不仅可以提高软件开发的效率和质量,还能够更好地管理代码。