2016-07-13 10 views
0

Für Cross-Compiling-Projekte für einen Mikrocontroller (msp430 von TI) verwende ich den clang ++ und den mspgcc von TI. Grundsätzlich ist der Übersetzungsvorgang wird wie folgt:Zwei Werkzeugketten mit cmake verwenden

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

Was ich tun möchte, ist meine Projekte mit cmake kompilieren. Ich habe über die Toolchain-Option für cmake gelesen (z. B. https://cmake.org/cmake/help/v3.6/manual/cmake-toolchains.7.html?highlight=toolchain), aber es passt nicht meine Situation.

Irgendwelche Möglichkeiten, es zu erreichen?


Die genauen Schritte für die Erstellung sind:

/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

Es klingt wie Sie sprechen über eine längere Toolchain (mehr Schritte, aber immer noch im Wesentlichen sequentiell im Gegensatz zu parallel/orthogonal), anstatt mehrere Toolchains. –

+0

Wie @ChintalagiriShashank gesagt hat, müssen Sie nur verschiedene Tools für verschiedene Schritte angeben: 'clang ++' als C++ - Compiler, 'llc' als .ll-Compiler (was auch immer das bedeutet),' msp430-elf-gcc' als ASM-Compiler und als Linker . – Tsyvarev

+0

Ja, ich nehme Werkzeuge aus verschiedenen Werkzeugketten, um eine neue längere Werkzeugkette zu bilden. Ich weiß, wie man den C++ - Compiler, den ASM-Compiler und den Linker setzt. Aber wie sage ich cmake, um den zusätzlichen Schritt vom .ll (llvm intermediate assembler) zur .s (target assembler) Datei hinzuzufügen? –

Antwort

2

Für einen Start, obwohl zugegebenermaßen suboptimal, Sie eines der Kompilierung behandeln könnte Befehle einfach als eine custom command.

Beachten Sie, dass dieser Ansatz Ihnen wenig mehr als ein normales altes Shell-Skript mit vielen zusätzlichen syntaktischen Kopfschmerzen für den Schritt gibt, für den Sie es verwenden.

Von den Befehlen, die Sie aufgelistet haben, sieht es so aus, als ob Sie nur msp430-elf-gcc zum Konvertieren eines ansonsten vollständig integrierten Assembly-Eintrags in msp430 hex verwenden. Wenn das der Fall ist, würde ich die Toolchain so einrichten, dass sie clang++ und die gesamte Abhängigkeitsauflösung behandelt, die mit dem Kompilieren von ernsthaften Programmen einhergeht. Der spätere Befehl msp430-elf-gcc kann einfach als benutzerdefinierter Befehl aufgelistet werden, der das Ziel Ihrer clang++ Build als Abhängigkeit enthält. Tatsächlich sind alle der letzten drei Schritte, die Sie haben, in dieser Hinsicht ziemlich einfach und können durchaus zugänglich sein, um im Wesentlichen fest codiert zu werden. Sehen Sie dieses SO answer.

Ein etwas sauberer Ansatz, obwohl Sie möglicherweise einige Anstrengungen unternehmen müssen, um sicherzustellen, dass es ausreicht oder nicht, wäre, den custom_command mit dem Ziel zu verknüpfen. Meta-Code aus einer flüchtigen Lektüre der add_custom_command docs:

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]) 

Mein erster Eindruck ist, dass add_custom_command mit der OUTPUT basierten Signatur (im Gegensatz zu der TARGET basierten Signatur) unter Beweis stellen kann intuitiver sein, aber das würde davon abhängen auf Ihre persönlichen Vorlieben sowie die Komplexität Ihres Builds.

Idealerweise müssten Sie einen komplexeren Build erstellen, indem Sie entweder ExternalProject verwenden oder cmake zweimal mit verschiedenen CMakeLists ausführen. Ich musste noch nie genug tun, um herauszufinden, wie das funktioniert.