2014-12-10 6 views
9

Ich möchte meine Softwareversion in meinen Code einbetten und später mit einem Befehl wie dem Argument -v oder --version aus dem Programmbinary abrufen. Als Beispiel drucken einige der GNU/Linux-Software-Binärdateien ihre Versionsinformationen, wenn sie mit einem -v oder -V Argument in der Befehlszeile nehmen ls als Beispiel geliefert:korrekte Art zum Codieren/Einbetten der Versionsnummer im Programmcode

$ ls --version 
ls (GNU coreutils) 8.13 
Copyright (C) 2011 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

Gibt es eine Konvention bzw. ein Standard dies tun? Ich habe versucht, nach diesen Informationen zu suchen, aber da ich die richtige Terminologie nicht kannte, führte meine Suche nur zu Versionskontroll-Howto's. Der Softwarecode ist in C++ geschrieben, wenn es hilft, das Problem besser zu lösen.

Antwort

11

Normalerweise für Haupt- und Nebenversionsnummern (wie in, 1.2, 1 Haupt- und 2 ist geringfügig), sie werden meistens direkt in den Code geschrieben, normalerweise als #define (weil Sie sie für bedingte Kompilationen benötigen, zB #if Blöcke).

Sie haben normalerweise eine separate Kopfzeile, die nur diese Definitionen und nichts anderes (außer dem Header-Guard) enthält, um Abhängigkeiten zu minimieren.

Einige Leute verwenden das Build-System (wie cmake), um eine Versionsnummer aus der Versionskontrolle (git, svn, cvs, etc ..) und dann diese Versionsnummer in ihre "Version" -Header zu setzen. Oder sie geben die Versionsnummer in die Build-Systemkonfigurationsdateien ein und fügen sie dann in die Kopfzeile ein, wie auf der cmake tutorial gezeigt. Persönlich mag ich diesen Ansatz nicht, weil er dazu neigt, Ihre Header-Dateien zu oft zu modifizieren und häufige und sinnlose Neukompilierungen zu verursachen.

Ich bevorzuge es, die Versionsnummer in der Header-Datei zu schreiben und dann diese Versionsnummern (Major, Minor, ..) aus dem Header auf das Build-System herausziehen. Dies ist eine andere Sache, die CMake sehr leicht tun kann.

Wenn Sie eine sehr tägliche Versionsnummer in Ihre Software einbetten möchten, z. B. eine Build- oder Revisionsnummer, sollten Sie sie nicht als #define in eine Headerdatei einfügen, sondern als extern const Variable, die Sie in einer cpp-Datei definieren. Zum Beispiel können Sie cmake verwenden, um eine Versionsnummer aus Ihrem Versionskontrollsystem zu ziehen, diese auf die cpp-Datei zu setzen, die diese extern const int revision; Variable definiert (über die cmake-Funktion configure_file), und Ihre Programme mit dieser cpp/object-Datei verknüpfen. Auf diese Weise wird die Revisionsnummer automatisch bei jedem Rebuild in Ihre Programme eingebaut und es wird nicht jedes Mal, wenn es aktualisiert wird, eine vollständige Neukompilierung auslösen (was bei jedem Commit der Fall ist).

Der Punkt ist, dass Haupt- und Nebenversionsnummern nicht häufig genug geändert werden, um irgendeine Art von automatischer Wartung zu erfordern, aber Sie müssen sie manuell nur an einer Stelle schreiben und sie überall dort weiter verbreiten, wo sie relevant sein könnte (Ich würde empfehlen, dass dieser Ort die Header-Datei selbst ist). Es sind nur die Revisions- oder Build-Nummern, die vollständig automatisiert werden müssen (generiert von der Versionskontrolle und überall sonst automatisch verbreitet).

+1

"Ich bevorzuge es, die Versionsnummer in die Header-Datei zu schreiben und dann diese Versionsnummern aus dem Header auf das Build-System zu ziehen."Eine Chance, dass du mehr darüber erfahren könntest, wie CMake das gemacht hat? – Mohan

2

Ich glaube, es ist üblich, die Versionsnummer in einer dedizierten Header-Datei zu halten. Einige Tools können dies automatisch für Sie generieren. Zum Beispiel ist hier, wie Sie es mit CMake tun: http://www.cmake.org/cmake-tutorial/ Siehe Abschnitt „Hinzufügen einer Versionsnummer und projektierter Header-Datei“

+0

Diese Option ist großartig, aber ich frage mich, ob es eine Möglichkeit gibt, dies zu tun, ohne CMake irgendwelche Dateien zu überschreiben. – rien333

Verwandte Themen