ターゲット本体内でMakefile変数値を再割り当てする方法はありますか?
私がやろうとしているのは、デバッグコンパイル用にいくつかの追加フラグを追加することです:
%.erl: %.beam
$(ERLC) $(ERLFLAGS) -o ebin $<
test: clean debug_compile_flag compile compile_test
debug_compile:
$(ERLCFLAGS) += -DTEST
testターゲットを呼び出す場合、環境をクリーンアップし、いくつかの新しいフラグ(既存のフラグに-DTESTなど)を追加し、コード全体をもう一度コンパイルします(最初のソース、次にテストモジュール)。
あちこちにたくさんのロジックが置かれているので、いくつかの新しいフラグセットでコンパイルするためのコードをコピー/貼り付けたくありません。
既存のコードを再利用できるように変数値を再定義する簡単な方法はありますか?
はい、Makeを再実行せずに、簡単に実行できます。 ターゲット固有の変数値 を使用します。
test: clean debug_compile
debug_compile: ERLCFLAGS += -DTEST
debug_compile: compile compile_test;
別の答えはこちらです: ルールの実行時にmake変数を定義する 。
怠zyな場合は、次のようなルールを持つことができます(FLAG
とDEBUG
は私の変数です):
.DBG:
$(eval FLAG += $(DEBUG))
テストを実行するためにメイクファイルにターゲットを追加したかったため、デバッグフラグを使用してソースコードを再コンパイルする必要がありました。 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)