# Copyright Vladimir Prus 2004.
# Copyright Toon Knapen 2004.
# Copyright Boris Gubenko 2007.
# 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 HP aC++ compiler.
#

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

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

# Configures the acc toolset.
rule init ( version ? : user-provided-command * : options * )
{
    local condition = [ common.check-init-parameters acc
        : version $(version) ] ;

    local command = [ common.get-invocation-command acc : aCC
        : $(user-provided-command) ] ;

    common.handle-options acc : $(condition) : $(command) : $(options) ;
}


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

# Declare flags.
flags acc CFLAGS <optimization>off : ;
flags acc CFLAGS <optimization>speed : -O3 ;
flags acc CFLAGS <optimization>space : -O2 ;

flags acc CFLAGS <inlining>off : +d ;
flags acc CFLAGS <inlining>on : ;
flags acc CFLAGS <inlining>full : ;

flags acc C++FLAGS <exception-handling>off : ;
flags acc C++FLAGS <exception-handling>on : ;

flags acc C++FLAGS <rtti>off : ;
flags acc C++FLAGS <rtti>on : ;

# We want the full path to the sources in the debug symbols because otherwise
# the debugger won't find the sources when we use boost.build.
flags acc CFLAGS <debug-symbols>on : -g ;
flags acc LINKFLAGS <debug-symbols>on : -g ;
flags acc LINKFLAGS <debug-symbols>off : -s ;

# V2 does not have <shared-linkable>, not sure what this meant in V1.
# flags acc CFLAGS <shared-linkable>true : +Z ;

flags acc CFLAGS <profiling>on : -pg ;
flags acc LINKFLAGS <profiling>on : -pg ;

flags acc CFLAGS <address-model>64 : +DD64 ;
flags acc LINKFLAGS <address-model>64 : +DD64 ;

# It is unknown if there's separate option for rpath used only
# at link time, similar to -rpath-link in GNU. We'll use -L.
flags acc RPATH_LINK : <xdll-path> ;

flags acc CFLAGS <cflags> ;
flags acc C++FLAGS <cxxflags> ;
flags acc DEFINES <define> ;
flags acc UNDEFS <undef> ;
flags acc HDRS <include> ;
flags acc STDHDRS <sysinclude> ;
flags acc LINKFLAGS <linkflags> ;
flags acc ARFLAGS <arflags> ;

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

# Select the compiler name according to the threading model.
flags acc CFLAGS <threading>multi : -mt   ;
flags acc LINKFLAGS <threading>multi : -mt ;

flags acc.compile.c++ TEMPLATE_DEPTH <c++-template-depth> ;


actions acc.link bind NEEDLIBS
{
    $(CONFIG_COMMAND) -AA $(LINKFLAGS) -o "$(<[1])" -L"$(RPATH_LINK)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) $(OPTIONS)
}

SPACE = " " ;
actions acc.link.dll bind NEEDLIBS
{
    $(CONFIG_COMMAND) -AA -b $(LINKFLAGS) -o "$(<[1])" -L"$(RPATH_LINK)" -Wl,+h$(<[-1]:D=) -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) $(OPTIONS)
}

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

actions acc.compile.c++
{
    $(CONFIG_COMMAND) -AA -c -Wc,--pending_instantiations=$(TEMPLATE_DEPTH) -I$(BOOST_ROOT) -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) $(C++FLAGS) -I"$(HDRS)" -I"$(STDHDRS)" -o "$(<)" "$(>)" $(OPTIONS)
}

actions updated together piecemeal acc.archive
{
    ar ru$(ARFLAGS:E="") "$(<)" "$(>)"
}
