任何人都可以帮我弄清楚为什么我不打算将.ll
文件的不同版本传递给LLVM_OPT
? makefile中是否有一种方法可以提取basename
个$(SRC)
以传递给opt
?
因此,方案是使用*.c
汇编clang
,然后将opt
与$(CCC_OPT)
一起应用于每个*.ll
,将其转换为$file_Opt.ll
。最后,clang
通过链接所有a.out
来生成后端$file_Opt.ll
。
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
答案 0 :(得分: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;)