Forum: Compiler & IDEs Gibt es sowas wie eine Buildnumber in AVR-GCC ?


von N. N. (drnicolas)


Lesenswert?

Ich würde gerne in mein Firmware-Projekt so etwas wie eine Build-Nummer 
oder Versionsabfrage einbauen.

Gib es ein feature, das automatisch bei jeder neu-Kompilierung die 
Build-nummer um eins erhöht und bei jeder Komplett-Neuerstellung 
ausserdem die Versionsnummer ?

von Klaus W. (mfgkw)


Lesenswert?

M.W. nicht.
So etwas regle ich normalerweise mit einer paar Skriptzeilen
im Makefile.

Außerdem gibt es natürlich noch _DATE_

von Bernhard (Gast)


Lesenswert?

Meines Wissens gibt es sowas wie eine Versionsnummer nur mit einem
Versionverwaltunsgsystem wie rcs, cvs, oder subversion. Da wird im
source code ein id-string hinterlegt, der beim ein- und auschecken
verändert wird. Sowas könnte man auch per script nachbauen.

von Peter (Gast)


Lesenswert?

Die Build-Nummer passe ich manual an. Daran kann man sich rasch gewöhnen 
es auch konsequent zu machen.

Zudem verwende ich aber noch TIME_ und _DAT als Timestamp für den 
entsprechenden Build:
1
prog_char VERSION[] = "01.02.33";
2
prog_char AUTOR[]   = "Peter";
3
prog_char BUILT[]   = __DATE__ ", " __TIME__;
4
5
6
static void BOOT_check(int status)
7
{
8
  //----------------------------------------------------------------------
9
  printf_I("\n\n");                               // two new lines
10
  //----------------------------------------------------------------------
11
  if (status & (1<<BORF))                         // Brown-Out Reset
12
  {
13
    printf_I("Brown-Out Reset\n");
14
  }
15
  else if (status & (1<<PORF))                    // Power-On Reset
16
  {
17
    printf_I("Power-On Reset\n");
18
  }
19
  else if (status & (1<<JTRF))                    // JTAG Reset
20
  {
21
    printf_I("JTAG Reset\n");
22
  }
23
  else if (status & (1<<EXTRF))                   // External Reset
24
  {
25
    printf_I("External Reset\n");
26
  }
27
  else if (status & (1<<WDRF))                    // Watchdog Reset
28
  {
29
    printf_I("Watchdog Reset\n");
30
  }
31
  else
32
  {
33
    printf_I("SW Restart\n");                    // jump, call or run into reset
34
  }
35
  printf_I("----------------------------------------\n");
36
  printf_I("| Beispiel - Testprogram               |\n");
37
  printf_I("----------------------------------------\n");
38
  printf_I("Version: V-");printf_P(VERSION);printf_I("\n");
39
  printf_I("Built:    ");printf_P(BUILT);printf_I("\n");
40
  printf_I("Autor:    ");printf_P(AUTOR);printf_I("\n");

von Klaus (Gast)


Lesenswert?

Was für eine Speicherverschwendung! oO

von N. N. (drnicolas)


Lesenswert?

Gerade die manuelle Änderung wollte ich umgehen.
Time & Date könnte immerhin eine ganz gute Unterscheidung bieten ...

von Markus J. (markusj)


Lesenswert?

Code::Blocks hat eine solche Funktion die automatisch beim 
speichern/kompilieren eine Build-Nummer inkrementieren kann - da ich 
aber inzwischen zu (AVR) Eclipse gewechselt habe, werden solche Aufgaben 
bei Bedarf von Hand erledigt.

mfG
Markus

von Rolf Magnus (Gast)


Lesenswert?

Bernhard schrieb:
> Meines Wissens gibt es sowas wie eine Versionsnummer nur mit einem
> Versionverwaltunsgsystem wie rcs, cvs, oder subversion. Da wird im
> source code ein id-string hinterlegt, der beim ein- und auschecken
> verändert wird.

Der ändert seinen Wert aber nur bei einem Commit dieser Datei, d.h. um 
hier so eine Build-Nummer zu bekommen, müßtest du bei jedem 
Compiliervorgang die Datei verändern und dann commiten.

von tuppes (Gast)


Lesenswert?

Nicolas Nickisch schrieb:
> Gib es ein feature, das automatisch bei jeder neu-Kompilierung die
> Build-nummer um eins erhöht und bei jeder Komplett-Neuerstellung
> ausserdem die Versionsnummer ?

Willst du das wirklich, bei jeder einzelnen Kompilierung eine Nummer 
erhöhen? Nummerieren musst du nur, was du irgendwo verwahrst oder was du 
nach außen gibst.

99 % der Kompilate erzeugst du nur für deinen eigenen Schreibtisch, die 
werden auch nirgendwo archiviert, stimmts? Also wozu die alle zählen?

von tuppes (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Bernhard schrieb:
>> Meines Wissens gibt es sowas wie eine Versionsnummer nur mit einem
>> Versionverwaltunsgsystem wie rcs, cvs, oder subversion. Da wird im
>> source code ein id-string hinterlegt, der beim ein- und auschecken
>> verändert wird.
>
> Der ändert seinen Wert aber nur bei einem Commit dieser Datei, d.h. um
> hier so eine Build-Nummer zu bekommen, müßtest du bei jedem
> Compiliervorgang die Datei verändern und dann commiten.

Das ist ein sinnvoller Ansatz. Was wertvoll genug ist, um im SCCS zu 
landen, ist auch wertvoll genug für eine Buildnummer. So könnte man es 
machen.

Nicht jeder Zwischenstand, bei dem man nur die Debugausgaben geändert 
hat, muss eine eigene Buildnummer haben.

von Andreas F. (aferber)


Lesenswert?

tuppes schrieb:
> 99 % der Kompilate erzeugst du nur für deinen eigenen Schreibtisch, die
> werden auch nirgendwo archiviert, stimmts? Also wozu die alle zählen?

Ack. Eine Build-Nummer ist nur dann sinnvoll, wenn später der exakte für 
den Build verwendete Sourcecode reproduzierbar ist, ergo alles was in 
ein VCS eingecheckt wurde.

Eine bei jedem make hochgezählte Nummer ist wertlos, da das erstens 
nicht reproduzierbar ist, und zweitens wird das inkonsistent, sobald es 
mehr als eine Arbeitskopie gibt. Letzteres lässt sich i.d.R. spätestens 
dann nicht mehr vermeiden, wenn man mit mehreren Leuten an dem Projekt 
arbeitet, aber selbst alleine schränkt man sich mit nur einer Working 
Copy IMO sehr ein.

Allerdings sollte man irgendwie über den Build-Prozess dafür sorgen, 
dass wirklich nur ein aus einem komplett eingecheckten Source gebautes 
Image eine "Buildnummer" bekommt. Bei lokal geänderten Sourcen, z.B. 
zwecks Debugging, sollte das Feld dann z.B. mit "DEV" oder ähnlichem 
gefüllt werden, damit eindeutig erkennbar ist, dass es sich um einen 
"Bastel-Build" handelt.

Andreas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.