C++ 不同Makefile目标的不同变量集

C++ 不同Makefile目标的不同变量集,c++,c,makefile,gnu-make,C++,C,Makefile,Gnu Make,我试图在现有的Makefile中添加一些灵活性,该Makefile目前只针对一种体系结构进行编译。我假设在我的改变之前,‘所有’都是默认的目标——这是第一个没有点的目标,它被定义在大文件中间的某个地方。 我补充说 default_action: stm32f4target 在文件和 stm32f4target: all 在文件的底部,我假设这将“all”封装在新的默认“stm32f4target”任务中。仍然有效 现在我想创建一个现有的变量定义 USE_FPU = yes 以我的目标为条件

我试图在现有的Makefile中添加一些灵活性,该Makefile目前只针对一种体系结构进行编译。我假设在我的改变之前,‘所有’都是默认的目标——这是第一个没有点的目标,它被定义在大文件中间的某个地方。 我补充说

default_action: stm32f4target
在文件和

stm32f4target: all
在文件的底部,我假设这将“all”封装在新的默认“stm32f4target”任务中。仍然有效

现在我想创建一个现有的变量定义

USE_FPU = yes
以我的目标为条件,所以我将其更改为

stm32f4target: USE_FPU = yes

但这破坏了一切:我仍然在调用make而不带参数,我假设我的新stm32f4target是默认目标。我从我的C编译器得到一条消息,与FPU相关的宏被重新定义,这意味着我上次的更改改变了生成文件的行为,这是我没有预料到的。我在这里做错了什么?

据我所知,在标准make中,在make执行期间无法有条件地设置变量。但作为一种解决方法,您可以使用递归make调用,并在命令行上设置该变量:

stm32f4target:
        $(MAKE) all USE_FPU=yes
命令行定义覆盖Makefile变量,因此如果愿意,可以在Makefile中保留默认的USE\u FPU=no。

如果正在使用,可以使用
eval
函数为变量赋值

stm32f4target: 
    $(eval USE_FPU=yes)

那么,你的实际制造系统是什么?都是手写的吗?当
ifeq($USE\u FPU,yes)
时,如何扩展
CFLAGS
?(调试makefiles是一项艰巨的工作,我很清楚:-()如果您只想更改默认目标(而不引入新目标)您可以使用该变量。例如,So
.DEFAULT\u GOAL:=stm32f4target
。默认情况下,
use\u FPU
是否设置为yes,并且您现在正试图将其范围限定为仅一个目标?如果是,将更改make进程的默认行为。此时哪个目标不工作?新的目标?旧的默认值
all
target?(在问题中添加了信息)我正在调用make,但没有指定目标,我假设我的新stm32f4target是默认目标。我尝试了“make-d”,它确认stm32f4target是我正在调用的新默认值是所有手写的,是ifeq($(使用)FPU),)使用 FPU=no endif