Quelle est la meilleure façon d'insérer la version et les informations de voûte dans les sources de C?

StackOverflow https://stackoverflow.com/questions/2096709

Question

Je veux que mon programme C ++ pour inclure une option « --version » qui lui fait imprimer:

  • Architecture il est compilé pour
  • Version de la source (par exemple, v0.1.0)
  • Nom de l'application

J'utilise aussi autoconf / automake pour la première fois, et je remarque que configure.ac a à la fois le binaire et la version. Il n'a pas d'informations d'architecture, et je ne veux pas ajouter ces informations, puisque je serai compilation sous plusieurs arcs.

Y at-il un moyen facile d'automatiser l'insertion de la version / arch / appname informations dans un fichier d'en-tête ou d'une source? Comment la plupart des C ++ codeurs font?

Était-ce utile?

La solution

autoconf vous donne un config.h, qui fournit des macros de chaîne telles que PACKAGE, PACKAGE_NAME, PACKAGE_STRING, PACKAGE_VERSION et VERSION.

(Quand j'utilise l'analyseur argument argp , J'utilise simplement

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <argp.h>
const char *argp_program_version = PACKAGE_STRING;
const char *argp_program_bug_address = PACKAGE_BUGREPORT;
/* et cetera */
int main(int argc, char **argv) {
    error_t argp_result = argp_parse(&argp, argc, argv, 0, 0, NULL);
    if (argp_result) return argp_result;
    /* et cetera */
}

puis --help, --version, etc. fonctionne tout simplement automatiquement.)

Vous pouvez également ajouter

AC_CANONICAL_HOST
AC_DEFINE_UNQUOTED([CHOST], ["$host"], [Canonical host])
AC_CANONICAL_BUILD
AC_DEFINE_UNQUOTED([CBUILD], ["$build"], [Canonical build])
AC_CANONICAL_TARGET
AC_DEFINE_UNQUOTED([CTARGET], ["$target"], [Canonical target])

à votre configure.ac, si vous voulez avoir les macros de chaîne dans votre config.h aussi. Ce sont généralement des chaînes de la forme $arch-$vendor-$kernel-$libc, où
CHOST est la plate-forme qui run le logiciel après sa construction,
CBUILD est la plate-forme qui est en train de construire le logiciel, et
CTARGET est la plate-forme du logiciel agir.
(Ce sont tous les mêmes, sauf si vous faites une compilation croisée ou la construction d'une chaîne d'outils de compilation croisée.)

Autres conseils

Ecrire un script python qui génère votre fichier source de version. Ensuite, faire fonctionner par tous les build scripts / outil que vous utilisez.

Choisissez une règle de réécrire effectivement le fichier de la version et l'appliquer dans le script python:. Il est vraiment dépendant du type d'organisation du projet et la libération que vous faites


Dans mon projet de la maison, j'utiliser un script qui génère un fichier de version à chaque fois que je construis, parce que je dois savoir Wich ordinateur développeur construit la version et à laquelle on arrive le temps.

Mais dans un grand nombre d'œuvres d'emploi j'ai utilisé un script qui a généré le fichier de version, mais seulement si je le voulais. En effet, l'équipe de développement a décidé quand une version spécifique était une « libération ».

J'ai suggéré l'aide d'un script Python parce que Python fonctionne sur toutes les plates-formes et developement est vraiment puissant et facile en matière de manipulations des fichiers texte. Il peut alors être appelé par tout système de construction (Visual Studio, CMake, etc.) que vous utilisez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top