在CMake内启动主机和目标交叉编译构建
是否有一种方法可以配置CMake,使单个在CMake内启动主机和目标交叉编译构建,cmake,cross-compiling,Cmake,Cross Compiling,是否有一种方法可以配置CMake,使单个make命令同时启动主机和目标构建?我有一个项目要在目标平台上运行,但需要从需要在主机平台(PC)上运行的生成器生成一些数据。从CMake的文档和环顾四周,我需要一个2遍的构建—首先是主机来创建生成器,然后是目标交叉编译构建。我的问题是如何通过cmakeconfigurations(不使用外部bash或python脚本)使用单个make命令启动2次构建 我知道的事情 CMake不允许在单个构建中更改工具链 几乎所有的解决方案都是:这很好,只是我需要跳过使用
make
命令同时启动主机和目标构建?我有一个项目要在目标平台上运行,但需要从需要在主机平台(PC)上运行的生成器生成一些数据。从CMake的文档和环顾四周,我需要一个2遍的构建—首先是主机来创建生成器,然后是目标交叉编译构建。我的问题是如何通过cmakeconfigurations(不使用外部bash或python脚本)使用单个make
命令启动2次构建
我知道的事情
CMake不允许在单个构建中更改工具链
几乎所有的解决方案都是:这很好,只是我需要跳过使用外部脚本的第二步
如何区分交叉编译期间运行的内容
据说可以使用CMake启动多个CMake构建
把我的评论变成答案
假设您有一个主机构建工具的buildTool
子目录:
buildTools\CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(BuildTools)
add_executable(genfoo genfoo.cpp)
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})
然后你可以有一个主要的:
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(BuildTools)
add_executable(genfoo genfoo.cpp)
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})
参考资料
您可以随时弯曲CMake和make
来基本上做任何您想做的事情。我只是想问一下,这是否值得付出努力,是否有人在看你的解决方案时仍然能够理解内部工作原理和/或找到可能的问题。例如,只需考虑一种可能的情况下的stdout
/stderr
输出,在这种情况下,您总是通过add_custom_command()
调用进行交叉编译,并再次对主机构建执行do callcmake
。太棒了!您能否详细说明-B
和-H
选项以及bin
参数到--构建
?在cmake--help
中找不到它。它们记录在哪里?但是我发现了一个问题:${CMAKE\u EXECUTABLE\u SUFFIX}“
是当前后缀。在linux上为windows编译时,这将是(IMO)“.exe”,但生成的文件没有该后缀,因为它是在linux上编译的。