Yocto 在SDK构建期间:environment-setup.d/尝试的安装之间发生冲突

Yocto 在SDK构建期间:environment-setup.d/尝试的安装之间发生冲突,yocto,bitbake,Yocto,Bitbake,我正在尝试为beaglebone构建一个包含Qt5的映像,并为该映像生成SDK 问题 我的问题是,生成未能通过do\u populate\u sdk任务创建sdk,出现以下错误: 错误:事务检查错误: 文件/opt/poky/2.3.1/sysroot/x86_64-pokysdk-linux/environment setup.d尝试安装nativesdk-cmake-3.7.2-r0.x86_64_nativesdk和nativesdk-qtbase-tools-5.8.0+git0+49d

我正在尝试为beaglebone构建一个包含Qt5的映像,并为该映像生成SDK

问题 我的问题是,生成未能通过
do\u populate\u sdk
任务创建sdk,出现以下错误:

错误:事务检查错误: 文件/opt/poky/2.3.1/sysroot/x86_64-pokysdk-linux/environment setup.d尝试安装nativesdk-cmake-3.7.2-r0.x86_64_nativesdk和nativesdk-qtbase-tools-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:
增加了来自file:///home/ubuntu/workspace/bbb/build-toaster-2/tmp/work/my-machine-poky-linux-gnueabi/my-image-dev/1.0-r0/oe-rootfs-repo.
最后一次元数据过期检查:0:00:00之前,2017年8月16日星期三11:47:27 UTC。
依赖项已解决

我所拥有的 为了配置我的图像,我遵循了这些建议,并在网上其他地方发布了类似的帖子。这是我的(缩短并略加编辑)图像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"
我还在我的
local.conf
中设置
DISTRO\u FEATURES\u remove=“busybox x11 wayland”
以及
DISTRO\u FEATURES\u append=“systemd opengl aufs”

如果我删除
inherit-populate\u-sdk\u-qt5
行,构建运行良好,但是在这种情况下,我的sdk当然没有make

我发现了什么 我发现不同的人有相同的问题(例如),但没有人得到答案

我检查了nativesdk cmake和nativesdk-qtbase_git配方(两个标准都没有改变),以查看文件是在哪里创建的,这两个配方对我来说都没有问题:

本地人-qtbase_git.bb:

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
}
cmake-3.7.2.bb:

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.d-cmake.sh:

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

这给我带来了以下错误消息:

回溯(最近一次呼叫最后一次):
文件“/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”,第57行
从dnf.cli导入main
ImportError:没有名为“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
/recipe sysroot native$find-name dnf
./usr/lib/python3.5/site-packages/dnf
/usr/bin/dnf
/etc/dnf
/etc/bash_.d/dnf
/etc/logrotate.d/dnf
你能看出我做错了什么吗?我完全不懂

编辑: Anders’通过切换打包类提供了一个更优雅的解决方案。如果可以,请在尝试此解决方法之前查看他的方法

我找到了一个适合我的解决方案,但不是理想的解决方案。无论如何,我都会发布它,以防它对某人有所帮助:

我发现,
nativesdk cmake
包与Qt包发生了冲突。因此,我在自定义层中创建了一个
nativesdk packagegroup sdk host.bbappend
文件,包含以下内容:

RDEPENDS_${PN}_remove = "\
    nativesdk-cmake \
"

这将从SDK构建中删除cmake依赖项,该构建符合我的目的。但这仅仅解决了症状,而不是问题。所以我很高兴有其他的解决方案。

我正在用cmake和Qt5构建一个SDK,没有任何问题

您的问题似乎源于
dnf
,当我使用
ipk
构建时没有任何问题,OpenEmbedded中的
rpm
处理很可能存在错误

您是否可以尝试使用以下方法重建:

PACKAGE_CLASSES = "package_ipk"

在您的
local.conf
中,看到它有帮助吗

只需尝试在nativesdk-qtbase.bb中添加DIRFILES=“”(您应该使用DIRFILES=“”)在自定义层中设置一个干净整洁的nativesdk-qtbase.bbappend)。 这可以解决由于此RPM的RPM目录所有权引起的冲突,这是标准RPM打包中的默认策略。有关@python write_specfile(){…walk_files方法的详细信息,请参阅包_rpm.bbclass。 注意:必须定义DIRFILES,但将其保留为空,才能在当前包中使用。 瞧


干杯。

RPM严格检查文件/目录。
environment setup.d
问题中的目录在两个软件包之间可能具有不同的模式或用户


您可以检查函数以了解RPM执行的确切检查。

如so61pi所述,RPM严格检查文件/目录。在我的情况下,安装nativesdk qtbase后,environment.d文件夹拥有775权限,而nativesk cmake使用755创建了相同的文件夹

我不知道这是否是因为函数
generate\u qt\u environment\u file
正在fakeroot环境中执行,但我通过将其函数体添加到
do\u install
函数并删除
generate\u qt\u environment\u file
修复了它


但不确定这是否是正确的修复方法。我注意到其他一些配方使用fakeroot关键字,而其他配方则不使用。我想知道为什么…

谢谢Anders,这工作非常好。我进行了全面重建,只是为了确保SDK的构建没有任何问题。选择idk而不是rpm有任何可能的缺点吗?这对我在f不起作用首先,但在将DIRFILES值从“”更改为“”并从
recipes qt\qt5\nativesdk-qtbase\u git.bbappend
重命名为我的图像中的
recipes qt\qt5\nativesdk-qtbase\u%.bbappend
后确实起到了作用。我不确定是哪一个更改起了作用,如果我开始进一步研究,它会更新。
PACKAGE_CLASSES = "package_ipk"