Autotools, Cmake ve Scons arasındaki farklar nelerdir?


259

Autotools, Cmake ve Scons arasındaki farklar nelerdir?


Bu konu Scons wiki'de zaten tartışılmıştır . Aşağıdaki bağlantıları ziyaret etmenizi öneririm: 1. scons.org/wiki/SconsVsOtherBuildTools Ubuntu Forum'da çok benzer bir tartışma konusunu ziyaret ettiniz mi ?
bhadra

Bu pdf'yi kontrol edebilirsiniz www-alt.gsi.de/documents/DOC-2007-Sep-17-1.pdf ; artıları ve eksileri vardır ve ayrıca her araç hakkında bazı ayrıntılar vardır.
Adam

Yanıtlar:


190

Gerçekte, Autotools'un 'tek gerçek' tasarruf zarafeti ', tüm GNU projelerinin büyük ölçüde kullandığı şeydir.

Autotools ile ilgili sorunlar:

  • Gerçekten ARCANE m4 makro sözdizimi, "uyumluluk" için testler için ayrıntılı, bükülmüş kabuk komut dosyası ile birleştirildi.
  • Dikkat etmiyorsanız , çapraz derleme yeteneğini bertaraf edeceksiniz (Nokia'nın Scratchbox / Scratchbox2 ile Maemo / Meego için yan basamak son derece kırılmış Autotools kurulumları oluşturduğuna dikkat edilmelidir.) Bu nedenle, testlerinizde sabit, statik yollara sahip olduğunuzda, çapraz derleme desteğini kıracaksınız çünkü sistem kök belirtiminize uymayacak ve ana sisteminizden bir şeyler çekecektir. Çapraz derleme desteğini kırırsanız, kodunuzu OpenEmbedded gibi şeyler için kullanılamaz hale getirir ve yayınlarını hedef yerine çapraz derleyici üzerinde oluşturmaya çalışan dağıtımlar için "eğlenceli" hale getirir.
  • NOBODY'nin şu anda ve günümüzde hemen hemen her şeyle kullandığı eski, kırık derleyicilerle ilgili sorunlar için BÜYÜK miktarda test yapıyor . Solaris, AIX veya benzerlerinin gerçekten eski bir versiyonuna glibc, libstdc ++ veya GCC gibi bir şey inşa etmedikçe , testler zaman kaybıdır ve yukarıda belirtildiği gibi birçok potansiyel kopma için bir kaynaktır.
  • Bir Windows sistemi için kullanılabilir kod oluşturmak üzere bir Autotools kurulumu elde etmek oldukça acı verici bir deneyimdir. (Windows için çok az kullandığım halde, platformlar arası kod geliştirdiği iddia edilirse ciddi bir endişe.)
  • O kırıldığında, harcamak için gidiyoruz SAAT ziyade, (Aslında bu benim yapmaya çalıştığım şey bu kişiye betik Yapınızın çözmek için yanlış var yazdığı şeyleri sıralamak için çalışıyor kuyruk peşinde (veya, Autotools'u tamamen sökün- Bu ayın geri kalanında karışıklığı çözmek için yeterli zaman olduğundan şüpheliyim ...) şu anda yazdığım için iş için Apache Thrift, çaprazlamayan BROKEN derleme sistemlerinden birine sahip -compile.)
  • "Normal" kullanıcıların gerçekten edilir DEĞİL sadece yapacağım "./configure; markasını" - pek çok şey için, bunlar birileri tarafından sağlanan bir paket çekerek olacağız, bir PPA veya bunların dağıtım satıcı dışına gibi. "Normal" kullanıcılar geliştirici değildir ve pek çok durumda tarballs almazlar. Herkesin buradaki durumun olacağını varsaymak için bu züppelik. Tarball'ların tipik kullanıcıları, şeyleri yapan geliştiricilerdir, bu yüzden eğer varsa kırılma ile çarpacaklar.

Çalışıyor ... çoğu zaman ... Autotools hakkında söyleyebileceğiniz tek şey. Temel, temel araç zinciri kodu için GNU projesini gerçekten ilgilendiren birkaç sorunu çözen bir sistemdir. (Düzenleme (2014/05/24): kaygı bu tür bir potansiyel olduğunu belirtmek gerekir KÖTÜ kısmen size, bu düşünceden ve doğru modern sistemlerle saplı Heartbleed hakkında-endişelenmek için bir şey gerçektenAutotools'un düzelttiği şeylerin çoğuyla ilgilenen hiçbir işiniz yok. GNU muhtemelen kod tabanının, Heartbleed ile olanların ışığında büyük ölçüde kaldırılması gerekiyor) Projenizi yapmak için kullanabilirsiniz ve Linux dışında herhangi bir yerde çalışmayı beklemediğiniz ufacık bir proje için iyi çalışabilir. GNU araç zinciri açıkça doğru şekilde çalışıyor. "Linux ile güzel bir şekilde bütünleştiği" ifadesi oldukça cesur ve yanlıştır . GNU araç takımıyla oldukça iyi bütünleşir ve BT'nin hedefleri ile ilgili problemleri çözer.

Bu, buradaki başlıkta tartışılan diğer seçeneklerle ilgili bir sorun olmadığı anlamına gelmez.

SCons, Make / GMake / etc'nin yerine geçer. ve oldukça hoş görünüyor, her şey göz önünde

  • Hala gerçekten sadece POSIX aracı. Muhtemelen MinGW'yi Windows araçları oluşturmak için Autotools'tan daha kolay alabilirsiniz, ancak yine de POSIX şeyler yapmaya daha çok uygundur ve kullanmak için Python ve SCons yüklemeniz gerekir.
  • Scratchbox2 gibi bir şey kullanmadığınız sürece çapraz derleme yaparken sorunları var.
  • Kuşkusuz kendi karşılaştırmalarından CMake'den daha yavaş ve daha az kararlı. CMake için SCons'a kıyasla yarı yürekli (POSIX tarafı yapmak / yapmak için gmake ...) negatifleri ile geliyorlar. (Bu vesileyle, size gerek eğer OLDUĞUNU diğer çözümlerle karşılaştırıldığında çok genişletilebilirlik, proje çok karmaşık olmasından bağımsız Kendine sorman gereken ...)

Bu iş parçacığında CMake için verilen örnekler biraz sahte.

Ancak...

  • Yeni bir dil öğrenmeniz gerekecek.
  • Make, SCons veya Autotools kullanmaya alışkınsanız karşı sezgisel şeyler var.
  • CMake'i, oluşturduğunuz sisteme kurmanız gerekir.
  • Önceden oluşturulmuş ikili dosyalarınız yoksa sağlam bir C ++ derleyicisine ihtiyacınız olacaktır.

Gerçekte, hedefleriniz burada seçtiğiniz şeyi dikte etmelidir.

  • Eğer bir başa gerekiyor mu LOT geçerli bir çalışma ikili üretmek için kırık toolchain arasında? Evetse, yukarıda bahsettiğim dezavantajların farkında olarak Autotools'u düşünmek isteyebilirsiniz. CMake bununla başa çıkabilir, ancak Autotools'tan daha az endişe duyar. SCons bu konuda endişelenmek için genişletilebilir, ancak orada kullanıma hazır bir cevap değildir.
  • Windows hedefleri hakkında endişelenmeniz mi gerekiyor? Eğer öyleyse, Autotools tam anlamıyla çalışma dışı olmalıdır. Eğer öyleyse, SCons iyi bir seçim olabilir / olmayabilir. Eğer öyleyse, CMake sağlam bir seçimdir.
  • Çapraz derleme konusunda endişe etmek bir ihtiyaç (Evrensel uygulamalar / kütüphaneler, vb tarihinde Protobufs Apache Thrift, gibi şeyler var mı GEREKEN ... Bu umurumda)? Eğer öyleyse, Autotools kudretiWindows için endişelenmenize gerek olmadığı sürece sizin için çalışır, ancak işler değiştikçe yapılandırma sisteminizi korumak için çok zaman harcayacaksınız. Scratchbox2'yi kullanmadığınız sürece SCons şu anda neredeyse hiç hareket etmiyor - gerçekten çapraz derleme üzerinde bir tutamağı yok ve bu genişletilebilirliği kullanmanız ve aynı şekilde sürdürmeniz gerekecek Automake ile yapacaksınız. Öyleyse, sanal alandan dışarı sızma endişesi olmadan çapraz derlemeyi desteklediği ve Scratchbox2 gibi / onsuz çalışacağı ve OpenEmbedded gibi şeylerle güzel bir şekilde entegre olacağı için CMake'i düşünmek isteyebilirsiniz.

Pek çok projenin qmake, Autotools, vs.'den ayrılması ve CMake'e geçmesinin bir nedeni var. Şimdiye kadar, CMake tabanlı bir projenin ya çapraz derleme durumuna ya da bir VisualStudio kurulumuna düşmesini bekleyebilirim ya da proje sadece Windows veya yalnızca OSX parçalarını hesaba katmadığı için sadece az miktarda temizlemeye ihtiyaç duyuyorum kod tabanına. Gerçekten bir SCons tabanlı projeden - ve tam olarak 1/3 veya daha fazla Autotools projesinin bir veya Scratchbox2 bir ana bina dışında herhangi bir bağlamda inşa etmesini engelleyen SOMETHING yanlış almasını bekliyoruz olamaz.


12
Heartbleed'den bahseden bölüm bu sinirli ranttan uzaklaşıyor. Sorun, bozuk malloc'ları tespit etmek için bir konfigüratör tipi paket kullanmak değil, sistem kitaplıklarını yeniden uygulamak ve kusurları çok daha erken tespit edecek kütüphaneler üreten platform geliştiricilerini yenmek için sorun yaratmıştı. Bağlantı noktası programlarının bir nedeni, yaptığınız farkında olmadığınız küçük varsayımlara daha az bağımlı oldukları için daha yüksek kalitede olmalarıdır
Rob11311

9
Mesele şu ki, bundan hiç bir şekilde etkilenmemektedir. Autotools ile, bunun gibi şeyleri TAMAMLAMAK konusunda endişeleniyorsunuz - bu yeniden uygulamalar bu düşüncenin GENİŞLETMESİ. Olduğu gibi bir sonraki seviyeye götürmek. Bunu o arkadan görmelisiniz ... hangi noktada ondan hiç çıkmaz. Akıl yürütmenizin temel sebebini parmaklarınızla söylemediniz - tam olarak ne oldu. Shellshock ve bunun gibi birkaç başka şeyle birlikte getiren tam DÜŞÜNMEYİ alıyorum. Eğer kırılmışsa, FİKS yapmalısınız. Eğer yapamıyorsanız, neden devam ettiğini sormalısınız.
Svartalf

5
Autotools ve scons'ın emdiğinden şüphe etmiyorum, ancak bu cevap CMake'in eksilerini not etmekte zayıf bir iş çıkarıyor (tercih edilen yapım sistemim, sadece yapı sistemlerinin çok, çok üzücü durumu nedeniyle). Temel olarak, CMake, çoğu şeyi işleyen bazı çekirdek soyutlamalardan ziyade bireysel kenar vakaları için yerleşik desteğe sahip tutarsızlığın bir parçasıdır. Kesinlikle koli bandı ve programlama telidir. Yanlış bir şey yaptığımdan eminim, ancak CMakeLists.txt başına bir VS projesi kabul edilebilir bulmadıkça VisualStudio'yu desteklemiyor (VS kullanıcısı değilim, ancak Winfriendsım bana bunun kötü olduğunu söylüyor).
weberc2

5
Diğer nefret edilen programlama araçlarından farklı olarak, "CMake, iyi parçalar" (belki bir broşür ya da bir blog yazısı) adlı bir kitap yapmak için yeterli malzeme yoktur ve PHP'den ziyade kötü tasarımın bir fraktalidir .
weberc2

2
@JAB VS kullanıcıları tarafından bunun deyimsel olmadığı söylendi. Aslında, CMake, projemiz için inşa sistemi olarak değiştirildi çünkü kimse, "deyimsel" VS Project dosyalarını nasıl üreteceğini anlayamadı.
weberc2

73

Araçları kimin kullandığı arasında önemli bir ayrım yapılmalıdır. Cmake, yazılımı oluştururken kullanıcı tarafından kullanılması gereken bir araçtır. Otomatik araçlar, herhangi bir SuS uyumlu sistemde bulunan standart araçları kullanarak yazılımı oluşturmak için kullanılabilecek bir dağıtım tarball üretmek için kullanılır. Başka bir deyişle, otomatik araçlar kullanılarak oluşturulan bir tarball'dan yazılım yüklüyorsanız, otomatik araçları kullanmıyorsunuzdur . Öte yandan, Cmake kullanan bir yazılım yüklüyorsanız, edilir CKağıt kullanarak ve yazılım oluşturmak için yüklü olması gerekir.

Kullanıcıların büyük çoğunluğunun kutularına otomatik araçların yerleştirilmesine gerek yoktur. Tarihsel olarak, birçok geliştirici, yapılandırılmış komut dosyasını yeniden oluşturmak için kullanıcıyı autoconf'u çalıştırmaya zorlayan hatalı biçimlendirilmiş tarball'ları dağıttığı için çok karışıklığa neden olmuştur ve bu bir paketleme hatasıdır. Çoğu büyük linux dağıtımının, varsayılan olarak hiçbirini yüklememeleri gerektiğinde, otomatik araçların birden çok sürümünü yüklemeleri nedeniyle daha fazla karışıklık meydana gelmiştir. Daha da fazla karışıklık, yazılımlarını dağıtmak için tarball oluşturmak yerine bir sürüm kontrol sistemi (örn. Cvs, git, svn) kullanmaya çalışan geliştiricilerin nedenidir.


5
Doğru, ancak yazılımı dağıtmak için bir VCS kullanmanın kötü gibi görünmesine rağmen. Bir kasanın veya klonun içeriği bir tarballın içeriğiyle aynıysa, neden tarball'ları tavsiye edersiniz?
d -_- b

5
@ Sorunuzu anlamadım. Üzerinde çalıştığım tüm projeler VCS kasasından farklı bir tarball üretiyor. İki ayrı tutulması güvenilir dağıtımda yardımcı olur.
William Pursell

13
Birçok projenin insanlardan en son sürümü almak için VCS'yi kullanmalarını istedikleri doğrudur, ancak bu sadece geliştiriciler için uygundur. Ne yazık ki, birçok kullanıcı sürüm tarball ve VCS arasındaki farkı anlayamıyor. VCS'den inşa etmeye çalışmak daha fazla bağımlılık getirir. Kullanıcının doğru otomatik takım kombinasyonuna ihtiyacı olabilir asciidocveya help2manveya daha doxygenda önemlisi olabilir . Bu, otomobiller için büyük bir pazarlama problemi oldu. Kullanıcılar yanlış olarak tarball ve VCS arasındaki farkı anlamadıkları için autoconf'a ihtiyaç duyduklarını düşünüyorlar.
William Pursell

3
Bir proje neden Cmake'nin çıktısını, proje dosyalarını ve Makefiles'i ortak platformlar için dağıtamaz (örn.) Win, Linux ve MacOSX? Lex / yacc araçlarıyla aynı durum gibi görünüyor, geliştirilmiş C kodunu ekliyorsunuz, böylece araçlar olmadan platformlar üzerine inşa edilebilir
Rob11311 27:03

3
Bu tartışmada bahsedilen hususların doğru olduğunu düşünmeme rağmen, bu tartışmanın noktayı kaçırdığına inanıyorum. Kullanıcının tüm diğer şeyleri yüklemesi gerekir ve cmake'yi yüklemesi gerekip gerekmediği büyük bir sorun olmamalıdır. Kütüphaneler, derleyici araç zinciri ve yazılımı oluşturmak için gereken diğer araçlar hakkında daha fazla endişe duyarım.
lanoxx

24

GNU kodlama standartlarıyla ilgili değil.

Otomatik araçların şu andaki faydaları - özellikle de automake ile kullanıldığında - Linux dağıtımı oluşturmaya çok iyi entegre olmalarıdır.

Örneğin cmake ile her zaman "ihtiyacım olan -DCMAKE_CFLAGS veya -DCMAKE_C_FLAGS mıydı?" Hayır, ikisi de değil, "-DCMAKE_C_FLAGS_RELEASE". Veya -DCMAKE_C_FLAGS_DEBUG. Kafa karıştırıcı - autoconf'ta, sadece ./configure CFLAGS = "- O0 -ggdb3" ve elinizde.

İnşa altyapıları ile entegrasyon olarak, scons kullandığınız olamayacağını sorunu var make %{?_smp_mflags}, _smp_mflagskabaca sistem gücünü (yönetici ayarlayabilir) için genişleyen bir RPM makro olmanın bu durumda. İnsanlar -jNCPUS gibi şeyleri çevrelerine koyarlar. Bu çalışmayan scons ile, bu yüzden scons kullanan paketler sadece dağıtım dağıtılmış olabilir.


8
+1 ve bu doğru olsaydı dünya daha iyi bir yer olurdu. Ne yazık ki, ./configure CFLAGS=-O0makefile CFLAGS üzerine yazan ve bunun yerine kullanıcının çalışmasını gerektiren paketlerle başarısız olur ./configure --enable-debug. (örneğin tmux).
William Pursell

2
Autotools'tan daha kafa karıştırıcı değil ve William'ın haklı olarak işaret ettiği gibi, herkesin makyaj çerçevesindeki yanlış çerçeveli CFLAGS = "<foo>" ile cehenneme çekildi. Oldukça basit bir şekilde bu "eski testere" öğelerden bir diğeri. CMake örnekleri sahte ... yine ... RELEASE veya DEBUG belirtmiyorsanız ilkini yapabilirsiniz. BAŞARISIZ.
Svartalf

17

Autotools hakkında bilmek önemli olan, genel bir yapı sistemi olmamalarıdır - GNU kodlama standartlarını uygularlar ve başka hiçbir şey yapmazlar. Tüm GNU standartlarına uyan bir paket yapmak istiyorsanız, Autotools iş için mükemmel bir araçtır. Eğer yapmazsanız, Scons veya CMake kullanmalısınız. (Örneğin, bu soruya bakın .) Bu yaygın yanlış anlama, Autotools'taki hayal kırıklığının çoğunun geldiği yerdir.


11
GNU standartlarına Automake devre dışı bırakılabilir AUTOMAKE_OPTIONS = -foreignGözlerinde farklı Makefile.am. (Ya -foreignda senin autogen.sh. Sanırım neredeyse herkes bunu kullanıyor.)
Dietrich Epp

9
Evet, ancak bu yalnızca Automake'nin bir README dosyasının gerekli olup olmadığı gibi yüzeysel GNU kurallarını uygulayıp uygulamadığını kontrol eder. Sanki kuralları ile bir GNU tarzı Tarball'ı bina temel dayanak değişmez installcheckve distclean. Autotools'u kullanırken bu tür davranışları değiştirmeye çalışırsanız, sadece zamanınızı boşa harcıyorsunuz.
ptomato

1
(Teoride) tüm yazılım paketlerinin aynı şekilde oluşturulmasına ve kurulmasına izin verirler.
ptomato

Teorik olarak, BROKEN derleyicileri ve işletim sistemleri ile diğer araçlardan daha uygun bir şekilde başa çıkmanıza ve orada vurgulanan @ptomato gibi yüzeysel kuralları uygulamanıza izin verir. Eğer modern kullanıyorsanız bir üzerine aracı (örnekler için GCC veya çınlama ... demek) Modern gerçekten goofy Linux veya geçerli * BSD söylemek hiçbir şey işletim sistemi, siz yok GEREKİYOR "kurallar" var. Aslında, sizin için çok, çok daha fazla iş yaparlar ve dürüstçe çapraz derleme için yardımcı olamazlar. Bugünlerde tüm kullanımların neredeyse yarısı gömülü Linux ve * BSD içindir. NEDEN orada sana yardım edemeyecek şeylerle gidiyorsun?
Svartalf

Cevabınızı neden reddettiğinizden emin değilsiniz, çünkü cevabınızı yorumunuzda kabul ediyorsunuz ...?
ptomato

9

Geliştiriciler açısından bakıldığında, cmake şu anda kullanımı en kolay olanıdır, ancak kullanıcı açısından otomatik araçların büyük bir avantajı vardır.

autotools tek bir dosya yapılandırma betiği oluşturur ve onu oluşturmak için tüm dosyalar dağıtım ile birlikte gönderilir. grep / sed / awk / vi yardımıyla anlaşılması ve düzeltilmesi kolaydır. Bunu, / usr / share / cmak * / Modules içinde çok sayıda dosyanın bulunduğu Cmake ile karşılaştırın; yönetici erişimi olmadığı sürece kullanıcı tarafından düzeltilemez.

Yani, eğer bir şey tam olarak işe yaramazsa, standart Unix araçları (grep / sed / awk / vi vb.) Yapı sistemini anlamak zorunda kalmadan balyozla kolayca "sabitlenebilir".

Neyin yanlış olduğunu bulmak için cmake build dizininizi hiç araştırdınız mı? Yukarıdan aşağıya okunabilen basit shellscript ile karşılaştırıldığında, neler olduğunu öğrenmek için oluşturulan Cmake dosyalarını takip etmek oldukça zordur. Ayrıca CMake ile FindFoo.cmake dosyalarını uyarlamak yalnızca CMake dili hakkında bilgi sahibi olmakla kalmaz, aynı zamanda süper kullanıcı ayrıcalıkları da gerektirebilir.


7
Autotools ile ilgili sorunların
CMake'e

7
Çünkü otomatik araçlar karmaşık bir sistemdir (tıpkı CMake gibi). Autotools'un "kolayca sabitlendiğini" düşünüyorsanız (bunu düşünmek için nedenler olabilir), yanıtta sorunların nasıl daha kolay çözülebileceğini açıklamak iyi bir IMHO olacaktır.
sleske

5
autotools tek bir dosya yapılandırma komut dosyası oluşturur ve onu oluşturmak için tüm dosyalar dağıtım ile birlikte gönderilir. grep / sed / awk / vi yardımıyla anlaşılması ve düzeltilmesi kolaydır. Bunu, / usr / share / cmak * / Modules içinde çok sayıda dosyanın bulunduğu Cmake ile karşılaştırın; yönetici erişimi olmadığı sürece kullanıcı tarafından düzeltilemez. Neyin yanlış olduğunu bulmak için cmake derleme dizininizi hiç incelediniz mi? Ne olup bittiğini öğrenmek için oluşturulan CKağıt dosyaları aşağıdaki yukarıdan aşağıya okunabilir basit shellscript, karşılaştırıldığında oldukça zordur
Arved

2
Evet, bu mantıklı, teşekkürler. Cevabınıza ekleme özgürlüğünü aldım. Geri dönmek için çekinmeyin :-).
sleske

1
Kendi yerel cmake sürümünüzü her zaman kullanabilirsiniz; sistem düzeyinde yüklü olanları kullanmak için hiçbir neden yoktur. Platformlar arası çalışmalar yapan herkes için bu tamamen normaldir; Kesinlikle cmake'yi çoğu zaman kullanıyorum.
James Moore
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.