2017-09-27 2 views
0

Je travaille avec C++ sur Visual Studio 2015 et utilise Git comme un contrôle source. J'écris une application multiplate-forme et je voudrais que mon application inclue la branche git et le commit à partir duquel elle a été construite.Visual Studio 2015 - Définition d'une variable de préprocesseur avec la branche git et la validation git

Sur les plateformes autres que Visual Studio je mets les lignes suivantes dans mon Makefile:

GIT_CUR_COMMIT := $(shell git rev-parse --verify HEAD) 
GIT_CUR_BRANCH := $(shell git rev-parse --abbrev-ref HEAD) 
DEPS += -DGIT_COMMIT=\"$(GIT_CUR_COMMIT)\" -DGIT_BRANCH=\"$(GIT_CUR_BRANCH)\" 

Et puis dans mon application je code pour lire ces variables préprocesseur et les exposer par programme:

std::string getGitCommit() 
{ 
    #ifdef GIT_COMMIT 
    return GIT_COMMIT; 
    #endif 
    return "unavailable"; 
} 

std::string getGitBranch() 
{ 
    #ifdef GIT_BRANCH 
    return GIT_BRANCH; 
    #endif 
    return "unavailable"; 
} 

Mais dans Visual Studio, il n'y a pas de Makefiles. Comment puis-je définir ces deux variables GIT_CUR_COMMIT et GIT_CUR_BRANCH au moment de la compilation et obtenir le même comportement?

+0

Je construis en utilisant makefiles dans Visual Studio. Donc, "il n'y a pas de makefile" n'est pas un truisme, mais plutôt comment vous choisissez de construire avec Visual Studio. Je suppose que vous utilisez le bâtiment basé sur vcproj? – Yakk

+0

Oui, je suis désolé de ne pas être clair. J'utilise vcproj based building – fx23

Répondre

0

probablement - vous pouvez le faire exactement la même façon VS - Mais je sens que la procédure suivante serait beaucoup plus facile à mettre en œuvre

Dans les propriétés du projet sélectionnez le « Build Events »/« l'événement pré-construction »

Ajouter les commandes suivantes à la ligne de commande

echo | set /p dummyName=#define GIT_CUR_COMMIT > gitparams.h 
git rev-parse --verify HEAD >> gitparams.h 

echo | set /p dummyName=#define GIT_BRANCH >> gitparams.h 
git rev-parse --abbrev-ref HEAD >> gitparams.h 

Cela devrait générer le fichier d'en-tête suivant (gitparams.h) chaque fois que vous compilez votre projet

#define GIT_CUR_COMMIT 8a6b3f147fababda57ddd39262df5aa83bc853c4 
#define GIT_BRANCH master 

Assurez-vous de l'ajouter à .gitignore

Et dans votre code, vous pouvez utiliser

#include "gitparams.h" 

#define ADD_QUOTES_HELPER(s) #s 
#define ADD_QUOTES(s) ADD_QUOTES_HELPER(s) 

std::string getGitCommit() 
{ 
#ifdef GIT_CURR_COMMIT 
    return ADD_QUOTES(GIT_CURR_COMMIT); 
#endif 
    return "unavailable"; 
} 
+0

Depuis que j'écris une application multi-plateforme, j'aimerais que mon code soit aussi similaire que possible sur différentes plateformes. Vous avez mentionné qu'il y a un moyen de faire exactement ce que j'ai fait dans VS. Pourriez-vous s'il vous plaît élaborer ce que c'est? – fx23

+0

Vous pouvez probablement définir des variables d'environnement dans l'étape de pré-construction et l'utiliser dans votre étape de compilation. Mais pourquoi ne pas créer un makefile crossplatform qui va générer le gitparams.h pour vous - donc votre code sera le même pour toutes les plateformes? –

+0

Je pourrais le faire, mais mon code fonctionne déjà avec les variables d'environnement et je préfère ne pas le changer si possible. Pourriez-vous écrire la solution complète avec les variables d'environnement? – fx23