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)这会减慢构建速度并且不好......
这可能需要几次迭代。
重申问题:
有对变量的赋值,以及创建文件的规则(通过解压 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成为调用其他生成文件的主生成文件,您可以简单地交换名称。
| 归档时间: |
|
| 查看次数: |
4841 次 |
| 最近记录: |