![]() |
Qt Extended Home · Build System Home · Reference · User Guide · Internals | ![]() |
See Introduction to QBuild for an introduction to QBuild. This guide shows how to port projects to QBuild.
One of the philosophies of QBuild is to make everything opt-in. Things are off by default and turned on only because the project requested them (directly or indirectly). Part of porting will involve turning on features your project had by default before.
QBuild is not 100% syntax-compatible with qmake.
QBuild does not expand variables inside strings. You must
#VAR="FOO is \$$FOO"
VAR="FOO is $$FOO"
#VAR="FOO is $$FOO, demonstrate catenation"
VAR="FOO is "$$FOO", demonstrate catenation"
To embed a quote character in a quoted string you must escape the character with itself (like in SQL). This compares to qmake's use of backslash as an escape character. These statements are equivalent.
#VAR=one two three
VAR=one two three
#VAR="one two" three
VAR="one two" three
#VAR="one \"two\"" three
VAR="one ""two""" three
For ease of embedding quotes in shell scripts and defines, there are several functions available. See shellQuote(), define_string() and define_value().
QBuild allows a group notation that is handy when defining objects.
#FOO.TYPE=object
#FOO.FOO=foo
#FOO.BAR=bar
FOO [
TYPE=object
FOO=foo
BAR=bar
]
There are a number of changes that must be made. They are described by name or by topic.
None of the implicit variables exposed by qmake are available. The two most used of these have replacements.
#VAR=$$PWD
VAR=$$path(.,project)
#VAR=$$OUT_PWD
VAR=$$path(.,generated)
A number of variables are no longer set by the build system.
#VAR=$$QPEDIR
VAR=$$path(/,generated) # only for projects inside the Qt Extended tree
VAR=$$path(QtopiaSdk:/,generated) # for all projects
#VAR=$$QTOPIA_DEPOT_PATH
VAR=$$path(/,project) # only for projects inside the Qt Extended tree
#VAR=$$QTDIR
CONFIG+=qt embedded
qt_get_qtdir()
VAR=$$QTDIR # returns the path to Qt Embedded in the SDK
#VAR=$$QT_DEPOT_PATH
VAR=$$path(/qtopiacore/qt,existing) # only for projects inside the Qt Extended tree
This function achieved several things at once so there is no simple mapping. In general, the QBuild commands required to replace this function call are a straightforward combinations of options.
The keywords app, lib, plugin and subdirs become the TEMPLATE of the project.
#qtopia_project(app)
TEMPLATE=app
#qtopia_project(lib)
TEMPLATE=lib
#qtopia_project(plugin)
TEMPLATE=plugin
#qtopia_project(subdirs)
TEMPLATE=subdirs
See too the note on subdirs below.
The keyword qtopia becomes a CONFIG value.
#qtopia_project(qtopia app)
TEMPLATE=app
CONFIG+=qtopia
Qt and Qt Embedded apps use CONFIG values too.
#qtopia_project(desktop app)
TEMPLATE=app
CONFIG+=qt
#qtopia_project(embedded app)
TEMPLATE=app
CONFIG+=qt embedded
Non-Qt projects simply omit that CONFIG value.
#qtopia_project(desktop external app)
TEMPLATE=app
#qtopia_project(external app)
TEMPLATE=app
CONFIG+=embedded
The default project type in QBuild is the same as a stub project. Theme projects are no longer special.
#qtopia_project(stub)
#qtopia_project(theme)
The core keyword has no direct replacement. Required Qt and Qt Extended libs are set vi the QT and QTOPIA variables.
# QtCore only
QT=core
# libqtopiabase only
QTOPIA=base
The test keywords are now CONFIG values.
#qtopia_project(unittest)
CONFIG+=unittest
#qtopia_project(integrationtest)
CONFIG+=integrationtest
#qtopia_project(systemtest)
CONFIG+=systemtest
There is no replacement for the server_lib keyword. Server projects are directly included into a single project for building.
There is no qtopia_main CONFIG value. Instead, an application specifies that they support quicklauncher or singleexec by adding them to CONFIG.
# Using QTOPIA_MAIN, quicklaunch compatible
CONFIG+=qtopia quicklaunch
# Using QTOPIA_MAIN, quicklaunch and singleexec compatible
CONFIG+=qtopia quicklaunch singleexec
If the CONFIG value does not include quickalunch then the singleexec CONFIG value indicates the app has a singleexec_main function (instead of using the QTOPIA_MAIN macro).
# A non-quicklaunchable Qtopia app that is singleexec compatible
CONFIG+=qtopia singleexec
# A Qt app that is singleexec compatible
CONFIG+=qt embedded singleexec
# An app that is singleexec compatible
CONFIG+=embedded singleexec
Embedded apps that do not link to Qt and do not have CONFIG+=singleexec will be built as standalone binaries. Apps that link to Qt will not be built unless they have CONFIG+=singleexec (they would end up very large due to the static linking).
The replacement for depends() is MODULES. Generally, the last part of the name is what is required. The exact value is whatever the project you depend on specifies as its MODULE_NAME.
#depends(libraries/handwriting)
MODULES+=handwriting
Fake dependencies are not supported. In most cases, this was to support using headers. A selector notation allows this to work in QBuild.
#INCLUDEPATH+=.../handwriting
#depends(libraries/handwriting,fake)
MODULES+=handwriting::headers
See MODULES for the complete reference on what can be specified using the selector notation and how this is implemented.
Note that is is preferred to use the QTOPIA variable for Qt Extended libs (it matches the QT variable used for Qt libs). Also, some modules will have different names (since there were some name clashes.
#depends(libraries/qtopiamail)
CONFIG+=qtopia
QTOPIA+=mail
These commands are replaced by an object with a list of commands to be run. Note that the name of the object can be used as a selector. See MODULES for the complete reference on what can be specified using the selector notation and how this is implemented.
#dep(CONFIG+=foo)
myobj.TYPE=DEPENDS
myobj.EVAL="CONFIG+=foo"
Multiple values can be on separate objects or on the same object.
#dep(CONFIG+=foo)
#dep(CONFIG+=bar)
myobj.TYPE=DEPENDS
myobj.EVAL=\
"CONFIG+=foo"\
"CONFIG+=bar"
#dep(CONFIG+=foo)
myobj.foo.TYPE=DEPENDS
myobj.foo.EVAL="CONFIG+=foo"
#dep(CONFIG+=bar)
myobj.bar.TYPE=DEPENDS
myobj.bar.EVAL="CONFIG+=bar"
QBuild recognizes two kinds of persisted dependencies. Those that apply only to the current build tree and those that persist into the SDK.
#idep(CONFIG+=foo)
myobj.TYPE=DEPENDS PERSISTED
myobj.EVAL="CONFIG+=foo"
#idep(CONFIG+=foo)
myobj.TYPE=DEPENDS PERSISTED SDK
myobj.EVAL="CONFIG+=foo"
The awkward alternate form where the command is to be run in the same project is simpler.
#idep(CONFIG+=foo,CONFIG)
myobj.TYPE=DEPENDS PERSISTED METOO
myobj.EVAL="CONFIG+=foo"
The no_tr CONFIG value is gone. Instead, all projects must register their ability to be translated by setting STRING_LANGUAGE and LANGUAGES. If the STRING_LANGUAGE is included in LANGUAGES a plural-only translation file is created.
STRING_LANGUAGE=en_US
LANGUAGES=en_US de
The optional variable AVAILABLE_LANGUAGES allows qbuild lupdate to operate on a larger list of languages than is installed. This is primarily aimed at Qt Extended which creates translations for a large number of languages but installs translations for a smaller set.
STRING_LANGUAGE=en_US
LANGUAGES=$$QTOPIA_LANGUAGES
AVAILABLE_LANGUAGES=$$QTOPIA_AVAILABLE_LANGUAGES
The TRANSLATABLES variable is gone. In its place is a conditional sources mechanism.
#TRANSLATABLES+=foo.cpp
#condition:SOURCES+=foo.cpp
mycond.TYPE=CONDITIONAL_SOURCES
mycond.CONDITION=condition
mycond.SOURCES=foo.cpp
There are caveats to the conditional sources mechanism. See conditional_sources Extension for more information.
The build system no longer guesses what system a plugin is for and what type it is. These must be explicitly stated.
PLUGIN_FOR=qt
PLUGIN_TYPE=kbddrivers
PLUGIN_FOR=qtopia
PLUGIN_TYPE=mediaengines
A plugin that is loaded by Qt can depend on Qt Extended (eg. to get qLog) as long as the app that loads the plugin also depends on Qt Extended.
The INSTALLS variable is no longer used. The .hint values are used to locate the install objects. One consequence of this is that some objects need .hint=image added.
#INSTALLS+=foo
foo.hint=image
foo.files=foo.txt
foo.path=/foo
Here is an example .pro file before porting.
qtopia_project(qtopia app)
TARGET=example
CONFIG+=qtopia_main
AVAILABLE_LANGUAGES=en_US
LANGUAGES=$$AVAILABLE_LANGUAGES
FORMS=examplebase.ui
HEADERS=example.h
SOURCES=main.cpp example.cpp
desktop.files=example.desktop
desktop.path=/apps/Applications
desktop.trtarget=example-nct
desktop.hint=nct desktop
INSTALLS+=desktop
pics.files=pics/*
pics.path=/pics/example
pics.hint=pics
INSTALLS+=pics
help.source=help
help.files=example.html
help.hint=help
INSTALLS+=help
target.hint=sxe
target.domain=untrusted
pkg.name=example
pkg.desc=Example Application
pkg.version=1.0.0-1
pkg.maintainer=Qt Extended <info@qtextended.org>
pkg.license=Commercial
Here are the bits that have changed.
#qtopia_project(qtopia app)
TEMPLATE=app
CONFIG+=qtopia
#CONFIG+=qtopia_main
CONFIG+=quicklaunch singleexec
#AVAILABLE_LANGUAGES=en_US
#LANGUAGES=$$AVAILABLE_LANGUAGES
STRING_LANGUAGE=en_US
LANGUAGES=en_US de
#INSTALLS+=desktop
#INSTALLS+=pics
#INSTALLS+=help
Here is the complete exmple application after porting.
TARGET=example
CONFIG+=qtopia
CONFIG+=quicklaunch
CONFIG+=singleexec
STRING_LANGUAGE=en_US
LANGUAGES=en_US de
pkg.name=example
pkg.desc=Example Application
pkg.version=1.0.0-1
pkg.maintainer=Qt Extended <info@qtextended.org>
pkg.license=Commercial
FORMS=examplebase.ui
HEADERS=example.h
SOURCES=main.cpp example.cpp
desktop.hint=nct desktop
desktop.files=example.desktop
desktop.path=/apps/Applications
desktop.trtarget=example-nct
pics.hint=pics
pics.files=pics/*
pics.path=/pics/example
help.hint=help
help.source=help
help.files=example.html
target.hint=sxe
target.domain=untrusted
Here is a third-party library stub.
qtopia_project(stub)
idep(LIBS+=-lasound)
Here is the ported project.
MODULE_NAME=alsa
DEP.libs [
TYPE=DEPENDS PERSISTED SDK
EVAL="LIBS+=-lasound"
]
See also Tasks.
| Copyright © 2009 Trolltech | Qt Extended - Build System Documentation |