を書いていますがMakefile
、ビルド ディレクトリとソース ディレクトリを分けたいと思います。私が最初に考えたのは、「ファイル名の先頭にソース パスを追加してルールを作成すれば、それで完了だ」ということだけでした。</p>
問題は、このソリューションが非常に反復的であり、見栄えがよくないことです。Makefile
ソースを保持しているディレクトリとは別のディレクトリにターゲットを格納するa を自分で作成するための最良のアプローチは何でしょうか。
を書いていますがMakefile
、ビルド ディレクトリとソース ディレクトリを分けたいと思います。私が最初に考えたのは、「ファイル名の先頭にソース パスを追加してルールを作成すれば、それで完了だ」ということだけでした。</p>
問題は、このソリューションが非常に反復的であり、見栄えがよくないことです。Makefile
ソースを保持しているディレクトリとは別のディレクトリにターゲットを格納するa を自分で作成するための最良のアプローチは何でしょうか。
プログラムbsdmakeは、ビルドされたターゲットを、ソースを保持するディレクトリとは別のディレクトリに格納するための非常に優れたサポートを提供します。このMakefile
機能を使用すると、書くのが少し難しくなる可能性があるため、回答で最も重要なテクニックを確認します。
組み込み変数.OBJDIR
には、ターゲットがビルドされるディレクトリの名前が含まれています。次のように決定されます(ページからの抜粋man
):
.OBJDIR A path to the directory where the targets are built. Its
value is determined by trying to chdir(2) to the follow‐
ing directories in order and using the first match:
1. ${MAKEOBJDIRPREFIX}${.CURDIR}
(Only if ‘MAKEOBJDIRPREFIX’ is set in the environ‐
ment or on the command line.)
2. ${MAKEOBJDIR}
…
6. ${.CURDIR}
プログラムmake
は、ターゲットを実行する前に、そのディレクトリに移動して設定しchdir(2)
ます.OBJDIR
。PWD
適切な準備.OBJDIR
がない場合は、ターゲットを構築するため.CURDIR
に実行する前に、目的のディレクトリ (またはツリー構造) を作成する必要があります。make
を設定する最初のメカニズムに依存することを選択したと仮定すると、ターゲットをビルドするため.OBJDIR
に実行する前に、ビルド システムを編成できます。make
MAKEOBJDIRPREFIX
が適切な値に設定されています。make
ターゲットの可能性があります) は、必要なディレクトリまたはディレクトリを の下に準備し${MAKEOBJDIRPREFIX}
ます。Makefile
前のセットアップが機能するために必要な単純な配置を検討し、説明します。
program : a.o b.o c.o
cc a.o b.o c.o -o program
a.o b.o c.o : defs.h
a.o : a.c
cc -c a.c
b.o : b.c
cc -c b.c
c.o : c.c
cc -c c.c
manual.html: manual.css
manual.html: a.c b.c c.c defs.h
manualtool -c manual.css -o manual.html a.c b.c c.c defs.h
a.o
プログラムmake
をビルドする前に、そのディレクトリからchdir(2)
コンパイラ${.OBJDIR}
を実行します。cc
ソースa.c
は別のディレクトリにあるため、コンパイラcc
はそれを見つけられず、コンパイルは失敗します。この問題は、によって定義されたローカル変数を使用することで解決されます。したがってmake
、前のものは次のように変換されます。Makefile
program : a.o b.o c.o
cc ${.ALLSRC} -o program
a.o b.o c.o : defs.h
a.o : a.c
cc -c ${.ALLSRC:M*.c}
b.o : b.c
cc -c ${.ALLSRC:M*.c}
c.o : c.c
cc -c ${.ALLSRC:M*.c}
manual.html: manual.css
manual.html: a.c b.c c.c defs.h
manualtool -c ${.ALLSRC:M*.css} -o manual.html ${.ALLSRC:N*.css}
コマンドラインのさまざまな場所でソースの一部を適切に選択するために、最後のレシピでグロビングパターンがどのように使用されているかに注意してください。
freebsdのビルド システム (おそらくnetbsdとopenbsd ) は、この機能を使用して、さまざまなアーキテクチャのオペレーティング システムを同時にビルドできるようにします。(クリーニングも簡単になります!) これらの Makefile を調べて、関連するテクニックをよりよく理解することができます。
bdsmake用の移植可能なマクロbsdowlも のこの機能をサポートしています。ファイルとocamlの例を参照してください。bsdmake
bps.objdir.mk