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

別の答えはここにあります:ルール実行時にmake変数を定義します

怠惰な人のために、あなたは次のようなルールを持つことができます(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

テストを実行するためにmakefileにターゲットを追加したかったのですが、これは、いくつかのデバッグフラグを使用してソースコードを再コンパイルすることを意味していました。イアンの答え: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

編集:他の回答でベータによって説明されているように、それは可能です。


いいえ。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 に答える