【问题标题】:using loop in GNU makefile在 GNU makefile 中使用循环
【发布时间】:2015-11-10 15:48:38
【问题描述】:

谁能帮我弄清楚为什么我不能在这里将不同版本的.ll 文件传递​​给LLVM_OPT? makefile 中是否有办法提取$(SRC) 中的每个basename 以传递给opt

所以场景是编译*.cclang,然后将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

【问题讨论】:

  • 这怎么办?运行make 的输出是什么? $(CC_OPTS) 是什么? $(CCC_OPTS) 是什么? $(CC_OPTS) 是否包含要运行的实际命令?
  • 抱歉问题不完整。我正在更新它。问题是,我应该从每个file.c 中提取file 部分,然后将其传递给opt
  • 是的,所以,您确实意识到您原来的问题中没有任何地方,对吧?甚至没有在更新的问题中明确提出,对吧?
  • 好吧,这个问题仍然有效。如何在 makefile 中定义某些循环。现在我需要在action 部分之前定义另一个,但是如何...
  • 您对$(foreach) 的使用完全正确。你没有提到任何关于另一个循环的事情。你还没有尝试过。您没有提供失败或错误或任何关于您的其他循环如何不工作的信息。所以这也不是你问的问题的一部分。

标签: loops makefile llvm llvm-clang


【解决方案1】:

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

您可以直接使用Text Functionpatsubst

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

【讨论】:

  • 啊,我一开始应该自己做第三个!谢谢@Etan
猜你喜欢
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 2015-03-27
  • 2020-06-27
相关资源
最近更新 更多