如何在 Yocto 中正确构建 mDNS?

问题描述

有人可以帮助我设置在 Yocto 中构建 mDNS 和/或 纠正我可能犯的任何其他错误
我之前成功构建了 mDNS 并在嵌入式 Linaro 中运行 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 mDNSIdentify
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/ dir,而不是 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 (REV L5.4.47_2.2.0) 更新
适用于 Linux BSP 文档的 i.MX L5.4.47_2.2.0。包括发行说明、用户指南。
ZIP 11.6 MB 2020 年 11 月 3 日 L5.4.47_2.2.0_LINUX_DOCS [英文]
我正在为 i.MX 8M nano 评估板做这件事。
我上面路径中的 build-wayland 文件夹是我的 build 文件夹。
我做了以下几行来得到它。
~/Yocto/imx-yocto-bsp$ disTRO=fsl-imx-wayland MACHINE=imx8mnddr4evk 源 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 上进行了这项工作 “仿生海狸”并将生成的图像闪烁到我的 i.MX 8M 纳米板上。
我在 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 create-layer Meta-mdns-so
bitbake-layers add-layer Meta-mdns-so

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

确认
-layer.conf
copYING.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 中为我的 第一次尝试:
-------------------------------------------------- ---------------------
描述 = "mDNS 组件"
PRIORITY = "可选"
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() {
install -d ${D}${base_libdir}
install -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. 将包添加到 conf/local.conf 中的变量 IMAGE_INSTALL 并设置 下一张图片的详细信息
我补充说:
IMAGE_INSTALL_append=" mdns" 行后,'CONF_VERSION' = "1"'。

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

在我的部署文件夹下,在 ~/Yocto/imx-yocto-bsp/build-wayland/tmp/deploy/images/imx8mnddr4evk/,我有 imx-image-multimedia-imx8mnddr4evk-20210211215119.rootfs.wic.bz2 最新时间戳为 2021/02/11(星期四)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 Feb 11 16:07 mDNSResponderPosix

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

第二次尝试时,我只将配方中的 do_install() 更改为:
-------------------------------------------------- ------------------------------
do_install() {
安装 -t ${S} ${D}
install -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/ ~/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?

解决方法

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