Это или тривиально или работает в противоречии с философией того, как делают, должен использоваться, но я хотел бы иметь командную строку, которая читает, поскольку "делают отладку", а не "делают DEBUG=1". Я пытался создать фальшивую цель, названную отладкой, которая не сделала ничего кроме набора переменная ОТЛАДКИ, но затем было различие между, "делают отладочную сборку", и "делают отладку сборки" - а именно, что в одном случае, переменная была установлена после того, как сборка произошла.
Существует ли способ дать определенный целевой приоритет?
Спасибо за помощь.
См. "Значения переменных для конкретных целей" в эта страница .
вы можете написать следующее:
.PHONY: debug
debug:
$(MAKE) -$(MAKEFLAGS) build DEBUG=1
build:
echo makeflags='$(MAKEFLAGS)' debug=${DEBUG}
Это, по крайней мере, будет работать с GNU Make, BSD Make и Interix Make. Все остальные реализации я не пробовал.
Если ваша отладка будет использоваться только с целью сборки, вы можете сделать так, чтобы отладка вызывала сборку, чтобы вы могли просто набрать make debug
или make build
, где make build
будет не отладочной.
Но что касается вашего вопроса, я недостаточно знаком с makefiles, чтобы ответить на него.
Один из подходов заключается в том, чтобы установить зависимости и правила сборки как в цели сборки, так и в цели отладки, но добавить ваши опции отладки в цель отладки. Простой пример:
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;
}
В 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)