Изменить значение переменной Makefile внутри целевого тела - PullRequest
49 голосов
/ 26 апреля 2010

Есть ли способ переназначения значения переменной Makefile внутри целевого тела?

Я пытаюсь добавить дополнительные флаги для отладочной компиляции:

%.erl: %.beam
    $(ERLC) $(ERLFLAGS) -o ebin $<

test: clean debug_compile_flag compile compile_test

debug_compile:
    $(ERLCFLAGS) += -DTEST

Так что, если я вызову test target, я бы хотел очистить свою среду, добавить несколько новых флагов (например, -DTEST к существующим), скомпилировать весь код еще раз (сначала источники, затем тестовые модули).

Я не хочу копировать / вставлять код для компиляции с некоторыми новыми установленными флагами, поскольку здесь и там много логики.

Есть ли какой-нибудь простой способ переопределить значение переменной, чтобы я мог повторно использовать существующий код?

Ответы [ 4 ]

68 голосов
/ 26 апреля 2010

Да, есть простой способ сделать это без повторного запуска Make. Используйте целевое значение переменной :

test: clean debug_compile

debug_compile: ERLCFLAGS += -DTEST
debug_compile: compile compile_test;
43 голосов
/ 22 марта 2013

Другой ответ здесь: Определить переменную make во время выполнения правила .

Для ленивых у вас могут быть правила, подобные следующим (FLAG и DEBUG - мои переменные):

.DBG:
    $(eval FLAG += $(DEBUG))
0 голосов
/ 23 февраля 2018

Я хотел добавить цель в make-файл для запуска тестов, что подразумевало перекомпиляцию исходного кода с некоторыми флагами отладки. Ответ Яна: https://stackoverflow.com/a/15561911/ было единственным решением, которое сработало.

Вот файл Makefile, который я придумал, который гарантирует порядок выполнения при запуске make tests:

TARGET     = a.out

CC         = g++
GENERIC_F  = -Wall -Wextra -I. -Idoctest/doctest/

CFLAGS     = -O0 -std=c++11 $(GENERIC_F)
DEBUG_MODE = -DDEBUG

LINKER     = g++
LFLAGS     = $(GENERIC_F) -lm

SRCDIR     = src
OBJDIR     = build
BINDIR     = bin

SOURCES    = $(wildcard $(SRCDIR)/*.cc)
INCLUDES   = $(wildcard $(SRCDIR)/*.h)
OBJECTS    = $(SOURCES:$(SRCDIR)/%.cc=$(OBJDIR)/%.o)
rm         = rm -f

.PHONY: clear_screen tests extend_cflags

$(BINDIR)/$(TARGET): $(OBJECTS) $(INCLUDES)
    $(LINKER) $(OBJECTS) $(LFLAGS) -o $@
    @echo -e "Linking complete!\n"

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.cc $(INCLUDES)
    @mkdir -p $(OBJDIR) $(BINDIR)
    $(CC) $(CFLAGS) -c $< -o $@
    @echo -e "Compiled "$<" successfully!\n"

.PHONY: clean
clean:
    @$(rm) $(OBJECTS)
    @echo "Cleanup complete!"

.PHONY: remove
remove: clean
    @$(rm) $(BINDIR)/$(TARGET)
    @echo "Executable removed!"

clear_screen:
    @clear

extend_cflags:
    $(eval CFLAGS += $(DEBUG_MODE))

tests: | remove extend_cflags $(BINDIR)/$(TARGET) clear_screen
    @$(BINDIR)/$(TARGET)
0 голосов
/ 26 апреля 2010

Редактировать : Как объясняется Бета в другом ответе , это возможно.


Нет. Нет никакого способа сделать это в Makefile. Однако вы можете изменить значение переменной в командной строке make. Если вы переписали свой Makefile следующим образом:

ERLCFLAGS += $(ERLCFLAGSADDED)

%.erl: %.beam
    $(ERLC) $(ERLCFLAGS) -o ebin $<

test: clean compile compile_test

Затем вы можете вызвать make для выполнения ваших тестов, используя:

make ERLCFLAGSADDED=-DTEST test
...