##############################################################################
# Copyright 2005-2006 Andreas Huber Doenni
# Distributed under the Boost Software License, Version 1.0. (See accompany-
# ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
##############################################################################

project libs/statechart/example ;

local custom = <define>CUSTOMIZE_MEMORY_MANAGEMENT ;
local native = <define>BOOST_STATECHART_USE_NATIVE_RTTI ;

rule independent-obj-build (
  name : directory : cpp-sources + : requirements * )
{
  local objs ;

  for local cpp-source in $(cpp-sources)
  {
    obj $(name)$(cpp-source)
      : $(directory)/$(cpp-source).cpp : $(requirements) ;
    objs += $(name)$(cpp-source) ;
  }

  return $(objs) ;
}

rule statechart-st-example-build (
  name : directory : cpp-sources + : requirements * )
{
  exe $(name) : [ independent-obj-build $(name)
                    : $(directory) : $(cpp-sources)
                    # Some platforms have either problems with the automatic
                    # detection of the threading mode (e.g. vc-7_1 &
                    # gcc >= 3.4.0) or don't support single-threaded mode
                    # (e.g. vc-8_0). We therefore manually turn MT
                    # off here
                    : <threading>single <define>BOOST_DISABLE_THREADS $(requirements) ] ;

  return $(name) ;
}

rule statechart-mt-example-build (
  name : directory : cpp-sources + : requirements * )
{
  exe $(name) : [ independent-obj-build $(name)
                    : $(directory) : $(cpp-sources)
                    : <threading>multi $(requirements) ]
                ../../thread/build//boost_thread ;

  return $(name) ;
}

stage run
  : [ statechart-st-example-build BitMachine : BitMachine : BitMachine ]
    [ statechart-st-example-build Camera
        : Camera : Camera Configuring Main Shooting ]
    [ statechart-st-example-build Handcrafted : Handcrafted : Handcrafted ]
    [ statechart-st-example-build KeyboardNormal : Keyboard : Keyboard ]
    [ statechart-st-example-build KeyboardNative
        : Keyboard : Keyboard : $(native) ]
    [ statechart-st-example-build PingPongSingle
        : PingPong : PingPong Player : $(custom) ]
    [ statechart-mt-example-build PingPongMulti1
        : PingPong : PingPong Player : $(custom) ]
    [ statechart-mt-example-build PingPongMulti2
        : PingPong : PingPong Player : $(custom) <define>USE_TWO_THREADS ]
    [ statechart-st-example-build StopWatch : StopWatch : StopWatch ]
    [ statechart-st-example-build StopWatch2 : StopWatch : StopWatch2 ]
    [ statechart-st-example-build PerformanceNormal
        : Performance : Performance ]
    [ statechart-st-example-build PerformanceCustom
        : Performance : Performance : $(custom) ]
    [ statechart-st-example-build PerformanceNative
        : Performance : Performance : $(native) ]
  : <install-dependencies>on <install-type>EXE <install-type>SHARED_LIB ;
