Sekme karakterleri olmadan geçerli Makefiles oluşturabilir misiniz?


114
target: dependencies
    command1
    command2

Sistemimde (Mac OS X), makeMakefiles'ın her commandsatırın içeriğinden önce bir sekme karakterine sahip olmasını gerektiriyor gibi görünüyor veya bir sözdizimi hatası veriyor.

Bu, Makefiles oluştururken veya düzenlerken bir sıkıntıdır çünkü editörüm her zaman her yerde olacak şekilde ayarlanmıştır.

Sekme karakterleri olmadan geçerli Makefiles oluşturabilir misiniz?


4
Ayrıca editörümü boşluklarla sekmeleri taklit edecek şekilde yapılandırdım. Ancak, editörüm ayrıca Makefiles'da olduğu gibi kesinlikle, pozitif olarak bir sekmeye sahip olmam gerektiği nadir durumlarda Ctrl-Tab yazmama izin veriyor. Belki editörünüz de biliyordur.
toolic

Yanıtlar:


118

Bu bir sözdizimi tuhaflığı / gerekliliğidir, makeMac OS X ile ilgisi yoktur. Maalesef, kullanacaksanız bu konuda yapabileceğiniz hiçbir şey yoktur make.

Düzenleme : GNU Make artık özel bir tarif önekini desteklemektedir. Bu cevaba bakın .

Bu yönünden hoşlanmayan ilk kişi sen değilsin make. Unix Nefret Edenlerin El Kitabından alıntı yapmak için :

Dennis'in Makefile'ındaki sorun, yorum satırını eklediğinde, yanlışlıkla 2. satırın başına sekme karakterinden önce bir boşluk eklemesidir. Sekme karakteri, Makefiles sözdiziminin çok önemli bir parçasıdır. Tüm komut satırları (örneğimizde cc ile başlayan satırlar) sekmelerle başlamalıdır. Değişikliğini yaptıktan sonra, 2. satır olmadı, dolayısıyla hata.

"Ne olmuş yani?" "Bunun nesi var?" diye soruyorsunuz.

Bunda tek başına yanlış bir şey yok. Sadece Unix'te diğer programlama araçlarının nasıl çalıştığını düşündüğünüzde, sözdiziminin bir parçası olarak sekmeleri kullanmak The Green Berets'deki pungee stick tuzaklarından biri gibidir: Kansaslı zavallı çocuk John Wayne'in önünde yürüme noktasıdır ve yapmaz. t Trip telini gör. Sonuçta, Kansas mısır tarlalarında dikkat edilmesi gereken teller yok. WHAM!


5
Sekmelerle ilgili sorun, make kullanan herkesin öğrendiği ilk şeylerden biridir - bunu gerçek bir sorun olarak görmedim.

2
@Neil, Ben de: UHH ile aynı fikirdeyim demedim, sadece bazılarının beğenmediğini söylüyordum. :-)
Alok Singhal

2
Cmake kullanmak için iyi bir fiş gibi görünüyor. Yapım sözdizimindeki tek sinir bozucu tuhaflık değil.
orodbhen

3
Gnu.org/software/make/manual/html_node/Special-Variables.html'yi buldum (bakın .RECIPEPREFIX). Aşağıdaki cevaplardan biri de bundan bahsetmektedir ve benim yerine "doğru" olarak işaretlenmelidir. stackoverflow.com/a/21920142
Alok Singhal

3
Bu çok büyük bir sorun değil ama can sıkıcı. Her seferinde. Güvenilir bir şekilde can sıkıcıdır ve \ omicron lineer zamanda can sıkıcıdır.
Parthian Shot

60

Bu sorunun ilk sorulmasından bu yana Tab, önek karakteri dışında bir şey kullanmanıza izin veren bir GNU Make sürümü yayınlandı . Posta listesi duyurusundan :

Yeni özel değişken: .RECIPEPREFIX, reçete giriş karakterini varsayılandan (TAB) başka bir şeye sıfırlamanıza izin verir. Bu değişken değerinin ilk karakteri yeni tarif giriş karakteridir. Değişken boş dizeye ayarlanmışsa, SEKME yeniden kullanılır. İsteğe göre ayarlanabilir ve sıfırlanabilir; tarifler ilk ayrıştırıldıklarında aktif olan değeri kullanır. Bu özelliği algılamak için $ (. RECIPEPREFIX) değerini kontrol edin.

Bu özellik, Temmuz 2010'da yayınlanan GNU Make 3.82'ye eklenmiştir (bu sorunun orijinal sorulduğu tarihten altı ay sonra). Üç yıl geçtiği ve o zamandan bu yana değiştiği için, diğer Make tatlarının GNU Make'i takip etmesi muhtemeldir.


51

Sekmeler olmadan geçerli bir makefile oluşturmanın kıvrımlı bir yolu vardır.

Makefile dosyanızı okumak için değiştirirseniz:

target: dependencies; command1; command2

Çalışacaksa. Birden fazla satırda olmasını istiyorsanız, şunları yapabilirsiniz:

target: dependencies; \
command1; \
command2

Dağınık, ama işe yarıyor.


Destekleyen bir Make sürümüne yükseltmek .RECIPEPREFIXmuhtemelen en iyi yaklaşımdır. Ancak, bunu yapmak istemediğim için buna dayalı bir çözüm kullandım. Satır 1:, target:\ Satır 2: [dört boşluk girintisi] ve ardından;command
LS

33

Profilinizde bir vimrc varsa, vim'in boşluklara dönüşmesini önlemek için bu satırı ekleyebilirsiniz:

autocmd FileType make setlocal noexpandtab

Ben de bununla mücadele ediyordum ve bu benim için sorunu çözdü. İyi sözü yay!


19

Boşluk kullanmak istersen bu benim için yapar

.RECIPEPREFIX +=

Misal


Hangi marka sürümü bunu destekliyor? Bu, GNU Make 4.1'de çalışmaz.
Cerin

2
GNU Make 4.1 x86_64-pc-linux-gnu için oluşturuldu Üzgünüm ama çalışıyor
neok

Muhtemelen, bu değişkenin make dosyasının kendisinde bildirilmesi gerektiğinden bahsetmek gerekir (ön ek nokta kolay fark edilmez)
urusai_na

En azından sürüm 4.2'de bu çalışmalıdır. Belgeler.RECIPEPREFIX , "Değişken boşsa ( varsayılan olarak olduğu gibi ) bu karakter standart sekme karakteridir " açıklamasında diyor . Bu, değişkenin varsayılan olarak tanımlandığı anlamına gelir. Kullanılarak onaylanır ifeq ($(origin .RECIPEPREFIX), undefined). Çünkü , lhs'ye tek bir boşluk ve rhs +=eklemek , önceden tanımlandığı sürece tek bir boşluğa (artı boş bir dizge) ayarlar . ( Tanımlanmamışsa, ile aynıdır .)var +=varvarvar+==
ynn

1
Bu cevap artık işe yaramıyor. En son çözüm için cevabımı görün .
ynn

11

Vim'in ekleme kipinde, Ctrl-v <TAB>boşluk eklemek için tab tuşunu ayarlamış olsanız bile , biri değişmez bir sekme eklemek için kullanılabilir . Bu elbette sorunuza cevap vermiyor, ancak gerçek sekmelere ihtiyaç duymamak için mevcut yöntemlere bir alternatif olabilir.


10

EditorConfig kullanıyorsanız, IDE'nizi.editorconfig boşluk yerine girinti için sekme kullanmaya zorlamak için dosyanıza aşağıdaki satırları ekleyebilirsiniz Makefile:

[Makefile]
indent_style = tab

4

GNU 4.2 Yapana kadar

Steven Penny'nin cevabı işe yarıyor.

.RECIPEPREFIX +=

Bunun işe yaramasının nedeni benim yorumumda anlatılıyor .


GNU Make 4.3'ten beri (19 Ocak 2020'de yayınlandı)

Davranışı +=operatörü olan değiştirilebilir bir geri-uyumlu bir şekilde. Sol işlenen boş bir değere sahipse, artık boşluk eklenmez.

Bunun yerine kullanabilirsiniz

.RECIPEPREFIX := $(.RECIPEPREFIX)<space>

, <space>tek bir boşluk nerede . $(.RECIPEPREFIX)Boş bir değer olarak genişletilmesine rağmen , bu GNU Make'ın yok saymasına izin vermemek için gereklidir <space>. Bu kodun 4.3 sürümünden daha eski GNU Make üzerinde çalıştığını unutmayın.


1

ubuntu'da: vi Makefiles, alanı sekme (veya istediğiniz herhangi bir şey) ile değiştirir:

:%s/<space chars>/^I/g

Örneğin, 8 boşluğu sekmeyle değiştirin:

:%s/        /^I/g

Dikkat edin: ^ ^ ve I karakterleriyle değil, sekme tuşuyla eklerim : D


-6

Taşınabilir değil. Bazı yapım çeşitleri kesinlikle sekme karakterleri gerektirir. Boşluk yerine sekmeleri tercih etmenin bir başka nedeni :-)

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.