首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从单独的文件下载cmake中的交叉编译工具链?

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

Stack Overflow用户
提问于 2015-07-23 23:48:23
回答 1查看 2.6K关注 0票数 5

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

代码语言:javascript
运行
复制
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在工具链文件中对我有用的答案的

代码语言:javascript
运行
复制
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},它将再次下载工具链。但这是另一个问题..。

EN

Stack Overflow用户

回答已采纳

发布于 2015-07-24 07:13:59

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

对于下载文件,可以使用文件(DOWNLOAD ...)命令。要从归档中提取文件,只需使用流程和适当的命令即可。

票数 5
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31599965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档