如何在 Yocto 中正确构建 mDNS?

How does one get everything right to build mDNS in Yocto?

谁能帮我设置在 Yocto 中构建 mDNS 的方法 and/or 纠正我可能犯的任何其他错误?
我之前成功构建了mD​​NS并在Linaro embedded中得到了运行 Linux.
这是一个非常详细的 post,试图在给予足够的方面犯错误 信息。正如一位回复者在我最近看到的一条论坛消息中所写: "Welcome to Yocto. Here's your bottle of whiskey and Advil..."

在 Linaro 中构建 Linux:我从 Apple 获得了这个 .tar 的 mDNS: 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
Then, still in mDNSResponder-878.200.35/, I did:
make install os="linux" -C "mDNSPosix"

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

对于 Yocto,我想我会将 libdns_sd.so 的副本添加到 /lib/ 文件夹中 我的食谱的目的地,这样我就可以 link 在我 运行 之前给它另一个模块 make install,必须在 target 上完成 运行。但是如果我建造 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/。我将如何正确编写该行以进行复制 它到 ~/Yocto/imx-yocto-bsp/build-wayland/tmp/work/aarch64-poky-linux/?

下的 /lib/

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 ) UPDATED
i.MX L5.4.47_2.2.0 for Linux BSP Documentation. Includes Release Notes, User Guide.
ZIP 11.6 MB 03 Nov 2020 L5.4.47_2.2.0_LINUX_DOCS [ English ]
我正在为 i.MX 8M 纳米评估板执行此操作。
我上面路径中的 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 这么清楚。

所以我之前在 Linux host PC 运行 Ubuntu 18.04.4 上工作过 "Bionic Beaver" 并将生成的图像闪烁到我的 i.MX 8M 纳米板上。
我在 UART 输出中看到的许多行是:
欢迎使用 NXP i.MX Release Distro 5.4-zeus (zeus)!
我遵循了以下非常好的教程,还添加了一个 helloworld 层作为 它显示并让 helloworld 在我的 target board 上工作 .wic 图片来自 host:
https://medium.com/the-innovation/how-to-prepare-a-helloworld-c-recipe-with-yocto-project-1f74c296a777
这是一个很好的教程,一方面,因为它清楚地描述了目录 结构,可以遵循。注意作者的错别字 但是,放入。他 starts 把 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 中创建了以下树(每级缩进一个破折号):

conf
-layer.conf
COPYING.MIT
README
recipes-example
-mdns
--files
---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 然而,这里的信息已有七年历史,背景信息 links 已经腐烂了。
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 = "The mDNS component"
PRIORITY = "optional"
SECTION = "protocols"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://mDNSResponder-878.200.35.tar.gz"
# S = "${WORKDIR}"
# -Shouldn't set S because BitBake expects the source to be in a dir called
# mDNSResponder-878.200.35 in the work dir.
# Don't need a do_compile step since by default BitBake starts the make command
# to compile the application.
# But need additional make options
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

在新的终端中回到这项工作时 window 我总是这样做
~/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
Found lots, including this folder:
./aarch64-poky-linux/mdns/878.200.35-r0/

如地狱世界教程:
步骤 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/, I got imx-image-multimedia-imx8mnddr4evk-20210211215119.rootfs.wic.bz2 With the up-to-date timestamp of 2021/02/11 (Thurs) 21:51:19 (0000 UTC).

将其刷写到我的 i.MX 8M 纳米板上,

-didn't have libdns_sd.so in the /lib/ folder
-didn't have a /mDNSR-878.200.35 folder in root.
-find -iname mdns doesn't find mDNSR-878.200.35; finds a screenful of files.
-the /mDNSR-878.200.35/mDNSPosix/build/prod/ folder with its 8 build artifacts wasn't there.

然而,在 bitbake host 上,发现了 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
total 9452
-rwxr-xr-x 1 159200 Feb 11 16:07 libdns_sd.so
-rwxr-xr-x 1 239856 Feb 11 16:07 libnss_mdns-0.2.so
-rwxr-xr-x 1 1504904 Feb 11 16:07 mDNSClientPosix
-rwxr-xr-x 1 1750944 Feb 11 16:07 mdnsd
-rwxr-xr-x 1 1481136 Feb 11 16:07 mDNSIdentify
-rwxr-xr-x 1 1525392 Feb 11 16:07 mDNSNetMonitor
-rwxr-xr-x 1 1493112 Feb 11 16:07 mDNSProxyResponderPosix
-rwxr-xr-x 1 1511048 Feb 11 16:07 mDNSResponderPosix

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

第二次尝试时,我只将食谱中的 do_install() 更改为:
---------------------------------------------- ------------------------------

do_install() {
install -t ${S} ${D}
install -d ${D}${base_libdir}
install -m 0755 ${S}/mDNSResponder-878.200.35/mDNSPosix/build/prod/libdns_sd.so ${D}${base_libdir}
}

---------------------------------------------- ------------------------------
这是两个变化,首先从 S 复制到 D 以尝试获取 mDNSResponder-878.200.35/ 目录复制到目的地,然后尝试 来自 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 个任务不需要重新运行 都成功了。
它通常会闪烁并擦除一堆 activity,这次它这样做了。它 显示剩余的内容以便能够研究它可能会很好。

它没有更新任何内容:

~/Yocto/imx-yocto-bsp/build-wayland/tmp/deploy/images/imx8mnddr4evk# No longer had 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的do_compile和878.200.25等


中再次有 mDNSResponder-878.200.35 ~/Yocto/imx-yocto-bsp/build-wayland/tmp/work/aarch64-poky-linux/mdns/878.200.35-r0/.
在 host 中的 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() 中,我有:
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/ 用于 link 到下一个模块我必须建立在 host?

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

此致,

稍后:跟进问题: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