本机包拒绝将库放在 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 中的前缀。
我有一个必须为主机和目标构建的包 (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 中的前缀。