2012-07-30 94 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,你可以简单地交换名称。

相关问题