Ensure that uic is always run before any C++ source is compiled

It's very, very hard to scan for dependencies with a plain make. So
let's give up and simply enforce that all *.ui files need to be
processed before a *.cpp gets compiled.

This introduces the make target "uicables" (similar to the "mocables"
target that qmake produces) that will compile all .ui files. This
target is now a dependency of all .cpp builds.

In addition, tell make where to find .ui files and their corresponding
ui_*.h files.

Signed-off-by: Thiago Macieira <thiago@macieira.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Thiago Macieira 2013-10-03 15:38:50 -07:00 committed by Dirk Hohndel
parent b3b729e629
commit bd1f8b580b
2 changed files with 27 additions and 13 deletions

View file

@ -107,6 +107,18 @@ SOURCES = \
main.cpp \ main.cpp \
$(RESFILE) $(RESFILE)
FORMS = \
qt-ui/about.ui \
qt-ui/divecomputermanagementdialog.ui \
qt-ui/diveplanner.ui \
qt-ui/downloadfromdivecomputer.ui \
qt-ui/maintab.ui \
qt-ui/mainwindow.ui \
qt-ui/preferences.ui \
qt-ui/printoptions.ui \
qt-ui/renumber.ui \
qt-ui/subsurfacewebservices.ui \
qt-ui/tableview.ui
RESOURCES = $(NAME).qrc RESOURCES = $(NAME).qrc
@ -155,7 +167,6 @@ MSGLANGS=$(notdir $(wildcard po/*.po))
# Add files to the following variables if the auto-detection based on the # Add files to the following variables if the auto-detection based on the
# filename fails # filename fails
OBJS_NEEDING_MOC = OBJS_NEEDING_MOC =
OBJS_NEEDING_UIC =
HEADERS_NEEDING_MOC = HEADERS_NEEDING_MOC =
include Rules.mk include Rules.mk

View file

@ -38,6 +38,11 @@ MOC_OBJS = $(HEADERS_NEEDING_MOC:.h=.moc.o)
ALL_OBJS = $(OBJS) $(MOC_OBJS) ALL_OBJS = $(OBJS) $(MOC_OBJS)
# handling of uic
UIC_HEADERS = $(patsubst %.ui, ui_%.h, $(subst qt-ui/,,$(FORMS)))
vpath %.ui qt-ui
vpath ui_%.h .uic
# Files for using Qt Creator # Files for using Qt Creator
CREATOR_FILES = $(NAME).config $(NAME).creator $(NAME).files $(NAME).includes CREATOR_FILES = $(NAME).config $(NAME).creator $(NAME).files $(NAME).includes
@ -47,6 +52,8 @@ $(TARGET): gen_version_file $(ALL_OBJS) $(MSGOBJS) $(INFOPLIST)
@$(PRETTYECHO) ' LINK' $(TARGET) @$(PRETTYECHO) ' LINK' $(TARGET)
$(COMPILE_PREFIX)$(CXX) $(LDFLAGS) -o $(TARGET) $(ALL_OBJS) $(LIBS) $(COMPILE_PREFIX)$(CXX) $(LDFLAGS) -o $(TARGET) $(ALL_OBJS) $(LIBS)
uicables: $(UIC_HEADERS)
gen_version_file $(VERSION_FILE): gen_version_file $(VERSION_FILE):
ifneq ($(STORED_VERSION_STRING),$(VERSION_STRING)) ifneq ($(STORED_VERSION_STRING),$(VERSION_STRING))
$(info updating $(VERSION_FILE) to $(VERSION_STRING)) $(info updating $(VERSION_FILE) to $(VERSION_STRING))
@ -178,10 +185,10 @@ MOCFLAGS = $(filter -I%, $(CXXFLAGS) $(EXTRA_FLAGS)) $(filter -D%, $(CXXFLAGS) $
@mkdir -p .dep/$(@D) @mkdir -p .dep/$(@D)
$(COMPILE_PREFIX)$(CC) $(CFLAGS) $(EXTRA_FLAGS) -MD -MF .dep/$@.dep -c -o $@ $< $(COMPILE_PREFIX)$(CC) $(CFLAGS) $(EXTRA_FLAGS) -MD -MF .dep/$@.dep -c -o $@ $<
%.o: %.cpp %.o: %.cpp uicables
@$(PRETTYECHO) ' CXX' $< @$(PRETTYECHO) ' CXX' $<
@mkdir -p .dep/$(@D) @mkdir -p .dep/$(@D)
$(COMPILE_PREFIX)$(CXX) $(CXXFLAGS) $(EXTRA_FLAGS) -MD -MF .dep/$@.dep -c -o $@ $< $(COMPILE_PREFIX)$(CXX) $(CXXFLAGS) $(EXTRA_FLAGS) -I.uic -Iqt-ui -MD -MF .dep/$@.dep -c -o $@ $<
# This rule is for running the moc on QObject subclasses defined in the .h # This rule is for running the moc on QObject subclasses defined in the .h
# files. # files.
@ -203,16 +210,12 @@ MOCFLAGS = $(filter -I%, $(CXXFLAGS) $(EXTRA_FLAGS)) $(filter -D%, $(CXXFLAGS) $
%.qrc: %.qrc:
# This creates the ui headers. # This creates the ui headers.
ui_%.h: %.ui ui_%.h: %.ui .uic
@$(PRETTYECHO) ' UIC' $< @$(PRETTYECHO) ' UIC' $<
$(COMPILE_PREFIX)$(UIC) $< -o $@ $(COMPILE_PREFIX)$(UIC) $< -o .uic/$@
# This forces the creation of ui headers with the wrong path .uic:
# This is required because the -MG option to the compiler outputs $(COMPILE_PREFIX)mkdir $@
# unknown files with no path prefix
ui_%.h: qt-ui/%.ui
@$(PRETTYECHO) ' UIC' $<
$(COMPILE_PREFIX)$(UIC) $< -o qt-ui/$@
share/locale/%.UTF-8/LC_MESSAGES/$(NAME).mo: po/%.po po/%.aliases share/locale/%.UTF-8/LC_MESSAGES/$(NAME).mo: po/%.po po/%.aliases
@$(PRETTYECHO) ' MSGFMT' $*.po @$(PRETTYECHO) ' MSGFMT' $*.po
@ -242,13 +245,13 @@ doc:
clean: clean:
rm -f $(ALL_OBJS) *~ $(NAME) $(NAME).exe po/*~ po/$(NAME)-new.pot \ rm -f $(ALL_OBJS) *~ $(NAME) $(NAME).exe po/*~ po/$(NAME)-new.pot \
$(VERSION_FILE) $(HEADERS_NEEDING_MOC:.h=.moc) *.moc qt-ui/*.moc qt-ui/ui_*.h $(VERSION_FILE) $(HEADERS_NEEDING_MOC:.h=.moc) *.moc qt-ui/*.moc .uic/*.h
rm -f $(RESOURCES:.qrc=.qrc.cpp) rm -f $(RESOURCES:.qrc=.qrc.cpp)
rm -rf share rm -rf share
confclean: clean confclean: clean
rm -f $(CONFIGFILE) rm -f $(CONFIGFILE)
rm -rf .dep rm -rf .dep .uic
distclean: confclean distclean: confclean
rm -f $(CREATOR_FILES) rm -f $(CREATOR_FILES)