使用makefile目标来设置构建选项

时间:2010-05-06 21:15:52

标签: makefile

这或者是微不足道的,或者与make应该如何使用的哲学背道而驰,但是我希望有一个命令行,它读作“make debug”而不是“make DEBUG = 1”。我尝试创建一个名为debug的虚假目标,除了设置DEBUG变量之外什么也没做,但是“make debug build”和“make build debug”之间存在差异 - 即在一种情况下,变量在构建之后设置了发生了。

有没有办法让某些目标优先?

感谢您的帮助。

6 个答案:

答案 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.foomake foo.debug,它会自动变成make DEBUG=1 foo,并且适用于您放入$(TARGETS)

的任何目标

答案 4 :(得分:0)

如果您的调试仅用于构建目标,您也可以进行调试构建,这样您就可以输入make debugmake 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;
}