C ++ Build Systems - Ne kullanılır? [kapalı]


136

C ++ 'da yeni bir projeye başlıyorum - başlangıçta sadece kendi zamanımda - ve mevcut yapı sistemlerini araştırıyorum. Cevabın "Çok ve hepsi korkunç" gibi görünüyor.

Bunun için özellikle ihtiyacım olan özellikler:

  1. C ++ 11 desteği
  2. Çapraz platform (Linux ana hedef olarak, ancak en azından Windows üzerinde de oluşturulabilir)
  3. İyi birim testi desteği
  4. Kodları ayırmak için birden fazla modül desteği
  5. Kod oluşturma desteği (asn1c veya protobuf kullanma -% 100 emin değilim)
  6. Bakımı kolay

Şimdi, CMake ve Autotools kullananların 1-4'ünü yeterince kolayca yapabileceğimi biliyorum. Muhtemelen ayrıca SCons ve Waf ve diğerleri ile de. Sorun, bunları kullanarak kod oluşturma nasıl doğru bir şekilde çalıştım - bu, oluşturma işlemi ilk çalıştırılana kadar mevcut olmayan kaynak dosyaları, bu nedenle derleme sisteminin yürütülebilir koda dönüştürmek gerekir kaynak dosyaları ancak yapı başlayana kadar gerçekten bilmiyor ... (ASN1C, birlikte çalışabilmesi gereken düzinelerce başlık ve kaynak dosyası oluşturur ve gerçek dosya kümesi asn dosyanızın içeriğine bağlıdır) ayrıca bunların hiçbirinin bakımı özellikle kolay değildir - CMake ve Autotools'un çalışması için yönetmeniz gereken büyük komut dosyaları vardır,

Peki - böyle bir şey için hangi yapı sistemleri önerilir? Yoksa şimdilik dosyaları ve kabuk komut dosyalarını yapmakla sıkışıp kalacağım?


11
"Cevabın 'Çok, hepsi korkunç' gibi görünüyor" izlenimim de ('bakış açımdan korkunç' ilavesi ile; Bu tür terimlerle çok fazla genelleştirmek istemiyorum ). Aslında bu sebeple kendiminkini kurdum ve istediğim şeyi ve her zaman işlerin nasıl çalışmasını istediğim için beklenenden daha iyi sonuç verdi. Biraz daha az zaman alan bir şey için, muhtemelen mevcut araçlardan geçmeniz ve diğerlerinden daha az baş ağrısı veren bir araç seçmeniz gerekecektir.
Christian Stieber

4
Tup'u deneyin .
Kerrek SB

Ayrıca bakınız: stackoverflow.com/q/3349956
ergosys

8
Bir derleme sisteminden ne tür bir C ++ 11 desteği bekliyorsunuz? Bu derleyiciden aldığınız bir şeydir, derleme sistemi gerçek kaynak dosyalarını ayrıştırmaz, hatta okumaz, sadece onlara ihtiyaç duyanlara iletir, değil mi?
Baruch

5
Doğru, ancak derleyiciye C ++ 11 desteğini kullanmasını söylemeyi kolaylaştırmak iyi olurdu. g ++ bir bayrağa ihtiyaç duyar, farklı bir set clang, msvc görünüşe göre herhangi bir şeye ihtiyaç duymaz. Ayrıca, hangi c ++ 11 özelliklerinin mevcut olduğunu saptama desteği de yararlı olacaktır çünkü derleyiciler arasında farklılık gösterir ...
Graham

Yanıtlar:


117

+1, "Birçok, ve onlar korkunç."

Ancak, "en zengin" ve "en ölçeklenebilir" muhtemelen bir Makefile-üreteci olan CMake'dir (ayrıca doğal MSVC ++ *.proj/ üretir *.sln). Tuhaf sözdizimi, ancak bir kez öğrendikten sonra, farklı platformlar için güzel yapılar oluşturmanıza izin verebilir. Eğer "tazelenmeye başlasam", muhtemelen kullanardım CMake. "Kod oluşturma" işleminiz, ne yapmak istediğinize bağlı olarak yapı sisteminin ötesinde "kendi başına bir yaşam" alabilir. (Aşağıya bakınız.)

Basit projeler için QMake oluşturucusu tamamdır ( QMake'i kullanmak için Qt kütüphanelerini kullanmanıza gerek yoktur). Ancak, "basit" kod tanımlamıyorsunuz - kod üretimi ve "ekstra fazlar" CMake, Scons(veya Waf) gibi kendi uzantılarınız için muhtemelen istediğiniz veya zengin bir API'ye sahip bir şey anlamına gelir .

İş yerinde Scons kullanıyoruz . "Kurşun geçirmez yapılar" üretir, ama gerçekten yavaştır. Başka hiçbir sistem kurşun geçirmez olmayacaktır Scons. Ama yavaş. Python'da yazılmıştır ve "çalışma alanı organizasyonumuz" (sadece modül bağımlılıklarını belirttiğimiz) için arayüzü genişlettik ve bu Sconstasarım amacının bir parçası ( Python aracılığıyla bu tür bir uzantı). Kullanışlı, ancak yapılar yavaş. Kurşun geçirmez yapılar alırsınız (herhangi bir geliştirici kutusu son sürümü yapabilir), ancak yavaş. Ve yavaş. SconsYine de kullanırsanız , yavaş olduğunu unutmayın. Ve yavaş.

2000 Yılından sonraki on yıl içinde hala uçan arabamız olmadığını düşünmek beni hasta ediyor. Muhtemelen onları elde etmek için yüz yıl daha beklememiz gerekecek. Ve sonra hepimiz hala berbat yapı sistemleri ile inşa edilen uçan arabalarımızda uçacağız.

Evet, hepsi korkunç.

[KOD ÜRETİMİ HAKKINDA]

Scons"aşamalar" üzerinde çalışır ve "biraz statik" dir. Yapının bir parçası olarak üretilen kodu oluşturabilir (insanlar bunu birkaç farklı şekilde yapıyor), ancak bu "çok Scons benzeri olmayan bir şey" olarak tanımlandı.

Basitse "bazı dosyaları önceden işleyin ve kaynak dosyaları oluşturun", o zaman biggie yok (birçok seçeneğiniz var ve bu yüzden qmakeyazılmıştır - dosyaların mocönişlenmesi için *.hpp/*.cpp).

Ancak, bunu "ağır" bir şekilde yapıyorsanız, kendi kodunuzu yazmanız gerekecektir. Örneğin, veritabanlarını sorgulayan ve "katmanlar" (geleneksel 3 katmanlı uygulama geliştirmede) arasında arabirim oluşturmak için C ++ sınıfları oluşturan derlemenin bir parçası olarak komut dosyalarımız vardı. Benzer şekilde, IDL'ler aracılığıyla sunucu / istemci kaynak kodu oluşturduk ve birden çok istemcinin / sunucunun farklı sürümlerle (aynı "istemci" veya "sunucu" için) aynı anda çalışmasına izin vermek için gömülü sürüm bilgileri ekledik. Çok sayıda üretilen kaynak kodu. Bunun "yapı sistemi" olduğunu "iddia edebiliriz", ama gerçekten, "yapılandırma yönetimi" için önemsiz olmayan bir altyapıdır, bunun bir kısmı "yapı sistemi" dir. Örneğin, bu sistem "devralma" ve "


37
Scons'u da seviyorum - ama bence yavaş.
Lothar

1
Kod oluşturulduğunda isteğe bağlı ikinci bir aşama yapmak için CMake'in Makefile sarıcı ile kod oluşturma işlemini gerçekleştirmesini sağlayabilirsiniz. : Ben vs. yeniden cmake, bakınız tetiklemek için kod oluşturma sonra tam bağımlılık izleme, erken çıkış desteklemek başardı javaglue.com/javaglue.html#tag:JavaGlue ve code.google.com/p/javaglue
sdw

3
Yaklaşık 2 yıl sonra hala SCons'un yavaş olduğunu düşünüyor musunuz? Ben bir yapı sistemi seçerken zaman, ben rastladım bu ve bunun Scons ile gitmek benim kararına katkıda bulunmuştur.
JBentley

2
@Ben, bu doğru, ama aynı zamanda yavaş.
charley

2
Buna bakan herkes Meson'u (ninja kullanan) düşünmelidir.
Matthew D. Scholefield

33

Gradle'ı şimdi kullanabilirsiniz: https://docs.gradle.org/current/userguide/native_software.html

Bunu aslen yayınladığımdan bu yana bu yıllar içinde biraz olgunlaşmış gibi görünüyor. Projenin "inkübe" olduğunu belirten sayfa kayboldu, ancak bu durumu kaldıran hiçbir resmi duyuru bulamıyorum.


Gradle'a katılıyorum. Gradle ölçeklenebilir olarak tasarlanmıştır. Ancak, eklenti uygulamasının ne kadar hızlı olduğuna bağlıdır. Ayrıca kepçenin kendisi için bazı ek yükler vardır. Ayrıca, bazı eklentilerin kullanım durumlarınız için özelleştirilmesi gerekebileceğini unutmayın.
JE42

Graderin C ++ 'ı desteklemeye ilgisini görmek ilginç. Umarım hepimizin eksik olduğu c ++ projeleri için güzel ve sağlam bir yapı sistemi üretirler.
hbobenicio

@squid teşekkürler, güncellendi.
Nate Glenn

1
Gradle güçlü ancak basit. Hiçbir garip sözdizimi, tek bir gradle.build dosyası genellikle birden fazla yürütülebilir çıktı (main, testler, vb.) İle tüm bir proje oluşturmak için yeterlidir. Tüm kaynak dizinlere dosya dökümü yapılmaz. Versiyon için süper kolay.
Overdrivr

1
Geçtiğimiz iki günü Gradle ile savaşarak geçirdim, sadece bir "merhaba dünya" kütüphanesi, uygulaması ve gtestleri oluşturmaya çalışıyorum ve bunu yeni bir proje için önerebileceğimi söyleyemem. Araçların hepsi orada olabilir, ancak belgeler mevcut değildir (şüphenin faydasını verir). Belki de onu uygun bulanlar en sevdiğiniz kaynaklara işaret edebilir?
jwm

16

Bunları buldum, henüz hepsini kişisel olarak kullanmadım:

Ninja , hız odaklı küçük bir yapı sistemi. Google artık Android oluşturmak için Make: link yerine Ninja'yı kullanıyor .

Sallamak , güçlü ve hızlı bir yapı sistemi.

Tup , yüksek performanslı bir yapı sistemi. Algoritmik tabanlı tasarım. Tüp Analizleri .

Şimdi hepsi platformlar arası ve Windows'u destekliyor. Gereksinimlerinizin geri kalanından henüz emin değilim, çünkü bunları henüz kendim test etmedim. Ticari gelişimde kullanılıyorlar, CIG Ninja'yı aldı. Bir proje jeneratörü ile Ninja'nın kolaylığını ve hızını kullandım ve seviyorum. İlk ikisi Scons, Ant, vb.


1
Tup, sembol aramalarını bozacak, başka herhangi bir derleme sistemi ile güzel bir şekilde oynamıyor (gerçekten, gerçekten), rastgele çıktılarla ( dosyalara javacayrılmış iç sınıflarla oluşturulan sınıflar gibi) güzel oynamıyor class$1.class, kötü yazılmış ve ne yapmak için sistem kesmek kullanır. Küçük sistemler için harika; büyük projeler için sürdürülemez.
Qix - MONICA SEÇİLDİ

@Qix: Çıktıyı deponuzdan ayrı tutamaz mısınız?
Kerrek SB

1
@KerrekSB Yapabilirsiniz, ancak sembol aramayla ilgili sorun bu değildir. TUP, FUSE kullanır ve kendi ara katman yazılımını bağlar .tup/mnt. Daha sonra, .tup/mnt/@tupjob-XXXXXokuma / yazma işlemlerini izlemek için derleme yapılandırmasını zorunlu kılmak üzere bir klasördeki (yani ) tüm derleme programlarını çalışma dizini olarak çalıştırır. Yol kesinlikle saklanmadığı sürece (yani sembollerle) iyi çalışır. İkili derlediğinizde, sembol yolu ikilinin kendisinde saklanır. Bu, GDB sembolleri yüklemeye çalıştığında, tupjobhatalara neden olmayan bu yolu arar .
Qix - MONICA HAZIRLANMIŞ

Hem Tup hem de Ninja, Make'den daha düşük veya daha düşük olan çok düşük seviyeli araçlardır. C ++ 'a uyarlanmamışlar. Bu araçları kendi başlarına sistemler inşa etmek bile istemem çünkü gerçek yapı sistemlerinin karmaşık gerçek dünya projeleriyle başa çıkmak için sunduğu birçok önemli üst düzey özelliği eksik. Bu sistemlerden bazıları Ninja'yı arka uç olarak kullanabilir.
Johan Boulé

11

Scons çok samimi ve esnek bir sistem, ama haklısın, Lothar, gerçekten yavaş.

Ancak Python'da yazılmış programların performansını artırmanın bir yolu var. Bu JIT kullanımı. Bilinen tüm projeler arasında PyPy, çok güçlü, hızlı büyüyen ve motive olmuş bir JIT destekli Python 2.7 uygulamasıdır. Python 2.7 ile PyPy uyumluluğu oldukça şaşırtıcı. Ancak Scons, PyPy uyumluluk wiki'sinde desteklenmeyen bir proje olarak ilan edildi . Öte yandan, piton tabanlı otoklavlar emici olarak modellenen Waf , PyPy altyapısı tarafından tamamen destekleniyor. Projelerimde toplantının hızı PyPy'ye geçişte 5-7 kat arttı. Performans raporlarını PyPy'den görebilirsiniz .

Modern ve nispeten hızlı inşa sistemi için Waf iyi bir seçimdir.


Scons'ın bağlantılı wiki sayfasında "Uyumlu" olarak işaretlendiğini belirtmek gerekir, bu yüzden görünüşe göre şimdi PyPy ile çalışıyor.
Sahte İsim

8

Google derleme sistemi iyi bir alternatiftir: http://bazel.io/


3
"Çapraz platform (Linux ana hedef, ancak en azından Windows üzerinde de inşa edebiliyor)". Bazel'in SSS'si "Şu anda aktif olarak Windows desteğini geliştirmek için çalışıyoruz, ancak yine de kullanılabilir olmanın yolları."
Michael Mrozek

3
Sistemin kendisi mi yoksa projeyi kuran kişi mi olduğundan emin değilim, ama bunu @ work kullanarak arkada büyük bir acı yaşadım. Çok esnek değil (sadece ürpertici değilse, genellikle yetersiz, bir şey yapmanın bir yolunu desteklediği için), yeterince güçlü değil, kötü belgelenmiş (temel vakaların yanı sıra), az topluluk var, bu nedenle yığın akışının sizi kurtarmasını beklemeyin , kendi başına oldukça bağımlılık, çoğu sistem, vb, vs, vb çoğu IDE ile iyi oynamayın. Bu yüzden google hayranı değilseniz - ondan uzak durun (btw, Buck adında bir facebook sürümü var - facebook hayranları için)
Slava

Hey, 6 hafta geçirdikten sonra CMake'in çalışmasını sağlamak için kullanımı gerçekten kolay buldum . Ben üçüncü taraf bağımlılıkları indirmek ve onları derlemek istedim (ben güzel python ve JavaScript araçları oluşturmak için kullanılan gibi). Bu kolaylaştı, ancak desteklemeyen 3. taraflar için kendi bazel dosyalarınızı yazmak zorunda kalabilirsiniz. Bunları saklamak için merkezi bir repoya ihtiyaçları var.
CpILL

6

SCons kullandım ve bu derleme sisteminden çok etkilendim. SCons, python ve python tarafından genişletilebilir - harika, çünkü Python ihtiyacınız olan her şeye sahiptir, sadece mantığı kodlayın, tüm düşük seviyeli işlevsellik zaten SCons ve Python'da uygulanmıştır ve çapraz platformdur. İyi programlama becerileriniz varsa, derleme komut dosyalarınız mükemmel ve kolay görünecektir.

Marka, CMake ve benzeri yapı sistemleri makroların çöpü gibi görünüyor. Waf SCons analogudur. Waf çalışıyorum ama SCons daha kolay olacak ve bu yüzden SCons ile kaldı.

Kalabalık görüşüne göre SCons çok yavaş, ancak bir projenin ortasında yapım hızı ile marka ve SCons arasında herhangi bir fark görmedim. Bunun yerine, SCons, paralel yapılarla iyi çalıştı, make'in de büyük sıkıntıları var.

Ayrıca, SCons, hepsi bir arada, yapılandırmak, oluşturmak, dağıtmak, şablonlardan yapılandırma oluşturmak, testleri çalıştırmak ve yapılabilecek diğer görevleri yapmak için python ve SCons ile kodlama yapabilmenizi sağlar. Bu çok büyük bir avantaj.

Basit bir proje için CMake de iyi bir seçimdir.


3
Buradaki sorunum şımarık olduğum. Mesleğe göre bir Java geliştiricisiyim ve Java dünyasında Gradle gibi araçlar C ++ geliştirme için gerçekten sahip olmak istediğim araçlardır. Harici bir bağımlılık olmadan, tek satırlık bir yapı dosyası kullanarak bir gradle projesi kurabilirim. Bu kadar. Çok sayıda bağımlılığa sahip çok modüllü projelerin de yapılması kolaydır ve aslında basit bir C ++ projesinden bile çok daha az yapılandırmada ağırlığa sahiptirler ...
Graham

-I gibi dirs ve -L kütüphane dirs gibi sistem yapılandırma bayrakları soyut değil çünkü Scons kullanan diğer paketleri oluşturmakta sorun vardı. CFLAGS almaz, genellikle doğru yere bakmak için her scons betiğini değiştirmeniz gerekir.
ACyclic

5

sadece sentlerimi eklemek için:

http://industriousone.com/premake

wiki'de özel bir web sayfası da var .


2
Ne yazık ki Premake, OP gereksinimlerine göre kod oluşturmayı desteklemiyor. Ve yapabileceğiniz birkaç şey olmasına rağmen, birim test için desteğini "iyi" olarak adlandırmam.
ergosys

@ergosys karınca belirtilmediğini fark, antayrıca C / C ++ destekler, bu sizin için iyi olup olmadığına bakın, sahip olduğum soyadı, sadece bunun için Makefiles ve Cmake kullanın.
user827992

2

Ceedling'i kullanabilirsiniz . Bununla birlikte, şu anda sadece C'yi desteklemektedir ve yazarın Unity ve CMock test çerçevelerine sıkıca bağlıdır.

Bir C ++ derleyici ve birim test / alaycı çerçeve ile çalışmak için çatallanabilir ve değiştirilebilir.

Ayrıca Tup layık bir söz. Son derece hızlıdır, ancak çerçeveleri vb. Test etme hakkında hiçbir şey bilmez. TDD yapmayı planlıyorsanız, Tup muhtemelen gidilecek yoldur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.