【问题标题】:Launch host and target crosscompiling builds inside CMake在 CMake 中启动主机和目标交叉编译构建
【发布时间】:2017-02-28 10:55:04
【问题描述】:

有没有办法配置 CMake,使得单个 make 命令将启动主机和目标构建?我有一个旨在在目标平台上运行的项目,但需要从需要在主机平台(PC)上运行的generator 生成的一些数据。从 CMake 的文档和环顾四周,我需要一个 2 遍构建 - 第一个主机创建生成器,然后是目标交叉编译构建。我的问题具体是如何通过 CMake 配置使用单个 make 命令启动 2-pass 构建(不使用外部 bash 或 python 脚本)

我知道的事情

  1. CMake 不允许在单个构建中更改工具链
  2. 几乎像这样的解决方案:How to instruct CMake to use the build architecture compiler? 这很好,只是我需要跳过使用外部脚本的第二步
  3. 如何区分交叉编译期间运行的内容cmake - compile natively and crosscompile the same code
  4. 据说可以使用 CMake How to make CMake targeting multiple plattforms in a single build 启动多个 CMake 构建

【问题讨论】:

  • 你可以随时使用 CMake 和 make 来做任何你想做的事情。我只是质疑是否值得付出努力,以及是否有人查看您的解决方案仍然能够理解内部运作和/或发现可能的问题。例如,想想stdout/stderr 在您总是进行交叉编译的可能场景之一中的输出,并在内部通过add_custom_command() 调用再次调用cmake 进行主机构建。

标签: cmake cross-compiling


【解决方案1】:

把我的评论变成答案

假设您有一个用于主机构建工具的 buildTool 子目录:

buildTools\CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(BuildTools)

add_executable(genfoo genfoo.cpp)

那么你可以有一个主要的:

CMakeLists.txt

if (CMAKE_CROSSCOMPILING)
    set(_genfoo "bin/genfoo${CMAKE_EXECUTABLE_SUFFIX}")
    add_custom_command(
        OUTPUT ${_genfoo}
        COMMAND ${CMAKE_COMMAND} 
                    -DCMAKE_BUILD_TYPE:STRING="Release"
                    -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE:PATH="${CMAKE_BINARY_DIR}/bin"
                    -B"bin"
                    -H"${CMAKE_SOURCE_DIR}/buildTools"
        COMMAND ${CMAKE_COMMAND} --build bin --config Release
    )
else()
    set(_genfoo genfoo)
    add_subdirectory(buildTools)
endif()

add_custom_command(
    OUTPUT foo.h
    COMMAND ${_genfoo}
    DEPENDS ${_genfoo}
)

add_executable(bar bar.cpp foo.h)
target_include_directories(bar PRIVATE ${CMAKE_BINARY_DIR})

参考文献

【讨论】:

  • 太棒了!您能否详细说明-B-H 选项以及bin 参数到--build?在cmake --help 中找不到它。它们记录在哪里?
  • 但是我发现了一个问题:${CMAKE_EXECUTABLE_SUFFIX}"是当前的后缀。在 linux 上为 windows 编译时,这将是(IMO)“.exe”,但生成的文件文件没有该后缀,因为它是在 linux 上编译的。
猜你喜欢
  • 2012-03-31
  • 2018-04-11
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多