在 GNU makefile 中使用循环
using loop in GNU makefile
谁能帮我弄清楚为什么我不能在这里将不同版本的 .ll
文件传递给 LLVM_OPT
? makefile 中有没有一种方法可以提取 $(SRC)
中的每个 basename
以传递给 opt
?
所以场景是用 clang
编译 *.c
,然后将 opt
和 $(CCC_OPT)
应用于每个个体 *.ll
,将它们转换为 $file_Opt.ll
.最后,clang
通过链接所有 $file_Opt.ll
.
生成后端 a.out
BENCHMARK = $(shell basename `pwd`)
SRC := $(wildcard *.c)
HEADERS := $(wildcard *.h)
# Actions
.PHONY: all clean vclean
all:
$(ZCC) $(HEADERS) $(INCPATHS) $(SRC)
$(foreach var,$(SRC), $(CC_OPTS) $(CCC_OPTS) -S -o $(var)_llvmOpt.ll $(var).ll;)
$(LCC) -v *_llvmOpt.ll -lm
clean:
rm -f a.out *.o *.a *.s *.i *.I
vclean:
rm -f a.out *.o *.a *.s *.i *.I *.ll
输出:
opt: loop-wrap.c.ll: error: Could not open input file: No such file or directory
make: *** [all] Error 1
从文件名中删除 .c
后缀的两种选择。
可以直接使用Text Function patsubst
:
$(foreach var,$(patsubst %.c,%,$(SRC)),$(CC_OPTS) $(CCC_OPTS) -S -o $(var)_llvmOpt.ll $(var).ll;)
$(foreach var,$(SRC:.c=),$(CC_OPTS) $(CCC_OPTS) -S -o $(var)_llvmOpt.ll $(var).ll;)
或者,这可能更正确,您也可以为此使用 Functions for File Names 函数 basename
:
$(foreach var,$(basename $(SRC)),$(CC_OPTS) $(CCC_OPTS) -S -o $(var)_llvmOpt.ll $(var).ll;)
谁能帮我弄清楚为什么我不能在这里将不同版本的 .ll
文件传递给 LLVM_OPT
? makefile 中有没有一种方法可以提取 $(SRC)
中的每个 basename
以传递给 opt
?
所以场景是用 clang
编译 *.c
,然后将 opt
和 $(CCC_OPT)
应用于每个个体 *.ll
,将它们转换为 $file_Opt.ll
.最后,clang
通过链接所有 $file_Opt.ll
.
a.out
BENCHMARK = $(shell basename `pwd`)
SRC := $(wildcard *.c)
HEADERS := $(wildcard *.h)
# Actions
.PHONY: all clean vclean
all:
$(ZCC) $(HEADERS) $(INCPATHS) $(SRC)
$(foreach var,$(SRC), $(CC_OPTS) $(CCC_OPTS) -S -o $(var)_llvmOpt.ll $(var).ll;)
$(LCC) -v *_llvmOpt.ll -lm
clean:
rm -f a.out *.o *.a *.s *.i *.I
vclean:
rm -f a.out *.o *.a *.s *.i *.I *.ll
输出:
opt: loop-wrap.c.ll: error: Could not open input file: No such file or directory
make: *** [all] Error 1
从文件名中删除 .c
后缀的两种选择。
可以直接使用Text Function patsubst
:
$(foreach var,$(patsubst %.c,%,$(SRC)),$(CC_OPTS) $(CCC_OPTS) -S -o $(var)_llvmOpt.ll $(var).ll;)
$(foreach var,$(SRC:.c=),$(CC_OPTS) $(CCC_OPTS) -S -o $(var)_llvmOpt.ll $(var).ll;)
或者,这可能更正确,您也可以为此使用 Functions for File Names 函数 basename
:
$(foreach var,$(basename $(SRC)),$(CC_OPTS) $(CCC_OPTS) -S -o $(var)_llvmOpt.ll $(var).ll;)