# Copyright 2002-2006 Vladimir Prus
# Copyright 2005 Alo Sarv
# Copyright 2005-2009 Juergen Hunold
#
# Distributed under the Boost Software License, Version 1.0. (See
# accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)

# Qt4 library support module
#
# The module attempts to auto-detect QT installation location from QTDIR
# environment variable; failing that, installation location can be passed as
# argument:
#
# toolset.using qt4 : /usr/local/Trolltech/Qt-4.0.0 ;
#
# The module supports code generation from .ui and .qrc files, as well as
# running the moc preprocessor on headers. Note that you must list all your
# moc-able headers in sources.
#
# Example:
#
#     exe myapp : myapp.cpp myapp.h myapp.ui myapp.qrc
#                 /qt4//QtGui /qt4//QtNetwork ;
#
# It's also possible to run moc on cpp sources:
#
#   import cast ;
#
#   exe myapp : myapp.cpp [ cast _ moccable-cpp : myapp.cpp ] /qt4//QtGui ;
#
# When moccing source file myapp.cpp you need to include "myapp.moc" from
# myapp.cpp. When moccing .h files, the output of moc will be automatically
# compiled and linked in, you don't need any includes.
#
# This is consistent with Qt guidelines:
# http://doc.trolltech.com/4.0/moc.html

import modules ;
import feature ;
import errors ;
import type ;
import "class" : new ;
import generators ;
import project ;
import toolset : flags ;
import os ;
import virtual-target ;
import scanner ;

# Qt3Support control feature
#
# Qt4 configure defaults to build Qt4 libraries with Qt3Support.
# The autodetection is missing, so we default to disable Qt3Support.
# This prevents the user from inadvertedly using a deprecated API.
#
# The Qt3Support library can be activated by adding
# "<qt3support>on" to requirements
#
# Use "<qt3support>on:<define>QT3_SUPPORT_WARNINGS"
# to get warnings about deprecated Qt3 support funtions and classes.
# Files ported by the "qt3to4" conversion tool contain _tons_ of
# warnings, so this define is not set as default.
#
# Todo: Detect Qt3Support from Qt's configure data.
#       Or add more auto-configuration (like python).
feature.feature qt3support : off on : propagated link-incompatible ;

# The Qt version used for requirements
# Valid are <qt>4.4 or <qt>4.5.0
# Auto-detection via qmake sets '<qt>major.minor.patch' 
feature.feature qt : : propagated ;

project.initialize $(__name__) ;
project qt ;

# Save the project so that we tolerate 'import + using' combo.
.project = [ project.current ] ;

# Helper utils for easy debug output
if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
{
    .debug-configuration = TRUE ;
}

local rule debug-message ( message * )
{
    if $(.debug-configuration) = TRUE
    {
        ECHO notice: [qt4-cfg] $(message) ;
    }
}

# Capture qmake output line by line
local rule read-output ( content )
{
    local lines ;
    local nl = "
" ;
    local << = "([^$(nl)]*)[$(nl)](.*)" ;
    local line+ = [ MATCH "$(<<)" : "$(content)" ] ;
    while $(line+)
    {
        lines += $(line+[1]) ;
        line+ = [ MATCH "$(<<)" : "$(line+[2])" ] ;
    }
    return $(lines) ;
}

# Capture Qt version from qmake
local rule check-version ( bin_prefix )
{
    full-cmd = $(bin_prefix)"/qmake -v" ; 
    debug-message Running '$(full-cmd)' ;
    local output = [ SHELL $(full-cmd) ] ;
    for line in [ read-output $(output) ]
    {
        # Parse the output to get all the results.
        if [ MATCH "QMake" : $(line) ]
        {
            # Skip first line of output
        }
        else 
        {
            temp = [ MATCH "([0-9]*)\\.([0-9]*)\\.([0-9]*)" : $(line) ] ;
        }
    }
    return $(temp) ;
}

# Validate the version string and extract the major/minor part we care about.
#
local rule split-version ( version )
{
    local major-minor = [ MATCH ^([0-9]+)\.([0-9]+)(.*)$ : $(version) : 1 2 3 ] ;
    if ! $(major-minor[2]) || $(major-minor[3])
    {
        ECHO "Warning: 'using qt' expects a two part (major, minor) version number; got" $(version) instead ;

        # Add a zero to account for the missing digit if necessary.
        major-minor += 0 ;
    }

    return $(major-minor[1]) $(major-minor[2]) ;
}

# Initialize the QT support module. 
# Parameters:
# - 'prefix'    parameter tells where Qt is installed.
# - 'full_bin'  optional full path to Qt binaries (qmake,moc,uic,rcc)
# - 'full_inc'  optional full path to Qt top-level include directory
# - 'full_lib'  optional full path to Qt library directory
# - 'version'   optional version of Qt, else autodetected via 'qmake -v'
# - 'condition' optional requirements 
rule init ( prefix : full_bin ? : full_inc ? : full_lib ? : version ? : condition * )
{
    project.push-current $(.project) ;

    debug-message "==== Configuring Qt ... ====" ;
    for local v in version cmd-or-prefix includes libraries condition
    {
        if $($(v))
        {
            debug-message "  user-specified "$(v): '$($(v))' ;
        }
    }

    # Needed as default value
    .prefix = $(prefix) ;

    # pre-build paths to detect reinitializations changes
    local inc_prefix lib_prefix bin_prefix ;
    if $(full_inc)
    {
        inc_prefix = $(full_inc) ; 
    }
    else
    {
        inc_prefix = $(prefix)/include ;
    }
    if $(full_lib)
    {
        lib_prefix = $(full_lib) ;
    }
    else
    {
        lib_prefix = $(prefix)/lib ;
    }
    if $(full_bin)
    {
        bin_prefix = $(full_bin) ;
    }
    else
    {
        bin_prefix = $(prefix)/bin ;
    }

    # Globally needed variables
    .incprefix = $(inc_prefix) ;
    .libprefix = $(lib_prefix) ;
    .binprefix = $(bin_prefix) ;

    if ! $(.initialized)
    {
        # Make sure this is initialised only once
        .initialized = true ;

        # Generates cpp files from header files using "moc" tool
        generators.register-standard qt4.moc : H : CPP(moc_%) : <allow>qt4 ;

        # The OBJ result type is a fake, 'H' will be really produced. See
        # comments on the generator class, defined below the 'init' function.
        generators.register [ new uic-generator qt4.uic : UI : OBJ :
            <allow>qt4  ] ;

        # The OBJ result type is a fake here too.
        generators.register [ new moc-h-generator
            qt4.moc.inc : MOCCABLE_CPP : OBJ : <allow>qt4 ] ;

        generators.register [ new moc-inc-generator
            qt4.moc.inc : MOCCABLE_H : OBJ : <allow>qt4 ] ;

        # Generates .cpp files from .qrc files.
        generators.register-standard qt4.rcc : QRC : CPP(qrc_%) ;

        # dependency scanner for wrapped files.
        type.set-scanner QRC : qrc-scanner ;

        # Save value of first occuring prefix
        .PREFIX = $(prefix) ;
    }

    if $(version)
    {
        major-minor = [ split-version $(version) ] ;
        version = $(major-minor:J=.) ;
    }
    else
    {   
        version = [ check-version $(bin_prefix) ] ;
        if $(version)
        {
            version = $(version:J=.) ;
        }
        debug-message Detected version '$(version)' ;
    }

    local target-requirements = $(condition) ;

    # Add the version, if any, to the target requirements.
    if $(version)
    {
        if ! $(version) in [ feature.values qt ]
        {
            feature.extend qt : $(version) ;
        }
        target-requirements += <qt>$(version:E=default) ;
    }

    local target-os = [ feature.get-values target-os : $(condition) ] ;
    if ! $(target-os)
    { 
        target-os ?= [ feature.defaults target-os ] ;
        target-os = $(target-os:G=) ;
        target-requirements += <target-os>$(target-os) ;
    }

    # Build exact requirements for the tools
    local tools-requirements = $(target-requirements:J=/) ;

    debug-message "Details of this Qt configuration:" ;
    debug-message "  prefix:      " '$(prefix:E=<empty>)' ;
    debug-message "  binary path: " '$(bin_prefix:E=<empty>)' ;
    debug-message "  include path:" '$(inc_prefix:E=<empty>)' ;
    debug-message "  library path:" '$(lib_prefix:E=<empty>)' ;
    debug-message "  target requirements:" '$(target-requirements)' ;
    debug-message "  tool requirements:  " '$(tools-requirements)' ;

    # setup the paths for the tools
    toolset.flags qt4.moc .BINPREFIX $(tools-requirements) : $(bin_prefix) ;
    toolset.flags qt4.rcc .BINPREFIX $(tools-requirements) : $(bin_prefix) ;
    toolset.flags qt4.uic .BINPREFIX $(tools-requirements) : $(bin_prefix) ;

    # TODO: 2009-02-12: Better support for directories
    # Most likely needed are separate getters for: include,libraries,binaries and sources.
    toolset.flags qt4.directory .PREFIX $(tools-requirements) : $(prefix) ;

    # Test for a buildable Qt.
    if [ glob $(.prefix)/Jamroot ]
    {
       .bjam-qt = true

       # this will declare QtCore (and qtmain on <target-os>windows)
       add-shared-library QtCore ;
   }
   else
   # Setup common pre-built Qt.
   # Special setup for QtCore on which everything depends
   {
       local usage-requirements =
           <include>$(.incprefix)
           <library-path>$(.libprefix)
           <dll-path>$(.libprefix)
           <threading>multi
           <allow>qt4 ;

       local suffix ;

       # Since Qt-4.2, debug versions on unix have to be built
       # separately and therefore have no suffix.
       .suffix_version = "" ;
       .suffix_debug = "" ;

       # Control flag for auto-configuration of the debug libraries.
       # This setup requires Qt 'configure -debug-and-release'.
       # Only available on some platforms.
       # ToDo: 2009-02-12: Maybe throw this away and
       # require separate setup with <variant>debug as condition.
       .have_separate_debug = FALSE ;
              
       # Setup other platforms
       if $(target-os) in windows cygwin 
       {
           .have_separate_debug = TRUE ;
    
           # On NT, the libs have "4" suffix, and "d" suffix in debug builds.
           .suffix_version = "4" ;
           .suffix_debug = "d" ;

           # On Windows we must link against the qtmain library
           lib qtmain
               : # sources
               : # requirements
                  <name>qtmain$(.suffix_debug)
                  <variant>debug
                  $(target-requirements)
               ;
           
           lib qtmain
               : # sources
               : # requirements
                   <name>qtmain
                   $(target-requirements)
               ;
       }
       else if $(target-os) = darwin
       {
           # On MacOS X, both debug and release libraries are available.
           .suffix_debug = "_debug" ;

           .have_separate_debug = TRUE ;

           alias qtmain ;
       }
       else
       {
           alias qtmain : : $(target-requirements) ;
       }

       lib QtCore : qtmain
           : # requirements
             <name>QtCore$(.suffix_version)
             $(target-requirements)
           : # default-build
           : # usage-requirements
             <define>QT_CORE_LIB
             <define>QT_NO_DEBUG
             <include>$(.incprefix)/QtCore
             $(usage-requirements)
           ;

       if $(.have_separate_debug) = TRUE
       {    
           debug-message Configure debug libraries with suffix '$(.suffix_debug)' ;

           lib QtCore : $(main)
               : # requirements
                 <name>QtCore$(.suffix_debug)$(.suffix_version)
                 <variant>debug
                 $(target-requirements)
               : # default-build
               : # usage-requirements
                 <define>QT_CORE_LIB
                 <include>$(.incprefix)/QtCore
                 $(usage-requirements)
               ;
        }
    }

    # Initialising the remaining libraries is canonical
    # parameters 'module' : 'depends-on' : 'usage-define' : 'requirements' : 'include'
    # 'include' only for non-canonical include paths. 
    add-shared-library QtGui     : QtCore : QT_GUI_LIB     : $(target-requirements) ;
    add-shared-library QtNetwork : QtCore : QT_NETWORK_LIB : $(target-requirements) ;
    add-shared-library QtSql     : QtCore : QT_SQL_LIB     : $(target-requirements) ;
    add-shared-library QtXml     : QtCore : QT_XML_LIB     : $(target-requirements) ;

    add-shared-library Qt3Support : QtGui QtNetwork QtXml QtSql 
                                  : QT_QT3SUPPORT_LIB QT3_SUPPORT
                                  : <qt3support>on $(target-requirements) ;

    # Dummy target to enable "<qt3support>off" and
    # "<library>/qt//Qt3Support" at the same time. This enables quick
    # switching from one to the other for test/porting purposes.
    alias Qt3Support : : <qt3support>off $(target-requirements) ;

    # OpenGl Support
    add-shared-library QtOpenGL : QtGui : QT_OPENGL_LIB : $(target-requirements) ;

    # SVG-Support (Qt 4.1)
    add-shared-library QtSvg : QtXml QtOpenGL : QT_SVG_LIB : $(target-requirements) ;

    # Test-Support (Qt 4.1)
    add-shared-library QtTest : QtCore : : $(target-requirements) ;

    # Qt designer library
    add-shared-library QtDesigner : QtGui QtXml : : $(target-requirements) ;

    # Support for dynamic Widgets (Qt 4.1)
    add-static-library  QtUiTools : QtGui QtXml : $(target-requirements) ;

    # DBus-Support (Qt 4.2)
    add-shared-library QtDBus : QtXml : : $(target-requirements) ;

    # Script-Engine (Qt 4.3)
    add-shared-library QtScript : QtGui QtXml : QT_SCRIPT_LIB : $(target-requirements) ;

    # Tools for the Script-Engine (Qt 4.5)
    add-shared-library QtScriptTools : QtScript : QT_SCRIPTTOOLS_LIB : $(target-requirements) ;

    # WebKit (Qt 4.4)
    add-shared-library QtWebKit : QtGui : QT_WEBKIT_LIB : $(target-requirements) ;

    # Phonon Multimedia (Qt 4.4) 
    add-shared-library phonon : QtGui QtXml : QT_PHONON_LIB : $(target-requirements) ;

    # Multimedia engine (Qt 4.6) 
    add-shared-library QtMultimedia : QtGui : QT_MULTIMEDIA_LIB : $(target-requirements) ;

    # XmlPatterns-Engine (Qt 4.4) 
    add-shared-library QtXmlPatterns : QtNetwork : QT_XMLPATTERNS_LIB : $(target-requirements) ;

    # Help-Engine (Qt 4.4) 
    add-shared-library QtHelp : QtGui QtSql QtXml : : $(target-requirements) ;

    # AssistantClient Support
    # Compat library
    # Pre-4.4 help system, use QtHelp for new programs
    add-shared-library QtAssistantClient : QtGui : : $(target-requirements) : QtAssistant ;

    debug-message "==== Configured Qt-$(version) ====" ;

    project.pop-current ;
}

rule initialized ( )
{
    return $(.initialized) ;
}



# This custom generator is needed because in QT4, UI files are translated only
# into H files, and no C++ files are created. Further, the H files need not be
# passed via MOC. The header is used only via inclusion. If we define a standard
# UI -> H generator, Boost.Build will run MOC on H, and then compile the
# resulting cpp. It will give a warning, since output from moc will be empty.
#
# This generator is declared with a UI -> OBJ signature, so it gets invoked when
# linking generator tries to convert sources to OBJ, but it produces target of
# type H. This is non-standard, but allowed. That header won't be mocced.
#
class uic-generator : generator
{
    rule __init__ ( * : * )
    {
        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
    }

    rule run ( project name ? : property-set : sources * )
    {
        if ! $(name)
        {
            name = [ $(sources[0]).name ] ;
            name = $(name:B) ;
        }

        local a = [ new action $(sources[1]) : qt4.uic : $(property-set) ] ;

        # The 'ui_' prefix is to match qmake's default behavior.
        local target = [ new file-target ui_$(name) : H : $(project) : $(a) ] ;

        local r = [ virtual-target.register $(target) ] ;

        # Since this generator will return a H target, the linking generator
        # won't use it at all, and won't set any dependency on it. However, we
        # need the target to be seen by bjam, so that dependency from sources to
        # this generated header is detected -- if jam does not know about this
        # target, it won't do anything.
        DEPENDS all : [ $(r).actualize ] ;

        return $(r) ;
    }
}


class moc-h-generator : generator
{
    rule __init__ ( * : * )
    {
        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
    }

    rule run ( project name ? : property-set : sources * )
    {
        if ! $(sources[2]) && [ $(sources[1]).type ] = MOCCABLE_CPP
        {
            name = [ $(sources[0]).name ] ;
            name = $(name:B) ;

            local a = [ new action $(sources[1]) : qt4.moc.inc :
                $(property-set) ] ;

            local target = [ new file-target $(name) : MOC : $(project) : $(a)
                ] ;

            local r = [ virtual-target.register $(target) ] ;

            # Since this generator will return a H target, the linking generator
            # won't use it at all, and won't set any dependency on it. However,
            # we need the target to be seen by bjam, so that dependency from
            # sources to this generated header is detected -- if jam does not
            # know about this target, it won't do anything.
            DEPENDS all : [ $(r).actualize ] ;

            return $(r) ;
        }
    }
}


class moc-inc-generator : generator
{
    rule __init__ ( * : * )
    {
        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
    }

    rule run ( project name ? : property-set : sources * )
    {
        if ! $(sources[2]) && [ $(sources[1]).type ] = MOCCABLE_H
        {
            name = [ $(sources[0]).name ] ;
            name = $(name:B) ;

            local a = [ new action $(sources[1]) : qt4.moc.inc :
                $(property-set) ] ;

            local target = [ new file-target moc_$(name) : CPP : $(project) :
                $(a) ] ;

            # Since this generator will return a H target, the linking generator
            # won't use it at all, and won't set any dependency on it. However,
            # we need the target to be seen by bjam, so that dependency from
            # sources to this generated header is detected -- if jam does not
            # know about this target, it won't do anything.
            DEPENDS all : [ $(target).actualize ] ;

            return [ virtual-target.register $(target) ] ;
        }
    }
}


# Query the installation directory. This is needed in at least two scenarios.
# First, when re-using sources from the Qt-Tree. Second, to "install" custom Qt
# plugins to the Qt-Tree.
#
rule directory
{
    return $(.PREFIX) ;
}

# Add a shared Qt library.
rule add-shared-library ( lib-name : depends-on * : usage-defines * : requirements * :  include ? )
{
     add-library $(lib-name) : $(.suffix_version) : $(depends-on) : $(usage-defines) : $(requirements) : $(include) ;
}

# Add a static Qt library.
rule add-static-library ( lib-name : depends-on * : usage-defines * : requirements * : include ? )
{
     add-library $(lib-name) : : $(depends-on) : $(usage-defines) : $(requirements) : $(include) ;
}

# Add a Qt library.
# Static libs are unversioned, whereas shared libs have the major number as suffix.
# Creates both release and debug versions on platforms where both are enabled by Qt configure.
# Flags:
# - lib-name Qt library Name
# - version  Qt major number used as shared library suffix (QtCore4.so)
# - depends-on other Qt libraries
# - usage-defines those are set by qmake, so set them when using this library
# - requirements addional requirements
# - include non-canonical include path. The canonical path is $(.incprefix)/$(lib-name).
rule add-library ( lib-name : version ? : depends-on * : usage-defines * : requirements * : include ? )
{
    if $(.bjam-qt)
    {
        # Import Qt module
        # Eveything will be setup there
        alias $(lib-name)
           : $(.prefix)//$(lib-name)
           :
           :
           : <allow>qt4 ;
    }
    else
    {
        local real_include ;
        real_include ?= $(include) ;
        real_include ?= $(lib-name) ;
        
        lib $(lib-name) 
           : # sources
             $(depends-on)
           : # requirements
             <name>$(lib-name)$(version)
             $(requirements)
           : # default-build
           : # usage-requirements
             <define>$(usage-defines)
             <include>$(.incprefix)/$(real_include)
           ;

        if $(.have_separate_debug) = TRUE
        {
            lib $(lib-name) 
               : # sources
                 $(depends-on)
               : # requirements
                 <name>$(lib-name)$(.suffix_debug)$(version)
                 $(requirements)
                 <variant>debug
               : # default-build
               : # usage-requirements
                 <define>$(usage-defines)
                 <include>$(.incprefix)/$(real_include)
               ;
        }
    } 

    # Make library explicit so that a simple <use>qt4 will not bring in everything.
    # And some components like QtDBus/Phonon may not be available on all platforms.
    explicit $(lib-name) ;
}

# Use $(.BINPREFIX[-1]) for the paths as several tools-requirements can match.
# The exact match is the last one.

# Get <include> and <defines> from current toolset.
flags qt4.moc INCLUDES <include> ;
flags qt4.moc DEFINES <define> ;

# Processes headers to create Qt MetaObject information. Qt4-moc has its
# c++-parser, so pass INCLUDES and DEFINES.
# 
actions moc
{
    $(.BINPREFIX[-1])/moc -I"$(INCLUDES)" -D$(DEFINES) -f $(>) -o $(<)
}


# When moccing files for include only, we don't need -f, otherwise the generated
# code will include the .cpp and we'll get duplicated symbols.
#
actions moc.inc
{
    $(.BINPREFIX[-1])/moc -I"$(INCLUDES)" -D$(DEFINES) $(>) -o $(<)
}


# Generates source files from resource files.
#
actions rcc
{
    $(.BINPREFIX[-1])/rcc $(>) -name $(>:B) -o $(<)
}


# Generates user-interface source from .ui files.
#
actions uic
{
    $(.BINPREFIX[-1])/uic $(>) -o $(<)
}


# Scanner for .qrc files. Look for the CDATA section of the <file> tag. Ignore
# the "alias" attribute. See http://doc.trolltech.com/qt/resources.html for
# detailed documentation of the Qt Resource System.
#
class qrc-scanner : common-scanner
{
    rule pattern ( )
    {
        return "<file.*>(.*)</file>" ;
    }
}


# Wrapped files are "included".
scanner.register qrc-scanner : include ;
