对Makefile目标使用条件语句

对Makefile目标使用条件语句,makefile,Makefile,你好,我试图在我的makefile中使用条件语句让它执行不同的make目标,但是它跳过了条件,直接转到else 他是我想做的事的一个典型例子 ifdef ($(RUN_TEST)) all: install run uninstall else all: install uninstall endif 您没有指明在哪个系统上运行Makefile,因为有稍微不同的make程序可用。Make可以在linux和windows上运行,并且有不同的变体 然而,我已经使用了大多数变体,并且有一种常见的方

你好,我试图在我的makefile中使用条件语句让它执行不同的make目标,但是它跳过了条件,直接转到else

他是我想做的事的一个典型例子

ifdef ($(RUN_TEST))
all: install run uninstall 
else
all: install uninstall
endif

您没有指明在哪个系统上运行Makefile,因为有稍微不同的make程序可用。Make可以在linux和windows上运行,并且有不同的变体

然而,我已经使用了大多数变体,并且有一种常见的方法可以解决您的问题。您必须认识到,makefile不是以常规顺序方式执行的程序。它是在将来某个时间执行的一系列操作的声明或定义。您不能像程序那样按顺序阅读它。特别是,依赖项的定义不会执行,并且不能嵌入到语句中,即使是预处理的语句

实现所需的最佳方法是将依赖项放入变量中并有条件地设置该变量,如下所示:

if ($(RUN_TEST))
ALL=install run uninstall
else
ALL=install uninstall
endif

all : $(ALL)
ifdef RUN_TEST
  ALL = install run uninstall
else
  ALL = install uninstall
endif
这应该适用于大多数实现。

GNU make使用要测试的变量名;您正在为它提供变量的展开式。你想这样写:

if ($(RUN_TEST))
ALL=install run uninstall
else
ALL=install uninstall
endif

all : $(ALL)
ifdef RUN_TEST
  ALL = install run uninstall
else
  ALL = install uninstall
endif

通过使用
$(RUN\u TEST)
您实际上是在测试一个由
RUN\u TEST
的扩展名命名的变量。因此,例如,如果
RUN\u TEST
设置为
true
,那么
ifdef$(RUN\u TEST)
实际测试变量
true
是否定义。

我实际使用ifeq($(原始运行),未定义)找到了它周围的所有:安装卸载其他所有:安装运行卸载endif