Est-il judicieux d'écrire des scripts de construction en C ++?

15

J'utilise CMake pour générer mes projets IDE / makefiles, mais j'ai encore besoin d'appeler des "scripts" personnalisés pour manipuler mes fichiers compilés ou même générer du code.

Dans les projets précédents, j'utilisais Python et c'était OK, mais maintenant j'ai de la difficulté à gérer beaucoup de dépendances dans deux très gros projets sur lesquels je travaille, donc je veux minimiser les dépendances partout.

Quelqu'un m'a suggéré d'utiliser C ++ pour écrire mes scripts de build au lieu d'ajouter une dépendance de langage juste pour cela. Les projets eux-mêmes utilisent déjà C ++ donc je peux voir plusieurs avantages:

  • pour construire l'ensemble du projet, seuls un compilateur C ++ et CMake seraient nécessaires, rien d'autre (toutes les autres dépendances sont C ou C ++);
  • La sécurité de type C ++ (lors de l'utilisation de C ++ moderne) rend tout plus facile à obtenir "correct";
  • c'est aussi le langage que je connais le mieux donc je suis plus à l'aise avec lui même si je suis capable d'écrire du bon code Python;
  • gain potentiel de vitesse d'exécution (mais je ne pense pas que ce sera vraiment perceptible);

Cependant, je pense qu'il pourrait y avoir quelques inconvénients et je ne suis pas sûr de l'impact réel car je n'ai pas encore essayé:

  • pourrait être plus long pour écrire le code (cela dit, je ne suis pas sûr car je suis assez efficace en C ++ pour écrire quelque chose qui fonctionne rapidement, donc peut-être pour ce système ce ne serait pas si long à écrire) (le temps de compilation ne devrait pas t être un problème pour ce cas);
  • Je dois supposer que tous les fichiers texte que je vais lire en entrée sont en UTF-8, je ne suis pas sûr que cela puisse être facilement vérifié lors de l'exécution en C ++ et le langage ne le vérifiera pas pour vous;
  • les bibliothèques en C ++ sont plus difficiles à gérer que dans les langages de script;

Je manque d'expérience et de clairvoyance, il me manque donc peut-être des avantages et des inconvénients. La question est donc: est-il judicieux d'utiliser C ++ pour cela? avez-vous des expériences à signaler et voyez-vous des avantages et des inconvénients qui pourraient être importants?

Klaim
la source
1
Dépendre d'un seul interprète de langue pour la construction ne semble pas trop mal, d'autant plus que c'est Python - très portable, répandu sur Linux et facilement disponible sur Windows. Si vous avez besoin de bibliothèques Python supplémentaires, vous pouvez utiliser virtualenv et il n'ajoutera rien d'autre qu'un fichier Python (que vous pourriez expédier) une connexion Internet et un peu de plomberie pour configurer le virtualenv, les installer dans le, et exécuter votre réel construire des scripts dans cet environnement. Vous pouvez obtenir un script supplémentaire dans votre build et une connexion Internet comme exigence.
Vous pouvez évaluer le codage du texte avec une assez bonne fiabilité.
DeadMG
@DeadMG Ouais, mais le faire à la main si beaucoup trop de travail (si vous voulez une bonne supposition et ne vous limitez pas à "est-ce ascii ou unicode, et si c'est unicode, combien de bits et quel ordre d'octets?") Et l'ajout d'une autre dépendance (s'il existe une bibliothèque libre et autonome pour cela) vainc le point de passer en C ++ pour arrêter en fonction de Python.
@delnan Oui mais il reste encore plus de langue à installer. D'après votre description, toute dépendance supplémentaire ne semblerait pas "trop ​​mauvaise" mais je la considère car il y a déjà beaucoup à gérer, donc cela peut aider à limiter les langues utilisées. J'utilise également un langage de script intégré (implémenté en C ++ directement dans le projet), javascript / HTML / CSS, XML et d'autres formats qui sont déjà beaucoup à garder à l'esprit.
Klaim
2
qu'allez-vous utiliser pour construire votre script de construction c ++?
jk.

Réponses:

24

Utilisez simplement Python.

Je développe en C ++ et je fais mes scripts de build en Python, et je trouverais pénible de faire des scripts de build en C ++:

  • Python rend trivial la manipulation de dictionnaires, de listes, de dictionnaires imbriqués de dictionnaires de listes, etc. (Par exemple, l'un de mes scripts utilise une hiérarchie à plusieurs niveaux de tous mes outils, versions d'outils et chemins des versions d'outils. ) C ++ peut faire de même avec les modèles et les classes personnalisées, mais il est beaucoup plus détaillé (ce qui se traduit par plus de lignes de code, ce qui se traduit généralement par une baisse de productivité).
  • Python fournit des bibliothèques et des routines de haut niveau telles que sa gestion XML et JSON, son sous - processus et os.walk . Encore une fois, C ++ peut le faire, mais c'est beaucoup plus de travail pour trouver les bibliothèques, apprendre leurs API, assembler correctement les appels (qui sont souvent de niveau inférieur), etc.
  • Les scripts de construction sont une activité sans valeur ajoutée (pour emprunter un terme au lean). Il vaut mieux utiliser un langage aussi avancé que possible, pour les faire le plus rapidement possible, pour se remettre au travail qui profite à vos utilisateurs.
  • D'après mon expérience, les scripts de construction ont tendance à croître de manière imprévue. Même si une tâche semble initialement simple pour C ++, elle peut se compliquer rapidement. Lorsqu'une nouvelle exigence apparaît, il est souvent beaucoup plus simple de gérer la manipulation dans un script Python que de le faire en C ++ (ce qui peut nécessiter la recherche ou la lecture de nouvelles API de bibliothèque, etc.).

Concernant les avantages que vous listez pour C ++:

  • L'ajout d'une seule dépendance (Python) ne devrait pas compliquer considérablement votre build. C'est déjà standard sur la plupart des installations Linux, par exemple. Grâce aux bibliothèques «batteries incluses» de Python, il peut même être plus facile à gérer que les bibliothèques C ++ dont vos scripts de construction dépendraient.
  • La sécurité de type que C ++ donne est la plus utile pour les grands projets, pas les petits scripts.
  • Python complète très bien le C ++ (haut niveau contre bas niveau, typé dynamiquement contre statiquement, etc.) et peut même très bien s'intégrer avec C ++ (grâce à SWIG et Boost.Python) si vous voulez le faire plus tard, c'est donc vaut la peine d'apprendre pour un programmeur C ++.
  • Comme vous l'avez dit, la vitesse d'exécution ne devrait pas être un problème.
Josh Kelley
la source
Nous l'avons fait (builds python) après un an de lutte avec cmake sur un projet cross paltform. Au final, nous n'avons même pas pris la peine d'essayer de faire une vérification de dépendance (la partie la plus complexe d'une build). Puisque pour les builds automatisés, vous voulez tout reconstruire de toute façon et en C ++ il y a tellement de dépendances complexes
Martin Beckett
1

Je pense que cette question est spécifique à chaque cas. Je dirais qu'il n'y a pas de bonne réponse, que ce soit logique ou non d'utiliser C ++ pour les scripts de construction, la seule façon de le comprendre est de l'essayer dans la pratique.

Personnellement, je verrais Python supérieur à C ++ en raison d'une meilleure expressivité du langage et d'outils de bibliothèque standard plus faciles (opinion personnelle, bien sûr) pour gérer la tâche de manipulation des fichiers binaires et de génération de code. Bien sûr, des bibliothèques sophistiquées développées pour la tâche peuvent être disponibles, mais sinon, je parierais certainement que Python sera la réponse "plus souvent correcte" - dans le cas général.

zxcdw
la source
1

N'écrivez pas vous-même des scripts, vous dupliquez vos efforts et réinventez les roues.

Utilisez quelque chose comme SCONS ou même Maven 3 qui prend en charge les systèmes de construction C ++ .

Un bon système de construction, quelle que soit la langue, ne devrait pas nécessiter de logique personnalisée sous forme de scripts pour créer un artefact exécutable fonctionnel.

Si vous devez écrire des scripts pour un système de build pour le personnaliser, ce n'est pas un bon système de build. Écrire un plugin pour un système de build est une autre histoire, mais cela devrait être très particulier à un environnement / matériel principalement, et devrait être quelque chose qui est rarement utilisé.


la source
1
Comme je l'ai expliqué, j'utilise déjà cmake mais j'ai encore besoin de scripts personnalisés. Je parle de ces scripts personnalisés, pas du processus de construction lui-même.
Klaim
1
J'adore Maven - le script nécessaire pour construire un programme C "Hell World" est plus long que le programme!
quant_dev
@quant_dev, je me souviens de la première fois que j'ai cherché à utiliser Maven, sur leur propre page Web, ils recommandent de commencer avec quelqu'un qui connaît déjà maven, car il est difficile de configurer la première fois. C'était le premier signe que je ne voulais rien avoir à faire avec ça!
Brady
J'ai aimé les SCons, c'est un peu lent mais très facile à utiliser.
quant_dev
1
@JarrodRoberson J'ai utilisé les "scripts" trop généreusement. Je veux dire ses fichiers de configuration. Je ne sais pas si être déclaratif rend Maven automagiquement plus portable et plus facile à entretenir. Cela le rend cependant moins flexible, ce qui peut être pénible dans les grands projets.
quant_dev
0

Pour se concentrer sur la question:

Est-il judicieux d'écrire des scripts de construction en C ++?

La réponse est un simple non .

La réponse actuellement acceptée fait un zoom sur python et répertorie tout un tas de problèmes valables, mais je voudrais ajouter une raison indépendante du langage:

Vous ne voulez vraiment rien écrire dans un langage compilé si vous pouvez l'aider:

  • Vous aurez besoin d'un script pour démarrer le script!
  • Ou vous devez archiver le script compilé dans le contrôle de code source (et le synchroniser avec les sources archivées!)
  • Le script a soudainement également une configuration de construction pour le script attaché. (Cela doit être maintenu!)

De plus, en allant avec l'autre réponse:

Vous ne voulez probablement pas non plus utiliser un langage de script "brut" pour créer vos scripts de construction (je comprends que les subtilités C ++ seraient gérées par CMake).

Ce que vous devriez probablement faire est de choisir l'une des versions . Systèmes . dehors . . et voyez si on correspond à votre facture. scriptabilité / extensibilité / play-nice-with-CMake / crossplatformness.

Martin Ba
la source