2015-08-24 2 views
0

Je dois générer un .c et un .h à partir d'une spécification de tampon de protocole Google .proto dans ma construction.Comment générer du code source en utilisant un outil externe de configure lui-même?

Actuellement, j'ai suivi l'approche de l'enregistrement manuel des dépendances dans mon fichier généré .h. À savoir, j'ai ajouté plusieurs:

somefilethatincludesthegenerated.$(OBJEXT): mygenerated.h 

et qui, ensemble, avec mes règles pour construire mygenerated.h et mygenerated.c œuvres. Je sais environ BUILT_SOURCES mais cela ne fonctionne que pour make all pas pour make mytarget. J'ai donc voulu explorer la possibilité de générer les sources de configure à la place, comme décrit dans le Automake manual.

Le AC_CONFIG_FILES me permettrait de générer mygenerated.h à partir d'un mygenerated.h.in mais vraiment ce fichier n'est pas destiné à être généré à partir d'un modèle. Les fichiers doivent être générés en utilisant un outil externe appelé protoc. Dans mon dossier Makefile.am la règle pour construire les sources générées est:

mygenerated.c mygenerated.c: myprotofile.proto 
    $(PROTOC) --proto_path=$(srcdir) --c_out=$(builddir) $^ 

Comment obtenir quelque chose de similaire à l'intérieur lui-même configure ?. Ce que je suis après est de construire toujours les sources générées, et avant toute autre cible (BUILT_SOURCES ne fonctionnera pas pour des objectifs autres que all, check, et quelques autres)

+0

Vous devrez compiler le fichier proto pour générer les sources. Jetez un coup d'œil au manuel [protobuf] (https://developers.google.com/protocol-buffers/docs/overview). – petersv

+0

Je le sais déjà, comme il est décrit dans la question elle-même. Maintenant, je veux compiler le fichier proto à partir du script 'configure' lui-même au lieu de le compiler dans le' Makefile' – ecerulm

+0

pourquoi voulez-vous compiler le code dans l'étape 'configure'? 'configure' essaie vraiment de séparer les étapes de * configuration * et * construction *; tu ne devrais pas essayer de les mêler. –

Répondre

2

I à l'aide AC_CONFIG_COMMANDS au lieu succéda de AC_CONFIG_FILES.

donc pour exécuter protoc (ou protoc-c comme dans ce cas) de configure ajouter ce qui suit à configure.ac:

AC_CONFIG_COMMANDS([src/mygenerated.h], 
        [protoc-c --proto_path=src --c_out=src src/myprotofile.proto]) 

Ensuite, lorsque vous exécutez ./configure, vous verrez un

config.status: executing src/mygenerated.h commands 

Notez que Si vous modifiez le fichier .proto, vous devez réexécuter ./configure. C'est un inconvénient de l'approche "générer des sources à partir de configure".