использование целей make-файла для установки параметров сборки - PullRequest
6 голосов
/ 07 мая 2010

Это либо тривиально, либо идет вразрез с философией использования make, но я бы хотел, чтобы в командной строке было указано «make debug», а не «make DEBUG = 1». Я попытался создать фальшивую цель с именем debug, которая ничего не делала, кроме как установить переменную DEBUG, но затем была разница между «make debug build» и «make build debug», а именно: в одном случае переменная была установлена ​​после сборки произошло.

Есть ли способ придать определенным целям приоритет?

Спасибо за вашу помощь.

Ответы [ 6 ]

5 голосов
/ 07 мая 2010

См. «Значения целевой переменной» в на этой странице .

3 голосов
/ 29 июля 2010

Вы также можете сделать это, посмотрев на переменную 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]
1 голос
/ 07 мая 2010

Одна вещь, которую вы можете сделать с 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)

1 голос
/ 07 мая 2010

вы можете написать следующее:

.PHONY: debug
debug:
        $(MAKE) -$(MAKEFLAGS) build DEBUG=1

build:
        echo makeflags='$(MAKEFLAGS)' debug=${DEBUG}

Это будет работать по крайней мере с GNU Make, BSD Make и Interix Make. Я не пробовал все другие реализации.

0 голосов
/ 07 мая 2010

Один из подходов состоит в том, чтобы установить зависимости и правила сборки в целях сборки и отладки, но добавить параметры отладки в цель отладки. Простой пример:

Makefile

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;
}
0 голосов
/ 07 мая 2010

Если ваша отладка будет использоваться только с целью сборки, вы можете также сделать сборку вызова отладки, чтобы вы могли просто набрать make debug или make build, где make build не будет отладкой.

Но что касается вашего настоящего вопроса, я недостаточно знаком с make-файлами, чтобы ответить на него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...