Android 构建系统:如何从 .t​​ar 文件中包含预构建文件?

LiM*_*Mar 1 android makefile build tar android-source

我正在构建一个定制的 Android 系统 (JellyBean)。

我有一个项目(来自上游)包含一个 .tar 文件,它应该在构建时解压缩,它的内容应该被复制到结果目录树中的某个位置。我应该如何构建makefile来做到这一点?

我尝试了以下方法:

1) 使用 un-tar 指令编写 Android.mk(在带有 tar 的 git 中)并使用“PRODUCT_COPY_FILES += ...”

这不起作用,因为 PRODUCT_COPY_FILES 不能在 Android.mk 中使用

2) 使用 untar 说明和一些包含在 AndroidProducts.mk 中的产品定义 mk 文件编写 Android.mk,其中包含“PRODUCT_COPY_FILES += ...”

这不起作用,因为解压缩发生在“PRODUCT_COPY_FILES += (ls /untared/dir/*)”之后,因此 PRODUCT_COPY_FILES 结果为空。

3) 编写产品定义 mk 文件做 untar 然后“PRODUCT_COPY_FILES += ...”

这有效但不是很好,因为构建系统在多个位置包含此文件并且解压缩发生多次(~10)这会减慢构建速度并且不好......

Bet*_*eta 5

这可能需要几次迭代。

重申问题:

有对变量的赋值,以及创建文件的规则(通过解压 tar 文件)。我们事先不知道这些文件的名称是什么,但我们希望它们在变量中。对变量的赋值(和修改)往往发生在规则之外,因此它们将在规则之前执行。

这里有几种方法。(如果对您的系统没有更多的了解,很难知道哪个是最好的。)

1)将初始分配

PRODUCT_COPY_FILES := ...
Run Code Online (Sandbox Code Playgroud)

PRODUCT_COPY_FILES = ...
Run Code Online (Sandbox Code Playgroud)

Make 中两种类型的变量简单扩展变量和递归扩展变量。(这与递归调用 makefile 无关。)选择由分配=或确定:=。如果您有一个简单的扩展变量,例如

LIST := $(shell ls foo/)
Run Code Online (Sandbox Code Playgroud)

然后它将包含foo/ 分配时所有文件的列表。如果您执行一个将文件放入 的规则foo/,那么另一个使用$(LIST)的规则,第二个规则将只看到原始文件名。但是如果你使用递归扩展的变量:

LIST = $(shell ls foo/)
Run Code Online (Sandbox Code Playgroud)

那么它将包含$(shell ls foo/). 在使用变量之前,这不会被扩展(评估),因此第二条规则将看到所有文件名。

如果更改PRODUCT_COPY_FILES为递归扩展变量,则可以使用

PRODUCT_COPY_FILES += $(shell ls /untared/dir/*)
Run Code Online (Sandbox Code Playgroud)

并且该ls命令在使用该变量之前不会执行。

2) 使用 tar -t

tar实用程序允许您获取 tar 文件的内容列表,而无需实际解压缩它。

PRODUCT_COPY_FILES += $(shell tar -tf tarfile)
Run Code Online (Sandbox Code Playgroud)

(您可能需要使用一些过滤或其他路径操作来获得您想要的。)

3)递归使用Make

Make 的递归使用是在 Make 执行 Make 时,使用相同的 makefile 或不同的 makefile。

也许definition.mk解压 tar 文件,然后调用android.mk

# definition.mk

all:
    tar -xvf ...
    $(MAKE) -f android.mk
Run Code Online (Sandbox Code Playgroud)

android.mk开始时,文件中已经存在的/untared/dir/

或者,如果您想android.mk成为调用其他生成文件的主生成文件,您可以简单地交换名称。