1

カスタマイズされた Android システム (JellyBean) を構築しています。

ビルド時に untar する必要がある .tar ファイルを含むプロジェクトを (アップストリームから) 取得しました。その内容は、結果のディレクトリ ツリーの特定の場所にコピーする必要があります。それを行うには、どのようにmakefileを構築すればよいですか?

私は次のことを試しました:

1) un-tar 命令を使用して Android.mk (tar を含む git 内) を作成し、「PRODUCT_COPY_FILES += ...」を使用する

Android.mk では PRODUCT_COPY_FILES を使用できないため、これは機能しません。

2) untar 命令を使用して Android.mk を書き込み、AndroidProducts.mk に含まれる製品定義 mk ファイル ("PRODUCT_COPY_FILES += ..." を含む) を記述します。

untar は "PRODUCT_COPY_FILES += (ls /untared/dir/*)" の後に発生し、PRODUCT_COPY_FILES が空になるため、これは機能しません。

3) untar を実行して製品定義 mk ファイルを書き込み、次に "PRODUCT_COPY_FILES += ..."

これは機能しますが、ビルドシステムにはこのファイルが複数の場所に含まれており、untar が何度も (~10) 発生し、ビルドが遅くなり、良くないため、あまり良くありません ...

4

1 に答える 1

5

これには数回の反復が必要な場合があります。

問題を言い換えるには:

変数への割り当てと、(tar ファイルを解凍して) ファイルを作成するルールがあります。これらのファイルの名前がどうなるかは事前にわかりませんが、変数に入れたいと思います。変数への割り当て (および変数の変更) は、ルールの外側で発生する傾向があるため、ルールの前に実行されます。

ここにいくつかのアプローチがあります。(システムの知識がなければ、どちらが最適かを判断することは困難です。)

1) 初期割り当て

PRODUCT_COPY_FILES := ...

PRODUCT_COPY_FILES = ...

Make には、単純展開変数と再帰展開変数の 2 種類変数あります。(これは、makefile を再帰的に呼び出すこととは関係ありません。) 選択は、=またはを代入することによって決定され:=ます。次のような単純に展開された変数がある場合

LIST := $(shell ls foo/)

foo/ 次に、割り当て時に含まれているファイルのリストが含まれます。ファイルを に配置するルールを実行してからfoo/、 を使用する別のルールを実行する$(LIST)と、2 番目のルールには元のファイル名のみが表示されます。しかし、再帰的に展開された変数を使用する場合:

LIST = $(shell ls foo/)

が含まれます$(shell ls foo/)。これは、変数が使用されるまで展開 (評価) されないため、2 番目のルールではすべてのファイル名が表示されます。

再帰的に展開された変数に変更PRODUCT_COPY_FILESする場合は、使用できます

PRODUCT_COPY_FILES += $(shell ls /untared/dir/*)

コマンドは、ls変数が使用されるまで実行されません。

2) tar -t を使用する

このtarユーティリティを使用すると、tar ファイルを実際に解凍せずに内容のリストを取得できます。

PRODUCT_COPY_FILES += $(shell tar -tf tarfile)

(必要なものを取得するには、フィルタリングまたはその他のパス操作を使用する必要がある場合があります。)

3) Make を再帰的に使用する

Make の再帰的な使用は、Makeが同じ Makefile または異なる Makefile を使用して Make を実行する場合です。

おそらくdefinition.mktarファイルを解凍してから呼び出しますandroid.mk

# definition.mk

all:
    tar -xvf ...
    $(MAKE) -f android.mk

開始するandroid.mkと、ファイルはすでに に存在し/untared/dir/ます。

android.mkまたは、他のメイクファイルを呼び出すマスターのメイクファイルになりたい場合は、名前を交換するだけです。

于 2012-07-30T15:20:55.280 に答える