Génération des entités IDL utilisant automake / Makefile.am
-
26-09-2019 - |
Question
Pour ceux qui ne connaissent IDL (langage de description de l'interface), elle encapsule la description des données pour les plates-formes (java, c, c ++, etc.). Mon projet a des dépendances Foo.c, foo.h, FooHelper.c et FooHelper.h qui sont générés à partir Foo.idl. Comment puis-je exécuter une commande arbitraire quand Foo.idl change, mais comprennent toujours Foo.c, FooHelper.c, dans le processus de construction?
Mes tentatives actuelles ajouter une règle à la Makefile.am - l'espoir est que la règle est copiée dans le Makefile
.J'ai essayé:
Foo.idl : Foo.idl
${the_generate_command}
et ensuite ajouté à Foo.idl my_program_SOURCES mais il ne fonctionne pas the_generate_command lors de la construction.
J'ai eu génératrice de succès de l'IDL avec
Foo.c Foo.h FooHelper.h FooHelper.c : Foo.idl
${the_generate_command}
Mais il ne sera pas ajouter Foo.c, FooHelper.c au processus de compilation, de sorte qu'ils ne sont jamais construit, juste généré par the_generate_command!
Tout le code (y compris le IDL) est en $ PROJECT_DIR / src.
La solution
La réponse de rq est presque correcte, mais manque quelques subtilités. Essayez ceci:
bin_PROGRAMS = myprogram
myprogram_SOURCES = Foo.c Foo.h FooHelper.h FooHelper.c $(OTHER_SOURCES)
BUILT_SOURCES = Foo.c Foo.h FooHelper.h FooHelper.c
EXTRA_DIST = Foo.idl
MAINTAINERCLEANFILES = Foo.c Foo.h FooHelper.h FooHelper.c
Foo.c: Foo.idl
$(THE_GENERATE_COMMAND)
Foo.h FooHelper.h FooHelper.c: Foo.c
@if test -f $@; then \
touch $@; \
else \
## Recover from the removal of $@
rm -rf $<; \
$(MAKE) $(AM_MAKEFLAGS) $<; \
fi
Les règles supplémentaires à « générer » Foo.h
, FooHelper.h
et FooHelper.c
de Foo.c
faire en sorte que des constructions parallèles ne seront pas essayer de courir $(THE_GENERATE_COMMAND)
deux fois. Il est un idiome détaillé dans le manuel Automake qui travaillera pour construit en parallèle. Il y a encore un peu de fragilité ici: si les supprime de l'utilisateur (par exemple) FooHelper.h
et FooHelper.c
et commence une marque parallèle, il peut exécuter la partie de récupération de $(MAKE) $(AM_MAKEFLAGS) $<
de la règle plusieurs fois en parallèle. Comme le manuel dit, cette course ne peut va se passer si les mutile manuellement utilisateur l'arbre de construction, et même alors, il n'y a rien d'un make clean; make
ne peut pas fixer.
Les ligne de garantit que BUILT_SOURCES
Foo.c
, Foo.h
, FooHelper.h
et FooHelper.c
sont construits avant d'essayer de myprogram
(voir cette section du manuel Automake pour voir pourquoi il suffit de les ajouter à myprog_SOURCES
est insuffisante). La variable EXTRA_DIST
assure que le fichier .idl
sera capturé par make dist
( référence ).
MAINTAINERCLEANFILES
spécifie des fichiers supplémentaires à supprimer lors de l'exécution make maintainer-clean
; est de se conformer à la Makefile GNU Normes . Voir aussi la description de la variable dans le manuel Automake .