我有一个必须为主机和目标构建的包(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
}
有谁能让我知道我做错了什么?提前致谢
答案 0 :(得分:1)
首先,为什么要编写自己的openssl配方而不是使用oe-core中的配方?
无论如何,问题在于你没有告诉食谱使用什么前缀。在本机构建中,前缀是将包正确地重定位到本机sysroot中。
答案 1 :(得分:-1)
好的,我知道问题所在:
对于本机配方,您必须使用映像文件夹中主机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)的""
。