組み込みルールと同様に、どこでも使用できるデフォルトのグローバル暗黙ルールを許可するメカニズムが make にありますか?
Make は、C/C++/Fortran ファイルをコンパイルするための組み込みの暗黙的な規則をいくつか提供しますMakefile
。ただし、他の言語 (Go プログラミング言語ファイルなど) をコンパイルする場合は、Makefile
常に a が必要です。Makeenvironment を拡張して、デフォルトで暗黙のルールを利用できるようにしたいと考えています。
組み込みルールと同様に、どこでも使用できるデフォルトのグローバル暗黙ルールを許可するメカニズムが make にありますか?
Make は、C/C++/Fortran ファイルをコンパイルするための組み込みの暗黙的な規則をいくつか提供しますMakefile
。ただし、他の言語 (Go プログラミング言語ファイルなど) をコンパイルする場合は、Makefile
常に a が必要です。Makeenvironment を拡張して、デフォルトで暗黙のルールを利用できるようにしたいと考えています。
Makefile の移植性が低下するため、これは通常は望ましくありません。そのように設定されていない場合、他の誰かのマシンでは機能しません。
ただし、これを行う場合は、Go ファイルのデフォルト ルールを使用して「グローバル」Makefile をどこかに作成し、そのパスを MAKEFILES 環境変数に追加します。このグローバルな Makefile は、「make」を実行すると、あたかもそのソースをファイルの先頭に含めたかのように、どの Makefile よりも前に処理されます。
あなたができるという事実に言及していると思います
make hello.o
と make は.o
、ファイルから(または、存在する場合.c
は実際には orから) を作成する方法を自動的に認識しますが、カスタム ファイル タイプに対してはこれを行いたい (たとえば、から を作成する) 。.f
.p
.bar
.foo
これを行う最も移植性の高い方法は次のとおりです (Makefile 内):
.SUFFIXES: .foo .bar
.foo.bar:
foo2bar -in $> -out $@
最初の行 ( .SUFFIXES
) は、これらを特別なサフィックスとして扱うことを make に警告しています。.bar
2行目は、「aからaを作成するためのレシピです.foo
。3行目は、これを行うためのコマンドを提供します-$>
そして$@
、makeによって入力および出力ファイル名に変更されます.
注: 3 行目のインデントはタブ文字でなければなりません。
GNU make でのみ機能する、はるかに柔軟な方法は、暗黙のルールのサポートを使用することです。GNU make を使用することを保証できる場合は、おそらくこれをお勧めします。
私はdmazzoniに同意しますが、Goのmakeレシピを追加しますMakefile
。
# Include default Golang Make magic
include $(GOROOT)/src/Make.$(GOARCH)
# Hack the following line
your_program: your_program.$O
$(LD) -o $@ $^
# Compiles .go-files into architecture-specific binaries
%.$O: %.go
$(GC) -o $@ $^
clean:
rm your_program *.$O
(注:これ$O
はドル+大文字-o-ゼロではありません!)
利用可能なすべてのマシンでテストしたわけではありませんが、かなりうまく移植できるはずです。