基于this link,我创建了一个基于Autotools的构建系统,该系统无需调用QMAKE即可接受Qt UI和RSC文件。

但是,我希望以以下方式将源文件, header 文件和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
    @MOC@ -o$@ $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(MOC_CPPFLAGS) $<

ui_%.h: %.ui
    @UIC@ -o $@ $<

qrc_%.cc: %.qrc
    @RCC@ -o $@ $<

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类文件位于$(srcdir)中,则效果很好,但是仅将它们移动到所需目录并更改Makefile.am中的预期行不会产生预期结果。也就是说,进行以下更改不起作用:
BUILT_SOURCES = include/ui_mainwidget.h
[ ... ]
qthello_SOURCES =           \
    src/moc_mainwidget.cc   \
    src/mainwidget.cc       \
    main.cc

在我看来,必须对构建规则进行一些更改,以确保$(builddir)中包含include,src和ui目录,并确保传递了正确的输入文件。但是,我在编写此类构建规则方面经验不足,而Google似乎没有答案。

有没有简便的便携式方法可以实现这一目标?

最佳答案

因此,由于this post,我最终找到了解决方案。

以下是最终的Makefile.am

moc_%.cc: ../include/%.h
    $(MKDIR_P) $(@D)
    @MOC@ -o$@ $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(MOC_CPPFLAGS) $<

ui_%.h: ../ui/%.ui
    $(MKDIR_P) $(@D)
    @UIC@ -o $@ $<

qrc_%.cc: %.qrc
    $(MKDIR_P) $(@D)
    @RCC@ -o $@ $<

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中。

10-07 19:04
查看更多