【问题标题】:Using two tool-chains with cmake在 cmake 中使用两个工具链
【发布时间】:2016-07-13 11:51:58
【问题描述】:

对于微控制器(来自 TI 的 msp430)的交叉编译项目,我使用来自 TI 的 clang++ 和 mspgcc。 基本上编译过程如下:

file.cpp 
--(llvm clang++)--> file.ll 
--(llvm llc)--> file.s 
--(ti msp430-elf-gcc)--> file.o 
--(ti msp430-elf-gcc)--> a.out (executable)

我想做的是用 cmake 编译我的项目。我已经阅读了 cmake 的工具链选项(例如 https://cmake.org/cmake/help/v3.6/manual/cmake-toolchains.7.html?highlight=toolchain),但它不太适合我的情况。

有没有可能实现它?


编译的具体步骤是:

/usr/local/opt/llvm/bin/clang++ -I ~/ti/gcc/include/ -I ~/ti/gcc/msp430-elf/include/ -D__MSP430F5529__ -S -emit-llvm -std=c++11 --target=msp430 -Wall -c file.cpp -o file.ll

/usr/local/opt/llvm/bin/llc -march=msp430 file.ll -o file.s

~/ti/gcc/bin/msp430-elf-gcc -Wall -D_GNU_ASSEMBLER_ -I ~/ti/gcc/include/ -mmcu=msp430f5529 -mcpu=430 -x assembler -Wa,-gstabs -c file.s -o file.o

~/ti/gcc/bin/msp430-elf-gcc -mmcu=msp430f5529 -B ~/ti/gcc/include/ -mcpu=430 -Wl,-Map=a.out.map file.o  -o a.out 

【问题讨论】:

  • 听起来您是在谈论更长的工具链(更多步骤,但与并行/正交相比仍然基本上是顺序的),而不是多个工具链。
  • 正如@ChintalagiriShashank 所说,您只需为不同的步骤指定不同的工具:clang++ 作为 C++ 编译器,llc 作为 .ll 编译器(无论这意味着什么),msp430-elf-gcc 作为 ASM 编译器并作为链接器。
  • 是的,我从不同的工具链中提取工具来形成一个新的更长的工具链。我知道如何设置 C++ 编译器、ASM 编译器和链接器。但是我如何告诉 cmake 将额外的步骤从 .ll(llvm 中间汇编器)添加到 .s(目标汇编器)文件?
  • But how do I tell cmake to add the extra step... - 据我所知,您不能:CMake 仅区分 compile 和 link 阶段。所以你需要手动组合步骤。或者以某种方式通过定义函数/宏或创建特殊的编译脚本来自动化这个过程,从 C 生成目标文件。

标签: c++ cmake cross-compiling


【解决方案1】:

首先,尽管公认不是最理想的,但您可以将其中一个编译命令简单地视为 custom command。

请注意,这种方法只会为您提供一个常规的旧 shell 脚本,并为您使用它的步骤添加大量的语法问题。

从您列出的命令来看,您似乎只使用msp430-elf-gcc 将完全集成的程序集列表转换为 msp430 十六进制。如果是这种情况,我会设置工具链来处理clang++ 以及编译严肃程序时的所有依赖关系解析。后面的msp430-elf-gcc 命令可以简单地作为自定义命令列出,其中包含clang++ 构建的目标作为依赖项。事实上,在这方面,您完成的所有最后三个步骤都相当简单,并且很可能基本上可以进行硬编码。请参阅SO answer。

一种更简洁的方法,尽管您可能需要付出一些努力来确保它是否足够,但是将 custom_command 链接到目标。粗略阅读 add_custom_command 文档的元代码:

add_executable(file.ll ${SOURCES})
add_custom_command(TARGET file.ll
                   POST_BUILD
                   COMMAND llc [ARGS] [args1...]
                   COMMAND msp430-elf-gcc [ARGS] [args2...] 
                   COMMAND msp430-elf-gcc [ARGS] [args3...] 
                   [WORKING_DIRECTORY dir]
                   [COMMENT comment] [VERBATIM])

我最初的印象是add_custom_command 与基于OUTPUT 的签名(与基于TARGET 的签名相反)可能会更直观,但这取决于您的个人喜好以及整体复杂性你的构建。

理想情况下,您必须使用 ExternalProject 或使用不同的 CMakeList 运行两次 cmake 来设置更复杂的构建。不过,我从来没有做过任何糟糕的事情来弄清楚它是如何工作的。

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 2013-11-20
    • 2013-09-13
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2021-10-31
    相关资源
    最近更新 更多