2016-04-08 7 views
2

Basierend auf this link, erstellte ich ein Autotools-based Build-System, das Qt UI und RSC-Dateien akzeptiert, ohne QMAKE aufrufen zu müssen.Qt Automake separate Include, ui, Ressourcenordner

ich aber möchte die Quelle, Kopf- und ui-Dateien in Ordnern in der folgenden Art und Weise trennen:

${srcdir} 
├── Makefile.am 
├── main.cc 
├── include 
│   └── mainwidget.h 
├── src 
│   └── mainwidget.cc 
└── ui 
    └── mainwidget.ui 

Und das Build-Verzeichnis auf folgende Weise bestellt haben

${builddir} 
├── include 
│   └── ui_mainwidget.h 
├── Makefile 
├── main.o 
├── mainwidget.o 
└── moc_mainwidget.o 

Meine Makefile.am sieht derzeit so aus:

moc_%.cc: %.h 
    @[email protected] [email protected] $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(MOC_CPPFLAGS) $< 

ui_%.h: %.ui 
    @[email protected] -o [email protected] $< 

qrc_%.cc: %.qrc 
    @[email protected] -o [email protected] $< 

bin_PROGRAMS = qthello 
BUILT_SOURCES = ui_mainwidget.h 

qthello_CXXFLAGS = -I$(srcdir)/include -I$(builddir)/include 
qthello_CPPFLAGS = $(QT_CPPFLAGS) 

qthello_LDFLAGS = $(QT_LDFLAGS) 
qthello_LDADD = $(QT_LIBS) 

qthello_SOURCES =  \ 
    moc_mainwidget.cc \ 
    mainwidget.cc  \ 
    main.cc 

Das funktioniert gut, wenn die ui-cl ass-Dateien befinden sich in $ (srcdir), aber sie einfach in die gewünschten Verzeichnisse zu verschieben und die erwarteten Zeilen in Makefile.am zu ändern, führt nicht zum gewünschten Ergebnis. Das heißt, diese Änderungen zu tun nicht:

BUILT_SOURCES = include/ui_mainwidget.h 
[ ... ] 
qthello_SOURCES =   \ 
    src/moc_mainwidget.cc \ 
    src/mainwidget.cc  \ 
    main.cc 

Es fällt mir ein, dass einige Änderungen an den Build-Regeln getroffen werden müssen, um sicherzustellen, dass die sind, src, ui -directories in $ existieren (builddir), und dass die richtigen Eingabedateien übergeben werden. Ich bin jedoch unerfahren beim Schreiben solcher Build-Regeln und Google scheint nicht die Antwort zu haben.

Gibt es irgendwelche tragbaren Möglichkeiten, dies zu erreichen?

Antwort

1

Also habe ich schließlich eine Lösung gefunden, dank this post.

Es folgt die letzte Makefile.am

moc_%.cc: ../include/%.h 
    $(MKDIR_P) $(@D) 
    @[email protected] [email protected] $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(MOC_CPPFLAGS) $< 

ui_%.h: ../ui/%.ui 
    $(MKDIR_P) $(@D) 
    @[email protected] -o [email protected] $< 

qrc_%.cc: %.qrc 
    $(MKDIR_P) $(@D) 
    @[email protected] -o [email protected] $< 

clean-local: 
    rm -rf ui/ include/ 

bin_PROGRAMS = qthello 

BUILT_SOURCES =    \ 
    include/ui_mainwidget.h 

qthello_CXXFLAGS =   \ 
     -I$(srcdir)/include \ 
     -I$(builddir)/include 

qthello_CPPFLAGS = $(QT_CPPFLAGS) 

qthello_LFLAGS = $(QT_LDFLAGS) 
qthello_LDADD = $(QT_LIBS) 

qthello_SOURCES =    \ 
    ui/moc_mainwidget.cc  \ 
    src/mainwidget.cc   \ 
    main.cc 

Beachten Sie, dass AC_PROG_MKDIR_P zu configure.ax hinzugefügt werden müssen.

+1

Wissen Sie nicht, wie allgemein diese Lösung ist - Gebäude außerhalb des Quellbaums, usw.? - Aber es ist immer noch eine sehr nützliche Frage und Antwort. Baut auch nach den Prinzipien des 'COMPILE'-Makros von' Makefile.in' auf. Schön gemacht:) –