2016-04-13 11 views
0

私は自分のプロジェクトをビルドするメイクファイルを持っています。リリースビルド後にmakefileがデバッグフォルダを作成しないのはなぜですか?

makeで呼び出されたときにそれは罰金のビルドが、私は試してみて、その後make debugをすれば、それも私のビルドの間でmake cleanを呼び出す場合でも、リンクが失敗したことを意味する、デバッグ出力ディレクトリを作成しようとしません。

ただし、「リリース」フォルダを削除すると、デバッグビルドが機能します。

これはなぜ起こるのですか?

Makefileの

EXEC_DIR = ../../../../Bin/linux/release/ 
EXECUTABLE = $(EXEC_DIR)/prog 
CC = g++ 
DEBUG = -g -D_DEBUG 

... 

CFLAGS = -Wall -c $(INCLUDE_DIRS) -std=c++11 
LFLAGS = -Wall 

... 

all : $(EXECUTABLE) 

debug : EXEC_DIR = ../../../../Bin/linux/debug/ 
debug : EXECUTABLE = $(EXEC_DIR)/prog 
debug : CFLAGS += $(DEBUG) 
debug : LFLAGS += $(DEBUG) 
debug : $(EXECUTABLE) 

$(EXECUTABLE) : $(OBJS) | $(EXEC_DIR) 
    $(CC) $(LFLAGS) $(OBJS) -o $(EXECUTABLE) 

$(EXEC_DIR) : 
    mkdir -p $(EXEC_DIR) 

... 

clean : 
    -rm *.o *~ 
+1

'debug:EXEC_DIR = ../../../../ Bin/linux/debug /'という行は、あなたが思うとは思っていません。それは、 'debug'ターゲットのスコープに対してのみ' EXEC_DIR'をセットしているのです(makefileに対してはグローバルではありません)。 – John

+1

それが期待どおりに動作したとしても、ソースファイルのどれも変更されていないので、実行可能ファイル以外のものは再構築しません。 –

+0

しかし、もっと重要な点として、 'debug'ターゲットに対して設定された' EXEC_DIR'の値は、 'debug:EXECUTABLE ='代入行中には有効ではありません。それが問題です。 'make -p'の出力を見て' debug'ターゲットを見てください。 –

答えて

1

それであなたはdebugレシピ(ないそのサブレシピ)の範囲でのみ有効ですTarget Variableを、作成されてやっています。

ifeq ($(filter debug,$(MAKECMDGOALS)),debug) 
    EXEC_DIR = ../../../../Bin/linux/debug/ 
    OBJ_DIR = ../../../../Bin/linux/debug/objs 
    ... 
endif 

してからオブジェクトファイルのすべてに$(OBJ_DIR)を付加:あなたはおそらくやりたいことは次のようにラインを持っています。これは、Etanが言及していたソースファイルの再構築ではありません。

+0

これは、リリースビルドのために通常は 'EXEC_DIR'と' OBJ_DIR'を宣言した後、ファイルの先頭にあるべきですか? – Cameron

+0

ファイルの先頭でelseを使用するか、または他の宣言の後に指定します(最後の宣言が優先されます) – John

+0

これをどのように呼び出しますか? – Cameron

関連する問題