【问题标题】:Multiple cross-compilation targets for drivers with CMake使用 CMake 的驱动程序的多个交叉编译目标
【发布时间】:2021-04-10 14:16:01
【问题描述】:

我正在为一个硬件模块开发一个驱动程序,并且我希望在使用 CMake 时使其尽可能便携。是否有实现这一目标的最佳做法?

所有平台和平台相关代码都应使用通用代码。 什么样的目录结构适合这个用例? 如何构建 CMakeLists.txt 文件?

【问题讨论】:

    标签: c++ cmake driver firmware


    【解决方案1】:

    我建议在源目录的根目录中使用通用实现,同时在 arch 目录中使用专门的架构细节。然后您可以在根CMakeLists.txt 中使用

    选择适当的架构相关代码
    add_subdirectory( ${PROJECT_SOURCE_DIR}/arch/${CMAKE_TARGET_PROCESSOR} )
    

    示例项目结构:

    source/arch/arm/platform_dependent_code.cpp
    source/arch/arm/CMakeLists.txt
    source/arch/x86/platform_dependent_code.cpp
    source/arch/x86/CMakeLists.txt
    source/common_code.cpp
    source/CMakeLists.txt <-- to contain add_subdirectory( ${PROJECT_SOURCE_DIR}/arch/${CMAKE_TARGET_PROCESSOR} )
    

    一旦将CMAKE_TARGET_PROCESSOR CMake 变量设置为arm,那么除了通用代码之外,仅构建与arm 相关的代码,或者一旦设置x86x86 并使用通用代码...@987654329 @command 为你创造奇迹

    我不确定您如何处理多重交叉编译中的工具链,但我建议使用应设置 CMAKE_TARGET_PROCESSOR 的 CMake 工具链文件...(请参阅 https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/CrossCompiling

    【讨论】:

    • 谢谢,这确实清理了很多目录结构。我遇到了 ExternalProject_Add ,它可以让我为每个拱门进行构建,直接提供 CMAKE_TOOLCHAIN_FILE,你认为这可以很好地工作吗?
    • 我不知道,缺乏经验。我粗略描述的解决方案是我在项目中使用的解决方案,我发现它非常简单,易于维护。它还有一个优点,您不必在源代码中处理拱门管理,只需在 CMake 中。如果您在arch cmakelists.txt 中正确设置了包含路径并且在所有平台中具有相同的标题名称,则只需包含来自arch 的标题...
    • 我尝试了您的解决方案,它与可用于为不同目标设置工具链文件的顶级 Makefile 结合使用非常好。非常感谢您的解决方案。
    猜你喜欢
    • 2015-08-04
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    相关资源
    最近更新 更多