2016-07-13 12 views
0

マイクロコントローラ用のクロスコンパイルプロジェクト(TIのmsp430)では、TIのclang ++とmspgccを使用します。次のように 基本的にコンパイルプロセスは、次のとおりです。私がやりたいcmakeで2つのツールチェーンを使用

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のtoolchainオプション(例えば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 
+1

これは、複数のツールチェーンではなく、より長いツールチェーン(より多くのステップですが、基本的にはパラレル/直交とは対照的に順次)について話しているようです。 –

+0

@ChintalagiriShashankは言ったように、C++コンパイラとしては 'clang ++'、.llコンパイラでは 'llc'(これが何であれ)、ASMコンパイラとリンカとしての' msp430-elf-gcc' 。 – Tsyvarev

+0

はい、私は、より長い新しいツールチェーンを形成するために、異なるツールチェーンからツールを取ります。私はC++コンパイラ、ASMコンパイラ、およびリンカを設定する方法を知っています。しかし、どのようにして.all(llvm中間アセンブラ)から.s(ターゲットアセンブラ)ファイルに余分なステップを追加するようにcmakeに指示しますか? –

答えて

2

、確かに、次善かかわらず、あなたは、単にcustom commandとしてコンパイルコマンドのいずれかを扱うことができます。

このアプローチでは、使用するステップの文法的な頭痛にたくさんの追加された通常の古いシェルスクリプトを少しだけ与えることに注意してください。

リストされているコマンドからは、完全に統合されたアセンブリリストをmsp430 hexに変換するのにmsp430-elf-gccしか使用していないようです。そのような場合は、clang++を処理するツールチェインと、深刻なプログラムのコンパイルに伴うすべての依存関係解決策を設定します。後のmsp430-elf-gccコマンドは、依存コマンドとしてclang++のターゲットを含むカスタムコマンドとして単純にリストされます。実際、あなたが持っている最後の3つのステップはすべて、その点でかなり簡単であり、本質的にハードコーディングされているかもしれません。この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]) 

私の最初の印象は、(TARGET基づく署名ではなく)OUTPUT基づく署名とadd_custom_commandがより直感的になるかもしれないが、それが依存することになるということですあなたの個人的な好みやビルドの全体的な複雑さに関して

理想的には、ExternalProjectまたは異なるCMakeListsでcmakeを2回実行して、より複雑なビルドを設定する必要があります。私は、それがどのように機能するかを理解するには、どちらかといえども十分にやらなければならなかった。

関連する問題