【问题标题】:create symbolic link in bitbake recipe在 bitbake 配方中创建符号链接
【发布时间】:2018-01-09 11:50:23
【问题描述】:

我有一个 .bbappend 配方,我需要在我的系统中创建一个符号链接。

这就是现在的样子:

bernardo@bernardo-ThinkCentre-Edge72:~/yocto/genericx86-64-rocko-18.0.0/meta-datavision/recipes-devtools/oracle-java$ cat oracle-jse-jdk_1.7.0.bbappend 
FILES_${PN} += "/lib64/ld-linux-x86-64.so.2"

do_install_append() {
    install -d ${D}/lib64
    ln -s ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2 
}

但是,在 sysroot 中仅创建目录 /lib64。没有生成符号链接 /lib64/ld-linux-x86-64.so.2。

为了正确创建此符号链接,我应该在我的配方中进行哪些更改?

【问题讨论】:

    标签: symlink yocto bitbake


    【解决方案1】:

    最干净的解决方案是使用“-r”标志:

    do_install_append() { 安装 -d ${D}/lib64 ln -s -r ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2 }

    来自 gnu ln 手册页:

    -r, --relative 创建相对于链接位置的符号链接

    【讨论】:

      【解决方案2】:

      尽量避免使用绝对路径:

      do_install_append() {
          install -d ${D}/lib64
          cd ${D}/lib64
          ln -s ../lib/ld-2.26.so ld-linux-x86-64.so.2 
      }
      

      【讨论】:

      • 就像一个魅力!非常感谢!!!!!!你介意再解释一下为什么在创建符号链接之前我需要 cd 吗?再次感谢!
      • 首先,D 变量包含一个到你的部署目录的绝对路径,所以在你的目标系统上它会指向类似/path/to/yocto/dir/build/tmp/work/.../lib64/... 的东西,这显然是一个无效的位置。此外,通常为符号链接指定相对路径,这有助于以二进制格式共享库。
      • 关于你的情况,我不太确定你为什么没有看到结果包中的链接(你没有看到它,或者它是构建过程中的错误?),但是作为我在上面提到过在ln 中指定绝对路径并不常见。我什至不确定使用绝对路径作为ln 的链接名称是否有效。
      • 我遇到了和 OP 类似的问题,没有安装链接文件。我已尝试按照此答案中的建议创建链接。但仍然没有安装链接文件。以某种方式创建链接如何导致文件被安装?我看不出这个答案如何解决 OP 的问题。绝对路径有什么问题?不像这些文件会被移动。
      【解决方案3】:

      从 Yocto 2.3 开始,推荐使用lnr

      例如

      do_install_append() {
          install -d ${D}/lib64
          lnr ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2 
      }
      

      或者,您也可以inherit relative_symlinks 将任何绝对符号链接转换为相对符号链接,但这比lnr 不常用。

      参照。 https://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html#migration-2.3-absolute-symlinks

      【讨论】:

        【解决方案4】:

        我查看了其他食谱如何在 rootfs 中创建链接,并且大多数似乎都是这样做的:

        ln -sf /data/etc/bluetooth/main.conf ${D}/${sysconfdir}/bluetooth/main.conf
        

        配方中的此命令将在设备上创建以下链接:

        /# ls -al /etc/bluetooth/main.conf
        lrwxrwxrwx 1 root root 29 Sep 11 15:34 /etc/bluetooth/main.conf -> /data/etc/bluetooth/main.conf
        

        您在创建链接时使用了由 Yocto 生成的完整路径,但您使其指向 rootfs 中的“最终”位置。

        这样您就可以使用“绝对”路径,而不必更改配方中的工作目录。

        【讨论】:

          【解决方案5】:

          你可以这样做:

          ln -s ../lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2
          

          或者如果您在目标系统启动之前不需要符号链接(即它不是您正在构建的其他软件包的依赖项),您也可以这样做:

          ln -s /lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2
          

          ln 不关心创建符号链接时您的目标是否有效或存在。在您启动目标系统(或以某种方式将此文件系统挂载到 /)后,它将生效。但确实,推荐使用相对链接。

          【讨论】:

            【解决方案6】:
            do_install_append () {
            install -d 0755 ${D}/dir
            install -d 0755 ${D}/dir/subdir
            cd ${D}/dir/subdir
            ln -sf /source_so_the_symbilic_link <name_of_the_symbolic_link>
            

            } FILES_${PN} += "/dir"

            【讨论】:

              【解决方案7】:

              截至 2022 年 1 月 19 日,这似乎是让它工作的唯一方法(适应所需的文件名):

              do_install() {
                  install -d ${D}${libdir}
                  install -m 0644 ${S}/libmine.so.0 ${D}${libdir}/
                  lnr ${D}${libdir}/libmine.so.0 ${D}${libdir}/libmine.so
              }
              
              FILES_${PN} += " \
                  ${libdir}/libmine.so.0 \
                  ${libdir}/libmine.so \
              "
              
              FILES_SOLIBSDEV = ""
              INSANE_SKIP_${PN} += "dev-so"
              

              【讨论】:

                猜你喜欢
                • 2018-09-06
                • 1970-01-01
                • 2019-12-07
                • 1970-01-01
                • 1970-01-01
                • 2017-06-10
                • 1970-01-01
                • 1970-01-01
                • 2016-03-19
                相关资源
                最近更新 更多