【问题标题】:Android build system: How to include prebuilt files from a .tar file?Android 构建系统:如何包含 .tar 文件中的预构建文件?
【发布时间】:2012-07-27 23:43:18
【问题描述】:

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

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

我尝试了以下方法:

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

这不起作用,因为 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 文件解压缩,然后 "PRODUCT_COPY_FILES += ..."

这可行,但不是很好,因为构建系统在多个位置包含此文件,并且 untar 发生了很多次(~10),这会减慢构建速度并且不太好......

【问题讨论】:

  • definition.mk 递归调用android.mk 怎么样?或者如果android.mk 必须是主makefile,将其解压,然后递归调用secondary.mk(它将执行PRODUCT_COPY_FILES,然后执行所有实际工作)?
  • 嗯,你能详细说明一下吗?我相信,我还没明白......你在“definition.mk”下是什么意思?和“递归” - 这是否意味着有东西称它为自我?你怎么“打电话”?
  • 我会回答,但可能有更简单的方法。您是否可以控制对PRODUCT_COPY_FILES初始分配?
  • 嗯。你的意思是初始分配? '=' 而不是 '+=' 的地方?比方说,我有所有的来源,但它们来自上游,我应该尽量减少我改变的 git 的数量......
  • 是的,我就是这个意思。是= 还是:=

标签: android makefile build tar android-source


【解决方案1】:

这可能需要几次迭代。

重申问题:

有一个对变量的赋值,以及一个创建文件的规则(通过解压缩 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) 递归使用 Make

Recursive use of Make 是 Make 使用相同或不同的 makefile 执行 Make 时。

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

# definition.mk

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

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

或者,如果您希望 android.mk 成为调用其他 makefile 的主 makefile,您可以简单地交换名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2017-10-11
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多