在GNU makefile中使用循环

时间:2015-11-10 15:48:38

标签: loops makefile llvm llvm-clang

任何人都可以帮我弄清楚为什么我不打算将.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

1 个答案:

答案 0 :(得分:1)

从文件名中删除.c后缀的两种选择。

您可以直接使用Text Function patsubst

$(foreach var,$(patsubst %.c,%,$(SRC)),$(CC_OPTS) $(CCC_OPTS) -S -o $(var)_llvmOpt.ll $(var).ll;)

或通过Substitution Reference

$(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;)