devtool使用介绍4

devtool使用介绍4

    • 2.5 devtool add详细介绍
    • 2.5.1名称和版本
    • 2.5.2依赖性检测和映射
    • 2.5.3 License检测
    • 2.5.4添加Makefile-Only文件
    • 2.5.5添加本机工具
    • 2.5.6添加Node.js模块

2.5 devtool add详细介绍

devtool add命令会根据命令提供的源树自动创建recipe。当前,该命令支持以下功能:

  • Autotools autoconf和automake)
  • CMake
  • Scons
  • qmake
  • Plain Makefile
  • Out-of-tree内核模块
  • 二进制包即“-b”选项)
  • node . js模块
  • 使用setuptools或distutils的Python模块

除了二进制包之外,应该根据源树中出现的文件自动确定如何处理源树。例如,如果找到CMakeLists.txt文件,则假定源树使用CMake,并相应地处理。

注意
在大多数情况下,你需要编辑自动生成的recipe,以便正确构建。通常,你会经历几个编辑和构建周期,直到recipe成功构建。一旦recipe构建完成,你就可以使用可能的进一步迭代在目标设备上测试recipe。

本文的其余部分将详细介绍如何生成recipe的各个部分。

2.5.1名称和版本

如果你没有在命令行中指定名称和版本,devtool add将使用源树中的各种元数据来确定正在构建的软件的名称和版本。根据工具的决定,devtool相应地设置所创建的recipe文件的名称。

如果devtool不能确定名称和版本,命令会打印错误。对于这种情况,你必须重新运行命令并提供名称和版本,或者仅仅提供名称,或者仅仅提供版本作为命令行的一部分。

有时,从源树确定的名称或版本可能不正确。在这种情况下,必须重置recipe:

$ devtool reset -n recipename

执行devtool reset命令后,需要再次执行devtool add命令,并提供名称或版本号。

2.5.2依赖性检测和映射

devtool add命令尝试检测构建时依赖性并将它们映射到系统中的其他recipe。 在此映射期间,命令将这些recipe的名称作为recipe内DEPENDS变量的一部分进行填写。 如果无法映射依赖项,则devtool会在配方中添加注释以表明这种依赖关系。 无法映射依赖关系可能是由于无法识别命名或由于依赖关系根本不可用而导致的。 对于不可用的依赖关系,必须使用devtool add命令添加满足该依赖关系的其他recipe。 添加该recipe后,您需要更新原始recipe中的DEPENDS变量以包括新recipe:

RDEPENDS_${PN} += "dependency1 dependency2 ..."
注意
devtool add命令通常无法区分强制性和可选性依赖项。 因此,某些检测到的依赖关系实际上可能是可选的。 如有疑问,请查阅有关recipe的软件文档或配置脚本,以获取更多详细信息。 在某些情况下,您可能会发现可以用一个选项替代依赖项,该选项可以禁用传递给配置脚本的关联功能。

2.5.3 License检测

devtool add命令尝试确定您要添加的软件是否能够在通用的开源许可证下进行分发。 如果是这样,该命令将相应地设置LICENSE值。 您应针对要构建的软件的文档或源文件再次检查命令添加的值,并在必要时更新该LICENSE值。

devtool add命令还会将LIC_FILES_CHKSUM值设置为指向看起来与许可证相关的所有文件。 意识到许可证声明通常出现在源文件顶部或文档中的注释中。 在这种情况下,该命令无法识别这些许可证声明。 因此,您可能需要修改LIC_FILES_CHKSUM变量以指向这些注释中的一个或多个(如果存在)。 设置LIC_FILES_CHKSUM对于第三方软件尤为重要。 如果您将来将配方升级到较新的上游版本,该机制将尝试确保正确的许可。 检测到许可的任何更改,并且你收到错误提示你再次检查许可文本。

如果devtool add命令无法确定许可信息,则devtool将LICENSE值设置为“ CLOSED”,并保持LIC_FILES_CHKSUM值不变。 即使设置在所有情况下都不太正确,此行为也可以使您继续开发。 你应检查所构建软件的文档或源文件,以确定实际的许可证。

2.5.4添加Makefile-Only文件

在专有软件和开源软件中,使用Make本身都很常见。 不幸的是,在编写Makefile时通常不会考虑交叉编译。 因此,devtool add通常不能很好地确保这些Makefile正确构建。 例如,显式调用gcc而不使用CC变量是很常见的。 通常,在交叉编译环境中,gcc是构建主机的编译器,并且交叉编译器的名称类似于arm-poky-linux-gnueabi-gcc,并且可能需要参数(例如,指向目标计算机的关联sysroot)。

在编写Makefile-Only文件的recipe时,请记住以下几点:

  • 您可能需要修补Makefile,以使用变量而不是工具链中的硬编码工具(例如gcc和g ++)。
  • 通过与SDK的环境设置脚本所设置的环境类似的方式,在其中运行Make的环境中设置了各种标准变量以进行编译(例如CC,CXX等)。 一种简单的查看这些变量的方法是在配方上运行devtool build命令,然后查看oe-logs / run.do_compile。 在此文件的顶部,存在正在设置的环境变量的列表。 您可以在Makefile中利用这些变量。
  • 如果Makefile使用“ =”设置变量的默认值,则该默认值将覆盖环境中设置的值,通常这是不希望的。 在这种情况下,您可以修补Makefile,以便使用“?=”运算符设置默认值,也可以在make命令行上强制使用该值。 要在命令行上强制使用该值,请将变量设置添加到recipe中的EXTRA_OEMAKE或PACKAGECONFIG_CONFARGS。 这是使用EXTRA_OEMAKE的示例:
  EXTRA_OEMAKE += "'CC=${CC}' 'CXX=${CXX}'"

在上面的示例中,在变量设置周围使用单引号,因为值很可能包含空格,因为必需的默认选项已传递给编译器。

  • 在交叉编译环境中,Makefiles中的硬编码路径通常是有问题的。这是特别正确的,因为那些硬编码的路径通常指向构建主机上的位置,并且由于它们特定于构建主机而不是目标,因此它们将是只读的或将contamination引入交叉编译中。修补Makefile以使用前缀变量或其他路径变量通常是处理这种情况的方法。
  • 有时,Makefile运行特定于目标的命令,例如ldconfig。 在这种情况下,您可能可以应用从Makefile中删除这些命令的补丁程序。

2.5.5添加本机工具

通常,您需要构建在构建主机(而不是目标)上运行的其他工具。 在运行devtool add时,应使用以下方法之一表明这一要求:

  • 指定recipe名称,以“ -native”结尾。 像这样指定名称将生成仅针对构建主机构建的recipe。
  • 使用devtool add命令指定“ DASHDASHalso-native”选项。 指定此选项将创建仍然为目标构建的recipe文件,但还会创建为构建主机构建的带有“ -native”后缀的变量。
注意如果您需要添加作为源代码树的一部分提供的工具,该工具为目标构建代码,通常可以通过分别构建本机部分和目标部分而不是在同一编译过程中来完成。 通过“ DASHDASHalso-native”选项可以意识到,你可以仅使用一个recipe文件添加该工具。

2.5.6添加Node.js模块

您可以通过两种不同的方式使用devtool add命令添加Node.js模块:
1)通过npm,以及 2)从存储库或本地源。

使用以下形式通过npm添加Node.js模块:

$ devtool add "npm://registry.npmjs.org;name=forever;version=0.15.1"

名称和版本参数是必需的。 recipe会生成并指向锁定和收缩包装文件,以便根据第一次冻结为依赖项获取的版本。 这也将保存在以后的提取中验证的校验和。 这些行为共同确保了构建的可重复性和完整性。

注意
您必须在URL周围使用引号。 devtool add不需要引号,但shell认为“;” 作为多个命令之间的分隔符。 因此,如果没有引号,devtool add将不会收到其他部分,这将导致多个“找不到命令”错误。为了支持添加Node.js模块,nodejs recipe必须是SDK的一部分。

如前所述,您还可以直接从存储库或本地源树中添加Node.js模块。 要以这种方式添加模块,请以以下形式使用devtool add:

devtool add https://github.com/diversario/node-ssdp

在此示例中,devtool获取指定的Git存储库,将代码检测为Node.js代码,使用npm获取依赖项,并相应地设置SRC_URI。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注