0

を書いていますがMakefile、ビルド ディレクトリとソース ディレクトリを分けたいと思います。私が最初に考えたのは、「ファイル名の先頭にソース パスを追加してルールを作成すれば、それで完了だ」ということだけでした。</p>

問題は、このソリューションが非常に反復的であり、見栄えがよくないことです。Makefileソースを保持しているディレクトリとは別のディレクトリにターゲットを格納するa を自分で作成するための最良のアプローチは何でしょうか。

4

1 に答える 1

1

プログラムは、ビルドされたターゲットを、ソースを保持するディレクトリとは別のディレクトリに格納するための非常に優れたサポートを提供します。この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)ます.OBJDIRPWD適切な準備.OBJDIRがない場合は、ターゲットを構築するため.CURDIRに実行する前に、目的のディレクトリ (またはツリー構造) を作成する必要があります。make

を設定する最初のメカニズムに依存することを選択したと仮定すると、ターゲットをビルドするため.OBJDIRに実行する前に、ビルド システムを編成できます。make

  • 環境変数MAKEOBJDIRPREFIXが適切な値に設定されています。
  • 特別なスクリプト (makeターゲットの可能性があります) は、必要なディレクトリまたはディレクトリを の下に準備し${MAKEOBJDIRPREFIX}ます。

Makefile の配置

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}

コマンドラインのさまざまな場所でソースの一部を適切に選択するために、最後のレシピでグロビングパターンがどのように使用されているかに注意してください。

のビルド システム (おそらく ) は、この機能を使用して、さまざまなアーキテクチャのオペレーティング システムを同時にビルドできるようにします。(クリーニングも簡単になります!) これらの Makefile を調べて、関連するテクニックをよりよく理解することができます。

用の移植可能なマクロbsdowlも のこの機能をサポートしています。ファイルとの例を参照してください。bsdmakebps.objdir.mk

于 2014-09-20T21:27:29.860 に答える