MPLABX automatische Buildnummer

Ich möchte Euch heute zeigen, wie Ihr mit Hilfe von MPLABX bzw. zwei kleiner Skripte eine automatische Erzeugung von Buildnummern euer Projekte erreichen könnt. Die Generierung der Buildnummer wird vollautomatisch und ohne Euer zutun von statten gehen. Am Ende dieses Artikels sollt Ihr in der Lage sein ein beliebiges Projekt in MPLABX so zu erweitern, dass a) neben der originalen HEX-Datei eine zweite mit Buildnummer im Namen erzeugt wird und b) eine Headerdatei automatisch generiert wird, die als Makro die aktuelle Buildnummer enthält.

Vorbereitungen

Damit die oben genannten Anforderungen auch in die Tat umgesetzt / erfüllt werden können, müssen wir zwei Skripte schreiben, die diese Aufgaben erledigen. Diese werden dann über MPLABX in den Post- bzw. Pre-Prozess eingebunden und erledigen somit “unsichtbar” ihre Arbeit. In MPLABX gibt es die Möglichkeit vor und nach dem Buildvorgang Skripte bzw. Aufgaben zu erledigen und genau das werden wir nutzen.

Pre-Prozess

Bevor das Projekt kompiliert wird, möchten wir eine Headerdatei erzeugen, die im Projekt selber eingebunden wird und die aktuelle Buildnummer enthält, so dass diese im laufenden Programm ggfs. extern ausgelesen werden kann. Ich möchte auf die Programmierung des Skriptes gar nicht groß eingehen, da ich 1) selber wenig Ahnung davon habe (die notwendigen Befehle habe ich mir alle über Google zurecht gesammelt) und 2) es hier nicht um die Programmierung eines Skriptes geht, sondern um dessen Nutzen.

:: -----------------------------------------------------------------------------
:: Skript zur automatischen Generierung der Buildnummer eines MPLABX-Projektes
:: 
:: Dieses Skript wird vor dem eigentlichen Kompilieren ausgefuehrt und erzeugt
:: die Headerdatei build.h in der die aktuelle Buildnummer des Projektes ent-
:: halten ist. Die Datei kann einfach im Projekt eingebunden werden.
:: 
:: Autor: Nicolas Meyertoens | http://pic-projekte.de
:: -----------------------------------------------------------------------------

setlocal EnableDelayedExpansion

:: Ermittlung des MPLABX IDE Projektnamens
for %%i in ("%cd%") do set "project=%%~nxi"

:: Pruefen ob die Datei >buildnumber.txt< bereits existiert
if NOT exist build\buildnumber.txt echo 0; > build\buildnumber.txt

:: Auslesen der letzten Buildnummer
for /f "delims=;" %%i in (build\buildnumber.txt) do set bn=%%i

:: erhoehen der Buildnummer
set /a bn=%bn%+1

:: erzeugen der Headerdatei mit Angabe der Buildnummer
echo /******************************************************************************* > build.h
echo * Diese Datei wurde automatisch erzeugt um die Buildnummer des Projektes zur >> build.h
echo * Verfuegung zu stellen. Fuer weitere Details, siehe: http://pic-projekte.de >> build.h
echo ******************************************************************************/ >> build.h
echo. >> build.h
echo #ifndef BUILD_H >> build.h
echo #define BUILD_H >> build.h
echo. >> build.h 
echo #define build %bn% >> build.h
echo. >> build.h
echo #endif >> build.h

Post-Prozess

Zusätzlich zu der Generierung der Headerdatei, die die aktuelle Buildnummer im Programm zur Laufzeit zur Verfügung stellt, möchten wir auch ein Skript, dass neben der originalen HEX-Datei eine Kopie davon erzeugt, die die aktuelle Buildnummer im Dateinamen trägt. Hierfür weisen wir MPLABX dazu an, dass das nachfolgende Skript nach dem eigentlichen Buildvorgang ausgeführt wird.

:: -----------------------------------------------------------------------------
:: Skript zur automatischen Generierung der Buildnummer eines MPLABX-Projektes
:: 
:: Dieses Skript wird nach dem eigentlichen Kompilieren ausgefuehrt und kopiert
:: die original HEX-Datei des MPLABX Projektes und fuegt der Datei eine fort-
:: laufende Buildnummer hinzu. 
:: 
:: Autor: Nicolas Meyertoens | http://pic-projekte.de
:: -----------------------------------------------------------------------------

setlocal EnableDelayedExpansion

:: Ermittlung des MPLABX IDE Projektnamens
for %%i in ("%cd%") do set "project=%%~nxi"

:: Auslesen der letzten Buildnummer
for /f "delims=;" %%i in (build\buildnumber.txt) do set bn=%%i

:: erhoehen der Buildnummer
set /a bn=%bn%+1

:: ausschreiben dieser neuen Buildnummer
echo %bn%; > build\buildnumber.txt

echo Current Build: %bn%

:: Loeschen der alten HEX-Datei (falls verfuegbar)
if %bn% GTR 1 (
 set /a tmp=%bn%-1
 del dist\default\production\%project%_build_!tmp!.hex
)

:: neue HEX-Datei anlegen
copy dist\default\production\%project%.production.hex dist\default\production\%project%_build_%bn%.hex

Diese beiden hier vorgestellten Skripte sind Dateien mit der Endung *.cmd und müssen im jeweiligen Projektordner abgelegt werden.

Download

Ich biete Euch die beiden Skripte an dieser Stelle noch einmal zum Download  an. Die beiden Dateien müssen wie gesagt im Projektordner (dort wo auch das Makefile liegt) abgelegt werden, damit sie später von MPLABX gefunden werden.

Einstellungen für MPLABX

Wir haben also die beiden Skript-Dateien (*.cmd, siehe Download) in das Projektverzeichnis gelegt und müssen nun noch die notwendigen Einstellungen in MPLABX vornehmen, damit die Skripte auch an den richtigen Stellen ausgeführt werden.

Wenn MPLABX mit dem entsprechenden Projekt geöffnet ist, rufen wir die Project-Properties aus. Hierfür einfach einen Rechtsklick auf das oberste Element im Projektfenster ausführen und den entsprechenden Eintrag aus dem Kontextmenü wählen. Es öffnet sich das nachfolgende Fenster:

mplabx_pp_building

Hier wählen wir im linken Bereich den Eintrag Building aus, woraufhin wir in folgende Ansicht gelangen:

Hier müssen die beiden markierten Häckchen gesetzt werden. Zusätzlich werden die beiden Zeilen call pre_BN.cmd und post_BN.cmd entsprechend dem Screenshot eingetragen und mit Apply / OK wird die Eingabe bestätigt.

Bedienung / Funktionstest

Jetzt wollen wir testen ob wir alles richtig gemacht haben und die Dateien entsprechend mit der Buildnummer erstellt werden. Wie sollte es anders sein… Zum Testen werden wir nun einfach das Projekt wie immer mit einen Klick auf den Build-Button kompilieren.

Als aller erstes sollte natürlich der beruhigende Schriftzug BUILD SUCCESSFUL im Output-Fenster erscheinen. Das ist dann auch schon ein sehr gutes Zeichen. Wir schauen jedoch noch nach ob die Headerdatei erzeugt wurde und ob die HEX-Datei mit der Buildnummer versehen wurde. Öffnet also euren Projektordner. Hier sollte sich bereits die Datei build.h befinden, die in etwas folgenden Inhalt hat:

/*******************************************************************************
* Diese Datei wurde automatisch erzeugt um die Buildnummer des Projektes zur
* Verfuegung zu stellen. Fuer weitere Details, siehe: http://pic-projekte.de
******************************************************************************/

#ifndef BUILD_H
#define BUILD_H

#define build 1

#endif 

Damit ist schon mal sichergestellt, dass die Headerdatei korrekt erstellt wurde. Ihr könnt diese einfach immer in euer Projekt mit einbinden um die Buildnummer im laufenden Betrieb zur Verfügung zu haben.

Als nächstes sehen wir aber auch noch nach ob die HEX-Datei korrekt generiert wurde. Hierzu navigieren wir in folgendes Verzeichnis: dist/default/production Hier sollte sich nun neben der originalen HEX-Datei <Projektname>.<production>.hex noch eine weitere HEX-Datei befinden <Projektname>_<build>_<Buildnummer>.

Hinweis: Die in diesem Artikel vorgestellten Skript erstellen eine kleine Textdatei im Unterordner build eures Projektes. Die Datei mit dem Namen buildnumber.txt darf bzw. sollte nicht gelöscht werden, da sonst der Wert der Buildnummer verloren geht und die Zählung wieder bei Eins beginnt.

Außerdem eine Randnotiz: Wenn es zu einem BUILD FAILED gekommen ist, dann wird die Buildnummer bis zu nächsten BUILD SUCCESSFUL falsch angezeigt. Nach einem erfolgreichen Build ist die Nummer jedoch wieder korrekt.

Siehe auch

  • MPLABX – Eine Einführung in die Entwicklungsumgebung
  • Bootloader – Ein effektiver und komfortabler Bootloader für PIC16 und PIC18
  • XC-Compiler – Die neuen Compiler für PIC-Mikrocontroller

Leave a Reply

Your email address will not be published. Required fields are marked *