2017-06-02 4 views
2

J'ai un projet QPhiX qui utilise GNU Autotools. Il y a un projet très connexe appelé QPhiX-Codegen dont le premier a besoin. Le processus de construction global fonctionne comme ceci:Exécuter un script pendant l'exécution de la configuration

  1. Exécutez make dans QPhiX-Codegen. Cela va compiler le générateur de code et l'exécuter. En cours d'exécution, il créera du code C++ plat.
  2. Exécutez un script Python qui utilise un moteur de modèle pour intégrer ce code C++ plat dans des fichiers d'en-tête complet et de code source. Cela créera également un CMakeLists.txt de sorte que le code généré peut être compilé.
  3. Exécutez cmake et make sur le Makefile généré par cmake pour compiler le code généré dans une bibliothèque statique, libqphix_codegen.a.

Ces trois choses sont enveloppées dans un script Bash que l'on appelle avec ./generate-and-compile $isa $cxx $cxxflags. L'ISA pourrait être AVX2, le compilateur C++ pourrait moi mpiicpc.

Puis un des commutateurs les répertoires à QPhiX et continue le processus de construction:

  1. Run ./configure ... --enable-arch=ISA --with-codegen=path/to/codegen/directory CXX=$CXX CXXFLAGS=$CXXFLAGS pour créer le Makefile. Dans ce Makefile, il aura les drapeaux de compilateur nécessaires pour inclure les fichiers d'en-tête générés et un lien vers libqphix_codegen.a.
  2. Exécutez make sur le Makefile généré par ./configure.

Ce processus expose plus de pas à l'utilisateur que nécessaire. Aussi l'utilisateur doit passer le même drapeau ISA, le même CXX et le même CXXFLAGS à deux scripts différents. Ensuite, ils doivent également mettre dans ce chemin vers le générateur de code dans le ./configure.

Je pense qu'il serait plus pratique pour l'utilisateur d'avoir un générateur de code sous-module git dans le projet QPhiX. Ensuite, le ./configure pourrait simplement exécuter le script codegen/generate-and-compile et lui passer les options.

Ma question est: Comment exécuter un script dans le ./configure? Est-ce que je viens de mettre l'extrait que je veux dans configure.ac? Ce fichier ressemble comme un script shell avec quelques macros, mais je ne suis pas sûr que ce serait le bon endroit pour le mettre.

+0

Voir aussi [27.8 Emulation de drapeaux par objet] (https://www.gnu.org/software/automake/manual/html_node/Per_002dObject-Flags.html) dans le manuel Automake. – jww

Répondre

1

Ce processus expose plus de pas à l'utilisateur que nécessaire. Aussi l'utilisateur doit passer le même drapeau ISA, le même CXX et le même CXXFLAGS à deux scripts différents. Ensuite, ils doivent également mettre dans ce chemin d'accès au générateur de code dans le ./configure.

Ce sont des critiques valides. Le moyen le plus rapide et le plus simple de les traiter serait probablement d'écrire un petit script d'encapsulation. Mais vous demandez,

Comment exécuter un script dans le ./configure? Est-ce que je ne fais que mettre l'extrait que je veux dans ?Ce fichier ressemble comme un shell script avec quelques macros, mais je ne suis pas sûr que ce serait le bon endroit pour le mettre .

configure.ac est entrée pour le processeur de macro m4, en tirant sur la configuration particulière et une bibliothèque de macros fournies par les Autotools et éventuellement d'autres sources. Autoconf le traite avec m4 pour produire le script shell configure. En fin de compte, si vous voulez que configure exécute une commande externe (par exemple un autre script), vous devez écrire cette commande directement dans configure.ac (ce que vous pouvez faire) ou utiliser une macro qui fera que la commande sera émis dans le script de sortie. Il n'y a pas de macro intégrée à usage général pour cela. Vous devez prendre un peu de soin pour éviter ou échapper la syntaxe que m4 va essayer d'interpréter, mais cela peut être fait. En effet, la bibliothèque de macros contient plusieurs exemples de macros qui s'étendent aux commandes externes, telles que les commandes pour exécuter le compilateur.

D'autre part, configure fonctionne par la collecte d'informations et de l'écriture et le lancement autre script config.status. Vous avez la possibilité de provoquer configure pour émettre les commandes que vous voulez exécuter dans config.status; vous le feriez via le second et/ou le troisième argument à AC_CONFIG_FILES. D'autre part, la mise à jour du script de configuration du projet principal pour intégrer automatiquement la génération de code via l'autre projet fusionne efficacement les deux projets. Si je devais faire cela, je serais enclin à effectuer une fusion beaucoup plus profonde que ce que vous semblez proposer. La configuration devrait, en réalité, être limitée à la préparation de Makefiles appropriés. Toute la génération de code et de construction serait mieux gérée par un (éventuellement récursif) make exécuter. Je ne vois aucune raison de penser que cela ne pourrait pas être réalisé dans votre cas, mais la mise en place impliquerait plus de travail.

+0

Il semble que je préfère caler le script de sous-projet de 'make'. Comment est-ce que j'ajouterais une cible au Makefile principal tel que tout dépend de cette cible? –