использование make-файла предназначается устанавливать опции сборки

Это или тривиально или работает в противоречии с философией того, как делают, должен использоваться, но я хотел бы иметь командную строку, которая читает, поскольку "делают отладку", а не "делают DEBUG=1". Я пытался создать фальшивую цель, названную отладкой, которая не сделала ничего кроме набора переменная ОТЛАДКИ, но затем было различие между, "делают отладочную сборку", и "делают отладку сборки" - а именно, что в одном случае, переменная была установлена после того, как сборка произошла.

Существует ли способ дать определенный целевой приоритет?

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

6
задан dmckee 6 May 2010 в 21:59
поделиться

5 ответов

См. "Значения переменных для конкретных целей" в эта страница .

5
ответ дан 10 December 2019 в 00:35
поделиться

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

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

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

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

1
ответ дан 10 December 2019 в 00:35
поделиться

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

Но что касается вашего вопроса, я недостаточно знаком с makefiles, чтобы ответить на него.

0
ответ дан 10 December 2019 в 00:35
поделиться

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

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
ответ дан 10 December 2019 в 00:35
поделиться

В 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
ответ дан 10 December 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: