本机包拒绝将库放在 sysroot 文件夹中

native package refuses to place libraries in the sysroot folder

我有一个必须为主机和目标构建的包 (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
}

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

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

似乎对于本机食谱,您必须使用图像文件夹中主机 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)的 ""

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

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