2 votes

Comment ajouter une étape de compilation personnalisée à un projet basé sur automake dans KDevelop ?

J'ai récemment commencé à travailler sur un projet de codage personnel en utilisant C++ et KDevelop. Bien que j'aie commencé en bidouillant, je me suis dit que ce serait mieux à long terme si je mettais en place une véritable suite de tests unitaires avant d'aller plus loin. J'ai créé un exécutable test-runner séparé en tant que sous-projet, et les tests que j'y ai ajoutés semblent fonctionner correctement. Jusqu'à présent, c'est un succès.

Cependant, j'aimerais vraiment que mes tests unitaires soient exécutés à chaque fois que je construis, et pas seulement lorsque je les exécute explicitement. Cela sera d'autant plus vrai que je divise le désordre que j'ai fait en bibliothèques de commodité, dont chacune aura probablement son propre exécutable de test. Plutôt que de les exécuter tous à la main, j'aimerais qu'ils s'exécutent à la dernière étape de mon processus de construction. J'ai regardé toutes les options du menu projet et du gestionnaire automake, mais je n'arrive pas à comprendre comment mettre cela en place.

J'imagine que cela peut être fait en éditant le fichier makefile à la main. Malheureusement, mon makefile-fu est un peu faible, et j'ai aussi peur que KDevelop écrase les changements que je fais à la main la prochaine fois que je change quelque chose dans l'IDE. Par conséquent, s'il y a une option sur la façon de faire cela à travers KDevelop lui-même, je préférerais de loin aller dans cette direction.

Est-ce que quelqu'un sait comment je peux faire en sorte que KDevelop exécute mes exécutables de test dans le cadre du processus de construction ? Merci d'avance !

(Je ne suis pas 100% lié à KDevelop. Si KDevelop ne peut pas faire cela, ou bien s'il y a un IDE qui rend cela beaucoup plus facile, je pourrais être convaincu de changer).

3voto

vog Points 3334

Bien que vous pourrait manipuler la cible `make` par défaut pour exécuter vos tests, ce n'est généralement pas recommandé, car chaque invocation de

make

exécuterait tous les tests. Vous devriez plutôt utiliser la cible "check", qui est une quasi-norme acceptée parmi les logiciels. En faisant cela, les tests ne sont lancés que lorsque vous exécutez un test, les tests ne sont lancés que lorsque vous exécutez

make check

Vous pouvez alors facilement configurer KDevelop pour qu'il exécute "make check" au lieu de "make".

Puisque vous utilisez automake (à travers KDevelop), vous n'avez pas besoin d'écrire la cible "check" vous-même. A la place, éditez simplement votre `Makefile.am` et définissez quelques variables :

TESTS = ...

Jetez un coup d'œil à la page documentation automake, "Support pour les suites de tests" pour plus d'informations.

0voto

Caruccio Points 124

J'ai réussi à le faire fonctionner de cette manière :

$ cat src/base64.c
//code to be tested
int encode64(...) { ... }

#ifdef UNITTEST
#include <assert.h>
int main(int argc, char* argv[])
{
  assert( encode64(...) == 0 );
  return 0;
}
#endif //UNITTEST
/* end file.c */

$ cat src/Makefile.am
...
check_PROGRAMS = base64-test
base64_test_SOURCES = base64.c
base64_test_CPPFLAGS = -I../include -DUNITTEST
TESTS = base64-test

A faire un contrôle construirait src/base64-test et l'exécuterait :

$ make check
...
PASS: base64-test
==================
All 1 tests passed
==================
...

J'essaie maintenant d'encapsuler le tout dans une macro m4 à utiliser comme suit :

MAKE_UNITTEST(base64.c)

ce qui devrait produire quelque chose comme la solution ci-dessus.

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X