在变量中有条件地包含/执行Makefile命令?

时间:2011-08-10 19:23:53

标签: makefile

我正在使用的Makefile,我从某个地方获得的,这是非常大的。我还发现了一些我想在makefile中偶尔改变的东西 - 对我来说最简单的方法就是在开始时定义(或不​​)一个(switch)变量(比如OVWRCHOICE) makefile;然后在makefile代码中执行以下操作:

ifdef OVWRCHOICE
  MYOPT = override
  ....
endif

......这都很花花公子。

问题是,最终我还需要更改“覆盖”部分中的部分,所以我想在文件的开头添加它。因此,因为这个“覆盖”部分包含几个make命令 - 我试图使用define来获得一个包含命令的变量(将在ifdef OVWRCHOICE...部分执行)。

所以我到达了这个简单的例子:

# uncomment as needed;
OVWRCHOICE = YES

define SET_OVWRCHOICE
  MYOPT = override
endef
export SET_OVWRCHOICE

# ... many lines of code ...

MYOPT = default

# ... many lines of code...

# without indent:  Makefile:18: *** missing separator.  Stop.
# with tab indent: Makefile:18: *** commands commence before first target.  Stop.
ifdef OVWRCHOICE
    $(SET_OVWRCHOICE)
endif

all:
    @echo $(MYOPT)

...因错误而失败。当然,如果我在帖子中使用第一个片段,则所有运行正常,make打印出预期结果:“覆盖”。

我将如何实现这样的目标?不确定“Makefile命令”的“包含”或“执行”在这种情况下是否是正确的术语;所以我很难找到搜索的起点:)

2 个答案:

答案 0 :(得分:2)

得到它 - 它在Eval Function - GNU `make'中描述;正确的结构是:

ifdef OVWRCHOICE
$(eval $(call SET_OVWRCHOICE))
endif

希望这有助于某人,
干杯!

答案 1 :(得分:1)

哦,好吧,我真的不知道在哪里存档这个片段,所以回到我的这个老问题:)这是OP的主题;但是这里有:

要测试makefile如何处理环境变量,这里有一个简单的例子:

Foo=something
all :
ifdef DEBUG
    @echo "Debug defined"
else
    @echo "Debug NOT defined"
endif

......这是对它的测试:

$ make
Debug NOT defined
$ make DEBUG
make: *** No rule to make target `DEBUG'.  Stop.
$ DEBUG make
DEBUG: command not found
$ DEBUG= make
Debug NOT defined
$ DEBUG=1 make
Debug defined

...很明显,从命令行在makefile中设置该变量的正确语法是:“DEBUG=1 make