2016-04-08 6 views
2

На основе this link я создал систему сборки на основе Autotools, которая принимает файлы Qt UI и RSC без необходимости вызова QMAKE.Qt Automake отдельно включает в себя, ui, папки ресурсов

Я же хочу, чтобы отделить источник, заголовки и UI-файлы в папки в следующем виде:

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

И есть каталог сборки упорядоченного следующим образом

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

Мои В настоящее время Makefile.am выглядит следующим образом:

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 

Это работает отлично, если ui-cl файлы ass находятся в $ (srcdir), но просто перемещая их в нужные каталоги и изменяя ожидаемые строки в Makefile.am, не сглаживает желаемый результат. То есть, делая эти изменения не работает:

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

Это происходит со мной, что некоторые изменения должны быть внесены в правила сборки для того, чтобы включать в себя, ЦСИ, пользовательский интерфейс -directories существуют в ($ builddir), и что передаются правильные входные файлы. Тем не менее я неопытен в написании таких правил сборки, и Google, похоже, не имеет ответа.

Есть ли какие-либо простые переносные способы достижения этого?

ответ

1

Так что в конце концов я нашел решение для этого благодаря this post.

Ниже окончательный 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 

Имейте в виду, что AC_PROG_MKDIR_P должны быть добавлены к configure.ax.

+1

Не знаю, как это общее решение - здание за пределами исходного дерева и т. Д.? - но это по-прежнему очень полезное Q & A. Основывается на принципах макроса 'COMPILE' из правил' Makefile.in'. Красиво сделано :) –