SORU
23 EKİM 2008, PERŞEMBE


Nasıl alt-dizinleri kaynak sadece bir makefile kullanarak bir Makefile oluşturmak için

Alt dizinleri bir sürü kaynak var:

src/widgets/apple.cpp
src/widgets/knob.cpp
src/tests/blend.cpp
src/ui/flash.cpp

Proje kökünde tek bir Makefile gibi bir kural kullanarak oluşturmak istiyorum

%.o: %.cpp
   $(CC) -c $<

build/test.exe: build/widgets/apple.o build/widgets/knob.o build/tests/blend.o src/ui/flash.o
   $(LD) build/widgets/apple.o .... build/ui/flash.o -o build/test.exe

Bu çalıştığımda/widget/apple oluşturmak için bir kural bulmak.Ç. Bu %çok şey değiştirebilir miyim.o: %.cpp/widget/apple oluşturmak için ihtiyaç duyduğu zaman kullanılır.o ?

CEVAP
20 Mart 2010, CUMARTESİ


Bu işe yarıyor:

CC        := g  
LD        := g  

MODULES   := widgets test ui
SRC_DIR   := $(addprefix src/,$(MODULES))
BUILD_DIR := $(addprefix build/,$(MODULES))

SRC       := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.cpp))
OBJ       := $(patsubst src/%.cpp,build/%.o,$(SRC))
INCLUDES  := $(addprefix -I,$(SRC_DIR))

vpath %.cpp $(SRC_DIR)

define make-goal
$1/%.o: %.cpp
    $(CC) $(INCLUDES) -c $$< -o $$@
endef

.PHONY: all checkdirs clean

all: checkdirs build/test.exe

build/test.exe: $(OBJ)
    $(LD) $^ -o $@


checkdirs: $(BUILD_DIR)

$(BUILD_DIR):
    @mkdir -p $@

clean:
    @rm -rf $(BUILD_DIR)

$(foreach bdir,$(BUILD_DIR),$(eval $(call make-goal,$(bdir))))

Bu Makefile kaynak dizinlerdeki dosyalar dahil olduğu varsayılır. Eğer mevcut değilse oluşturmak dizinler var ve bunlar oluşturursa da kontrol eder.

Son satır çok önemli. Örtük kurallar için her fonksiyonu make-goal, ve gerekli değildir kullanarak onları tek tek yazmak yapı oluşturur

Ayrıca otomatik bağımlılık nesil, Tromey's way kullanarak ekleyebilirsiniz

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ludique

    Ludique

    21 NİSAN 2009
  • Phymec

    Phymec

    18 Temmuz 2009
  • TomSka

    TomSka

    30 Mayıs 2006