\chapter qmake Concepts

\section1 Introducing qmake

\e qmake is an easy-to-use tool from Trolltech that creates makefiles
for development projects across different platforms.  \e qmake
simplifies the generation of makefiles so that only a few lines of
information are needed to create a makefile.  \e qmake can be used for
any software project whether it is written in Qt or not, although it
also contains additional features to support Qt development.

\e qmake generates a makefile based on the information in a project
file.  Project files are created by the developer. Project files are
usually simple, but can be quite sophisticated if required.
\e qmake can also generate projects for Microsoft Visual studio
without having to change the project file.  

\section1 qmake's Concepts

\section2 The QMAKESPEC environment variable

Before \e qmake can be used to build makefiles, the QMAKESPEC
environment variable must be set to the platform-compiler combination
that is being used on the system.  The QMAKESPEC environment variable
tells qmake where to look to find platform and compiler specific
information.  This ensures that the right libraries are used, and that
the generated makefile uses the correct syntax.  A list of the
currently supported platform-compiler combinations can be found in
qt/mkspecs.  Just set your environment variable to one of the
directories listed.

For example, if you are using Microsoft Visual Studio on Windows, then
you would set the QMAKESPEC environment variable to \e win32-msvc.
If you are using gcc on Solaris then you would set your QMAKESPEC
environment variable to \e solaris-g++.

Inside each of the directories in qt/mkspecs, there is a \e qmake.conf
file which contains the platform and compiler specific information.
These settings are applied to any project that is built using \e
qmake and should not be modified unless you're an expert. For example,
if all your applications had to link against a particular library, you
might add this information to the relevant \e qmake.conf file.

\section2 Project (.pro) files

A project file is used to tell \e qmake the details it needs to know
about creating a makefile for the application.  For instance, a list
of source files and header files that should be put into the project
file; any application specific configuration, such as an extra library
that should be linked against, or an extra include path.

\section3 '#' comments

You can add comments to project files. Comments begin with the '#'
symbol and run to the end of the line.

\section2 Templates

The template variable tells \e qmake what sort of makefile should be
generated for the application. The following choices are available:

\list
\i app - Creates a makefile that builds an application.  This is the
default, so if a template is not specified, this is used.
\i lib - Creates a makefile that builds a library.
\i vcapp - Creates a Visual Studio Project file which builds an application.
\i vclib - Creates a Visual Studio Project file which builds a library.
\i subdirs - This is a special template which creates a makefile which
will go into the specified directories and create a makefile for the
project file and call make on it.
\endlist

\section3 The 'app' template

The 'app' template tells \e qmake to generate a makefile that will build
an application.  When using this template the following \e qmake
system variables are recognized.  You should use these in your .pro
file to specify information about your application.

\list
\i HEADERS - A list of all the header files for the application.
\i SOURCES - A list of all the source files for the application.
\i FORMS - A list of all the .ui files (created using \e{Qt Designer})
for the application.
\i LEXSOURCES - A list of all the lex source files for the application.
\i YACCSOURCES - A list of all the yacc source files for the application.
\i TARGET - Name of the executable for the application. This defaults
to the name of the project file. (The extension, if any, is added
automatically).
\i DESTDIR - The directory in which the target executable is placed.
\i DEFINES - A list of any additional pre-processor defines needed for the application.
\i INCLUDEPATH - A list of any additional include paths needed for the application.
\i DEPENDPATH - The dependency search path for the application.
\i VPATH - The search path to find supplied files. 
\i DEF_FILE - Windows only: A .def file to be linked against for the application.
\i RC_FILE - Windows only: A resource file for the application.
\i RES_FILE - Windows only: A resource file to be linked against for the application.
\endlist

You only need to use the system variables that you have values for,
for instance, if you don't have any extra INCLUDEPATHs then you don't
need to specify any, \e qmake will add in the default ones needed.
For instance, an example project file might look like this:

\code
TEMPLATE = app
DESTDIR  = c:\helloapp
HEADERS += hello.h
SOURCES += hello.cpp 
SOURCES += main.cpp
DEFINES += QT_DLL
CONFIG  += qt warn_on release
\endcode

For items that are single valued, e.g. the template or the destination
directory, we use "="; but for multi-valued items we use "+=" to \e
add to the existing items of that type. Using "=" replaces the item's
value with the new value, for example if we wrote \c{DEFINES=QT_DLL},
all other definitions would be deleted.

\section3 The 'lib' template

The 'lib' template tells \e qmake to generate a makefile that will
build a library.  When using this template, in addition to the system variables
mentioned above for the 'app' template the \e VERSION variable is
supported.  You should use these in your .pro file to specify
information about the library.

\list
\i VERSION - The version number of the target library, for example, 2.3.1.
\endlist

\section3 The 'subdirs' template

The 'subdirs' template tells qmake to generate a makefile that will go
into the specified subdirectories and generate a makefile for the
project file in the directory and call make on it.

The only system variable that is recognised for this template is the
\e SUBDIRS variable.  This variable contains a list of all the
subdirectories that contain project files to be processed.  It is
essential that the project file in the sub directory has the same name
as the subdirectory, so that \e qmake can find it.  For
example, if the subdirectory is called 'myapp' then the project file
in that directory should be called \e myapp.pro in that directory.

\section2 The CONFIG variable

The config variable specifies the options that the compiler should use
and the libraries that should be linked against.  Anything can be
added to the config variable, but the options covered below are
recognised by qmake internally.

The following options control what compiler flags are used:

\list
\i release - The application is to be built in release mode.  This is ignored if 'debug' is specified.
\i debug - The application is to be built in debug mode.
\i warn_on - The compiler should output as many warnings as possible.  This is ignored if 'warn_off' is specified.
\i warn_off - The compiler should output as few warnings as possible.
\endlist

The following options define the type of library/application to be built:

\list
\i qt - The application is a Qt application and should link against the Qt library.
\i thread - The application is a multi-threaded application.
\i x11 - The application is an X11 application or library.
\i windows - 'app' template only: the application is a Windows window application.
\i console - 'app' template only: the application is a Windows console application.
\i dll - 'lib' template only: The library is a shared library (dll).
\i staticlib - 'lib' template only: The library is a static library.
\i plugin - 'lib' template only: The library is a plugin; this enables the dll option.
\endlist

For example, if your application uses the Qt library and you want to
build it as a debuggable multi-threaded application, your project file
will have the following line:

\code
    CONFIG += qt thread debug
\endcode

Note, that you must use "+=", not "=", or \e qmake will not be able to
use the settings used to build Qt as a guide as what type of Qt
library was built.

