【问题标题】:How to download a toolchain for cross compilation in cmake from separate file?如何从单独的文件下载用于 cmake 中交叉编译的工具链?
【发布时间】:2015-10-14 12:03:49
【问题描述】:

我有一个项目,在根目录中有一个 CMakeLists.txt 文件,该项目在 Linux 和 OSX 上编译得很好。现在我想为 MIPS OpenWRT 交叉编译它。 我想尽可能地自动化它,所以我会使用以下代码下载工具链并设置编译器变量:

ExternalProject_Add(ar71xx-toolchain
    PREFIX "${PROJECT_BINARY_DIR}/external/openwrt"
    URL "http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/generic/OpenWrt-Toolchain-ar71xx-for-mips_34kc-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2"
    UPDATE_COMMAND ""
    PATCH_COMMAND ""
    BUILD_COMMAND ""
    CONFIGURE_COMMAND ""
    INSTALL_COMMAND ""
)
ExternalProject_Get_Property(ar71xx-toolchain SOURCE_DIR)
SET(CMAKE_C_COMPILER ${SOURCE_DIR}/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-gcc)
SET(CMAKE_CXX_COMPILER ${SOURCE_DIR}/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-g++)
SET(CMAKE_STRIP ${SOURCE_DIR}/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-strip)

我以为我可以将它放在一个单独的工具链文件中并使用 -DCMAKE_TOOLCHAIN_FILE 传递它,但似乎 ExternalProject_Add 没有在工具链文件中执行。 我想避免将工具链下载步骤放入主 CMakeLists.txt 中,因为它实际上对项目本身并不是必需的,并且需要对每个目标平台执行相同的操作...... 那么有没有办法为当前的交叉编译构建定义可选步骤,并以某种方式将其作为命令行参数传递,以便在主项目构建之前执行?

更新: 基于 Tsyvarev 在工具链文件中对我有用的答案:

set(CMAKE_SYSTEM_NAME Linux)
set(TOOLCHAIN_DIR ${PROJECT_BINARY_DIR}/external/openwrt/toolchain)

if(NOT EXISTS ${TOOLCHAIN_DIR})
    file(DOWNLOAD http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/generic/OpenWrt-Toolchain-ar71xx-for-mips_34kc-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2 ${TOOLCHAIN_DIR}/toolchain.tar.bz2 SHOW_PROGRESS)
    execute_process(COMMAND tar --strip-components=2 -xjf ${TOOLCHAIN_DIR}/toolchain.tar.bz2 WORKING_DIRECTORY ${TOOLCHAIN_DIR})
    execute_process(COMMAND rm ${TOOLCHAIN_DIR}/toolchain.tar.bz2)
endif()

SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/mips-openwrt-linux-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/mips-openwrt-linux-g++)
SET(CMAKE_STRIP ${TOOLCHAIN_DIR}/bin/mips-openwrt-linux-strip)
SET(CMAKE_FIND_ROOT_PATH  ${TOOLCHAIN_DIR})
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

将 -DCMAKE_TOOLCHAIN_FILE 作为 CMAKE 参数传递给使用 ExternalProject_Add 添加的其他项目时存在一个问题。由于它是自己的 ${PROJECT_BINARY_DIR} 它将再次下载工具链。但这是另一个问题...

【问题讨论】:

  • 对我来说,在您的主要 CMakeLists.txt 发挥作用之前,将与工具链相关的机制移动到控制构建的脚本是一种更简洁的方法。
  • 你是对的,但我希望用户从构建目录调用“cmake -DCMAKE_TOOLCHAIN_FILE=../platforms/openwrt_ar71xx/mips.toolchain.cmake ..”而不是“cmake ..”如果他决定进行交叉编译而不是告诉他如何创建另一个 cmake 文件...

标签: cmake cross-compiling


【解决方案1】:

ExternalProject_add构建时执行所有步骤,而不是在配置时。

对于下载文件,您可以使用file(DOWNLOAD ...) 命令。要从存档中提取文件,只需使用 execute_process 和适当的命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-17
    • 2012-07-10
    • 1970-01-01
    • 2017-03-31
    • 2020-06-05
    • 2016-09-20
    • 2017-06-14
    相关资源
    最近更新 更多