Lompat ke konten
Aback Tools Logo

Pemeriksa Makefile dan Alat Linting Terbaik

Perbandingan pemeriksa Makefile terbaik: deteksi TAB vs spasi, validasi graf dependensi, pemeriksaan dependensi melingkar, dan linter siap CI seperti checkmake.

DH
Tutorials & How-Tos12 menit baca2,700 kata

Satu karakter yang salah di Makefile - spasi di tempat make mengharapkan TAB - dapat merusak seluruh build Anda secara diam-diam. Sintaks Makefile tanpa ampun, graf dependensi bisa mengembangkan loop melingkar yang tak terlihat, dan prasyarat yang tidak terdefinisi menyebabkan kegagalan yang baru muncul saat runtime. Panduan ini mencakup alat pemeriksa dan linting Makefile terbaik tahun 2026 - dari validator berbasis browser yang instan hingga linter CLI siap CI dan ekstensi editor - agar Anda menemukan setiap kesalahan sebelum make melakukannya.

#1Penyebab error make"missing separator" - TAB vs spasi
100%Pemeriksaan lokal browsertanpa unggah server, tanpa pendaftaran
< 1 dtkKecepatan validasidiagnostik instan tingkat baris

Apa yang sebenarnya dilakukan pemeriksa Makefile

Pemeriksa Makefile adalah alat analisis statis yang membaca Makefile Anda dan memvalidasinya terhadap aturan tata bahasa GNU Make sebelum ada perintah shell yang dijalankan. Berbeda dengan menjalankan make --dry-run, pemeriksa tidak membutuhkan lingkungan build, alat yang terinstal, atau file sumber yang valid - ia bekerja murni pada teks Makefile.

Apa yang divalidasi

Permukaan validasi pemeriksa yang baik mencakup tiga lapisan. Validasi sintaks memastikan aturan target mengikuti format yang benar, baris resep dimulai dengan karakter TAB, dan penugasan variabel menggunakan operator yang valid. Validasi dependensi membangun graf prasyarat dan memeriksa bahwa setiap dependensi merujuk ke target yang terdefinisi atau file nyata. Validasi semantik menandai pola yang secara teknis valid tetapi secara konsisten menimbulkan masalah - seperti deklarasi .PHONY yang hilang pada target non-file.

  • Lapisan sintaks - format aturan target, resep berindentasi TAB, operator penugasan variabel (`=`, `:=`, `?=`, `+=`)
  • Lapisan dependensi - prasyarat yang belum teratasi, target tidak terdefinisi, dan rantai dependensi melingkar
  • Lapisan semantik - deklarasi `.PHONY` yang hilang, definisi target ganda, dan blok resep kosong
  • Lapisan gaya - indentasi tidak konsisten, baris panjang, dan pelanggaran konvensi penamaan (ditangani linter seperti checkmake)

Note

Pemeriksa Makefile berbeda dengan menjalankan make -n (mode dry-run). make -n mengeksekusi graf dependensi tetapi mengganti perintah nyata dengan keluaran echo - ia tetap membutuhkan lingkungan build yang valid. Pemeriksa memvalidasi struktur file sepenuhnya secara offline, sehingga aman digunakan di lingkungan tanpa dependensi build yang terinstal.

Kesalahan Makefile yang paling umum

Sebagian besar kegagalan Makefile berasal dari sekumpulan kesalahan berulang yang sedikit. Memahami masing-masing membantu Anda tahu apa yang harus dicari saat pemeriksa melaporkan masalah - dan mengapa itu penting.

Indentasi TAB vs spasi

Kesalahan Makefile paling umum juga yang paling membingungkan: baris resep harus dimulai dengan karakter TAB, bukan spasi. GNU Make dirancang pada 1976 dan persyaratan TAB tidak pernah dihapus. Editor modern bawaan memakai spasi, dan banyak yang diam-diam mengonversi tab menjadi spasi saat menyimpan. Hasilnya adalah Makefile yang tampak terformat sempurna di layar tetapi gagal dengan error "missing separator" yang membingungkan saat runtime.

Makefile (rusak)
makefile
build:
    gcc -o app main.c   # ← diindentasi 4 spasi - make akan menolak ini

build:
	gcc -o app main.c   # ← diindentasi dengan TAB - benar

Warning

Kedua baris resep di atas tampak identik di sebagian besar font. Satu-satunya cara membedakannya adalah mengaktifkan tampilan karakter spasi di editor Anda, memakai pemeriksa Makefile, atau menjalankan cat -A Makefile dan mencari ^I (TAB) vs spasi di awal baris resep.

Prasyarat yang belum teratasi

Ketika sebuah target mencantumkan prasyarat yang tidak merujuk ke target terdefinisi maupun file yang ada, make diam-diam melewati dependensi tersebut atau gagal dengan "No rule to make target". Pemeriksa menangkapnya pada waktu analisis statis dengan membangun graf dependensi lengkap dan menandai setiap referensi menggantung sebelum Anda menjalankan satu pun perintah.

Dependensi melingkar

Dependensi melingkar terjadi ketika target A bergantung pada B, dan B bergantung (langsung atau tidak langsung) pada A. GNU Make mencetak peringatan dan membuang aturan melingkar itu, artinya sebagian build Anda diam-diam tidak berjalan. Pemeriksa yang membangun graf dependensi mendeteksi siklus sebelum eksekusi dan melaporkan target persis yang terlibat - sesuatu yang tidak ditampilkan jelas oleh peringatan runtime make untuk rantai panjang.

Deklarasi .PHONY yang hilang

Target seperti clean, test, all, dan install adalah nama konvensional yang tidak menghasilkan file keluaran. Tanpa deklarasi .PHONY, make memeriksa apakah ada file bernama "clean" di direktori. Jika ada, make menganggap target sudah mutakhir dan melewatkan resepnya sepenuhnya - tanpa error, tanpa keluaran, hanya kegagalan diam-diam. Setiap target non-file sebaiknya tercantum di .PHONY.

Jenis errorPerilaku makeTertangkap pemeriksa?
TAB vs spasierror "missing separator" saat runtime✓ Ya - menandai setiap baris terdampak
Prasyarat belum teratasi"No rule to make target" saat runtime✓ Ya - membangun graf dependensi
Dependensi melingkarPeringatan dicetak; aturan dibuang diam-diam✓ Ya - melaporkan seluruh rantai siklus
.PHONY hilangTarget dilewati diam-diam jika file ada di disk✓ Ya (linter seperti checkmake)
Target gandaDefinisi kedua menimpa yang pertama diam-diam✓ Ya - menandai redefinisi
Variabel tidak terdefinisiMengembang ke string kosong; tanpa error✗ Sebagian - hanya linter gaya

Cara memeriksa Makefile secara online

Pemeriksa Makefile berbasis browser adalah cara tercepat memvalidasi file tanpa menginstal apa pun. Berguna untuk pemeriksaan cepat, untuk developer yang bekerja di lingkungan tempat mereka tak bisa memasang alat CLI, atau untuk meninjau Makefile yang dikirim orang lain.

1

Buka Makefile Syntax and Dependency Checker

Buka Makefile Syntax and Dependency Checker di Aback Tools. Tanpa pendaftaran, tanpa unggah file ke server - seluruh validasi berjalan lokal di browser Anda dengan JavaScript.

2

Tempel atau unggah Makefile Anda

Tempel seluruh isi Makefile Anda ke panel input, atau gunakan opsi unggah file untuk memuat file langsung dari mesin Anda. Pemeriksa menerima sintaks standar GNU Make, termasuk aturan multi-target, aturan pola, dan direktif include.

3

Tinjau diagnostik tingkat baris

Pemeriksa berjalan seketika dan mengembalikan daftar kesalahan serta peringatan dengan nomor baris yang persis. Kesalahan indentasi TAB, prasyarat tak terdefinisi, dan rantai dependensi melingkar semuanya dilaporkan dengan konteks yang cukup untuk menemukan dan memperbaiki setiap masalah tanpa mencari manual di file.

4

Perbaiki, format, dan validasi ulang

Setelah memperbaiki kesalahan, gunakan Makefile Formatter untuk menormalisasi indentasi dan spasi di seluruh file, lalu tempel kembali ke pemeriksa untuk memastikan tidak ada masalah tersisa. Menjalankan kedua alat memakan waktu kurang dari satu menit dan memberi Anda Makefile yang bersih dan siap produksi.

Makefile Syntax and Dependency Checker

Validasi target Makefile, resep berindentasi TAB, graf dependensi, dan rantai melingkar secara instan di browser Anda - tanpa pendaftaran, tanpa unggah server.

Open tool

Perbandingan pemeriksa Makefile terbaik

Tidak ada satu pun pemeriksa Makefile "terbaik" untuk semua situasi. Alat yang tepat bergantung pada apakah Anda butuh pemeriksaan sekali cepat, integrasi pipeline CI, atau umpan balik editor real-time. Berikut perbandingan opsi-opsi utamanya.

Baris resep harus dimulai dengan karakter tab. Ini adalah persyaratan lama GNU Make yang tidak bisa diganggu oleh utilitas atau default IDE mana pun - hanya konfigurasi editor yang tepat atau pemeriksa statis yang akan menemukannya sebelum make.

- Manual GNU Make, §5.1

Makefile Syntax and Dependency Checker dari Aback Tools

Pemeriksa Aback Tools adalah pilihan terbaik saat Anda ingin hasil instan tanpa penyiapan apa pun. Ia memvalidasi sintaks, indentasi TAB, resolusi prasyarat, dan graf dependensi melingkar sepenuhnya di browser. Tanpa instalasi, tanpa unggah server, tanpa login. Sangat berguna untuk meninjau Makefile di lingkungan tempat Anda tak bisa memasang alat CLI - mesin remote, langkah tinjauan CI, atau lingkungan bersama dengan izin terbatas.

checkmake (CLI)

checkmake adalah linter CLI open source yang ditulis dalam Go, tersedia di GitHub di mrtazz/checkmake. Ia berfokus pada penegakan gaya dan konvensi: deklarasi aturan phony minimal, panjang baris maksimum, keberadaan deskripsi target, dan pola penamaan. Ringan dan cepat, ideal untuk hook pre-commit atau alur kerja CI tempat Anda ingin menegakkan konvensi Makefile lintas tim secara otomatis.

Ekstensi VS Code Makefile Tools

Ekstensi resmi Makefile Tools dari Microsoft untuk VS Code menyediakan IntelliSense real-time untuk target dan variabel, penyorotan error inline untuk masalah sintaks umum, dan panel penjelajah target. Pilihan terbaik bagi developer yang sering menulis Makefile dan menginginkan umpan balik native editor tanpa pindah ke alat terpisah. Ia tidak memvalidasi graf dependensi sedalam pemeriksa khusus, tetapi langsung menangkap sebagian besar kesalahan sehari-hari.

make --dry-run (bawaan)

Menjalankan make -n atau make --dry-run mengeksekusi logika build tanpa menjalankan perintah shell apa pun. Berguna untuk memverifikasi bahwa target dan perintah yang tepat terpilih, tetapi membutuhkan lingkungan build lengkap - semua prasyarat harus terpenuhi, dan alat ini tidak memberi keluaran error terstruktur. Gunakan sebagai pemeriksaan akhir setelah pemeriksa khusus memvalidasi struktur file.


AlatTipeCek TABGraf depsDep. melingkarSiap CITanpa instalasi
Pemeriksa Aback ToolsBrowser✓✓✓✓ (manual)✓
checkmakeCLI (Go)✓✗✗✓✗ instalasi
VS Code Makefile ToolsEkstensi✓✗✗✗✗ ekstensi
make --dry-runBawaan✓✓Peringat.✓✓ (butuh make)
GNU make --lintBawaan✓✗✗✓✓ (butuh make)

Tip

Gunakan pemeriksa Aback Tools dan Makefile Formatter bersama untuk tinjauan manual, checkmake di hook pre-commit Anda untuk penegakan konvensi, dan make --dry-run sebagai pemeriksaan integrasi terakhir sebelum merge. Setiap alat menangkap kelas error yang berbeda, dan mengombinasikannya mencakup hampir semua mode kegagalan.

Linting Makefile di CI/CD

Menambahkan validasi Makefile ke pipeline CI Anda mencegah regresi ter-merge tanpa terdeteksi. Penyiapannya ringan - satu langkah workflow yang menggagalkan build jika pemeriksa melaporkan kesalahan.

GitHub Actions dengan checkmake

checkmake tersedia sebagai binary prakompilasi untuk Linux dan macOS, memudahkan instalasi di runner GitHub Actions. Tambahkan job yang menginstal binary dan menjalankannya terhadap Makefile Anda - langkah itu gagal dengan kode keluar bukan nol jika ditemukan pelanggaran aturan, memblokir merge pull request.

.github/workflows/makefile-lint.yml
yaml
name: Lint Makefile

on:
  pull_request:
    paths:
      - 'Makefile'
      - '**/Makefile'

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install checkmake
        run: |
          curl -sSfL https://github.com/mrtazz/checkmake/releases/latest/download/checkmake-linux-amd64 \\
            -o /usr/local/bin/checkmake
          chmod +x /usr/local/bin/checkmake

      - name: Run checkmake
        run: checkmake Makefile

Note

Filter paths memastikan workflow hanya berjalan ketika Makefile benar-benar berubah, menghindari menit CI yang terbuang untuk commit yang tak terkait. Sesuaikan pola path dengan lokasi Makefile Anda di repositori.

Hook pre-commit

Untuk penegakan lokal sebelum kode mencapai CI, tambahkan hook pre-commit yang menjalankan checkmake terhadap perubahan Makefile yang di-stage. Framework pre-commit mendukungnya secara native dan terintegrasi mulus dengan alur kerja Git apa pun.

.pre-commit-config.yaml
yaml
repos:
  - repo: local
    hooks:
      - id: checkmake
        name: Lint Makefile
        language: system
        entry: checkmake
        files: ^Makefile$|/Makefile$
        pass_filenames: true

Makefile Formatter

Normalisasi indentasi TAB, spasi variabel, dan definisi target di seluruh Makefile Anda - gratis, lokal di browser, tanpa pendaftaran.

Open tool

Praktik terbaik untuk Makefile tanpa kesalahan

Menjalankan pemeriksa setelah menulis Makefile adalah jaring pengaman. Menulis Makefile dengan benar sejak awal adalah praktik yang membuat jaring pengaman jarang diperlukan. Kebiasaan-kebiasaan ini menghilangkan kesalahan paling umum sebelum muncul.

Konfigurasikan editor Anda untuk indentasi TAB

Setiap editor yang bawaannya memakai spasi perlu konfigurasi eksplisit untuk menggunakan TAB di file Makefile. Di VS Code, tambahkan pengaturan workspace atau per-bahasa yang membuat editor menyisipkan karakter TAB literal saat bekerja di file bernama Makefile. Di Vim dan Neovim, pola autocmd untuk file Makefile sudah standar dan terdokumentasi baik. Di IDE JetBrains, file Makefile otomatis terdeteksi dan diindentasi dengan TAB.

.vscode/settings.json
json
{
  "[makefile]": {
    "editor.insertSpaces": false,
    "editor.detectIndentation": false
  }
}

Selalu deklarasikan .PHONY untuk target non-file

Cantumkan di bawah .PHONY di bagian atas Makefile setiap target yang tidak menghasilkan file keluaran. Daftar konvensionalnya mencakup all, clean, install, test, lint, build, run, dan target aksi lain yang didefinisikan proyek Anda. Ini salah satu konvensi Makefile terpenting dan yang ditegakkan checkmake secara default.

  • Deklarasikan .PHONY sejak awal - letakkan dekat bagian atas Makefile agar terlihat oleh setiap pembaca dan setiap pemeriksa
  • Sertakan semua target aksi - target mana pun yang resepnya selalu ingin Anda jalankan, apa pun kondisi file, termasuk di .PHONY
  • Gunakan satu deklarasi .PHONY - cantumkan semua target phony dalam satu blok alih-alih deklarasi terpisah yang tersebar di file
  • Dokumentasikan target default - target pertama di Makefile adalah default; beri nama `all` dan dokumentasikan apa yang dibangunnya
  • Beri prefix pada target debug - target internal atau debugging seperti `debug-vars` atau `print-PATH` lebih kecil kemungkinannya berbenturan dengan file nyata jika diberi prefix

Tip

Jalankan [Makefile Comment Remover](/tools/data/comment-removers/makefile-comment-remover) sebelum commit untuk menghapus komentar pengembangan sambil mempertahankan struktur yang diandalkan make. Baris resep yang dimulai dengan @ (perintah senyap) dan - (perintah toleran kesalahan) ditangani dengan benar oleh remover.

Jaga prasyarat tetap datar dan eksplisit

Rantai prasyarat yang dalam lebih sulit divalidasi dan lebih mudah rusak. Bila memungkinkan, jaga graf dependensi tetap dangkal - satu atau dua tingkat - dan rujuk file secara eksplisit alih-alih mengandalkan aturan implisit. Aturan pola implisit seperti `%.o: %.c` adalah sintaks GNU Make yang valid, tetapi lebih sulit diselesaikan sepenuhnya oleh pemeriksa statis dan membuat graf dependensi kurang jelas bagi siapa pun yang membaca file.

Kapan pemeriksa tidak cukup

Pemeriksa Makefile statis sangat kuat tetapi bekerja pada teks file. Ia tidak bisa melihat status runtime, isi sistem file, atau ketersediaan alat. Ada kategori masalah Makefile yang tak bisa ditangkap secara statis oleh pemeriksa mana pun.

Variabel tak terdefinisi mengembang diam-diam

Di GNU Make, merujuk variabel yang tak terdefinisi mengembang ke string kosong tanpa error apa pun. Resep yang seharusnya menjalankan gcc $(CFLAGS) -o app main.c akan menjalankan gcc -o app main.c jika CFLAGS tak terdefinisi - berpotensi mengompilasi tanpa flag yang diperlukan dan menghasilkan binary yang bekerja lokal tetapi gagal di produksi. Pemeriksa tidak bisa mengetahui nilai CFLAGS yang Anda maksud, sehingga kategori bug ini butuh pengujian runtime atau pemeriksaan variabel kondisional di Makefile itu sendiri.

Resolusi aturan implisit saat runtime

GNU Make memiliki sekumpulan besar aturan implisit bawaan - cara otomatis mengompilasi file .c menjadi .o, menautkan file objek, dan sebagainya. Pemeriksa statis tidak mensimulasikan aturan-aturan ini, sehingga Makefile yang sangat bergantung pada aturan implisit bisa lolos pemeriksaan dengan bersih tetapi gagal saat runtime jika alat yang diasumsikan tidak terinstal. Aturan eksplisit dengan resep yang terdefinisi selalu lebih aman dan portabel.

Ketergantungan pada status sistem file

Target yang bergantung pada file yang dihasilkan target sebelumnya - file objek, header terkompilasi, kode sumber yang dihasilkan - benar saat runtime tetapi tidak dapat divalidasi secara statis karena file prasyaratnya belum ada sampai make berjalan. Untuk kasus ini, make --dry-run yang dipadukan dengan lingkungan build lengkap adalah pelengkap yang tepat bagi pemeriksa statis. Kedua pendekatan mencakup mode kegagalan yang berbeda dan paling kuat saat dipakai bersama.

Warning

Jika proyek Anda memakai ekspansi shell yang kompleks, panggilan $(shell ...), atau pembuatan target dinamis di dalam Makefile, pemeriksa statis dapat menghasilkan false positive untuk target yang belum teratasi. Tekan peringatan tertentu menggunakan file konfigurasi checkmake atau gunakan make --dry-run sebagai metode validasi untuk bagian-bagian tersebut.
Jenis masalahPemeriksa statismake --dry-runUji runtime
Kesalahan indentasi TAB✓ Menangkap✓ Menangkap✓ Menangkap
Dependensi melingkar✓ Menangkap✓ Memperingatkan✓ Menangkap
Prasyarat tak terdefinisi✓ Menangkap✓ Menangkap✓ Menangkap
.PHONY hilang✓ Menangkap✗ Terlewat✗ Sering terlewat
Nilai variabel tak terdefinisi✗ Tidak bisa diperiksa✗ Terlewat✓ Menangkap
Alat build yang hilang✗ Tidak bisa diperiksa✓ Menangkap✓ Menangkap
Masalah status sistem file✗ Tidak bisa diperiksa✓ Menangkap✓ Menangkap

Key takeaways

  • Indentasi TAB adalah kesalahan Makefile paling umum - setiap baris resep harus dimulai dengan TAB, bukan spasi, dan pemeriksa menangkap semua pelanggaran secara instan.
  • Makefile Syntax and Dependency Checker dari Aback Tools memvalidasi sintaks, graf dependensi, dan rantai melingkar di browser tanpa instalasi maupun pendaftaran.
  • checkmake adalah linter CLI terbaik untuk pipeline CI/CD dan hook pre-commit, menegakkan deklarasi .PHONY dan konvensi penamaan secara otomatis.
  • VS Code Makefile Tools menyediakan umpan balik editor real-time untuk pengembangan Makefile harian tanpa pindah ke alat terpisah.
  • Selalu deklarasikan .PHONY untuk target non-file - tanpanya, make melewati target diam-diam jika ada file bernama sama di disk.
  • Pemeriksa statis tidak bisa mendeteksi pengembangan variabel tak terdefinisi atau alat build yang hilang - gabungkan dengan make --dry-run untuk cakupan penuh.
  • Padukan pemeriksa Makefile dengan Makefile Formatter untuk memperbaiki kesalahan dan menormalkan gaya dalam satu alur kerja.

Pertanyaan yang sering diajukan

The best Makefile checker depends on your workflow. For a fast, no-install option, the Aback Tools Makefile Syntax and Dependency Checker validates targets, TAB-indented recipes, and dependency graphs entirely in your browser with line-level diagnostics. For automated CI pipelines, checkmake is the most widely used CLI linter - it enforces naming conventions and recipe hygiene. For editor integration, the VS Code Makefile Tools extension provides real-time syntax feedback as you type.

A Makefile checker validates several layers of correctness. At the syntax level, it checks that recipe lines start with a TAB character (not spaces), that target rules follow the correct target: prerequisites format, and that variable assignments use valid syntax. At the dependency level, it verifies that prerequisites reference defined targets and detects circular dependency chains that would cause make to loop indefinitely. Advanced checkers also flag missing default targets and duplicate target definitions.

The "missing separator" error is almost always a TAB indentation problem. GNU Make requires that every recipe line (the commands that run under a target) starts with a TAB character - not spaces, even if the spaces look identical on screen. Most text editors default to spaces, and some editors silently convert TABs to spaces. Check your editor's whitespace settings and enable visible whitespace characters. A Makefile checker will flag every affected line immediately, saving you from hunting through the file manually.

Circular dependencies occur when target A depends on target B, which depends back on target A, creating a loop that make cannot resolve. GNU make will print a warning like "Circular A <- B dependency dropped" and skip the looping rule. A static Makefile checker, such as the Aback Tools Makefile Syntax and Dependency Checker, builds the dependency graph before execution and reports circular chains with the exact target names involved, making them far easier to identify than reading make runtime warnings.

Yes. checkmake is available as a standalone binary and can be installed in a GitHub Actions job using apt-get on Ubuntu runners. Add a workflow step that runs checkmake Makefile - if it exits with a non-zero code, the workflow fails and blocks the pull request from merging. This prevents Makefile regressions from reaching the main branch. You can configure checkmake with a .checkmake file to adjust rule severity and exclude specific checks that do not apply to your project.

A Makefile linter (or checker) inspects your file for errors and rule violations - things that will cause make to fail or behave unexpectedly. It reports problems but does not modify the file. A Makefile formatter rewrites the file to apply consistent style: correct TAB indentation on recipe lines, aligned variable assignments, and clean spacing around operators. You should run the linter first to identify logic errors, then the formatter to normalize style. The Aback Tools suite provides both: the Makefile Syntax Checker and the Makefile Formatter.

No. All validation runs entirely in your browser using JavaScript. Your Makefile content is never uploaded to any external server, stored, or logged. This makes the tool safe for proprietary build scripts, internal tooling, and any other code that should not leave your device.

.PHONY is a special GNU Make directive that declares a target as "not a real file." Targets like clean, test, install, and all are conventional names that do not correspond to actual output files. Without .PHONY, make will skip running those targets if a file with the same name exists in the directory. Most Makefile linters flag the absence of .PHONY declarations on common non-file targets because the resulting silent skip is a frequent source of confusing build failures.

ShareXLinkedIn