target: dependencies
command1
command2
Pada sistem saya (Mac OS X), make
tampaknya mengharuskan Makefiles memiliki karakter tab yang mendahului konten setiap command
baris, atau memunculkan kesalahan sintaksis.
Ini adalah gangguan saat membuat atau mengedit Makefiles karena saya memiliki editor saya yang disetel menjadi semua spasi sepanjang waktu.
Bisakah Anda membuat Makefile yang valid tanpa karakter tab?
Jawaban:
Ini adalah keanehan / persyaratan sintaksis
make
, tidak ada hubungannya dengan Mac OS X. Sayangnya, tidak ada yang dapat Anda lakukan jika akan menggunakannyamake
.Sunting : GNU Make sekarang mendukung awalan resep khusus. Lihat jawaban ini .
Anda bukan orang pertama yang tidak menyukai aspek ini
make
. Mengutip Buku Pegangan Pembenci Unix :sumber
.RECIPEPREFIX
). Salah satu jawaban di bawah juga menyebutkan itu, dan harus ditandai sebagai "benar", bukan milik saya. stackoverflow.com/a/21920142Sejak pertanyaan ini pertama kali diajukan, versi GNU Make telah dirilis yang memungkinkan Anda untuk menggunakan sesuatu selain Tabsebagai karakter awalan. Dari pengumuman milis :
Fitur ini ditambahkan di GNU Make 3.82, dirilis pada Juli 2010 (enam bulan setelah tanggal asli pertanyaan ini). Karena sudah tiga tahun dan berubah sejak itu, kemungkinan rasa Make lain telah mengikuti GNU Make.
sumber
Ada cara berbelit-belit untuk memiliki makefile yang valid tanpa tab.
Jika Anda mengubah makefile Anda menjadi:
Jika akan berhasil. Jika Anda menginginkannya di lebih dari satu baris, maka Anda dapat melakukan:
Berantakan, tetapi berhasil.
sumber
.RECIPEPREFIX
mungkin merupakan pendekatan terbaik. Namun, karena saya tidak ingin melakukan itu, saya akhirnya menggunakan solusi berdasarkan ini. Baris 1target:\
:, Baris 2: [indentasi empat spasi] diikuti oleh;command
Jika Anda memiliki vimrc di profil Anda, Anda dapat menambahkan baris ini untuk mencegah vim berubah ke spasi:
Saya juga berjuang dengan ini, dan ini memperbaikinya untuk saya. Sebarkan kabar baik!
sumber
Ini melakukannya untuk saya jika Anda ingin menggunakan spasi
Contoh
sumber
.RECIPEPREFIX
bahwa "Jika variabel kosong (seperti default ) karakter itu adalah karakter tab standar." Ini berarti variabel ditentukan secara default. Itu dikonfirmasi dengan menggunakanifeq ($(origin .RECIPEPREFIX), undefined)
. Karena+=
menambahkan satu spasi dan rhs ke lhs,var +=
setvar
ke satu spasi (ditambah string kosong) asalkanvar
sudah ditentukan. (Jikavar
tidak ditentukan,+=
sama dengan=
.)Dalam mode penyisipan vim, seseorang dapat menggunakan
Ctrl-v <TAB>
untuk menyisipkan tab literal, bahkan jika Anda telah mengatur tombol tab untuk menyisipkan spasi. Ini tidak menjawab pertanyaan Anda, tentu saja, tetapi mungkin menjadi alternatif dari metode yang tersedia untuk menghindari perlunya tab literal.sumber
Jika Anda menggunakan EditorConfig , Anda dapat menambahkan baris berikut ke
.editorconfig
file Anda untuk memaksa IDE Anda menggunakan tab untuk indentasi alih-alih spasi diMakefile
:sumber
Hingga GNU Make 4.2
Jawaban Steven Penny berhasil.
Alasan mengapa ini berhasil dijelaskan dalam komentar saya .
Sejak GNU Make 4.3 (dirilis pada 19 Jan 2020)
Perilaku
+=
operator telah diubah dengan cara yang tidak kompatibel dengan versi sebelumnya. Jika operan kiri memiliki nilai kosong, spasi tidak lagi ditambahkan.Anda malah bisa menggunakan
, di mana
<space>
ada satu spasi. Meskipun$(.RECIPEPREFIX)
diperluas sebagai nilai kosong, ini diperlukan agar GNU Make tidak mengabaikannya<space>
. Perhatikan kode ini bekerja bahkan pada GNU Make lebih lama dari versi 4.3.sumber
di ubuntu: vi Makefiles mengganti spasi dengan tab (atau apa pun yang Anda inginkan):
Misalnya ganti 8 spasi dengan tab:
Perhatikan: ^ Saya menyisipkan dengan tombol tab, bukan ^ dan karakter I : D
sumber
Tidak portabel. Rasa tertentu dari make benar-benar membutuhkan karakter tab. Namun alasan lain untuk lebih memilih tab daripada spasi :-)
sumber