在 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;)

或通过 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;)