Frage

Für diejenigen, die nicht mit IDL (Interface Language), abstrahiert Datenbeschreibung für den Einsatz auf verschiedenen Plattformen (Java, C, C ++, etc.). Mein Projekt hat Abhängigkeiten Foo.c, foo.h, FooHelper.c und FooHelper.h, die aus Foo.idl erzeugt werden. Wie führe ich einen beliebigen Befehl, wenn Foo.idl ändert, aber immer noch ist Foo.c, FooHelper.c, in dem Build-Prozess?

hinzufügen Meine aktuellen Versuche, eine Regel auf die Makefile.am - die Hoffnung ist, dass die Herrschaft über auf die erzeugte Makefile kopiert

.

Ich habe versucht:

Foo.idl : Foo.idl
 ${the_generate_command}

und dann Foo.idl zu my_program_SOURCES hinzugefügt aber nicht the_generate_command lief beim Bau.

Ich habe Erzeugungs hatte Erfolg aus der IDL mit

Foo.c Foo.h FooHelper.h FooHelper.c : Foo.idl
 ${the_generate_command}

Aber es wird nicht Foo.c, FooHelper.c zum Kompilieren hinzufügen, so sind sie nie gebaut, nur durch the_generate_command erzeugt!

Der gesamte Code (einschließlich der IDL) ist in $ project_dir / src.

War es hilfreich?

Lösung

rq Antwort ist fast richtig, aber vermisst ein paar Feinheiten. Versuchen Sie folgendes:

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

Die zusätzlichen Regeln zu „erzeugen“ Foo.h, FooHelper.h und FooHelper.c von Foo.c dass parallel gewährleisten baut nicht versuchen und laufen $(THE_GENERATE_COMMAND) zweimal. Es ist ein Idiom detailliert in dem Automake Handbuch , die parallel baut arbeiten für. Es ist noch ein wenig Zerbrechlichkeit hier: wenn der Benutzer entfernt (sagen wir) FooHelper.h und FooHelper.c und eine parallel machen beginnt, kann es die $(MAKE) $(AM_MAKEFLAGS) $< Erholung Teil der Regel mehrfach parallel ausgeführt werden. Wie das Handbuch sagt, kann dieses Rennen nur gehen, wenn der Benutzer manuell verstümmelt den Build-Baum passieren, und selbst dann nichts, es ist ein make clean; make kann nicht fix.

Die BUILT_SOURCES Linie sorgt dafür, dass Foo.c, Foo.h, FooHelper.h und FooHelper.c gebaut werden, bevor sie zu bauen myprogram versuchen (siehe dieser Abschnitt der Automake Handbuch zu sehen, warum das Hinzufügen sie nur zu myprog_SOURCES nicht ausreicht). Die EXTRA_DIST Variable stellt sicher, dass die .idl Datei von make dist aufgenommen wird ( Referenz ).

MAINTAINERCLEANFILES gibt zusätzliche Dateien zu löschen, wenn make maintainer-clean ausgeführt wird; dies ist mit den GNU Makefile Standards zu erfüllen . Siehe auch die Beschreibung der Variablen in dem Automake Handbuch .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top