Doğrudan yapmak eski moda kabul edilir mi? [kapalı]


31

Bu yüzden doğrudan makefiles oluşturma ve 2015'te yapılacak aptalca bir şey hakkında birçok yorum / yazı / vb ile karşılaşıyorum. CMake gibi araçların farkındayım ve aslında CMake'i oldukça sık kullanıyorum. Mesele şu ki, CMake sadece sizin için Makefile'ı yaratıyor ve kendin yapmanın zorluğunu gidermeye yardım ediyor. Tabii ki birçok başka harika özellik de ekliyor ... ama yine de sonunda bir Makefile.

Öyleyse sorum şu, Make yapma aracına atıfta bulunma ile ilgili 'eski' konuşma mı, yoksa kendi Makefiles'inizi manuel olarak yazma fikri mi? C / C ++ gelişimi için bir IDE kullanmıyorum (sadece emacs), bu yüzden her zaman Makefiles yazdım.

Make modası geçmiş kabul edilirse, küçük, kişisel projeler inşa etmek için bir C / C ++ geliştiricisi ne kullanmalı?


8
Küçük, kişisel projeler makeiçin Makefile olmayan bir ürün yeterlidir. Ne güçlüğü var?
ott--

8
Hem masaüstü hem de sunucular olmak üzere FreeBSD sistemlerimdeki mevcut her yazılımın 'make' ile başlayan bir Makefile'i var. Hayır. 'Make' eski değildir.
Rob,

3
İnsanlar IDE'leri kullanmakta özgürdürler, ancak IDE'leri Makefiles kullanan projeleri makeilk yazmadan yaklaşık 40 yıl sonra destekleyemiyorsa , insanların bu konuda çalışmasını beklememeliler.
Miles Rout,

1
"Eskimiş konuşma ile ilgili olarak marka" sadece belirti veya bir ağrı noktası değil, kaldırma işleminin bir duyuru. Özellikle daha üstün bir total replasman henüz mevcut değilse ve hala ağrıyı azaltmaya yönelik tüm yaklaşımlar, bazı şekillerde, sadece acıya en yatkın olan kullanıcılardan gizlenmiş olarak yapar. Çok sayıda iyi cevap verilmiş olmasına rağmen, sorunun kendisi sınır görüş görüşüne dayanıyor.
rwong

1
CMakebir soyutlama katmanıdır. Bu soyutlamayı evcilleştirmek için gereklidir açık kaynak uymayan olacak tüketici IDE-ürünlerin yabani çeşitli Makefile. Yine sadece soyutlama değil, yapılandırma (autoconf gibi) özelliklerine de izin veriyor. Diğer soyutlamalar gibi alternatiflere izin verir . Ancak, CMake kullanıcıları için kolay erişilebilir hale getirilmiş Makefile alternatifleri hakkında yeni deneysel fikirlerin yolunu açıyor.
shuva

Yanıtlar:


30

En büyük fark, CMake'nin platformlar arası bir meta-inşa sistemi olmasıdır. Tek bir CMake projesi, normal Unix / Linux makefile dosyasını, Windows için bir Visual Studio projesi, Mac için bir XCode projesi ve kullanmak veya desteklemek isteyebileceğiniz hemen hemen tüm diğer meta olmayan derleme sistemlerini üretebilir.

Make make'i doğrudan kullanmak veya hatta makefiles'i elle düzenlemek bile "modası geçmiş" demem ama, Windows'a taşımayı gerektirmeyen, Unix / Linux işleri üzerinde çalışmadığınız sürece, muhtemelen yapmamanız gereken şeyler. Windows'a taşımak istemiyorsanız, Visual Studio proje dosyalarını doğrudan düzenlememelisiniz. Taşınabilirliğe ilgi duyuyorsanız, Scons veya CMake gibi bir meta-inşa sistemi öğrenmeye değer.


9
POSIX makeayrıca çapraz platformdur.
Blrfl

6
@Blrfl bu doğru olabilir, ancak genel olarak projenizi derlemek ve / veya bağlamak için kullanmanız gereken komut satırlarını bulursunuz, hedeflediğiniz tüm platformlar POSIX uyumlu olsa ve 'tümü üzerinde aynı derleyici kullanılarak yeniden (hala yerleri ile sinir bozucu sorunlar orada olacağım ihtiyacınız olsun, dosyaları dahil -lm, -lnslvb veya bu tesisler C kütüphanesinde, vb dahil edilip).
Jules

5
@Jules CMakeELF yükleyicilere sahip sistemler için standart, modüler uygulamanızın oluşturulmasına yönelik temelde çok daha fazla (ya da daha az) şey var ve bu özel takım zinciri için gerekli tüm araçlar için soyutlamalar sağlıyor. Eğer bu araç zincirinden ayrılırsanız (örneğin, çıplak metal için özel linker betiği), CMakeaniden hiçbir şekilde destek veya taşınabilirlik sağlamazsanız, tıpkı tamamen özel yapım komut dosyalarını kesmek için kullandığınız gibi hacklemelisiniz.
Ext3h

Aynı şey, Q yapımı için de geçerlidir (kötü belgelenmiş tutarsız tutarsız davranmalarına rağmen ** ap CMake,), btw;)
mlvljr

11

makegerçekten modası geçmiş?

Sanmıyorum Sonuçta, make hala değişmiş kaynağın koşullu derlemesi ve benzeri gibi istenen tüm işlevleri sağlayacak kadar güçlüdür. Söyleyen make, modası geçmiş yazma özel bağlayıcı komut modası geçmiş söyleyerek aynı olurdu.

Ama ne ham make sağlamayan, parametrik başlık oluşturma, bütünleşik test çerçevesi veya genel olarak yalnızca koşullu kütüphaneler gibi konfor için genişletilmiş işlevsellikler ve stok kütüphaneleridir.

Diğer yandan, CMake doğrudan genel ELF kütüphaneleri ve çalıştırılabilir dosyaları oluşturmak için uyarlanmıştır. Ne zaman önceden tanımlanmış prosedürlerden onlardan CMakeayrılsanız, kendi Makefiles'lerinizi hacklerken kullanmaya başlamanız gerekir.

C ++ 'ta ELF yükleyicilerini bilen bir sistem için ortalama uygulamanızdan çok daha fazlasını yaratabileceğinizi düşünerek, CMake kesinlikle tüm senaryolar için uygun değildir. Ancak böylesi standart bir ortamda çalışıyorsanız CMakeveya bu modern script script çerçevelerinden herhangi biri kesinlikle en iyi arkadaşlarınızdır.

Bu her zaman uygulamanızın ne kadar uzmanlaşmış olduğuna ve CMakeçerçevenin yapısının iş akışınıza ne kadar uygun olduğuna bağlıdır .


Yararlı olsa da make, braindead, arcane sözdizimi ve pek çok ay-dakika için yapabileceğiniz gereksiz kısıtlamaların bulunduğu korkunç bir sistemdir.
karınca

7

Bir zamanlar yüksek seviyeli diller sadece bir fikirdi. İnsanlar derleyiciler uygulamaya çalıştı. O zamanlar ciddi donanım kısıtlamaları vardı - hiçbir grafiksel araç yoktu, bu yüzden "düz metin" girdi dosyası formatı için kullanılmaya başlandı; bilgisayarlar genellikle çok küçük bir RAM miktarına sahipti, bu nedenle kaynak kodun parçalara bölünmesi ve derleyicinin ayrı programlara bölünmesi gerekiyordu (işlemci, derleyici, assembler, linker); İşlemciler yavaş ve pahalıydılar, bu nedenle pahalı optimizasyonlar yapamıyordunuz.

Tabii ki birçok kaynak dosya ve birçok nesne dosyası oluşturmak için birçok yardımcı program kullanıldığında, manuel olarak herhangi bir şey oluşturmak karışıklıktır. Araçlardaki tasarım kusurları için bir çalışma ortamı olarak (çok sınırlı donanımın neden olduğu) insanlar doğal olarak bazı zorlukları gidermek için komut dosyaları yazmaya başladılar.

Ne yazık ki, betikler garip ve dağınıktı. Scriptlerle ilgili problemleri çözmek için (ki bu, sınırlı donanımın neden olduğu araçlardaki tasarım kusurları için bir çözüm) sonunda insanlar, işleri kolaylaştırmak için yardımcı programlar icat etti make.

Ancak; makefiles garip ve dağınık. Makefile ile ilgili problemlerin üstesinden gelmek için (ki bunlar sınırlı donanımın neden olduğu araçlardaki tasarım kusurları için bir antrenman için bir antrenman için) insanlar otomatik olarak oluşturulmuş makefiles ile denemeye başladılar; derleyiciye bağımlılık yaratma gibi şeyler ile başlayarak; ve auto-conf ve cmake gibi araçlara öncülük eder.

Burası şimdi buradayız: sınırlı donanımın neden olduğu araçlardaki tasarım kusurları için bir çalışma ortamı için bir çalışma ortamı.

Benim beklentim, yüzyılın sonuna gelindiğinde mevcut yığının tepesinde birkaç "daha fazla çalışma ortamı" katmanı olacağına dair bir beklentim var. İronik olarak, tüm bunlara neden olan ciddi donanım kısıtlamaları, yıllar önce ortadan kayboldu ve şimdi böyle bir arkaik karmaşayı kullanmamızın tek nedeni, " her zaman böyle yapılmasıdır ".


1
Peki alternatif nedir? Alternatif, bildiğimiz şekliyle yapı kavramını tamamen değiştiriyor mu?
JParrilla

1
@Darkslash: (varsayımsal) alternatifleri düşünmeye başladığınızda, su baskınlarını açmak gibi bir şey olur - her şeyi sorgulamanız (ve anlambilim ve sözdiziminin ayrılması ve IDE'lerin ve araçların yeniden tasarlanması ve tek tek parçaların bir set olarak sunulması gibi fikirlerle sonuçlanmanız. daha büyük bulmaca). Daha pratik, cmakesadece semptomları tedavi etmek gibi araçların ve kök nedenleri / tedavileri tedavi edememek; bu da, muhtemelen asla "ideal" e yakın olmayacak araçları kullanmaktan başka seçeneğiniz olmadığı gerçeğini kabullenmenizi kolaylaştırıyor.
Brendan,

5
Makefiles hiçbir şekilde 'garip ve dağınık' değildir. İnanılmaz derecede zarifler: makeözünde bir asiklik bağımlılık grafiğini geçmek için bir motor. 'Komut dizileri' veya komut satırı ile ilgili hiçbir şey 'arkaik' değildir.
Miles Rout,

1
@MilesRout: Garip ve dağınık kısım grafik yapıdır. Geçiş yeterince zarif. Fakat sadece dağınık olan kısmın en yaygın örneğini alın: C başlık dosyaları. Her #includebiri bir kenardır, ancak makeC dosyalarını ayrıştıramaz. Yine de sorun değil, çünkü makebu kenarları bir sonraki düğümde (* .o dosyası) saklayabilir , ancak bunu da yapmaz.
MSalters

3
Daha iyi bir tasarımın mümkün olacağı konusunda hemfikir değilim. makesadece C'yi derlemek için değil! Sen almak .cve .hdosyaları ve Makefiles veren bir program istiyorum . Ama bu değil makeve yapılması gereken de değil make. Yine, makehepsi C ile ilgili değil ve yerleşik bir C'ye özgü çözüm makekötü bir fikir (ve bu arada UNIX felsefesinin ihlali).
Miles Rout

5

make (bir Makefile aracı veya doğrudan kullanımı), özellikle kullandığınız gibi "küçük, kişisel projeler" için eski değildir.

Tabii ki, birden fazla platformda hedeflenenler de dahil olmak üzere daha büyük projeler için de kullanabilirsiniz. İle hedef özgü değişkenleri kolayca özelleştir farklı platformlar için inşa nasıl olabilir. Günümüzde, Linux dağıtımları çapraz derleme araç zincirleriyle (örn. Mingw-w64 ) birlikte gelir, böylece tüm Makefile sürücünüzle çalışan Linux'tan eksiksiz bir Windows yazılım paketi (isterseniz yükleyici ile birlikte) oluşturabilirsiniz.

Cmake ve qmake gibi araçlar faydalı olabilir, ancak problemleri yoktur. Herhangi bir kütüphaneyle birlikte bir uygulama oluşturmak için genellikle iyidirler (her ne kadar her zaman qmake ile onları kullanan kütüphaneler ve programlar arasında uygun bağımlılığı kontrol etmekte sorun yaşadım), ancak geri kalanını yaparken her zaman bu araçların kısıtlamaları ile mücadele ediyorum. iş (kurucuları oluşturmak, dokümanları veya çeviri dosyalarını oluşturmak / yüklemek, arşivi ortak bir kütüphaneye dönüştürmek gibi olağandışı şeyler yapmak vb.). Bütün bunlar yapılabilir make, ancak bağımlılık takibi gibi şeyler biraz çaba gerektirebilir.

Qt Creator ve Eclipse gibi IDE'ler de Makefile tabanlı projeleri içe aktarabilir, böylece IDE kullanan geliştiricilerle paylaşabilirsiniz. Qt Creator IDE'nin bir C ++ IDE olarak mükemmel olduğunu düşünüyorum, ancak Emacs ile daha etkili olmak için biraz zaman harcadıktan sonra ve daha fazla Ada gelişimi yaptığım için kendimi Emacs'ı her şey için tercih ederken buluyorum. makeMakefile'deki bağlantı sonrası adım olarak TAGS dosyamı güncellediğimde ( Emacs'ta sembol gezinme için) aşağıdaki soru ile ilgili olarak M-x visit-tags-table:

find $(SRC_DIR) $(TEST_DIR) -regex ".*\.[ch]\(pp\)?" -print | etags -

Veya Ada'nın gelişimi için:

find $(SRC_DIR) $(TEST_DIR) -name "*.ad?" -print | etags -

2

Bu cevap @lxrec cevabını tamamlar.

Makefiles, sadece kaynak koddan bir program / kütüphane oluşturmak değil, birçok şey için kullanılabilir. CMake veya autotools gibi derleme sistemleri kod almak ve kullanıcının platformuna uyacak şekilde inşa etmek için tasarlanmıştır (örneğin kütüphaneleri bulmak veya doğru derleme seçeneklerini belirlemek). Örneğin, bazı sürüm görevlerini otomatikleştirmek için yardımcı olan bir makefile dosyasına sahip olabilirsiniz, örneğin: git'ten türetilen sürümle birlikte kod içeren bir zip dosyası oluşturun; kodunuza karşı testler yapın; bahsedilen zip dosyasını bir barındırma hizmetine yükleyin. Bazı yapı sistemleri (automake gibi) bunu yapmak için kolay bir yol sağlayabilir, bazıları olmayabilir.

Bu, bunun için makefiles kullanmanız gerektiği anlamına gelmez, bu tür görevler için bir betik dili (kabuk, piton vb.) Kullanabilirsiniz.


1

İnsan Makefileyazılılarının, özellikle şu durumlarda eski olduğunu sanmıyorum :

  1. POSIX make kullanarak, size taşınabilir Makefile
  2. ya da birçok ilginç özellik sunan GNU make 4'ü, özellikle de Makefilejeneratörler tarafından sağlanan fantezi özellikleri verimli bir şekilde kodlamayı sağlayan GUILE komut dosyası yazabilirliğini kullanma (otomatik araçların veya Cmake özelliklerinin GNU markasının Guile özelleştirmesi tarafından kolayca yazılabileceğini düşünüyorum. ). Tabii ki, ödemenin bedeli GNU’nun 4 olmasını gerektirir (büyük bir anlaşma değil, IMHO).

0

Makefile dosyaları eskimiş değil, aynı şekilde metin dosyaları eskimiş değil. Tüm verileri düz metin olarak saklamak, işleri yapmak için her zaman doğru yol değildir, ancak tek istediğiniz bir Yapılacaklar Listesi ise, düz bir metin dosyası iyidir. Daha karmaşık bir şey için, Markdown veya XML gibi daha karmaşık bir format ya da özel bir ikili format ya da bunların arasındaki herhangi bir şey isteyebilirsiniz, ancak basit durumlar için düz metin iyi çalışır.

Benzer şekilde, istediğiniz tek şey g++ -g src/*.c -o blah -W -Wall -Werror && ./blahher zaman yazmaktan kaçınmanın bir yoluysa, elle yazılmış bir Makefile mükemmeldir!

Taşınabilirliği yüksek olan, taşınabilirliği kendiniz yönetmek zorunda olmadığınız bir yer oluşturmak istiyorsanız, muhtemelen sizin için doğru Makefile dosyasını oluşturmak için Autotools gibi bir şey istiyorsunuz. Otomatik araçlar, çeşitli platformlar tarafından desteklenen özellikleri algılar. Autotools ile inşa edilen C89 standardında yazılmış bir program hemen hemen her yerde derlenir.


"hemen hemen her yerde derlenecek" -> "en yeni Unix benzeri sistemler üzerinde derlenecek". autotoolsÖrneğin, bir Windows sistemiyle ilgili herhangi bir dereceye kadar çalıştığını sanmıyorum (örneğin, Windows üzerinde gerçekten Unix benzeri bir sistem olan Cygwin / MingW'ye indirim yapmak).
sleske,

Son olmakla hiçbir ilgisi yok. Otomatik araçların avantajı, uzaktan POSIX benzeri her sistemde çalışmasıdır. Windows biraz POSIX uyumludur.
Miles Rout

Evet, düzeltilmiş duruyorum. Aslına bakarsanız, ototologların bir eleştirisinin kesinlikle çok eski sistemler için bile kod içerdiği olduğunu hatırlıyorum; Yine de hala Windows bölümünün yanındayım.
sleske,

Ve bunun suçu tamamen Microsoft'a aittir. Kaliteli bir ürün üretmeyi önemserlerse, Windows uluslararası işletim sistemleri standartları (POSIX gibi) için uygun bir desteğe sahip olacaktı. POSIX bu, sadece bir "Unix şey" değil tüm işletim sistemleri için taşınabilir işletim sistemi standardı. Windows sadece uyumlu olmayan bir hurda yığını.
Miles Rout

@MilesRout hala alt satırda "hemen hemen her yerde" % 90 masaüstü bilgisayarları hariç tutuyor .
el.pescado

-2

Projeniz basitse ve çok az dosya içeriyorsa, dosya yapmak için dosya gerekmez.

Bununla birlikte, proje karmaşık olduğunda, çok sayıda bellek alanı kullanır, birçok dosyaya sahiptir, o zaman her bellek alanını adreslenebilir bellekte doğru noktaya yerleştirmek gerekir, önemsiz bir değişiklik her seferinde her dosyayı yeniden derlememek oldukça arzu edilir. bir dosyaya yapılmış,

Eğer eski dosyaları silmek / derlemek / link vermek / asgari sıkıntı ve tuşa basma hataları şansı ile make, makefile gerçek bir nimet.

'Gerçek dünyaya' girdiğiniz zaman, projeler nadiren yalnızca 1 veya 2 dosyadır, aksine yüzlerce dosyadır. bir makefile her zaman doğru eylemleri gerçekleştirir ve gereksiz eylemler yapmaz (hata ayıklandıktan sonra), böylece sadece bir basit komut yazarsınız ve makefile tüm işi yapar


1
Bu tercih neden cevap vermedi makeüzerinde cmaketersi veya yardımcısı.
Ext3h

Makefiles kullanmak, her seferinde tüm dosyaları yeniden oluşturmaz. (aksi halde CMake veya Otomatik Araçlar kullanamadı)
ideasman42
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.