1 poin oleh GN⁺ 2024-09-22 | 2 komentar | Bagikan ke WhatsApp
  • Saya suka Makefile. Sudah lebih dari 10 tahun sejak pertama kali menggunakannya. Bahkan saat itu pun teknologi ini terlihat seperti teknologi lama. Seiring waktu, alat build baru bermunculan lalu menghilang, tetapi Makefile tetap digunakan. Saya jadi terbiasa dengannya saat ikut mengerjakan berbagai proyek, dan pada suatu titik saya pun menyukainya. Sekarang, ini adalah alat otomasi pertama yang saya gunakan saat memulai proyek baru.

  • Alasan saya menyukai Makefile adalah karena ia mengikuti konvensi tidak resmi untuk menerapkan kumpulan perintah yang sama. Saat saya menemukan proyek baru dan ada file Makefile, saya akan menjalankan make atau make build, lalu make install, dan proyeknya akan dibangun serta dikonfigurasi. Atau setidaknya saya bisa mengetahui langkah tambahan yang diperlukan.

  • Saya juga berusaha menerapkan konvensi yang sama di proyek saya sendiri. Jika saya membuka folder proyek lama lalu menjalankan make dev, semua langkah yang diperlukan akan dijalankan untuk membangun proyek dan menyalakan server pengembangan. Karena saya telah memakai beragam teknologi, masing-masing punya perintah yang berbeda. Dengan Makefile, proyek yang tidak disentuh selama berbulan-bulan atau bahkan bertahun-tahun pun tetap mudah dikelola.

  • Makefile itu sederhana. Saya tidak menggunakan kondisional, flag, atau fitur rumit lainnya. Sebagian besar tugas hanya terdiri dari satu atau lebih perintah shell. Saya bisa saja menulis skrip bash dengan beberapa fungsi, tetapi Makefile lebih mudah dan cepat ditulis.

  • Sebagian besar proyek pribadi saya memiliki tugas umum seperti berikut:

    • dev: memulai server pengembangan
    • build: membangun proyek (jika memerlukan langkah build)
    • deploy: menerapkan/mempublikasikan proyek
  • Blog ini memiliki Makefile sederhana dengan satu target:

    dev:  
      npm run dev  
    
  • Pada proyek yang lebih kompleks, saya menggunakan Makefile seperti ini:

    # Jalankan server pengembangan  
    dev:  
      bundle exec jekyll serve --unpublished -w --config _config.yml,_config-dev.yml --livereload  
    
    # Build aset  
    build:  
      npm run gulp build  
    
    # Pantau folder tertentu dan proses aset  
    watch:  
      npm run gulp watch -- --wip  
    
    # Build situs web secara lokal, enkripsi, lalu deploy ke server Netlify  
    deploy:  
      JEKYLL_ENV=production bundle exec jekyll build; \  
      make encrypt; \  
      netlify deploy --prod  
    
    # Enkripsi folder "_site"  
    encrypt:  
      npx staticrypt _site/*.html -r -d _site  
    
  • Dalam contoh di atas, keberadaan target phony diabaikan. Jika ada file bernama dev, build, watch, deploy, atau encrypt, Makefile mungkin tidak akan bekerja seperti yang diharapkan.

  • GNU Make sangat umum digunakan. Di Linux, kemungkinan besar sudah terpasang. Di MacBook juga saya tidak ingat pernah memasangnya secara eksplisit. Mungkin terpasang bersama alat lain. Make itu sederhana dan memiliki lebih sedikit dependensi tambahan dibanding alat build lain. Ini bisa berguna di lingkungan yang terbatas. Kemungkinan besar Make sudah tersedia. Kalau tidak, perintah di dalam Makefile tetap bisa dijalankan secara manual di shell.

  • Saya tidak menentang alat build lain. Saat menemukan alat build baru, saya merasa tertarik. Tetapi saya tetap memakai Make untuk mengelola berbagai alat tersebut.


Ringkasan GN⁺

  • Makefile menyediakan kumpulan perintah yang konsisten di berbagai proyek sehingga lebih mudah dikelola.
  • Dengan sintaks yang sederhana dan dependensi yang sedikit, Makefile tetap berguna bahkan di lingkungan yang terbatas.
  • Karena dapat digunakan bersama berbagai alat build, fleksibilitasnya tinggi.
  • Alat dengan fungsi serupa antara lain CMake, Ninja, dan Gradle.

2 komentar

 
kayws426 2024-09-22

Untuk makefile yang tidak mendefinisikan dependensi, menggantinya dengan justfile memberikan kegunaan yang lebih baik.

 
GN⁺ 2024-09-22
Komentar Hacker News
  • Dorongan untuk menggunakan Make

    • Ada pendapat agar tidak berkecil hati jika menggunakan Make dengan cara yang salah
    • Kesederhanaan adalah keunggulan Make, dan pada proyek kecil hal itu bukan masalah besar
    • Dalam kebanyakan kasus, tidak perlu terlalu memikirkan cara yang benar, karena kompleksitas hanya bertambah seperlunya
  • Masalah pada Makefile

    • Makefile tidak seburuk sistem build lain, tetapi tetap memiliki banyak masalah
    • Masalah utama sistem build:
      • Terlalu mendasar: pada proyek yang kompleks bisa menimbulkan kebingungan
      • Terlalu kompleks: membutuhkan pengetahuan awal dan pengelolaan yang berlebihan
      • Kurangnya pustaka standar: semua harus didefinisikan sendiri
      • Terlalu terbatas: saat kebutuhan berubah, harus pindah ke sistem lain
      • Terlalu banyak sihir: ciri sistem yang dirancang dengan buruk
      • Sintaks yang sulit dipahami atau tidak konsisten
  • Kelebihan Make

    • Pendapat dari orang yang menyukai Make
    • Make adalah kumpulan perintah untuk mentransformasikan file dengan DSL yang sederhana
    • Hal yang sama bisa dilakukan dengan Bash atau shell lain, tetapi Make lebih sederhana
  • Penggunaan target PHONY

    • Tidak menggunakan pelacakan dependensi berbasis mtime
    • Target harus didefinisikan sebagai PHONY
    • Belakangan ini beralih ke just dan justfile agar penggunaan lebih sederhana
  • Perdebatan sengit tentang Make

    • Make memicu perdebatan seperti perang vi-vs-emacs
    • Menggunakan Makefile sebagai driver sistem build tingkat atas adalah langkah yang cerdas
    • Bahkan saat memakai alat build lain, tetap bisa distandardisasi dengan Makefile
  • Beragam pemanfaatan Make

    • Make digunakan untuk mengotomatisasi berbagai pekerjaan
    • Menggunakan Makefile untuk build dan deploy situs web pribadi
    • Memanggil Make melalui Git push dan Git hook
    • Menggunakan Makefile untuk mengunggah dan mengelola file PDF
  • Batasan Make dan alternatifnya

    • Make cukup baik sebagai eksekutor tugas, tetapi ada alternatif yang lebih baik
    • Make/Makefile tidak terstandarisasi
    • Tidak bisa menyelesaikan dependensi, sehingga memerlukan skrip configure
    • Menggunakan mtime untuk memeriksa apakah input masih terbaru, tetapi ini bisa menimbulkan masalah
    • Dirancang mengikuti filosofi Unix, tetapi memiliki keterbatasan untuk sistem build modern
  • Beralih ke Justfile

    • Beralih ke Justfile untuk menghindari kompleksitas Makefile
  • Penggunaan Makefile yang sederhana

    • Ada pendapat yang mendukung penggunaan Makefile secara sederhana
    • Tetap bisa dibagikan tanpa harus mempelajari semuanya secara sempurna
    • Berbagi pengalaman bahwa pipeline GitLab CI menggantikan Makefile