【问题标题】:native package refuses to place libraries in the sysroot folder本机包拒绝将库放在 sysroot 文件夹中
【发布时间】:2016-04-21 08:47:17
【问题描述】:

我有一个必须为主机和目标构建的包 (openssl)。它创建了一些 .so.a 库,其他一些包分别在运行时和编译时需要这些库。

当我为目标编译这个包时,一切正常,每个文件最终都在我告诉它去的地方,但是当我为主机(${PN}-native 目标)编译时,它只是没有将库放入主机 sysroot 目录 (./build/tmp/sysroot/x86_64-linux)。

这是食谱:

SUMMARY = "Secure Socket Layer"
SECTION = "libs/network"
LICENSE = "openssl"
LIC_FILES_CHKSUM = "file://LICENSE;md5=4004583eb8fb7f89"

branch = "yocto"
SRC_URI = "git://www.myserver.com/openssl.git;protocol=ssh;branch=${branch}"
SRCREV = "${AUTOREV}"
S = "${WORKDIR}/git"

BBCLASSEXTEND += "native nativesdk"

# This is because I am porting this package from other project and I can't modify it.
FILES_${PN} += "${libdir}/libssl.so ${base_libdir}/libcrypto.so"
FILES_SOLIBSDEV = ""

do_compile() {
    ${MAKE}
}

do_install() {
    DESTDIR=${D} ${MAKE} install
}

谁能告诉我我做错了什么?提前致谢

【问题讨论】:

  • 是否有理由不在 OE-Core 中使用 openssl 配方?
  • 是的,我正在将我的项目从其他(非常老旧的)构建工具移植。他们要求我坚持旧版本中使用的软件包和构建程序。之后,我们将开始修改和替换包。这就是我发送.so 文件的原因。
  • 你在哪里告诉构建工具在哪里安装二进制文件?看起来它假设 prefix=/usr 并且你没有告诉它,这是本机构建所必需的,因为 $prefix 是本机构建的重定位方式。

标签: yocto bitbake openembedded


【解决方案1】:

首先,您为什么要编写自己的 openssl 配方而不是使用 oe-core 中的配方?

无论如何,问题是你从来没有告诉配方使用什么前缀。在本机构建中,前缀是将包正确重定位到本机 sysroot 中的原因。

【讨论】:

    【解决方案2】:

    好的,我知道问题出在哪里了:

    似乎对于本机配方,您必须使用映像文件夹中主机 sysroot 的完整路径来安装它。这意味着在为目标编译时,图像文件夹如下所示:

    $ tree -d
    /openssl/1.0.0-r0/image
    ├── lib
    └── usr
        ├── include
        │   └── openssl
        └── lib
    

    但是对于主机来说,在我的情况下是这样的:

    $ tree -d
    openssl-native/1.0.0-r0/image
    └── home
        └── xnor
            └── yocto
                └── build
                    └── tmp
                        └── sysroots
                            └── x86_64-linux
                                ├── lib
                                └── usr
                                    ├── include
                                    │   └── openssl
                                    └── lib
    

    编辑 正确的解决方案是修改Makefile 以从环境中获取${prefix}${bindir}${libdir} 等,而不是在Makefile 中硬编码这些路径。就我而言,由于项目要求,这是不可能的,所以我必须这样做:

    SUMMARY = "Secure Socket Layer"
    SECTION = "libs/network"
    LICENSE = "openssl"
    LIC_FILES_CHKSUM = "file://LICENSE;md5=4004583eb8fb7f89"
    
    branch = "yocto"
    SRC_URI = "git://www.myserver.com/openssl.git;protocol=ssh;branch=${branch}"
    SRCREV = "${AUTOREV}"
    S = "${WORKDIR}/git"
    
    BBCLASSEXTEND += "native nativesdk"
    
    # This is because I am porting this package from other project and I can't modify it.
    FILES_${PN} += "${libdir}/libssl.so ${base_libdir}/libcrypto.so"
    FILES_SOLIBSDEV = ""
    
    do_compile() {
        ${MAKE}
    }
    
    do_install() {
        # The change is here!
        DESTDIR=${D}${base_prefix} ${MAKE} install
    }
    

    您可以想象,${base_prefix} 扩展为主机(openssl-native)配方的"/home/xnor/yocto/build/tmp/sysroots/x86_64-linux/" 和目标(openssl)的""

    【讨论】:

    • 不,因为原生 $D 是适当调整的,所以这是不正确的。
    • 我认为你错了,如果你看一下manual,它明确指出${D}指向${WORKDIR}/image
    • 没错。 ${D} 会根据需要进行调整,因此使用 DESTDIR 的标准 makefile 仍然需要 DESTDIR=${D},因为构建应该尊重 ${prefix}。问题是你的食谱在任何地方都不尊重 ${prefix}。
    • @RossBurton 我知道,问题是我无法修改makefile。他们对prefix = /usr 进行了硬编码,这就是它不起作用的原因。我知道我的解决方案是一个 hack,但我不知道我现在还能做什么!
    • 你可以用补丁修改makefile。只需分配一个变量并在调用 make 时覆盖它。
    猜你喜欢
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2012-02-06
    • 2015-01-14
    • 2011-05-11
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多