使用两个带有 cmake 的工具链



对于微控制器(来自 TI 的 msp430)的交叉编译项目,我使用 clang++ 和 TI 的 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 

首先,虽然不可否认是次优的,但您可以将其中一个编译命令视为简单的自定义命令。

请注意,这种方法只会给你一个普通的旧 shell 脚本,其中有很多关于你使用它的步骤的语法问题。

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

一种稍微干净的方法,尽管您可能需要付出一些努力来确保它是否足够,但方法是将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])

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

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

相关内容

  • 没有找到相关文章

最新更新