# 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 cw,shared:multi ; nl = " " ; rule init ( version ? : command * : options * ) { # TODO: fix the $(command[1]) = $(compiler) issue setup = [ get-values : $(options) ] ; setup ?= cwenv.bat ; compiler = [ get-values : $(options) ] ; compiler ?= mwcc ; linker = [ get-values : $(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 : $(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 static/single/off : -runtime ss ; flags cw.compile CFLAGS static/single/on : -runtime ssd ; flags cw.compile CFLAGS static/multi/off : -runtime sm ; flags cw.compile CFLAGS static/multi/on : -runtime smd ; flags cw.compile CFLAGS shared/off : -runtime dm ; flags cw.compile CFLAGS shared/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 : cw ; generators.register-c-compiler cw.compile.c : C : OBJ : cw ; generators.register-linker cw.link : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : EXE : cw ; generators.register-linker cw.link.dll : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : SHARED_LIB IMPORT_LIB : cw ; generators.register-archiver cw.archive : OBJ : STATIC_LIB : cw ; ## compilation phase flags cw WHATEVER ; flags cw.compile CFLAGS on : -g ; flags cw.compile CFLAGS off : -O0 ; flags cw.compile CFLAGS speed : -O4,p ; flags cw.compile CFLAGS space : -O4,s ; flags cw.compile CFLAGS off : -inline off ; flags cw.compile CFLAGS on : -inline on ; flags cw.compile CFLAGS full : -inline all ; flags cw.compile CFLAGS off : -Cpp_exceptions off ; flags cw.compile CFLAGS on : -RTTI on ; flags cw.compile CFLAGS off : -RTTI off ; flags cw.compile CFLAGS on : -w on ; flags cw.compile CFLAGS off : -w off ; flags cw.compile CFLAGS all : -w all ; flags cw.compile CFLAGS on : -w error ; flags cw.compile USER_CFLAGS : ; flags cw.compile.c++ USER_CFLAGS : ; flags cw.compile DEFINES ; flags cw.compile UNDEFS ; flags cw.compile 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)")" } 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 ; flags cw LINKFLAGS : -search ; flags cw LINKFLAGS on : -g ; flags cw LINKFLAGS console : -subsystem console ; flags cw LINKFLAGS gui : -subsystem windows ; flags cw LINKFLAGS wince : -subsystem wince ; flags cw LINKFLAGS native : -subsystem native ; flags cw LINKFLAGS auto : -subsystem auto ; flags cw LINKFLAGS LIB/static : -library ; flags cw.link USER_LINKFLAGS ; flags cw.link LINKPATH ; flags cw.link FINDLIBS_ST ; flags cw.link FINDLIBS_SA ; flags cw.link LIBRARY_OPTION cw : "" : unchecked ; flags cw.link LIBRARIES_MENTIONED_BY_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)")" }