如何从单独的文件下载用于 cmake 中交叉编译的工具链?

2024-04-17

我有一个项目,根目录中有一个 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 中,因为它实际上对于项目本身并不重要,并且需要对每个目标平台执行相同的操作... 那么有没有一种方法可以为当前交叉编译构建定义可选步骤,并以某种方式将其作为命令行参数传递,以便在主项目构建之前执行?

UPDATE:基于 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} ,它将再次下载工具链。但这是另一个问题......


ExternalProject_add执行所有步骤build时间,不是在配置 time.

对于下载文件,您可以使用file https://cmake.org/cmake/help/v3.0/command/file.html(DOWNLOAD ...)命令。要从存档中提取文件,只需使用执行进程 http://www.cmake.org/cmake/help/v3.0/command/execute_process.html用适当的命令。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从单独的文件下载用于 cmake 中交叉编译的工具链? 的相关文章

  • find_package 用于使用 Visual Studio 进行调试和发布

    我正在为如何将第三方库包含在我的 cmake 项目中而绞尽脑汁 目前 我构建了 Poco 和其他一堆 它们都生成各自的 Config cmake 我将其与 find package 一起使用 我有一个包装构建脚本 用于构建所有依赖项并将它们
  • 调用always_inline‘_mm_mullo_epi32’时内联失败:目标特定选项不匹配

    我正在尝试使用 cmake 编译 C 程序 该程序使用 SIMD 内在函数 当我尝试编译它时 出现两个错误 usr lib gcc x86 64 linux gnu 5 include smmintrin h 326 1 错误 调用alwa
  • 如何检测当前作用域在 CMake 中是否有父作用域?

    有什么方法可以检测当前作用域是否有父作用域 我有一个项目 可以是独立项目 也可以是另一个项目的子项目 为了允许子项目情况 我使用 PARENT SCOPE 标志来 set 将内容推送到父项目 但是 当构建为独立项目时 我收到 当前范围没有父
  • 如何使用Cmake使用框架?

    对于 Macos 我想链接到一些框架 在 Windows 中 我想链接到一些库 比如OpenGL Framework 如何使用cmake表达这个需求 您可以尝试以下代码 target link libraries
  • CMake 链接失败

    我正在为 CMake 配置我的项目 并且遇到链接问题 项目文件全部编译成功 然后它说它正在链接并报告未找到的各种符号 这些符号大部分是由我自己的代码提供的 其中一些是由 BerkeleyDB 提供的 它已被正确定位并包含在内 这是我的顶级
  • Qt5 CMake 将所有库包含到可执行文件中

    我正在尝试使用 Qt 5 14 构建一个发布模式下的应用程序 并且 Qt Creator 内部一切正常 但是当我尝试单独运行可执行文件时 我收到如下错误 OS Windows 10 Qt 5 14 Cmake 3 5 我尝试过的 设置 CM
  • CMake 占位符如何工作?

    在 CMake 的支持库中 您将看到如下所示的命令定义 set CMAKE ASM ASM DIALECT COMPILE OBJECT
  • 如何安装和使用 YAML-Cpp

    我想学习 YAML 并将其与 C 一起使用 但我一直在尝试设置YAML Cpp 让我解释一下到目前为止我所做的事情 我下载了源代码 版本0 5 1 安装的 Cmake 适用于 Windows 安装了 Boost 库 为 Visual Stu
  • 在cmake中检测项目语言

    我想检测当前的项目语言 例如 如果我有这样的东西 cmake minimum required VERSION 3 0 project foo VERSION 1 0 LANGUAGES CXX 我需要这样的东西 if project la
  • 如何以编程方式迭代所有 CMake 目标?

    有没有办法从顶层获取 CMake 项目的所有目标CMakeLists txt 即以编程方式迭代目标 我想要这样做的原因是将一些 XCode 特定设置应用于每个目标 if CMAKE GENERATOR MATCHES Xcode inclu
  • CMake:不要为链接中使用的单个库设置 rpath

    我想要做的是配置我的 CMakeLists 文件 以便在构建我的项目时 链接器使用驻留在我的构建树中的共享库 so 的副本来链接可执行文件 但不会在中设置 rpath链接的可执行文件 以便系统必须在加载程序请求时提供该库 具体来说 我想在构
  • CMake:将为 lib 构建的对象文件重用到另一个 lib 目标中

    我正在尝试将我的项目转移到CMake 同时对编译过程进行一些优化 这是交易 我有几个子目录 必须 每个子目录都编译成静态库 这有效 我想将每个子目录中的所有目标文件收集到另一个更大的 完整的静态库中 它看起来像这样 libBig a mad
  • CXX 编译器标识未知

    我们在使用 Visual Studio 2012 在 Windows 7 64 位下使用 CMake v2 8 12 编译项目时遇到问题 CMake 给我们提供了以下错误 我们已经尝试使用管理员权限从 Visual Studio 命令行启动
  • 设置 CMake OBJECT 库的输出目录

    在我的 CMake 文件中 我指定了一个对象库 add library core OBJECT sourcefiles 我在共享库中进一步引用了这组目标文件 add library sharedlib SHARED
  • 如何将脚本的依赖项添加到 CMake 中的目标?

    链接我的程序后 我需要对其执行一些后处理 我添加了一个add custom command TARGET 效果很好 但是 这个额外的自定义命令运行一个脚本 未生成 它已签入代码库 并且我希望如果该脚本发生更改 目标将被视为过时 以便正确重建
  • cmake MSYS Makefiles 生成器丢失

    我通过 pacman 安装了 cmake 3 2 3 当我尝试从 msys64 shell 中使用它时出现错误 cmake G MSYS Makefiles CMake Error Could not create named genera
  • x86 上 SPARC 的交叉编译

    我已经看到关于交叉编译器的回复如何在 Windows 上交叉编译 C 代码 以便二进制文件也可以在 Unix Solaris HPUX Linux 上运行 https stackoverflow com questions 579695 h
  • CMake:如何将 .def 文件添加到 Visual Studio 项目过滤器?

    如何将 def 文件添加到 Visual Studio 项目过滤器 filters文件 Visual Studio 使用 def 文件 CMake代码 set a src a cpp a def add library a SHARED a
  • wasm-ld:错误:初始内存太小,需要 18317952 字节

    我想将 ffmpeg 编译为 wasm 下载 FFMPEG 和 emsdk 源代码后 我使用下面的命令进行构建 emconfigure configure cc emcc enable cross compile target os non
  • doxygen INSTALL 无法将文件“.../doxygen/build/bin/doxygen”复制到“/usr/local/bin/doxygen”

    解决了一些之后最初的问题 https stackoverflow com q 50986047 4120196在尝试让 doxygen 工作时 我在遵循以下步骤时偶然发现了下一个错误doxygen安装教程 http www doxygen

随机推荐