2

一般的な設定を含むマスター makefile と、プロジェクト固有の設定を含む子 makefile があります。

makefile での変数のオーバーライドに関する他の質問から、マスター makefile で次のコードを使用できることがわかりました。

CC ?= avr-gcc
CXX ?= avr-g++

子 makefile では、colorgccを使用してこれらの変数をオーバーライドします。

CC ?= color-avr-gcc
CXX ?= color-avr-g++

すべてが機能します。

しかし、子の makefile から上記の行を削除すると、make は and の代わりに and を使用gccg++始めavr-gccますavr-g++

CCとの両方のCXX扱いが異なると思います。make によってデフォルト値が提供され、次のステートメントを使用してデフォルト値を割り当てることができません。

CC ?= avr-gcc
CXX ?= avr-g++

私の質問:

  • 私の仮定は正しいですか?
  • はいの場合、子のメイクファイルでそれらをオーバーライドしない場合、マスターのメイクファイルにデフォルト値を提供し、それを使用させるCC他の方法はありますか?CXX

編集

Chrono Kitsuneの提案に従って、私は次のことを行いました

マスターメイクファイル

CC = avr-gcc
CXX = avr-g++
# Add other master macros here.
# Add other master targets here.

子メイクファイル

CC ?= color-avr-gcc
CXX ?= color-avr-g++
# There are no child macros or targets

include master.mk

残念ながら、これでもうまくいきませんでした。私が実行make child.mkすると、マスターCCCXX定義された が取得されます。

PS: ところで、私のマスター makefile は Arduino 用の makefile であり、完全なソース コードはgithubで入手できます。

4

2 に答える 2

3

マスター makefile を master.macros と master.targets の 2 つのファイルに分割します。.macros ファイルには CC や CXX などのマクロが含まれ、.targets ファイルには作成する実際のターゲットが含まれます。

子メイクファイル:

CC ?= color-avr-gcc
CXX ?= color-avr-g++
# Add other child macros here.

include master.macros

# Add child targets here.

include master.targets

master.マクロ:

CC = avr-gcc
CXX = avr-g++
# Add other master macros here.

マスター.ターゲット:

# Add master targets here.

コマンド ラインで CC を設定すると、プロジェクト全体でそれが使用されます。それ以外の場合、子メイクファイルで CC が設定されている場合、プロジェクト全体でその CC が使用されます。どちらも使用しない場合、プロジェクト全体で master.macros の CC マクロが使用されます。

マスター ターゲットのビルドのみに別の CC を使用するなど、より複雑なことが必要な場合は、デフォルトで $(CC) に設定されている MASTER_CC などの別の CC 変数を使用することをお勧めします。make MASTER_CC=avr-gcc子 makefile にある CC を使用したくない場合のように、コマンド ラインを使用します。?= 代入を使用し、すべてのルールを明示する必要があり、もちろんルール内の $(CC) を $(MASTER_CC) に置き換えます。

master.マクロ:

MASTER_CC ?= $(CC)
MASTER_CXX ?= $(CXX)

たとえば、それが CC の値である場合、color-avr-gcc を使用します。それ以外の場合は、make MASTER_CC=avr-gcc代わりに avr-gcc を使用する必要があります。私はこの最後のビットをテストしていません。つまり、バグがある可能性がありますが、最初の解決策が必要だと思います。マスター メイクファイルを 2 つのファイルに分割し、CC ?= ...マスター マクロと子メイクファイルのみを含む部分で使用します。

于 2013-09-19T20:45:34.573 に答える
0

origin関数を使用してデバッグした後、最終的に次の組み合わせで動作するようにしました。

マスターメイクファイル

CC = avr-gcc
CXX = avr-g++
# Add other master macros here.
# Add other master targets here.

子メイクファイル

include master.mk

CC = color-avr-gcc
CXX = color-avr-g++
# There are no child macros or targets

今私がするとき、make child.mkそれは拾いますcolor-avr-gcc。そして、子メイクファイルでコメントすると、avr-gccマスターメイクファイルから使用されます。

于 2013-09-20T06:01:24.667 に答える