web-dev-qa-db-ja.com

ターゲット本体内のMakefile変数値を変更します

ターゲット本体内でMakefile変数値を再割り当てする方法はありますか?

私がやろうとしているのは、デバッグコンパイル用にいくつかの追加フラグを追加することです:

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

test: clean debug_compile_flag compile compile_test

debug_compile:
    $(ERLCFLAGS) += -DTEST

testターゲットを呼び出す場合、環境をクリーンアップし、いくつかの新しいフラグ(既存のフラグに-DTESTなど)を追加し、コード全体をもう一度コンパイルします(最初のソース、次にテストモジュール)。

あちこちにたくさんのロジックが置かれているので、いくつかの新しいフラグセットでコンパイルするためのコードをコピー/貼り付けたくありません。

既存のコードを再利用できるように変数値を再定義する簡単な方法はありますか?

50
paulgray

はい、Makeを再実行せずに、簡単に実行できます。 ターゲット固有の変数値 を使用します。

test: clean debug_compile

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

別の答えはこちらです: ルールの実行時にmake変数を定義する

怠zyな場合は、次のようなルールを持つことができます(FLAGDEBUGは私の変数です):

.DBG:
    $(eval FLAG += $(DEBUG))
43
Ian Ooi

テストを実行するためにメイクファイルにターゲットを追加したかったため、デバッグフラグを使用してソースコードを再コンパイルする必要がありました。 Ianの答え: https://stackoverflow.com/a/15561911/ が唯一の解決策でした。

make testsを実行するときの実行順序を保証する、私が思いついたMakefileは次のとおりです。

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