2016-04-13 20 views
0

Projemi oluşturan bir makefile sahibiyim.Makefile, sürüm oluşturma işleminden sonra neden bir hata ayıklama klasörü oluşturmuyor?

make ile çağrıldığında ince oluşturur, ama denemek ve daha sonra bir make debug yaparsak, hatta ben oluşturur aradaki make clean çağrı bile, bağlantı başarısız demektir ayıklama çıkışı dizin oluşturmayı denemez.

Ancak "yayımlama" klasörünü silersem hata ayıklama yapıyorum.

Bunun neden olduğunu bilen var mı?

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

satırı 'hata ayıklama: EXEC_DIR = ../../../../ Bin/linux/debug /' sizin yaptığınızı düşünmez. Ne yapar, EXEC_DIR 'sadece' hata ayıklama 'hedefinin (makefile için küresel değil) kapsamı için ayarlar. – John

+1

Bu beklenmedik işe yaramış olsa bile, kaynak dosyalarının hiçbiri değişmeyeceği için, çalıştırılabilir olandan başka bir şey yeniden inşa edemez. –

+0

Ancak, noktadan daha fazlası için 'debug' hedefine ayarlanan EXEC_DIR değeri 'debug: EXECUTABLE =' atama satırında geçerli değil. Sorun bu. Bunu görmek için 'debug' hedefi için make -p' çıktısına bakın. –

cevap

1

Peki debug tarifleri (değil alt tarifler) kapsamında sadece etkili olan Target Variable, yaratıyor yapıyoruz.

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

ve ardından nesne dosyalarının tümüne $(OBJ_DIR) prepend: Ne büyük olasılıkla yapmak istiyorum aşağıdaki gibi hatları var olduğunu. Bu, Etan'ın bahsettiği yeniden inşa edilmeyen kaynak dosyaları etrafında toplanıyor.

+0

Bu nedenle, dosyanın başlangıcında, EXEC_DIR 've "OBJ_DIR" normal olarak sürüm oluşturma için bildirildikten sonra olmalıdır? – Cameron

+0

Ya da bir dosyanın başlangıcında veya başka bildirimlerden sonra (son bildirim öncelik kazanır) – John

+0

Bunu nasıl çağırırım? – Cameron

İlgili konular