target: dependencies
command1
command2
私のシステム(Mac OS X)では、 make
Makefileに各行の内容の前にタブ文字があることを要求するようですそうしcommand
ないと、構文エラーがスローされます。
Makefilesを作成または編集するときは、エディタをすべてのスペースに常時設定するので、これは厄介です。
タブ文字なしで有効なMakefileを作成できますか?
target: dependencies
command1
command2
私のシステム(Mac OS X)では、 make
Makefileに各行の内容の前にタブ文字があることを要求するようですそうしcommand
ないと、構文エラーがスローされます。
Makefilesを作成または編集するときは、エディタをすべてのスペースに常時設定するので、これは厄介です。
タブ文字なしで有効なMakefileを作成できますか?
回答:
これはの構文の奇妙さ/要件でありmake
、Mac OS Xとは何の関係もありません。残念ながら、を使用する場合、それについてできることは何もありませんmake
。
編集:GNU Makeはカスタムレシピ接頭辞をサポートするようになりました。この回答を参照してください。
あなたはのこの側面を嫌う最初のものではありませんmake
。Unix Haters 'Handbookを引用するには:
DennisのMakefileの問題は、コメント行を追加したときに、2行目の最初のタブ文字の前に誤ってスペースを挿入したことです。タブ文字は、Makefileの構文の非常に重要な部分です。すべてのコマンドライン(この例ではccで始まる行)はタブで始まる必要があります。彼が変更を加えた後、2行目は変更されなかったため、エラーが発生しました。
"だから何?" 「どうしたの?」
それ自体には何の問題もありません。Unixで他のプログラミングツールがどのように機能するかを考えると、構文の一部としてタブを使用することは、The Green Beretsのバンジースティックトラップの1つに似ています。カンザス州の貧しい子供は、ジョンウェインの前を歩いていて、トリップワイヤーを見てください。結局のところ、カンザス州のトウモロコシ畑には注意すべきトリップワイヤーはありません。ワム!
.RECIPEPREFIX
)。以下の回答の1つでもそのことが言及されており、私の代わりに「正しい」とマークする必要があります。 stackoverflow.com/a/21920142
この質問が最初に尋ねられて以来Tab、プレフィックス文字以外のものを使用できるバージョンのGNU Makeがリリースされました。メーリングリスト発表から:
新しい特殊変数:.RECIPEPREFIXを使用すると、レシピ紹介文字をデフォルト(TAB)から別の文字にリセットできます。この変数値の最初の文字は、新しいレシピ紹介文字です。変数が空の文字列に設定されている場合、TABが再び使用されます。自由に設定およびリセットできます。レシピは、最初に解析されたときにアクティブな値を使用します。この機能を検出するには、$(。RECIPEPREFIX)の値を確認してください。
この機能は、2010年7月にリリースされたGNU Make 3.82で追加されました(この質問の最初の質問日から6か月後)。それから3年が経過し、それ以来変化しているため、他のMakeフレーバーがGNU Makeをフォローしている可能性があります。
タブのない有効なメイクファイルを作成する複雑な方法があります。
makefileを読み取るように変更した場合:
target: dependencies; command1; command2
うまくいくでしょう。複数行にしたい場合は、次のようにします。
target: dependencies; \
command1; \
command2
乱雑ですが、動作します。
.RECIPEPREFIX
がおそらく最善の方法です。しかし、私はそうする気がなかったので、これに基づいたソリューションを使用することになりました。1行目:target:\
、2行目:[4つのスペースのインデント]に続く;command
EditorConfigを使用している場合は、次の行を.editorconfig
ファイルに追加して、IDEでスペースの代わりにタブをインデントに使用するように強制できますMakefile
。
[Makefile]
indent_style = tab
GNU Make 4.2まで
.RECIPEPREFIX +=
GNU Make 4.3以降(2020年1月19日にリリース)
+=
演算子の動作が下位互換性のない方法で変更されました。左側のオペランドの値が空の場合、スペースはなくなります追加され。
代わりに使用できます
.RECIPEPREFIX := $(.RECIPEPREFIX)<space>
、<space>
は単一のスペースです。が$(.RECIPEPREFIX)
空の値として展開され、これは、GNUのメイクを無視せない必要があります<space>
。このコードはバージョン4.3より前のGNU Makeでも機能することに注意してください。
Ubuntuの場合:vi Makefileはスペースをタブ(またはその他の必要なもの)に置き換えます。
:%s/<space chars>/^I/g
exの場合、8つのスペースをタブで置き換えます。
:%s/ /^I/g
注意して:^私は、Tabキーでない挿入^およびIの文字:D
可搬性はありません。makeの特定の種類では、タブ文字が絶対に必要です。スペースよりもタブを好むもう1つの理由:-)