Makefile脚本
时间: 2025-04-08 17:17:37 浏览: 37
### 编写和使用 Makefile 脚本
Makefile 是一种用于自动化构建过程的工具,广泛应用于软件开发领域。通过定义规则、目标以及依赖关系,它可以自动完成源码编译、链接以及其他任务。
#### 基础结构
一个典型的 Makefile 文件由以下几个部分组成:
1. **目标 (Target)**:要生成的目标文件。
2. **依赖 (Dependencies)**:生成该目标所需的其他文件或目标。
3. **命令 (Commands)**:描述如何从依赖生成目标的具体操作。
以下是基本语法:
```makefile
target: dependencies
command
```
#### 注释与特殊字符
在 Makefile 中,注释以 `#` 开头[^1]。如果希望某些命令不显示在终端上,则可以在这些命令前加上 `@` 符号。
#### 自定义文件名
默认情况下,Make 工具会寻找名为 `Makefile` 或 `makefile` 的文件。但如果自定义了文件名称(例如命名为 `Makefile1`),则需要显式指定 `-f` 参数运行:
```bash
make -f Makefile1
```
#### 示例:计算前 100 和的程序及其对应的 Makefile
假设有一个 C 程序用于计算前 100 个整数之和,并为其编写了一个简单的 Makefile 来管理编译流程[^2]:
**C 源代码 (`sum.c`)**
```c
#include <stdio.h>
int main() {
int sum = 0;
for(int i = 1; i <= 100; ++i){
sum += i;
}
printf("Sum of first 100 numbers is %d\n", sum);
return 0;
}
```
**Makefile**
```makefile
all: sum
sum: sum.o
@gcc -o sum sum.o
sum.o: sum.c
gcc -c sum.c
clean:
@rm -f sum sum.o
```
在此例子中,“all”为目标,默认执行;“sum”依赖于 “sum.o”,而后者又依赖于原始源文件 “sum.c”。最后提供了一个清除临时文件的功能——即删除可执行文件及中间对象文件。
#### 使用 `.PHONY`
为了防止实际存在的同名文件干扰到我们的指令执行,可以将一些逻辑上的动作标记为伪目标(`phony targets`),比如清理工作(clean)[^3]:
```makefile
.PHONY: clean
clean:
rm -rf test
```
这里明确告诉 make,“clean” 不是一个真实的文件路径而是纯粹的操作指示符。
#### 复杂项目实例
对于更复杂的工程项目,可能涉及多级目录下的多个 Verilog 文件处理等情况。下面给出基于 VCS 和 Verdi 进行仿真测试的一个完整案例[^4]:
```makefile
all: listfile com sim verdi clean
listfile:
find -name "*.sv" > filelist.f
com:
vcs -full64 -cpp g++-4.8 -cc gcc-4.8 -LDFLAGS "-Wl,--no-as-needed" \
-sverilog -debug_access+ppa -timescale=1ns/1ps -f filelist.f -l com.log -kdb -lca
sim:
./simv -l sim.log
verdi:
verdi -ssf *.fsdb -nologo &
clean:
rm -rf csrc *.log *.key *simv* *.vpd *DVE*
rm -rf verdiLog *.fsdb *.bak *.conf *.rc *.f
```
此脚本涵盖了查找所有设计文件、启动编译器、模拟环境直至最终数据查看整个链条的工作流。
#### 变量的应用
Makefiles 支持变量设置来简化维护成本高的重复字符串输入问题。例如定义 CC 表示使用的 C 编译器版本:
```makefile
CC=gcc
CFLAGS=-Wall -O2
hello: hello.o add.o sub.o mul.o
$(CC) $(CFLAGS) -o hello hello.o add.o sub.o mul.o
```
这样当以后切换不同平台或者优化选项调整时只需修改一处即可生效[^5]。
---
阅读全文
相关推荐















