58

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

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

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

test: clean debug_compile_flag compile compile_test

debug_compile:
    $(ERLCFLAGS) += -DTEST

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

我不想复制/粘贴代码来编译设置了一些新标志,因为这里和那里都有很多逻辑。

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

4

6 回答 6

93

是的,有一种简单的方法可以做到这一点,并且无需重新运行 Make。使用特定于目标的变量值

test: clean debug_compile

debug_compile: ERLCFLAGS += -DTEST
debug_compile: compile compile_test;
于 2010-04-26T14:11:40.520 回答
50

另一个答案在这里:Define make variable at rule execution time

对于懒惰的人,您可以使用以下规则(FLAG并且DEBUG是我的变量):

.DBG:
    $(eval FLAG += $(DEBUG))
于 2013-03-22T02:51:00.800 回答
4

这是我使用的解决方案:

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"main关卡中可见。

于 2020-08-28T05:50:23.977 回答
1

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

make prefix=<path to new dir> install

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

于 2019-11-20T03:28:15.990 回答
-1

我想在生成文件中添加一个目标来运行测试,这意味着使用一些调试标志重新编译源代码。伊恩的回答: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)
于 2018-02-23T10:16:26.933 回答
-9

编辑:正如 Beta 在另一个答案中所解释的那样,这是可能的。


不,在 Makefile 中没有办法做到这一点。make但是,您可以在命令行上更改变量的值。如果你重写你的 Makefile 如下:

ERLCFLAGS += $(ERLCFLAGSADDED)

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

test: clean compile compile_test

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

make ERLCFLAGSADDED=-DTEST test
于 2010-04-26T08:32:29.847 回答