web-dev-qa-db-ja.com

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

target: dependencies
    command1
    command2

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

これは、Makefileを作成または編集するときのイライラです。なぜなら、私はエディターをすべてのスペースに常時設定しているからです。

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

105
xyz

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

Edit:GNU Makeはカスタムレシピプレフィックスをサポートするようになりました。 この回答 を参照してください。

あなたはmakeのこの側面を嫌う最初の人ではありません。引用するには nix Haters 'Handbook

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

「それで何?」と尋ねると、「何が悪いの?」

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

109
Alok Singhal

この質問が最初に尋ねられてから、GNU Makeのバージョンがリリースされました。 Tab プレフィックス文字として。 メーリングリストの発表から

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

この機能はGNU Make 3.82、2010年7月(この質問の最初の質問日から6か月後)にリリースされました。)で追加されました。 MakeフレーバーはGNU Make。

53

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

Makefileを次のように変更する場合:

target: dependencies; command1; command2

動作する場合。複数行にしたい場合は、次を実行できます。

target: dependencies; \
command1; \
command2

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

50
George

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

autocmd FileType make setlocal noexpandtab

私もこれに苦労していましたが、これは私のためにそれを修正しました。良い言葉を広めましょう!

30
Pericolo

あなたがスペースを使用したい場合、これは私のためにそれをします

.RECIPEPREFIX +=

17
Steven Penny

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

11
Patrick Sanan

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

[Makefile]
indent_style = tab
5
iver56