我想指定一个包含多个自动变量的makefile目标,但我不知道如何执行。
例如:

build/%_$(MPU).o: %.c
      ${MP_CC} $< -o $@ -c -mcpu=$(MPU) $(CFLAGS)

这里的想法是从一个源文件创建多个对象文件(每个微控制器架构一个)。例如,如果我的源文件是BinarySearch.c
build/BinarySearch_33FJ128MC710A.o
build/BinarySearch_33FJ128MC706A.o
etc.

遗憾的是,我只能匹配源文件名“BinarySearch”,而不能匹配MPU名或许另一种表达我意图的方式是
 build/%1_%2.o: %1.c
      ${MP_CC} $< -o $@ -c -mcpu=%2 $(CFLAGS)

其中%1与源文件名匹配,而%2与MPU名匹配当然make语法实际上并不是这样工作的;我只是想表达我的愿望。
很可能我在这里采取了错误的方法,但我不确定应该使用哪个特性来实现这个目标任何帮助都将不胜感激。

最佳答案

你写的就快到了但是,make无法从源文件名计算出要编译的CPU。告诉我你要的CPU是什么。
生成文件(如上所述):

build/%_$(MPU).o: %.c
    ${MP_CC} $< -o $@ -c -mcpu=$(MPU) $(CFLAGS)

命令行:
$ make build/BinarySearch_33FJ128MC710A.o MPU=33FJ128MC710A

如果在同一个命令行上两次提到33FJ128MC710A对您来说太麻烦了,您可以使用二次扩展来获得您想要的效果请注意,这只适用于先决条件,因此您需要重新处理您的模式。
.SECONDEXPANSION:

build/%.o: $$(firstword $$(subst _, ,$$*_)).c
    ${MP_CC} $< -o $@ -c -mcpu=$(lastword $(subst _, ,$*)) $(CFLAGS)

现在你只需要
$ make build/BinarySearch_33FJ128MC710A.o

在命令行上(配方中的$*匹配依赖行中匹配的%,这通常非常方便)。

关于c - Makefile目标中的两个变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23250049/

10-13 05:04