怎么实现数组的效果
比如有多个文件的编译问题
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 ,,
这个函数的意思是,把参数 中的单词逐一取出放到参数 所指定的变量中,然后再执行
所以, 最好是一个变量名, 可以是一个表达式,而
中的单词。举个例子:
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)