2012-02-07 12 views
14

Şimdiki haliyle yönetmek zor oluyor gibi benim bin ve kod dosyaları ayrı dizinlere bölmek edebilmek istiyorum.Makefile, kaynak kodu ve ikili dosyalar için nasıl ayrı dizinler kullanabilir?

Ben ideal istiyorum

el her program bir olduğu akılda her programda (ayı için kuralları yazmak zorunda kalmadan benim şimdiki sistem ile çalışmak için bu alamıyor Ancak
project_dir 
|-Makefile 
|-run_tests.sh 
| 
|__source 
| |-program1.cpp 
| |-program2.cpp 
| 
|__bin 
    |-program1 
    |-program2 

ayrı bir program, nesnelerin değil bir dizi kaynak dosyaları olmayan olsa bile her zaman ikilileri yeniden oluşturur düşünüyorum bu yüzden şimdiki yolunda hedefini göremiyorum ben

#Current make system 
BIN=./bin/ 
SOURCE=./source/ 

LIST=program1 program2... 

all: $(LIST) 

%: $(SOURCE)%.cpp 
    $(CC) $(INC) $< $(CFLAGS) -o $(BIN)[email protected] $(LIBS) 

bu onun dışında çalışır) birbirine bağlanmıştır değişti. Tek düşüncem şu anda bir makefile yapmak için bir program yazmaktır ama bunu yapmak istemiyorum. Kullan automake:

+0

Geleneksel yaklaşım "src" kaynak dizinini çağırmak, oradaki ikili dosyaları oluşturmak ve ikili dosyaların "bin" dizinine kopyalandığı ayrı bir "yükleme" adımına sahip olmaktır - özel bir yardımcı program bile vardır Bunu yapmak için 'yükleyin. – reinierpost

cevap

17

Neredeyse vardı ...

#Current make system 
BIN=./bin/ 
SOURCE=./source/ 

LIST=$(BIN)/program1 $(BIN)/program2... 

all: $(LIST) 

$(BIN)/%: $(SOURCE)%.cpp 
    $(CC) $(INC) $< $(CFLAGS) -o [email protected] $(LIBS) 

Ayrıca aşağıdaki

PROG=program1 program2 
LIST=$(addprefix $(BIN)/, $(PROG)) 
+0

Aptal bir soru olabilir, ancak komut satırındaki '%' değişkenini (yani daha az dizin) kullanmanın bir yolu var. "gcc blah blah -D%" (böylece program kendi ismini bilir) – 111111

+2

Evet, sapı almak için '$ *' kullanabilirsiniz. –

+0

Mükemmel Sanırım dosyam bitmek üzere, tüm yardımlarınız için teşekkürler. – 111111

1

Kolay çözüm kullanarak LIST kolaylaştırabilir.

El ile bunu yapmak istiyorsanız, vpath yönergesini veya VPATH ortam değişkenini kullanmanız gerekir. GNU make kılavuzu, bunlarla ilgili a section numarasına sahiptir. Makefile'nizi doğrudan kaynak kodunadizinine koyun, VPATH olarak ayarlayın ve örtülü kurallar tekrar çalışacaktır.

+1

Eğer iyi yapılmış bir make dosyası ile yapılabilir eğer automake hayranı değil. – 111111

1

Makefile'nin kullanıma hazır bir versiyonu. .cpp dosyaları için /build/ :

aşağıdaki dizinde .o dosyaları için

ile klasör hazırlayın ikili dosyalar için /src/ : /bin/

Ardından kullanmak aşağıdaki Makefile /

CC   = g++ 
LD   = g++ 
CFLAG  = -Wall 
PROG_NAME = prog 

SRC_DIR  = ./src 
BUILD_DIR = ./build 
BIN_DIR  = ./bin 
SRC_LIST = $(wildcard $(SRC_DIR)/*.cpp) 
OBJ_LIST = $(BUILD_DIR)/$(notdir $(SRC_LIST:.cpp=.o)) 

.PHONY: all clean $(PROG_NAME) compile 

all: $(PROG_NAME) 

compile: 
    $(CC) -c $(CFLAG) $(SRC_LIST) -o $(OBJ_LIST) 

$(PROG_NAME): compile 
    $(LD) $(OBJ_LIST) -o $(BIN_DIR)/[email protected] 

clean: 
    rm -f $(BIN_DIR)/$(PROG_NAME) $(BUILD_DIR)/*.o 
de

Son programınız, derlediğiniz her zaman /bin/ programında prog olarak adlandırılacaktır. Kod, ikili dosyalar /build/ adresinden ayrılacak, böylece kaynak kod dizini çok düzgün ve temiz olacaktır.

İlgili konular