1 puan yazan GN⁺ 2024-09-22 | 2 yorum | WhatsApp'ta paylaş
  • Makefile'ları seviyorum. İlk kez kullanmamın üzerinden 10 yıldan fazla geçti. O zaman bile eski bir teknoloji gibi görünüyordu. Zaman geçtikçe yeni build araçları ortaya çıkıp kayboldu ama Makefile hâlâ kullanılmaya devam etti. Projelere katkı yaparken ona alıştım ve bir noktada sevmeye başladım. Şimdi yeni bir projeye başlarken ilk kullandığım otomasyon aracı bu.

  • Makefile'ları sevmemin nedeni, aynı komut setini uygulayan gayriresmî bir geleneği takip etmeleri. Yeni bir projeyle karşılaştığımda bir Makefile dosyası varsa make veya make build çalıştırırım, ardından make install çalıştırırım; proje derlenir ve yapılandırılır. Ya da ek adımlar hakkında bilgi edinirim.

  • Kendi projelerimde de aynı geleneği uygulamaya çalışıyorum. Eski bir proje klasörünü açıp make dev çalıştırdığımda, proje derlenip geliştirme sunucusu ayağa kalksın diye gereken tüm adımları yerine getiriyor. Farklı teknolojiler kullandığım için her birinin farklı komutları vardı. Makefile kullanınca, aylarca hatta yıllarca dokunmadığım projeleri bile kolayca yönetebiliyorum.

  • Makefile basit. Koşullar, bayraklar veya başka karmaşık özellikler kullanmıyorum. Çoğu görev bir ya da daha fazla shell komutundan oluşuyor. Birkaç fonksiyona sahip bir bash betiği de yazabilirim ama Makefile yazmak daha kolay ve daha hızlı.

  • Kişisel projelerimin çoğunda şu genel görevler bulunuyor:

    • dev: geliştirme sunucusunu başlat
    • build: projeyi derle (eğer build adımı gerekiyorsa)
    • deploy: projeyi dağıt / yayımla
  • Bu blogda tek hedefli basit bir Makefile var:

    dev:  
      npm run dev  
    
  • Daha karmaşık projelerde ise şöyle Makefile'lar kullanıyorum:

    # Geliştirme sunucusunu çalıştır  
    dev:  
      bundle exec jekyll serve --unpublished -w --config _config.yml,_config-dev.yml --livereload  
    
    # Varlıkları derle  
    build:  
      npm run gulp build  
    
    # Belirli klasörleri izle ve varlıkları işle  
    watch:  
      npm run gulp watch -- --wip  
    
    # Web sitesini yerelde derle, şifrele ve Netlify sunucusuna dağıt  
    deploy:  
      JEKYLL_ENV=production bundle exec jekyll build; \  
      make encrypt; \  
      netlify deploy --prod  
    
    # "_site" klasörünü şifrele  
    encrypt:  
      npx staticrypt _site/*.html -r -d _site  
    
  • Yukarıdaki örnekte phony hedeflerin varlığını göz ardı ediyorum. Eğer dev, build, watch, deploy veya encrypt adlı bir dosya varsa Makefile beklediğim gibi çalışmayabilir.

  • GNU Make çok yaygın. Linux'ta büyük olasılıkla zaten kurulu geliyor. MacBook'umda da onu özellikle kurduğumu hatırlamıyorum. Muhtemelen başka araçlarla birlikte kurulmuştu. Make basit ve diğer build araçlarına kıyasla daha az ek bağımlılığa sahip. Bu da onu kısıtlı ortamlarda kullanışlı kılabiliyor. Make'in zaten mevcut olma ihtimali yüksek. Değilse de Makefile içindeki komutları shell'de elle çalıştırabilirsiniz.

  • Başka build araçlarına karşı değilim. Yeni bir build aracı keşfettiğimde ilgimi çekiyor. Ama yine de farklı araçları yönetmek için Make kullanmaya devam ediyorum.


GN⁺ Özeti

  • Makefile, farklı projelerde tutarlı bir komut seti sunarak yönetimi kolaylaştırır.
  • Basit sözdizimi ve az sayıda bağımlılığı sayesinde kısıtlı ortamlarda da faydalı olabilir.
  • Farklı build araçlarıyla birlikte kullanılabildiği için esnekliği yüksektir.
  • Benzer işlevlere sahip araçlar arasında CMake, Ninja, Gradle bulunur.

2 yorum

 
kayws426 2024-09-22

Bağımlılıkları tanımlamayan makefile, daha iyi bir kullanım deneyimi için justfile ile değiştirilebilir.

 
GN⁺ 2024-09-22
Hacker News yorumu
  • Make kullanımına teşvik

    • Make’i yanlış kullandığını düşünüp moralini bozma görüşü
    • Make’in güçlü yanı sadeliği ve küçük projelerde bunun büyük bir sorun olmadığı
    • Çoğu durumda doğru yönteme takılmaya gerek olmadığı, yalnızca ihtiyaç kadar karmaşıklık eklendiği
  • Makefile’ların sorunları

    • Makefile’ların diğer build sistemlerinden daha az kötü olduğu ama yine de birçok sorunu bulunduğu
    • Build sistemlerinin başlıca sorunları:
      • Fazla temel olması: karmaşık projelerde kafa karışıklığı yaratır
      • Fazla karmaşık olması: başlangıç bilgisi ve bakım yükü aşırı yüksektir
      • Standart kütüphane eksikliği: her şeyi elle tanımlamak gerekir
      • Fazla kısıtlı olması: ihtiyaçlar değiştiğinde başka bir sisteme geçmek gerekir
      • Fazla sihir içermesi: kötü tasarlanmış sistemlerin özelliği
      • Şifreli veya tutarsız sözdizimi
  • Make’in avantajları

    • Make’i seven birinin görüşü
    • Make, dosyaları dönüştüren komutlardan oluşan basit bir DSL’dir
    • Bash ya da başka bir shell ile de yapılabilir ama Make daha basittir
  • PHONY hedef kullanımı

    • mtime tabanlı bağımlılık takibi kullanılmaz
    • Hedeflerin PHONY olarak tanımlanması gerekir
    • Son dönemde just ve justfile’lara geçilerek daha basit kullanım tercih ediliyor
  • Make üzerine hararetli tartışma

    • Make’in, vi-vs-emacs savaşları gibi tartışma yarattığı
    • Makefile’ı en üst düzey build sistemi sürücüsü olarak kullanmanın akıllıca olduğu
    • Başka build araçları kullanılsa bile Makefile ile standardizasyon sağlanabildiği
  • Make’in çeşitli kullanım alanları

    • Make’in çeşitli görev otomasyonlarında kullanıldığı
    • Kişisel web sitesini build etmek ve dağıtmak için Makefile kullanıldığı
    • Git push ve Git hook üzerinden Make çağrıldığı
    • PDF dosyalarının yüklenmesi ve yönetiminde Makefile kullanıldığı
  • Make’in sınırları ve alternatifler

    • Make’in bir görev çalıştırıcısı olarak fena olmadığı ama daha iyi alternatiflerin bulunduğu
    • Make/Makefile’ların standartlaştırılmadığı
    • Bağımlılık çözümlemesi yapamadığı, configure betiklerine ihtiyaç duyduğu
    • Girdilerin güncel olup olmadığını anlamak için mtime kullandığı, ancak bunun sorun çıkarabildiği
    • Unix felsefesine göre tasarlanmış olsa da modern build sistemlerinde sınırlamaları olduğu
  • Justfile’lara geçiş

    • Makefile karmaşıklığından kaçınmak için Justfile’lara geçildiği
  • Makefile’ın basit kullanımı

    • Makefile’ın basit kullanımını destekleyen görüş
    • Her şeyi mükemmel öğrenmeden de paylaşım yapılabildiği
    • GitLab CI pipeline’larının Makefile’ın yerini aldığına dair deneyim paylaşımı