【问题标题】:During SDK build: environment-setup.d/ conflicts between attempted installs在 SDK 构建期间: environment-setup.d/ 尝试安装之间的冲突
【发布时间】:2017-08-16 14:56:39
【问题描述】:

我正在尝试为包含 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-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 添加了 oe-repo repo -rootfs-repo.
上次元数据过期检查:UTC 时间 2017 年 8 月 16 日星期三 11:47:27 0:00:00 前。
依赖关系已解决。

我有什么

为了配置我的图像,我遵循了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"

我还在我的local.conf 中设置了DISTRO_FEATURES_remove = "busybox x11 wayland"DISTRO_FEATURES_append = " systemd opengl aufs"

如果我删除 inherit populate_sdk_qt5 行,构建运行良好,但在这种情况下,我当然不会为我的 SDK 获得 make。

我发现了什么

我发现不同的人有同样的问题(例如 here),但没有人得到答案。

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

natives-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
这给了我以下错误消息:

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

你能看出我做错了什么吗?我真是一头雾水……

【问题讨论】:

    标签: yocto bitbake


    【解决方案1】:

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

    您的问题似乎源于dnf,并且由于我正在使用ipk 构建而没有任何问题,因此在OpenEmbedded 中处理rpm 很可能存在错误。

    你可以尝试重建:

    PACKAGE_CLASSES = "package_ipk"
    

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

    【讨论】:

    • 谢谢安德斯,这工作得很好。我进行了完全重建以确保 SDK 构建没有任何问题。选择 idk 而不是 rpm 有什么缺点吗?
    【解决方案2】:

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

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

    我发现nativesdk-cmake 包不知何故与Qt 包发生了冲突。为此,我在自定义层中创建了一个nativesdk-packagegroup-sdk-host.bbappend 文件,内容如下:

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

    这从 SDK 构建中删除了 cmake 依赖项,这适用于我的目的。但这只是解决症状而不是问题。所以我很高兴有任何其他解决方案。

    【讨论】:

      【解决方案3】:

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

      干杯。

      【讨论】:

      • 起初这对我不起作用,但在将 DIRFILES 值从 "" 更改为 " " 并在我的图像中从 recipes-qt\qt5\nativesdk-qtbase_git.bbappend 重命名为 recipes-qt\qt5\nativesdk-qtbase_%.bbappend 后确实有效。我不确定是哪项更改起到了作用,如果我有时间进一步探索,我会更新。
      【解决方案4】:

      正如 so61pi 提到的,RPM 对文件/目录有严格的检查。就我而言,安装 nativesdk-qtbase 后 environment.d 文件夹的权限为 775,而 nativesk-cmake 创建的同一个文件夹的权限为 755。

      我不知道这是否是由于函数 generate_qt_environment_file 是在 fakeroot 环境中执行的,但我通过将其函数体添加到 do_install 函数并删除 generate_qt_environment_file 来修复它.

      不确定这是否是正确的解决方法。我注意到其他一些食谱使用 fakeroot 关键字,而另一些则没有。我想知道为什么...

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2016-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-02
          • 1970-01-01
          • 2016-05-26
          相关资源
          最近更新 更多