我正在使用的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命令”的“包含”或“执行”在这种情况下是否是正确的术语;所以我很难找到搜索的起点:)
答案 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
”