# Copyright (C) Reece H Dunn 2004
# 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)

# based on the msvc.jam toolset

import property ;
import generators ;
import os ;
import type ;
import toolset : flags ;
import errors : error ;
import feature : feature get-values ;
import path ;
import sequence : unique ;
import common ;

if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
{
   .debug-configuration = true ;
}

feature.extend toolset : cw ;

toolset.add-requirements <toolset>cw,<runtime-link>shared:<threading>multi ;

nl = "
" ;

rule init ( version ? : command * : options * )
{
   # TODO: fix the $(command[1]) = $(compiler) issue
    
    setup = [ get-values <setup> : $(options) ] ;
    setup    ?= cwenv.bat ;
    compiler = [ get-values <compiler> : $(options) ] ;
    compiler ?= mwcc ;
    linker = [ get-values <linker> : $(options) ] ;
    linker   ?= mwld ;

    local condition = [ common.check-init-parameters cw :
        version $(version) ] ;

    command = [ common.get-invocation-command cw : mwcc.exe : $(command) :
        [ default-paths $(version) ] ] ;
    
    common.handle-options cw : $(condition) : $(command) : $(options) ;

    local root = [ feature.get-values <root> : $(options) ] ;    
    if $(command)
    {
        command = [ common.get-absolute-tool-path $(command[-1]) ] ;
    }
    local tool-root = $(command) ;

    setup = $(tool-root)\\$(setup) ;

   # map the batch file in setup so it can be executed

    other-tools = $(tool-root:D) ;
    root ?= $(other-tools:D) ;
    
    flags cw.link RUN_PATH $(condition) : 
        "$(root)\\Win32-x86 Support\\Libraries\\Runtime"
        "$(root)\\Win32-x86 Support\\Libraries\\Runtime\\Libs\\MSL_All-DLLs" ;      
    
    setup = "set \"CWFOLDER="$(root)"\" && call \""$(setup)"\" > nul " ;

   if [ os.name ] = NT
   {
      setup = $(setup)"
" ;
   }
   else
   {
      setup = "cmd /S /C "$(setup)" \"&&\" " ;
   }

   # bind the setup command to the tool so it can be executed before the
   # command

   local prefix = $(setup) ;

   flags cw.compile .CC $(condition) : $(prefix)$(compiler) ;
   flags cw.link .LD $(condition) : $(prefix)$(linker) ;
   flags cw.archive .LD $(condition) : $(prefix)$(linker) ;

    if [ MATCH ^([89]\\.) : $(version) ]   
    {
        if [ os.name ] = NT
        {
        # The runtime libraries
        flags cw.compile CFLAGS <runtime-link>static/<threading>single/<runtime-debugging>off : -runtime ss ;
        flags cw.compile CFLAGS <runtime-link>static/<threading>single/<runtime-debugging>on : -runtime ssd ;
        
        flags cw.compile CFLAGS <runtime-link>static/<threading>multi/<runtime-debugging>off : -runtime sm ;
        flags cw.compile CFLAGS <runtime-link>static/<threading>multi/<runtime-debugging>on : -runtime smd ;
        
        flags cw.compile CFLAGS <runtime-link>shared/<runtime-debugging>off : -runtime dm ;
        flags cw.compile CFLAGS <runtime-link>shared/<runtime-debugging>on : -runtime dmd ;
        }        
    }    
}


local rule default-paths ( version ? )  # FIXME
{
   local possible-paths ;
   local ProgramFiles = [ common.get-program-files-dir ] ;

   # TODO: add support for cw8 and cw9 detection

   local version-6-path = $(ProgramFiles)"\\Metrowerks\\CodeWarrior" ;
   possible-paths += $(version-6-path) ;

   # perform post-processing

   possible-paths
      = $(possible-paths)"\\Other Metrowerks Tools\\Command Line Tools" ;

   possible-paths += [ modules.peek : PATH Path path ] ;

   return $(possible-paths) ;
}




## declare generators

generators.register-c-compiler cw.compile.c++ : CPP : OBJ : <toolset>cw ;
generators.register-c-compiler cw.compile.c : C : OBJ : <toolset>cw ;

generators.register-linker cw.link
   : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB
   : EXE
   : <toolset>cw
   ;
generators.register-linker cw.link.dll
   : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB
   : SHARED_LIB IMPORT_LIB
   : <toolset>cw
   ;

generators.register-archiver cw.archive
   : OBJ
   : STATIC_LIB
   : <toolset>cw
   ;

## compilation phase

flags cw WHATEVER <toolset-cw:version> ;

flags cw.compile CFLAGS <debug-symbols>on : -g ;
flags cw.compile CFLAGS <optimization>off : -O0 ;
flags cw.compile CFLAGS <optimization>speed : -O4,p ;
flags cw.compile CFLAGS <optimization>space : -O4,s ;
flags cw.compile CFLAGS <inlining>off : -inline off ;
flags cw.compile CFLAGS <inlining>on : -inline on ;
flags cw.compile CFLAGS <inlining>full : -inline all ;
flags cw.compile CFLAGS <exception-handling>off : -Cpp_exceptions off ;


flags cw.compile CFLAGS <rtti>on : -RTTI on ;
flags cw.compile CFLAGS <rtti>off : -RTTI off ;

flags cw.compile CFLAGS <warnings>on : -w on ;
flags cw.compile CFLAGS <warnings>off : -w off ;
flags cw.compile CFLAGS <warnings>all : -w all ;
flags cw.compile CFLAGS <warnings-as-errors>on : -w error ;

flags cw.compile USER_CFLAGS <cflags> : ;
flags cw.compile.c++ USER_CFLAGS <cxxflags> : ;

flags cw.compile DEFINES <define> ;
flags cw.compile UNDEFS <undef> ;
flags cw.compile INCLUDES <include> ;

actions compile.c
{
   $(.CC) -c -cwd include -lang c -U$(UNDEFS) $(CFLAGS) $(USER_CFLAGS) -I- -o "$(<)" @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)-D$(DEFINES) $(nl)"-I$(INCLUDES)")"
}
actions compile.c++
{
   $(.CC) -c -cwd include -lang c++ -U$(UNDEFS) $(CFLAGS) $(USER_CFLAGS) -I- -o "$(<)" @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)-D$(DEFINES) $(nl)"-I$(INCLUDES)")"
}

## linking phase

flags cw.link DEF_FILE <def-file> ;

flags cw LINKFLAGS : -search ;
flags cw LINKFLAGS <debug-symbols>on : -g ;
flags cw LINKFLAGS <user-interface>console : -subsystem console ;
flags cw LINKFLAGS <user-interface>gui : -subsystem windows ;
flags cw LINKFLAGS <user-interface>wince : -subsystem wince ;
flags cw LINKFLAGS <user-interface>native : -subsystem native ;
flags cw LINKFLAGS <user-interface>auto : -subsystem auto ;

flags cw LINKFLAGS <main-target-type>LIB/<link>static : -library ;

flags cw.link USER_LINKFLAGS <linkflags> ;
flags cw.link LINKPATH <library-path> ;

flags cw.link FINDLIBS_ST <find-static-library> ;
flags cw.link FINDLIBS_SA <find-shared-library> ;
flags cw.link LIBRARY_OPTION <toolset>cw : "" : unchecked ;
flags cw.link LIBRARIES_MENTIONED_BY_FILE : <library-file> ;

rule link.dll ( targets + : sources * : properties * )
{
    DEPENDS $(<) : [ on $(<) return $(DEF_FILE) ] ;
}

if [ os.name ] in NT
{
   actions archive
   {
      if exist "$(<[1])" DEL "$(<[1])"
      $(.LD) -library -o "$(<[1])" @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
   }
}
else # cygwin
{
   actions archive
   {
      _bbv2_out_="$(<)"
      if test -f "$_bbv2_out_" ; then
         _bbv2_existing_="$(<:W)"
      fi
      $(.LD) -library -o "$(<:W)" $_bbv2_existing_ @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
   }
}

actions link bind DEF_FILE
{
   $(.LD) -o "$(<[1]:W)" -L"$(LINKPATH)" $(LINKFLAGS) $(USER_LINKFLAGS) @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
}

actions link.dll bind DEF_FILE
{
   $(.LD) -shared -o "$(<[1]:W)" -implib "$(<[2]:W)" -L"$(LINKPATH)" $(LINKFLAGS) -f"$(DEF_FILE)" $(USER_LINKFLAGS) @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
}

