require 'mj/tools/subprocess'
require 'build-tool/build-system/base'

module BuildTool; module BuildSystem

    #
    # QMake build system.
    #
    class QMake < Base

        include MJ::Tools::SubProcess

        class MakeError < BuildTool::Error; end
        class QMakeError < BuildTool::Error; end

        def initialize( *args )
            super( *args )
        end

        #
        ### ATTRIBUTES
        #

        # Check if the module is configured
        def configured?
            Pathname.new( build_directory ).join( 'Makefile' ).exist?
        end

        def name
            "qmake"
        end

        #
        ### METHODS
        #

        # Configure the module
        def reconfigure()
            configure
        end

        # Execute a qmake command in the context of the build directory
        def qmake( command, wd = build_directory )
            rc = self.class.execute "qmake #{command}", wd, env
            if rc != 0
                raise QMakeError, "qmake failed with error #{rc}!"
            end
            rc
        end

        def configure
            check_build_directory( true )
            opt = option_string
            opt += " PREFIX=#{install_prefix.to_s}" if install_prefix
            rc = qmake "#{source_directory}/*.pro #{opt}"
            rc
        end

        def do_make( target = nil )
            rc = self.class.execute( "make #{target ? target : "" }", build_directory, self.module.environment.values )
            if rc != 0
                raise MakeError, "make #{target || "" } failed with error code #{rc}";
            end
            rc
        end

        def install( fast )
            make( "install" )
        end

        def install_fast_supported?
            false
        end

        def make( target = nil )
            do_make( target )
        end

        def option_string
            arr = []
            option_names.each do |var|
                val = self[var]
                arr << "#{var}='#{val}'"
            end
            arr.join(" ")
        end

    end # class QMake


end; end # module BuildTool::BuildSystem