タブ文字なしで有効なMakefileを作成できますか?


114
target: dependencies
    command1
    command2

私のシステム(Mac OS X)では、 make Makefileに各行の内容の前にタブ文字があることを要求するようですそうしcommandないと、構文エラーがスローされます。

Makefilesを作成または編集するときは、エディタをすべてのスペースに常時設定するので、これは厄介です。

タブ文字なしで有効なMakefileを作成できますか?


4
また、スペースを含むタブをエミュレートするようにエディターを構成しました。しかし、私のエディターでは、Makefilesのように、絶対に確実にタブが必要になるというまれな場合に、Ctrl-Tabを入力することもできます。おそらくあなたのエディターも同様です。
ツールの

回答:


118

これはの構文の奇妙さ/要件でありmake、Mac OS Xとは何の関係もありません。残念ながら、を使用する場合、それについてできることは何もありませんmake

編集:GNU Makeはカスタムレシピ接頭辞をサポートするようになりました。この回答を参照してください。

あなたはのこの側面を嫌う最初のものではありませんmakeUnix Haters 'Handbookを引用するには:

DennisのMakefileの問題は、コメント行を追加したときに、2行目の最初のタブ文字の前に誤ってスペースを挿入したことです。タブ文字は、Makefileの構文の非常に重要な部分です。すべてのコマンドライン(この例ではccで始まる行)はタブで始まる必要があります。彼が変更を加えた後、2行目は変更されなかったため、エラーが発生しました。

"だから何?" 「どうしたの?」

それ自体には何の問題もありません。Unixで他のプログラミングツールがどのように機能するかを考えると、構文の一部としてタブを使用することは、The Green Beretsのバンジースティックトラップの1つに似ています。カンザス州の貧しい子供は、ジョンウェインの前を歩いていて、トリップワイヤーを見てください。結局のところ、カンザス州のトウモロコシ畑には注意すべきトリップワイヤーはありません。ワム!


5
タブに関する問題は、makeが使用する誰もが最初に学ぶことの1つです-私はそれが本当の問題であるとは知りませんでした。

2
@ニール、私もどちらか:私がUHHに同意することを言ったことは一度もありません。:-)
Alok Singhal、2010年

2
cmakeを使用するための良いプラグのようです。make構文の唯一のイライラする奇妙さではありません。
orodbhen

3
gnu.org/software/make/manual/html_node/Special-Variables.htmlを見つけました(を参照.RECIPEPREFIX)。以下の回答の1つでもそのことが言及されており、私の代わりに「正しい」とマークする必要があります。 stackoverflow.com/a/21920142
Alok Singhal

3
大きな問題ではありませんが、迷惑です。毎回。それは確かに迷惑であり、\ omicron線形時間で迷惑です。
パルティアンショット

60

この質問が最初に尋ねられて以来Tab、プレフィックス文字以外のものを使用できるバージョンのGNU Makeがリリースされました。メーリングリスト発表から

新しい特殊変数:.RECIPEPREFIXを使用すると、レシピ紹介文字をデフォルト(TAB)から別の文字にリセットできます。この変数値の最初の文字は、新しいレシピ紹介文字です。変数が空の文字列に設定されている場合、TABが再び使用されます。自由に設定およびリセットできます。レシピは、最初に解析されたときにアクティブな値を使用します。この機能を検出するには、$(。RECIPEPREFIX)の値を確認してください。

この機能は、2010年7月にリリースされたGNU Make 3.82で追加されました(この質問の最初の質問日から6か月後)。それから3年が経過し、それ以来変化しているため、他のMakeフレーバーがGNU Makeをフォローしている可能性があります。


51

タブのない有効なメイクファイルを作成する複雑な方法があります。

makefileを読み取るように変更した場合:

target: dependencies; command1; command2

うまくいくでしょう。複数行にしたい場合は、次のようにします。

target: dependencies; \
command1; \
command2

乱雑ですが、動作します。


Makeをサポートするバージョンにアップグレードするの.RECIPEPREFIXがおそらく最善の方法です。しかし、私はそうする気がなかったので、これに基づいたソリューションを使用することになりました。1行目:target:\ 、2行目:[4つのスペースのインデント]に続く;command
LS

33

プロファイルにvimrcがある場合は、次の行を追加して、vimがスペースに変更されないようにすることができます。

autocmd FileType make setlocal noexpandtab

私もこれに苦労していましたが、これで解決しました。良い言葉を広めてください!


19

これは、スペースを使用したい場合に役立ちます

.RECIPEPREFIX +=


makeのどのバージョンがこれをサポートしていますか?これはGNU Make 4.1では機能しません。
セリン2017

2
x86_64-pc-linux-gnu用にビルドされたGNU Make 4.1申し訳ありませんが、動作します
neok

おそらく、言及する必要があります。この変数は、makeファイル自体の内部で宣言する必要があります(ドットのプレフィックスは
見つけにくい

少なくともバージョン4.2では、これは動作するはずです。ドキュメントでは、.RECIPEPREFIX「変数が空の場合(デフォルトでは)、その文字は標準のタブ文字である」と説明されています。これは、変数がデフォルトで定義されていることを意味します。を使って確認しifeq ($(origin .RECIPEPREFIX), undefined)ます。単一のスペースとrhsをlhsに+=追加するためすでに定義されている限り、単一のスペース(および空の文字列)にvar +=設定varvarます。(varが定義されていない場合+=、と同じ=です。)
ynn

1
この答えはもはや機能しません。最新の解決策については、私の回答を参照しください。
ynn

11

vimの挿入モードでは、Ctrl-v <TAB>スペースを挿入するようにタブキーを設定している場合でも、を使用してリテラルタブを挿入できます。もちろん、これはあなたの質問には答えませんが、リテラルタブを必要としないようにするために利用可能なメソッドの代わりになるかもしれません。


10

EditorConfigを使用している場合は、次の行を.editorconfigファイルに追加して、IDEでスペースの代わりにタブをインデントに使用するように強制できますMakefile

[Makefile]
indent_style = tab

4

GNU Make 4.2まで

スティーブンペニーの答えはうまくいきます

.RECIPEPREFIX +=

これが機能する理由は私のコメントに記載されています。


GNU Make 4.3以降(2020年1月19日にリリース)

+=演算子の動作が下位互換性のない方法で変更ました。左側のオペランドの値が空の場合、スペースはなくなります追加され。

代わりに使用できます

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

<space>は単一のスペースです。が$(.RECIPEPREFIX)空の値として展開され、これは、GNUのメイクを無視せない必要があります<space>。このコードはバージョン4.3より前のGNU Makeでも機能することに注意してください。


1

Ubuntuの場合:vi Makefileはスペースをタブ(またはその他の必要なもの)に置き換えます。

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

exの場合、8つのスペースをタブで置き換えます。

:%s/        /^I/g

注意して:^私は、Tabキーでない挿入^およびIの文字:D


-6

可搬性はありません。makeの特定の種類では、タブ文字が絶対に必要です。スペースよりもタブを好むもう1つの理由:-)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.