# Copyright Vladimir Prus 2004.
# Copyright Toon Knapen 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)

#
# Boost.Build V2 toolset for the IBM XL C++ compiler
#

import toolset : flags ;
import feature ;
import common ;
import generators ;
import os ;

feature.extend toolset : vacpp ;
toolset.inherit vacpp : unix ;
generators.override vacpp.prebuilt : builtin.prebuilt ;
generators.override vacpp.searched-lib-generator : searched-lib-generator ;

# Configure the vacpp toolset
rule init ( version ? : command * : options * )
{
    local condition = [ 
        common.check-init-parameters vacpp : version $(version) ] ;
              
    command = [ common.get-invocation-command vacpp : xlC
        : $(command) : "/usr/vacpp/bin/xlC" ] ;
        
    common.handle-options vacpp : $(condition) : $(command) : $(options) ;
}

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

# Allow C++ style comments in C files
flags vacpp CFLAGS : -qcpluscmt ;

# Declare flags
flags vacpp CFLAGS <optimization>off : -qNOOPTimize ;
flags vacpp CFLAGS <optimization>speed : -O3 -qstrict ;
flags vacpp CFLAGS <optimization>space : -O2 -qcompact ;

# Discretionary inlining (not recommended)
flags vacpp CFLAGS <inlining>off : -qnoinline ;
flags vacpp CFLAGS <inlining>on : -qinline ;
#flags vacpp CFLAGS <inlining>full : -qinline ;
flags vacpp CFLAGS <inlining>full : ;

# Exception handling
flags vacpp C++FLAGS <exception-handling>off : -qnoeh ;
flags vacpp C++FLAGS <exception-handling>on : -qeh ;

# Run-time Type Identification
flags vacpp C++FLAGS <rtti>off : -qnortti ;
flags vacpp C++FLAGS <rtti>on : -qrtti ;

# Enable 64-bit memory addressing model
flags vacpp CFLAGS <address-model>64 : -q64 ;
flags vacpp LINKFLAGS <address-model>64 : -q64 ;
flags vacpp ARFLAGS <target-os>aix/<address-model>64 : -X 64 ;

# Use absolute path when generating debug information
flags vacpp CFLAGS <debug-symbols>on : -g -qfullpath ;
flags vacpp LINKFLAGS <debug-symbols>on : -g -qfullpath ;
flags vacpp LINKFLAGS <debug-symbols>off : -s ;

if [ os.name ] = AIX
{
    flags vacpp.compile C++FLAGS : -qfuncsect ;

    # The -bnoipath strips the prepending (relative) path of libraries from
    # the loader section in the target library or executable. Hence, during
    # load-time LIBPATH (identical to LD_LIBRARY_PATH) or a hard-coded
    # -blibpath (*similar* to -lrpath/-lrpath-link) is searched. Without
    # this option, the prepending (relative) path + library name is
    # hard-coded in the loader section, causing *only* this path to be
    # searched during load-time. Note that the AIX linker does not have an
    # -soname equivalent, this is as close as it gets.
    #
    # The above options are definately for AIX 5.x, and most likely also for
    # AIX 4.x and AIX 6.x. For details about the AIX linker see:
    # http://download.boulder.ibm.com/ibmdl/pub/software/dw/aix/es-aix_ll.pdf
    #
    flags vacpp.link LINKFLAGS <link>shared : -bnoipath ;

    # Run-time linking
    flags vacpp.link EXE-LINKFLAGS <link>shared : -brtl ;
}
else
{
    # Linux PPC
    flags vacpp.compile CFLAGS <link>shared : -qpic=large ;
    flags vacpp FINDLIBS : rt ;
}

# Profiling
flags vacpp CFLAGS <profiling>on : -pg ;
flags vacpp LINKFLAGS <profiling>on : -pg ;

flags vacpp.compile OPTIONS <cflags> ;
flags vacpp.compile.c++ OPTIONS <cxxflags> ;
flags vacpp DEFINES <define> ;
flags vacpp UNDEFS <undef> ;
flags vacpp HDRS <include> ;
flags vacpp STDHDRS <sysinclude> ;
flags vacpp.link OPTIONS <linkflags> ;
flags vacpp ARFLAGS <arflags> ;

flags vacpp LIBPATH <library-path> ;
flags vacpp NEEDLIBS <library-file> ;
flags vacpp FINDLIBS <find-shared-library> ;
flags vacpp FINDLIBS <find-static-library> ;

# Select the compiler name according to the threading model.
flags vacpp VA_C_COMPILER  <threading>single : xlc   ;
flags vacpp VA_C_COMPILER  <threading>multi : xlc_r ;
flags vacpp VA_CXX_COMPILER <threading>single : xlC   ;
flags vacpp VA_CXX_COMPILER <threading>multi : xlC_r ;

SPACE = " " ;

flags vacpp.link.dll HAVE_SONAME <target-os>linux : "" ;

actions vacpp.link bind NEEDLIBS
{
    $(VA_CXX_COMPILER) $(EXE-LINKFLAGS) $(LINKFLAGS) -o "$(<[1])" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) $(OPTIONS) $(USER_OPTIONS)
}

actions vacpp.link.dll bind NEEDLIBS
{
    xlC_r -G $(LINKFLAGS) -o "$(<[1])" $(HAVE_SONAME)-Wl,-soname$(SPACE)-Wl,$(<[-1]:D=) -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) $(OPTIONS) $(USER_OPTIONS) 
}

actions vacpp.compile.c
{
    $(VA_C_COMPILER) -c $(OPTIONS) $(USER_OPTIONS) -I$(BOOST_ROOT) -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) -I"$(HDRS)" -I"$(STDHDRS)" -o "$(<)" "$(>)"
}

actions vacpp.compile.c++
{
    $(VA_CXX_COMPILER) -c $(OPTIONS) $(USER_OPTIONS) -I$(BOOST_ROOT) -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) $(C++FLAGS) -I"$(HDRS)" -I"$(STDHDRS)" -o "$(<)" "$(>)"
}

actions updated together piecemeal vacpp.archive
{
    ar $(ARFLAGS) ru "$(<)" "$(>)"
}
