1. ホーム
  2. makefile

[解決済み] デバッグとリリースのビルドを行うためのmakefileを設定するにはどうすればよいですか?

2022-02-14 04:24:55

質問

私のプロジェクトには以下のようなmakefileがあり、これをリリースビルドとデバッグビルド用に設定したいのです。私のコードでは、たくさんの #ifdef DEBUG マクロを設定しているので、単純にこのマクロを設定して -g3 -gdwarf2 のフラグをコンパイラに設定します。どうすればいいのでしょうか?

$(CC) = g++ -g3 -gdwarf2
$(cc) = gcc -g3 -gdwarf2

all: executable

executable: CommandParser.tab.o CommandParser.yy.o Command.o
    g++ -g -o output CommandParser.yy.o CommandParser.tab.o Command.o -lfl

CommandParser.yy.o: CommandParser.l 
    flex -o CommandParser.yy.c CommandParser.l
    gcc -g -c CommandParser.yy.c

CommandParser.tab.o: CommandParser.y
    bison -d CommandParser.y
    g++ -g -c CommandParser.tab.c

Command.o: Command.cpp
    g++ -g -c Command.cpp

clean:
    rm -f CommandParser.tab.* CommandParser.yy.* output *.o

リリース/デバッグビルドと言った場合、私は単に make を取得し、リリースビルドまたは make debug を使えば、makefile の中で手動でコメントアウトすることなく、デバッグビルドができます。

解決方法は?

を使用することができます。 ターゲット固有の変数値 . 例

CXXFLAGS = -g3 -gdwarf2
CCFLAGS = -g3 -gdwarf2

all: executable

debug: CXXFLAGS += -DDEBUG -g
debug: CCFLAGS += -DDEBUG -g
debug: executable

executable: CommandParser.tab.o CommandParser.yy.o Command.o
    $(CXX) -o output CommandParser.yy.o CommandParser.tab.o Command.o -lfl

CommandParser.yy.o: CommandParser.l 
    flex -o CommandParser.yy.c CommandParser.l
    $(CC) -c CommandParser.yy.c

すべてのコンパイルコマンドで $(CXX) または $(CC) を使用することを忘れないでください。

そうすると、'make debug' には -DDEBUG や -g といった余計なフラグが付きますが、'make' には付かないようになります。

余談ですが、他の投稿で提案されていたように、Makefileをもっと簡潔にすることができます。