2012-07-30 45 views
1

我正在構建一個定製的Android系統(JellyBean)。Android構建系統:如何從.tar文件包含預建文件?

我有一個項目(從上游)包含一個.tar文件,應該在構建時解壓,它的內容應該被複制到生成的目錄樹中的某個地方。 我應該如何構建makefiles來完成它?

我已經試過如下:

1)寫作Android.mk(與焦油的GIT)與非焦油指令和使用 「PRODUCT_COPY_FILES + = ...」

這不起作用,因爲PRODUCT_COPY_FILES不能在Android.mk

2)寫入Android.mk被用於與解壓縮的指令和從AndroidProducts.mk包括一些產品定義MK文件,其中包含「PRODUCT_COPY_FILES + = ...」

這不起作用,因爲untar在「PRODUCT_COPY_FILES + =(ls/untared/dir/*)」後發生,因此PRODUCT_COPY_FILES結果爲空。

3)寫作產品定義MK文件做解壓縮,然後「PRODUCT_COPY_FILES + = ...」

這工作,但不是那麼好,因爲構建系統包括在多個地方該文件和解壓發生多次(〜10)這減慢了構建並且不好...

+0

'definition.mk'如何遞歸調用'android.mk'?或者,如果'android.mk'必須是主makefile,請將其解壓縮,然後調用'secondary.mk'(它將執行'PRODUCT_COPY_FILES',然後執行所有實際工作)遞歸? – Beta 2012-07-30 11:21:57

+0

嗯,你能否詳細說明一下?我相信,我還沒有明白......你在「definition.mk」下的意思是什麼?而「遞歸」 - 是否意味着某種東西稱之爲自我?你怎麼「打電話」? – LiMar 2012-07-30 11:38:17

+0

我會回答,但可能有一個更簡單的方法。你是否可以控制對PRODUCT_COPY_FILES的* initial *賦值? – Beta 2012-07-30 12:55:00

回答

4

這可能需要幾次迭代。

要重申的問題:

有一個分配給一個變量,並創建文件(通過解壓縮tar文件)的規則。我們事先不知道這些文件的名稱是什麼,但我們希望它們在變量中。對變量的賦值(和修改)往往發生在規則之外,所以它們將在規則之前執行。

這裏有幾種方法。 (這是很難知道這是最好的,沒有系統的更多知識。)

1)從

PRODUCT_COPY_FILES := ... 

更改初始分配

PRODUCT_COPY_FILES = ... 

two types of variable in Make簡單地擴展變量和遞歸地擴展變量。 (這與遞歸調用makefile無關。)選擇取決於分配=:=。如果你有一個像

LIST := $(shell ls foo/) 

一個簡單擴展型變量然後它將包含一個列表的任何文件都在foo/在分配的時間。如果您執行的規則將文件放在foo/中,則另一個規則使用$(LIST),第二個規則將只能看到原始文件名。但是,如果你使用遞歸擴大變量:

LIST = $(shell ls foo/) 

那麼它將包含$(shell ls foo/)。這將不會被擴展(評估),直到使用變量,所以第二個規則將看到所有的文件名。

如果更改PRODUCT_COPY_FILES的遞歸擴展變量,你可以使用

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

ls命令不執行,直到使用變量。

2)使用tar -t

tar實用程序允許您獲得的TAR文件的內容的列表,而不實際拆包。

PRODUCT_COPY_FILES += $(shell tar -tf tarfile) 

(您可能需要使用一些過濾或其他路徑操縱得到你想要的東西。)

3)用做遞歸

Recursive use of Make是當製作執行製作,用要麼是相同的生成文件要麼是另一個。

也許definition.mk解壓縮tar文件,然後調用android.mk

# definition.mk 

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

android.mk開始,該文件已經存在於/untared/dir/

或者如果你想android.mk成爲調用其他makefile的主makefile,你可以簡單地交換名稱。

相關問題