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.

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top