我正在尝试为包含Qt5的beaglebone构建一个图像,并为此图像生成SDK。
我的问题是,构建失败了do_populate_sdk
任务创建SDK时出现以下错误:
错误:事务检查错误:文件/opt/poky/2.3.1/sysroots/x86_64-pokysdk-linux/environment-setup.d尝试安装nativesdk-cmake-3.7.2-r0.x86_64_nativesdk和nativesdk-qtbase-之间的冲突工具-5.8.0 + git0 + 49dc9aa409-r0.x86_64_nativesdk
稍微进一步向上流我遇到以下错误消息:
错误:无法调用dnf。命令'/home/ubuntu/workspace/bbb/build-toaster-2/tmp/work/my_machine-poky-linux-gnueabi/my-image-dev/1.0-r0/recipe-sysroot-native/usr/bin/dnf [...]'返回1: 从文件中添加了oe-repo repo:///home/ubuntu/workspace/bbb/build-toaster-2/tmp/work/my-machine-poky-linux-gnueabi/my-image-dev/1.0-r0/oe -rootfs回购。 上次元数据到期检查:0:00:00前在8月16日星期三11:47:27 UTC UTC。 依赖性得到解决。
为了配置我的图像,我遵循了建议here以及在网络上其他地方说明相同的帖子。这是我的(缩短并略微编辑)图像bb文件:
SUMMARY = "..."
LICENSE = "MIT"
IMAGE_LINGUAS = "en-us"
inherit core-image
# for populate_sdk to create a valid toolchain
inherit populate_sdk populate_sdk_qt5
CORE_OS = "..."
KERNEL_EXTRA_INSTALL = "..."
WIFI_SUPPORT = "..."
DEV_SDK_INSTALL = " \
binutils \
binutils-symlinks \
coreutils \
cpp \
cpp-symlinks \
diffutils \
file \
g++ \
g++-symlinks \
gdb \
gdbserver \
gcc \
gcc-symlinks \
gettext \
git \
ldd \
libstdc++ \
libstdc++-dev \
libtool \
make \
perl-modules \
pkgconfig \
python-modules \
python3-modules \
"
DEV_EXTRAS = "..."
EXTRA_TOOLS_INSTALL = " \
acpid \
bc \
bzip2 \
cursor-blink \
devmem2 \
dosfstools \
emmc-installer \
ethtool \
findutils \
i2c-tools \
iperf3 \
htop \
less \
memtester \
nano \
netcat \
procps \
rsync \
sysfsutils \
tcpdump \
unzip \
util-linux \
util-linux-blkid \
wget \
zip \
"
MQTT = "..."
ROOTFS_POSTPROCESS_COMMAND += "..."
QT_TOOLS = " \
qtbase \
qtbase-dev \
qtbase-mkspecs \
qtbase-plugins \
qtbase-tools \
qtserialport-dev \
qtserialport-mkspecs \
qt5-env \
"
QT5_PKGS = " \
qt3d \
qt3d-dev \
...
qtxmlpatterns \
qtxmlpatterns-dev \
qtxmlpatterns-mkspecs \
"
FONTS = "..."
TSLIB = "... "
ADDITIONAL_PKGS = "..."
QT_TEST_APPS = "..."
IMAGE_INSTALL += " \
${CORE_OS} \
${DEV_SDK_INSTALL} \
${DEV_EXTRAS} \
${EXTRA_TOOLS_INSTALL} \
${KERNEL_EXTRA_INSTALL} \
${FONTS} \
${QT_TOOLS} \
${QT5_PKGS} \
${QT_TEST_APPS} \
${MQTT} \
${WIFI_SUPPORT} \
${TSLIB} \
${ADDITIONAL_PKGS} \
"
IMAGE_FEATURES_append = " dev-pkgs"
export IMAGE_BASENAME = "my-image-dev"
我还在我的DISTRO_FEATURES_remove = "busybox x11 wayland"
中设置了DISTRO_FEATURES_append = " systemd opengl aufs"
以及local.conf
。
如果我删除inherit populate_sdk_qt5
行,构建运行正常,但在这种情况下我当然不会为我的SDK获取make。
我发现不同的人有同样的问题(例如here),但没有人得到答案。
我检查了nativesdk-cmake以及nativesdk-qtbase_git配方(两个都没有更改的标准)来查看文件的创建位置,并且看起来对我来说都没有问题:
natives-企图把色_git.宝宝:
fakeroot do_generate_qt_environment_file() {
mkdir -p ${D}${SDKPATHNATIVE}/environment-setup.d/
script=${D}${SDKPATHNATIVE}/environment-setup.d/qt5.sh
echo 'export PATH=${OE_QMAKE_PATH_HOST_BINS}:$PATH' > $script
echo 'export OE_QMAKE_CFLAGS="$CFLAGS"' >> $script
echo 'export OE_QMAKE_CXXFLAGS="$CXXFLAGS"' >> $script
echo 'export OE_QMAKE_LDFLAGS="$LDFLAGS"' >> $script
echo 'export OE_QMAKE_CC=$CC' >> $script
echo 'export OE_QMAKE_CXX=$CXX' >> $script
echo 'export OE_QMAKE_LINK=$CXX' >> $script
echo 'export OE_QMAKE_AR=$AR' >> $script
echo 'export QT_CONF_PATH=${OE_QMAKE_PATH_HOST_BINS}/qt.conf' >> $script
echo 'export OE_QMAKE_LIBDIR_QT=`qmake -query QT_INSTALL_LIBS`' >> $script
echo 'export OE_QMAKE_INCDIR_QT=`qmake -query QT_INSTALL_HEADERS`' >> $script
echo 'export OE_QMAKE_MOC=${OE_QMAKE_PATH_HOST_BINS}/moc' >> $script
echo 'export OE_QMAKE_UIC=${OE_QMAKE_PATH_HOST_BINS}/uic' >> $script
echo 'export OE_QMAKE_RCC=${OE_QMAKE_PATH_HOST_BINS}/rcc' >> $script
echo 'export OE_QMAKE_QDBUSCPP2XML=${OE_QMAKE_PATH_HOST_BINS}/qdbuscpp2xml' >> $script
echo 'export OE_QMAKE_QDBUSXML2CPP=${OE_QMAKE_PATH_HOST_BINS}/qdbusxml2cpp' >> $script
echo 'export OE_QMAKE_QT_CONFIG=`qmake -query QT_INSTALL_LIBS`${QT_DIR_NAME}/mkspecs/qconfig.pri' >> $script
echo 'export OE_QMAKE_PATH_HOST_BINS=${OE_QMAKE_PATH_HOST_BINS}' >> $script
echo 'export QMAKESPEC=`qmake -query QT_INSTALL_LIBS`${QT_DIR_NAME}/mkspecs/linux-oe-g++' >> $script
# Use relocable sysroot
sed -i -e 's:${SDKPATHNATIVE}:$OECORE_NATIVE_SYSROOT:g' $script
}
查马克-3.7.2.宝宝:
do_install_append_class-nativesdk() {
mkdir -p ${D}${datadir}/cmake
install -m 644 ${WORKDIR}/OEToolchainConfig.cmake ${D}${datadir}/cmake/
mkdir -p ${D}${SDKPATHNATIVE}/environment-setup.d
install -m 644 ${WORKDIR}/environment.d-cmake.sh ${D}${SDKPATHNATIVE}/environment-setup.d/cmake.sh
}
environment.的-查马克.是:
alias cmake="cmake -DCMAKE_TOOLCHAIN_FILE=$OECORE_NATIVE_SYSROOT/usr/share/cmake/OEToolchainConfig.cmake"
为了尝试,我继续执行了
/home/ubuntu/workspace/bbb/build-toaster-2/tmp/work/my_machine-poky-linux-gnueabi/my-image-dev/1.0-r0/recipe-sysroot-native/usr/bin/dnf
来自的脚本
/home/ubuntu/workspace/bbb/build-toaster-2/tmp/work/my_machine-poky-linux-gnueabi/my-image-dev/1.0-r0/recipe-sysroot-native
它给我带来以下错误信息:
Traceback (most recent call last):
File "/home/ubuntu/workspace/bbb/build-toaster-2/tmp/work/my-machine-poky-linux-gnueabi/my-image-dev/1.0-r0/recipe-sysroot-native/usr/bin/dnf.real", line 57, in <module>
from dnf.cli import main
ImportError: No module named 'dnf'
dnf模块似乎存在:
<path as above>/recipe-sysroot-native$ find -name dnf
./usr/lib/python3.5/site-packages/dnf
./usr/bin/dnf
./etc/dnf
./etc/bash_completion.d/dnf
./etc/logrotate.d/dnf
你能看到我做错的事吗?我绝对无能为力......
我正在使用cmake和Qt5构建SDK而没有任何问题......
你的问题似乎源于dnf
,而且由于我正在使用ipk
而没有任何问题,因此在OpenEmbedded中处理rpm
时可能存在一个错误。
您可以尝试重建:
PACKAGE_CLASSES = "package_ipk"
在你的local.conf
,看到它有帮助吗?
编辑:Anders'answer通过切换包装类提供更优雅的解决方案。如果可以,请在尝试此解决方法之前查看他的方法。
我找到了一个对我有用的解决方法,但不是理想的解决方案。无论如何,我发布它,以防它帮助某人:
我想通了,nativesdk-cmake
包与Qt一起碰撞了。因此,我在自定义图层中创建了一个nativesdk-packagegroup-sdk-host.bbappend
文件,其中包含以下内容:
RDEPENDS_${PN}_remove = "\
nativesdk-cmake \
"
这将从SDK构建中删除cmake依赖项,这适用于我的目的。但这仅仅解决了症状而不是问题。所以我很高兴任何其他解决方案。
只需尝试在nativesdk-qtbase.bb中添加DIRFILES =“”(您应该在自定义图层中使用DIRFILES =“”设置干净整洁的nativesdk-qtbase.bbappend)。这可以解决由于此RPM的RPM目录所有权而产生的冲突,这是标准RPM打包中的默认策略。有关详细信息,请参阅package_rpm.bbclass @ python write_specfile(){.... walk_files方法。注意:必须定义DIRFILES,但必须为空,才能在当前包上使用。瞧。
干杯。
正如so61pi所提到的,RPM严格检查文件/目录。在我的例子中,在安装nativesdk-qtbase之后,environment.d文件夹具有权限775,而nativesk-cmake使用755创建了相同的文件夹。
我不知道这是否是由于函数generate_qt_environment_file
在fakeroot环境中执行的事实引起的,但我通过将其函数体添加到do_install
函数并删除generate_qt_environment_file
来修复它。
不确定这是否是正确的解决方案。我注意到其他一些食谱使用fakeroot关键字而其他食谱则没有。我想知道为什么...
RPM严格检查文件/目录。您的问题中的environment-setup.d
目录可能在两个包之间有不同的模式或用户。
您可以检查函数rpmfilesCompare以获取RPM执行的确切检查。