对于微控制器的交叉编译项目(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
答案 0 :(得分:2)
首先,虽然承认不是最理想的,但您可以将其中一个编译命令简单地视为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或使用不同的CMakeLists运行两次cmake来设置更复杂的构建。不过,我从来没有做过足够严重的事情来弄清楚它是如何运作的。