makfile 知识汇总

hegangben
2025-06-12 / 0 评论 / 8 阅读 / 正在检测是否收录...

mbsvbkqc.png

怎么实现数组的效果

比如有多个文件的编译问题
vlogan -sysc -sc_model adder -sc_portmap the.map adder.v
vlogan -sysc -sc_model multiplier -sc_portmap the.map multiplier.v

每增加一下文件都需要增加一个增加的编译,该怎么实现呢?
如果model 名字和文件名字就是.v 关系 可以使用foreach

names := a b c d
files := $(foreach n,$(names),$(n).v)

all:$(names)

%: %.v 
    echo "$@ $<"
    vlogan    -sysc -sc_model $@ -sc_portmap the.map $<

输入make all 就行了

这里的%: %.v , 实际上表示任意的命令 比如make xxx, % 就表示xxx, 依赖%.v 就是表示xxx.v 存在, $@就表示这个对像xxx,$< 表示第一个依赖,就是xxx.v

foreach 函数

foreach函数和别的函数非常的不一样。因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell(/bin/sh)中的for语句,或是C-Shell(/bin/csh)中的foreach语句而构建的。它的语法是:

$(foreach ,,)
这个函数的意思是,把参数 中的单词逐一取出放到参数 所指定的变量中,然后再执行 所包含的表达式。每一次 会返回一个字符串,循环过程中, 的所返回的每个字符串会以空格分隔,最后当整个循环结束时, 所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。

所以, 最好是一个变量名, 可以是一个表达式,而 中一般会使用 这个参数来依次枚举 中的单词。举个例子:

names := a b c d

files := $(foreach n,$(names),$(n).o)
上面的例子中, $(name) 中的单词会被挨个取出,并存到变量 n 中, $(n).o 每次根据 $(n) 计算出一个值,这些值以空格分隔,最后作为foreach函数的返回,所以, $(files)的值是 a.o b.o c.o d.o 。

注意,foreach中的 参数是一个临时的局部变量,foreach函数执行完后,参数 的变量将不在作用,其作用域只在foreach函数当中。

常用的内置变量

$@:表示目标文件。
$^:表示所有的依赖文件。
$<:表示第一个依赖文件。

main: main.o utils.o

$(CC) -o $@ $^

在这里,$@ 表示目标文件 main,$^ 表示所有的依赖文件 main.o 和 utils.o。

wildcard 用法

SRCS := $(wildcard *.c)
在这个例子中,$(wildcard *.c) 将匹配当前目录下所有以 .c 结尾的文件,并将符合条件的文件名列表赋值给变量 SRCS。

FILES := $(wildcard src/*.c include/*.h)

这个示例中,$(wildcard src/.c include/.h) 将匹配 src 目录下的所有 .c 文件和 include 目录下的所有 .h 文件,并将结果合并为一个文件列表赋值给变量 FILES。

总之,$(wildcard pattern) 函数非常有用,可以帮助 Makefile 在构建过程中获取符合特定模式的文件列表,使得构建过程更加灵活和自动化。

0

评论 (0)

取消