在目标主体内更改Makefile变量值

时间:2010-04-26 08:21:27

标签: makefile target

有没有办法在目标体内重新分配Makefile变量值?

我要做的是为调试编译添加一些额外的标志:

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

test: clean debug_compile_flag compile compile_test

debug_compile:
    $(ERLCFLAGS) += -DTEST

因此,如果我调用 test 目标,我想清理我的环境,添加一些新的标志(比如 -DTEST 到现有的),编译整个代码再次(第一个来源,然后测试模块)。

我不想复制/粘贴用于编译的代码,因为这里和那里有很多逻辑。

是否有一些简单的方法可以重新定义变量值,以便重用现有代码?

6 个答案:

答案 0 :(得分:68)

是的,有一种简单的方法可以做到,而且无需重新运行Make。使用target-specific variable value

test: clean debug_compile

debug_compile: ERLCFLAGS += -DTEST
debug_compile: compile compile_test;

答案 1 :(得分:42)

另一个答案是:Define make variable at rule execution time

对于懒惰,您可以使用以下规则(FLAGDEBUG是我的变量):

.DBG:
    $(eval FLAG += $(DEBUG))

答案 2 :(得分:1)

这是我使用的解决方案:

def anys(lst):
    for x in lst:
        if x:
            return True
    return False

如果运行PASSWORD = abc123 main: sub @echo "in main" $(PASSWORD) sub: @echo "in sub" $(PASSWORD) $(eval PASSWORD=qwerty) @echo "in sub" $(PASSWORD) ,则输出为:

make main

您会看到原始值in sub abc123 in sub qwerty in main qwerty "abc123"中被覆盖,新值sub"qwerty"级别上可见。

答案 3 :(得分:0)

我想在makefile中添加一个目标来运行测试,这意味着用一些调试标志重新编译源代码。 Ian的回答: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)

答案 4 :(得分:0)

要在命令行上覆盖,请尝试以下操作:

make prefix=<path to new dir> install

这不会更改Makefile,但是会更改变量。

答案 5 :(得分:-6)

修改:正如other answer中的Beta所解释的那样,这是可能的。


没有。在Makefile中无法执行此操作。但是,您可以在make命令行上更改变量的值。如果您按如下方式重写Makefile:

ERLCFLAGS += $(ERLCFLAGSADDED)

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

test: clean compile compile_test

然后,您可以使用以下命令调用make来执行测试:

make ERLCFLAGSADDED=-DTEST test