2016-03-25 27 views
1

Bazı "giriş" -dizinlerinde derlemek ve farklı "çıktı" -dizinleri koymak istediğim bazı kaynak dosyalarım olduğunu varsayalım. Çıktı dizinlerini hesaplamak için tek yapmanız gereken giriş dizinlerini almak ve obj ve x/y/x ile src'u u/v/w (çift dize değiştirme) ile değiştirmektir.Gnu-make, giriş dizinini aldıktan sonra ve bunun üzerine birden çok dize değiştirmesi uyguladıktan sonra bir dizin yoluna dosyalar derlemek için nasıl kullanılır?

Örneğin

:

soruma Şimdi
g++ -c src/a/x/y/z/b/c/file1.cpp -o obj/a/u/v/w/b/c/file1.o 
g++ -c src/a/x/y/z/b/c/file2.cpp -o obj/a/u/v/w/b/c/file2.o 
g++ -c src/b/x/y/z/c/d/file3.cpp -o obj/b/u/v/w/c/d/file3.o 

:

Sana Make GNU içinde bir "kök" konulu bir tek dize değişiklik% kullanabileceğinizi biliyor, ama ne olsaydı çoklu ikameler yapmak için? Bunu nasıl yaptın?

Olası GNU Makefile: desen kural başına

Dediğiniz gibi
found_files := $(shell find src -type f -name '*.cpp') 
all: $(found_files) 
obj/%/x/y/z/%.o: src/%/u/v/w/%.cpp <---- GNU Make will not let me use multiple % here 
     $(CXX) -c -o [email protected] $< 
+0

Bunun çözüm olarak göründüğü somut bir probleminiz var mı? –

+0

Evet, bunun çözüm olarak göründüğü somut bir problemim var. Tam olarak neden bu kadar sıkıntı verici detaylarla sizi sıkmadan açıklamakta zorlanıyorum. Ürünle çalışıyorum. Üretim kodu cmake kullanılarak oluşturulmuşken, test kodu gnu make kullanılarak oluşturulmuştur. Sadece gnu make build sisteminin kontrolü var. Üretim kodunun bir parçası, bir kod oluşturmaktır. Ne yazık ki cmake, kaldırmak istediğim oluşturulan kod yoluna "CMakeFiles" (x/y/z ile karşılaştırılabilir) ekler. Dahil yol temizse oluşturulan başlık dosyalarını eklemek daha kolaydır. –

cevap

1

, bir% -wildcard ama elde ettiğin. bu nedenle senaryoda hiçbir desen kural .o s için .cpp s eşleme ifade edebilir ve her .cpp için belirgin derleme tarifi tanımlamalıdır ->.o çifti. Ben senin senaryonun bir "Merhaba dünya" örnek kurarsanız, bu makefile verir

src2obj = $(subst x/y/z,u/v/w,$(patsubst %.cpp,%.o,$(patsubst src/%,obj/%,$(1)))) 

define compile = 
$(call src2obj,$(1)): $(1) 
    g++ $(CPPFLAGS) $(CXXFLAGS) -c -o [email protected] $$< 
endef 

srcs := $(shell find src -type f -name '*.cpp') 
objs := $(foreach src,$(srcs),$(call src2obj,$(src))) 

.PHONY: all clean 

all: prog 

prog: $(objs) 
    g++ -o [email protected] $^ $(LDFLAGS) $(LDLIBS) 

$(foreach src,$(srcs),$(eval $(call compile,$(src)))) 


clean: 
    rm -f $(objs) prog 

Makefile: Sen make yüzden gibi tüm bu tarifleri oluşturmak için alabilirsiniz

make && ./prog 
g++ -c -o obj/b/u/v/w/c/d/file3.o src/b/x/y/z/c/d/file3.cpp 
g++ -c -o obj/a/u/v/w/b/c/file1.o src/a/x/y/z/b/c/file1.cpp 
g++ -c -o obj/a/u/v/w/b/c/file2.o src/a/x/y/z/b/c/file2.cpp 
g++ -o prog obj/b/u/v/w/c/d/file3.o obj/a/u/v/w/b/c/file1.o obj/a/u/v/w/b/c/file2.o 
Hello World 

Ancak, bu gibi dikenli kodları yapmama izin veren yapı ağacının makul bir şekilde yeniden yapılandırılması için ciddiyetle bakıyorum.