这或者是微不足道的,或者与make应该如何使用的哲学背道而驰,但是我希望有一个命令行,它读作“make debug”而不是“make DEBUG = 1”。我尝试创建一个名为debug的虚假目标,除了设置DEBUG变量之外什么也没做,但是“make debug build”和“make build debug”之间存在差异 - 即在一种情况下,变量在构建之后设置了发生了。
有没有办法让某些目标优先?
感谢您的帮助。
答案 0 :(得分:5)
请参阅this page中的“特定于目标的变量值”。
答案 1 :(得分:3)
你也可以通过查看MAKECMDGOALS变量
来做到这一点ifneq "$(findstring debug, $(MAKECMDGOALS))" ""
DEBUG = 1
endif
build:
@echo build and DEBUG is [$(DEBUG)]
debug:
调用它时会发生这种情况:
$ make build
build and DEBUG is []
$ make build debug
build and DEBUG is [1]
make: Nothing to be done for `debug'.
$ make debug build
make: Nothing to be done for `debug'.
build and DEBUG is [1]
答案 2 :(得分:1)
您可以写下以下内容:
.PHONY: debug
debug:
$(MAKE) -$(MAKEFLAGS) build DEBUG=1
build:
echo makeflags='$(MAKEFLAGS)' debug=${DEBUG}
这至少适用于GNU Make,BSD Make和Interix Make。我没有尝试所有其他实现。
答案 3 :(得分:1)
使用GnuMake可以做的一件事就是使用扩展为foreach
内置规则的宏。类似的东西:
TARGETS := build all foo bar baz
define DEBUG_TARGET_RULE
$(1).debug:
$$(MAKE) DEBUG=1 $(1)
debug.$(1):
$$(MAKE) DEBUG=1 $(1)
endef
$(foreach target,$(TARGETS),$(eval $(call DEBUG_TARGET_RULE,$(target))))
这样您就可以输入make debug.foo
或make foo.debug
,它会自动变成make DEBUG=1 foo
,并且适用于您放入$(TARGETS)
答案 4 :(得分:0)
如果您的调试仅用于构建目标,您也可以进行调试构建,这样您就可以输入make debug
或make build
,其中make build
将是非{}调试。
但至于你的实际问题,我不熟悉makefile来回答它。
答案 5 :(得分:0)
一种方法是在构建目标和调试目标中设置依赖项和构建规则,但是将调试选项添加到调试目标。一个简单的例子:
生成文件
program: program.c
gcc -o program program.c
debug: program.c
gcc -D DEBUG -o program program.c
Program.c
#include <stdio.h>
int main(void) {
#ifdef DEBUG
printf("DEBUG on!\n");
#endif
printf("in the program\n");
return 0;
}