如何在 Yocto 中正确构建 mDNS?

Posted

技术标签:

【中文标题】如何在 Yocto 中正确构建 mDNS?【英文标题】:How does one get everything right to build mDNS in Yocto? 【发布时间】:2021-05-21 21:28:39 【问题描述】:

有人可以帮我设置在 Yocto 中构建 mDNS 和/或 纠正我可能犯的任何其他错误? 我之前成功构建了 mDNS 并让它在 Linaro Embedded 中运行 Linux。 这是一个非常详细的帖子,试图在给予足够的方面犯错 信息。正如一位响应者在我最近看到的一条论坛消息中所写: “欢迎来到 Yocto。这是你的威士忌和 Advil……”

在 Linaro Linux 中构建:我从 Apple 获得了 mDNS 的 .tar 文件: https://opensource.apple.com/tarballs/mDNSResponder/mDNSResponder-878.200.35.tar.gz 紧随其后:https://github.com/balaji-reddy/mDNSResponder . 我为我的 mDNS 内容创建了一个基本文件夹 /mDNS/ 并在那里提取了 .tar, 创建一个 mDNSResponder-878.200.35/ 文件夹。我做了 cd 进去。 它使用以下命令在 Linaro 中为我轻松构建:make os="linux" -C "mDNSPosix"

我在 /mDNS/mDNSR-878.200.35/mDNSPosix/build/prod/ 中有 8 个文件: 40,592 libdns_sd.so 55,960 libnss_mdns-0.2.so 370,288 mDNSClientPosix 448,608 mdnsd 374,616 mDNS 识别 387,904 mDNSNetMonitor 373,960 mDNSProxyResponderPosix 379,768 mDNSResponderPosix 然后,仍然在 mDNSResponder-878.200.35/ 中,我做了: make install os="linux" -C "mDNSPosix"

除其他外,此安装启动了一个恶魔运行。它还复制 libdns_sd.so 和 libnss_mdns-0.2.so 到 /lib/,它应该在路径中。 这些行包含在安装输出中: -------------------------------------------------- ------------** 启动 Apple Darwin 多播 DNS / DNS 服务发现守护进程:mdnsd。 /usr/sbin/mdnsd 已安装 -------------------------------------------------- ------------**

对于 Yocto,我想我会将 libdns_sd.so 的副本添加到 /lib/ 文件夹中 我的食谱的目的地,所以我可以在运行之前将另一个模块链接到它 make install,必须在目标上运行。但是如果我建立 Yocto 中的其他模块,我想我应该将其复制到 /lib/ 下 tmp/work/ 目录,而不是 D,目的地。我的 do_install 行: 安装 -m 0755 $S/mDNSResponder-878.200.35/mDNSPosix/build/prod/libdns_sd.so $D$base_libdir 用于将其复制到 D 中的 /lib/ 中。我将如何正确编写该行以进行复制 它到 /lib/ 下 ~/Yocto/imx-yocto-bsp/build-wayland/tmp/work/aarch64-poky-linux/?

Yocto 低级文件夹不是很重要;我只是觉得我想要一个 我的主目录下的 Yocto 文件夹来保存我的 Yocto 东西。我创建了 imx-yocto-bsp 遵循 i.MX_Yocto_Project_User's_Guide.pdf。

首先,我遵循了 i.MX_Yocto_Project_User's_Guide.pdf,“IMXLXYOCTOUG” 从 imx-yocto-L5.4.47_2.2.0 下载,获取我的基本系统,其中 工作。我是从:www.nxp.com/imx8mnanoevk -> https://www.nxp.com/design/development-boards/i-mx-evaluation-and-development-boards/evaluation-kit-for-the-i-mx-8m-nano-applications-processor:8MNANOD4-EVK 并下载并解压下面三行中描述的这个 .zip: L5.4.47_2.2.0_LINUX_DOCS(修订版 L5.4.47_2.2.0)已更新 i.MX L5.4.47_2.2.0 用于 Linux BSP 文档。包括发行说明、用户指南。 ZIP 11.6 MB 2020 年 11 月 3 日 L5.4.47_2.2.0_LINUX_DOCS [ 英语 ] 我正在为 i.MX 8M nano 评估板执行此操作。 我上面路径中的 build-wayland 文件夹是我的构建文件夹。 我已经完成了以下操作。 ~/Yocto/imx-yocto-bsp$ DISTRO=fsl-imx-wayland MACHINE=imx8mnddr4evk source imx-setup-release.sh -b build-wayland 结果之一是最终将目录更改为 build-wayland 文件夹。事实证明,留在那个文件夹中是正确的做法 i.MX_Yocto_Project_User's_Guide.pdf 中的后续步骤,例如我的 我做的“bitbake imx-image-multimedia”命令;我不相信.pdf制作 很清楚。

所以我之前在运行 Ubuntu 18.04.4 的 Linux 主机 PC 上运行了这个 “Bionic Beaver”并将生成的图像闪到我的 i.MX 8M nano 板上。 我在 UART 输出中看到的其中一行是: 欢迎使用 NXP i.MX Release Distro 5.4-zeus (zeus)! 我遵循了以下非常好的教程,还添加了一个 helloworld 层作为 在闪烁构建后,它显示并让 helloworld 在我的目标板上工作 来自主机的 .wic 图片:https://medium.com/the-innovation/how-to-prepare-a-helloworld-c-recipe-with-yocto-project-1f74c296a777 这是一个很好的教程,一方面,因为它清楚地描述了目录 结构和可以遵循。小心作者的错别字 但是,放入。他开始将 helloworld.c 拼写为 hello-world.c 在他的 步骤 5 和 6 然后在他的步骤 7 中切换到 helloworld.c。你必须赶上 并在您注意到切换时修复您工作中的拼写。

我使用他 George Calin 展示的结构来制作我的 mdns 层。

在我的构建文件夹 build-wayland 中,我创建了 meta-mdns-so 旁边的 我按照教程创建的 meta-helloworld-app 文件夹。我用了 与教程中给出的类似步骤,包括 bitbake-layers 创建层 meta-mdns-so bitbake-layers 添加层 meta-mdns-so

这让我以类似的方式完成了教程中的第 4 步。 这在 meta-mdns-so 中创建了以下树(每级缩进一个破折号):

配置 -layer.conf 复制.MIT 自述文件 食谱示例 -mdns --文件 ---mDNSResponder-878.200.35.tar.gz --mDNSResponder_878.200.35.bb

请注意,后跟更多缩进的项目是目录。

将 mDNSResponder-878.200.35.tar.gz 放在我从中找到的文件下 https://wiki.yoctoproject.org/wiki/Building_your_own_recipes_from_first_principles 但是这里的信息大约有七年的历史和背景信息链接 已经烂了。 Yocto Mega 手册中的更多信息位于 https://www.yoctoproject.org/docs/3.0/mega-manual/mega-manual.html . 参见“7.3.21.3. 基于 Makefile 的包”

这是我想出的 mDNSResponder_878.200.35.bb 中的配方 第一次尝试: -------------------------------------------------- -------------------- DESCRIPTION = "mDNS 组件" 优先级 = “可选” SECTION = "协议" 许可证 =“麻省理工学院” LIC_FILES_CHKSUM = "file://$COMMON_LICENSE_DIR/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" SRC_URI = "file://mDNSResponder-878.200.35.tar.gz" # S = "$WORKDIR" # - 不应设置 S,因为 BitBake 期望源位于名为的目录中 # mDNSResponder-878.200.35 在工作目录中。 # 不需要 do_compile 步骤,因为默认情况下 BitBake 会启动 make 命令 # 编译应用程序。 # 但需要额外的 make 选项 EXTRA_OEMAKE = "'os="linux"' '-C "mDNSPosix"'" do_install() 安装 -d $D$base_libdir 安装 -m 0755 $WORKDIR/mDNSResponder-878.200.35/mDNSPosix/build/prod/libdns_sd.so $D$base_libdir -------------------------------------------------- --------------------** 我在 ~/Yocto/imx-yocto-bsp/build-wayland$ 中做了 bitbake mdns。

当我在新的终端窗口中回到这项工作时,我总是这样做 ~/Yocto/imx-yocto-bsp$ source setup-environment build-wayland 它把我放在我的 build-wayland 文件夹中:~/Yocto/imx-yocto-bsp/build-wayland$

bitbake 似乎可以很好地编译,我得到了以下内容: ~/Yocto/imx-yocto-bsp/build-wayland/tmp/work# find -iname mdns 找到很多,包括这个文件夹: ./aarch64-poky-linux/mdns/878.200.35-r0/

就像在 helloworld 教程中一样: 步骤 10. 将包添加到变量 IMAGE_INSTALL 中的 conf/local.conf 并设置 下一张图片的详细信息 我补充说: IMAGE_INSTALL_append=" mdns" 行后,'CONF_VERSION' = "1"'。

我从我的构建目录进行了 bitbake:bitbake imx-image-multimedia

在我的部署文件夹下,在 ~/Yocto/imx-yocto-bsp/build-wayland/tmp/deploy/images/imx8mnddr4evk/,我得到了 imx-图像-多媒体-imx8mnddr4evk-20210211215119.rootfs.wic.bz2 最新时间戳为 2021/02/11 (Thurs) 21:51:19 (0000 UTC)。

将它刷到我的 i.MX 8M nano 板上,它 - /lib/ 文件夹中没有 libdns_sd.so - 根目录中没有 /mDNSR-878.200.35 文件夹。 -find -iname mdns 没有找到 mDNSR-878.200.35;找到一屏文件。 - /mDNSR-878.200.35/mDNSPosix/build/prod/ 文件夹及其 8 个构建工件 不在那里。

但是,在 bitbake 主机上,发现了 8 个构建工件: ~/Yocto/imx-yocto-bsp/build-wayland/tmp/work/aarch64-poky-linux/mdns/878.200.35-r0/mDNSResponder-878.200.35/mDNSPosix/build/prod# ls -l 总计 9452 -rwxr-xr-x 1 159200 2 月 11 日 16:07 libdns_sd.so -rwxr-xr-x 1 239856 2 月 11 日 16:07 libnss_mdns-0.2.so -rwxr-xr-x 1 1504904 2 月 11 日 16:07 mDNSClientPosix -rwxr-xr-x 1 1750944 2 月 11 日 16:07 mdnsd -rwxr-xr-x 1 1481136 2 月 11 日 16:07 mDNSIdentify -rwxr-xr-x 1 1525392 2 月 11 日 16:07 mDNSNetMonitor -rwxr-xr-x 1 1493112 2 月 11 日 16:07 mDNSProxyResponderPosix -rwxr-xr-x 1 1511048 2 月 11 日 16:07 mDNSResponderPosix

我的结论是编译部分没问题,但我的 do_install 命令是错误的。 有人可以帮我改正我的食谱吗?

对于我的第二次尝试,我只将配方中的 do_install() 更改为: -------------------------------------------------- ------------------------------ do_install() 安装 -t $S $D 安装 -d $D$base_libdir 安装 -m 0755 $S/mDNSResponder-878.200.35/mDNSPosix/build/prod/libdns_sd.so $D$base_libdir -------------------------------------------------- ------------------------------ 这是两个更改,首先从 S 复制到 D 以尝试获取 mDNSResponder-878.200.35/ dir 复制到目的地,然后尝试 来自 S 而不是 WORKDIR 的“install -m”命令。

重试bitbake:bitbake imx-image-multimedia,最后指出 所有 6968 个任务都不需要重新运行。

我试过了:~/Yocto/imx-yocto-bsp/build-wayland$ bitbake -c clean mdns -- 得到了: 注意:任务摘要:尝试了 1 个任务,其中 0 个不需要重新运行,并且 都成功了。

~/Yocto/imx-yocto-bsp/build-wayland$ bitbake imx-image-multimedia -- 得到: 注意:任务摘要:尝试了 6968 个任务,其中 6967 个不需要重新运行 一切都成功了。 它通常会闪烁并擦除一堆活动,这一次是这样做的。它 将剩余部分显示出来以便能够研究它可能会很好。

它没有更新任何内容: ~/Yocto/imx-yocto-bsp/build-wayland/tmp/deploy/images/imx8mnddr4evk# 不再有 mDNSResponder-878.200.35/ in ~/Yocto/imx-yocto-bsp/build-wayland/tmp/work/aarch64-poky-linux/mdns/878.200.35-r0/.

我试过了:bitbake -c cleansstate mdns -- 得到: 注意:任务摘要:尝试了 2 个任务,其中 0 不需要重新运行,并且 都成功了。

做了:~/Yocto/imx-yocto-bsp/build-wayland$ bitbake imx-image-multimedia - 得到典型的 bitbake 输出,然后: 状态摘要:通缉 6 找到 0 错过 6 当前 2580(0% 匹配,99% 完成) 注意:任务摘要:尝试了 6968 个任务,其中 6954 个不需要重新运行 一切都成功了。 这次看到了 mdns 和 878.200.25 等的 do_compile。

再次在中拥有 mDNSResponder-878.200.35 ~/Yocto/imx-yocto-bsp/build-wayland/tmp/work/aarch64-poky-linux/mdns/878.200.35-r0/. 在主机中的 mDNSPosix 中拥有构建工件: ~/Yocto/imx-yocto-bsp/build-wayland/tmp/work/aarch64-poky-linux/mdns/878.200.35-r0/mDNSResponder-878.200.35/mDNSPosix/build/prod/ 自 2 月 11 日星期四以来仍然没有更新的图像 ~/Yocto/imx-yocto-bsp/build-wayland/tmp/deploy/images/imx8mnddr4evk/ .

有人可以纠正我的食谱和我可能犯的任何其他错误吗?是我的吗 do_install()?

在我的 do_install() 中,我有: 安装 -m 0755 $S/mDNSResponder-878.200.35/mDNSPosix/build/prod/libdns_sd.so $D$base_libdir 用于将其复制到 D 中的 /lib/。我将如何正确地将该行写入 复制到/lib/下 ~/Yocto/imx-yocto-bsp/build-wayland/tmp/work/aarch64-poky-linux/ 用于链接 到我必须在主机上构建的下一个模块?

与此同时,我会尝试删除我的 imx-image-multimedia-imx8mnddr4evk-20210211215119.rootfs.wic.bz2 并重做 位烘烤。 ...删除 imx-image-multimedia-imx8mnddr4evk-20210211215119.rootfs .tar.bz2 和 .wic.bz2 没有帮助;即使在我重新进行了上述清理和 bitbake 之后,它们也没有被重新创建。

最好的问候,

稍后:后续问题:Where can I obtain the mdns.service file needed for building mDNS in Yocto?

【问题讨论】:

【参考方案1】:

已经有 mDNS 版本 878.200.35 的配方: https://git.openembedded.org/meta-openembedded/tree/meta-networking/recipes-protocols/mdns/mdns_878.200.35.bb?h=zeus

【讨论】:

以上是关于如何在 Yocto 中正确构建 mDNS?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Yocto 中更改 u-boot 的配置

如何在 yocto 中编译 linux-raspberrypi 内核?

如何在自己的 Yocto 包中访问 protoc 编译器并引用 gRPC 库

如何在Yocto Linux中禁用虚拟终端

Gif 动画不适用于 Qt 5.8 中的 Yocto Pyro。如何使用 libqgif.so 在 bitbake 中构建 qtbase 5.8?

如何管理yocto项目的meta层并在git中构建配置