# copyright John Maddock 2003
# 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.

import modules ;

project : requirements
   # default to all warnings on:
   <warnings>all
   ;

local disable-icu = [ MATCH (--disable-icu) : [ modules.peek : ARGV ] ] ;

#
# ICU configuration:
#
if ! $(disable-icu)
{

   if [ modules.peek : ICU_PATH ]
   {    
       ICU_PATH =  [ modules.peek : ICU_PATH ] ;
   }
   if [ modules.peek : ICU_LINK ]
   {    
       ICU_LINK =  [ modules.peek : ICU_LINK ] ;
   }

   if $(ICU_LINK)
   {
      ICU_OPTS = <include>$(ICU_PATH)/include <linkflags>$(ICU_LINK) <dll-path>$(ICU_PATH)/bin <define>BOOST_HAS_ICU=1 <runtime-link>shared ;
   }
   else
   {
      lib icuuc : : <search>$(ICU_PATH)/lib <link>shared <runtime-link>shared ;
      lib icuuc : : <toolset>msvc <variant>debug <name>icuucd <search>$(ICU_PATH)/lib <link>shared <runtime-link>shared ;
      lib icuuc : : <name>this_is_an_invalid_library_name ;
      lib icudt : : <search>$(ICU_PATH)/lib <name>icudata <link>shared <runtime-link>shared ;
      lib icudt : : <search>$(ICU_PATH)/lib <name>icudt <toolset>msvc <link>shared <runtime-link>shared ;
      lib icudt : : <name>this_is_an_invalid_library_name ;
      lib icuin : : <search>$(ICU_PATH)/lib <name>icui18n <link>shared <runtime-link>shared ;
      lib icuin : : <toolset>msvc <variant>debug <name>icuind <search>$(ICU_PATH)/lib <link>shared <runtime-link>shared ;
      lib icuin : : <toolset>msvc <variant>release <name>icuin <search>$(ICU_PATH)/lib <link>shared <runtime-link>shared ;
      lib icuin : : <name>this_is_an_invalid_library_name ;

      if $(ICU_PATH)
      {
         icuucd_name = [ GLOB $(ICU_PATH)/bin : icuuc??d.dll ] ;
         icuuc_name = [ GLOB $(ICU_PATH)/bin : icuuc??.dll ] ;
         icudt_name = [ GLOB $(ICU_PATH)/bin : icudt??.dll ] ;
         icuin_name = [ GLOB $(ICU_PATH)/bin : icuin??.dll ] ;
         icuind_name = [ GLOB $(ICU_PATH)/bin : icuin??d.dll ] ;

         #ECHO $(icuucd_name:B) $(icuuc_name:B) $(icudt_name:B) $(icuin_name:B) $(icuind_name:B) ;
      }

      ICU_OPTS = 
         <include>$(ICU_PATH)/include 
         <library>icuuc/<link>shared/<runtime-link>shared 
         <library>icudt/<link>shared/<runtime-link>shared 
         <library>icuin/<link>shared/<runtime-link>shared 
         <dll-path>$(ICU_PATH)/bin 
         <define>BOOST_HAS_ICU=1 
         <runtime-link>shared
         <toolset>msvc:<linkflags>/delayload:$(icuucd_name:B).dll
         <toolset>msvc:<linkflags>/delayload:$(icuuc_name:B).dll
         <toolset>msvc:<linkflags>/delayload:$(icudt_name:B).dll
         <toolset>msvc:<linkflags>/delayload:$(icuin_name:B).dll
         <toolset>msvc:<linkflags>/delayload:$(icuind_name:B).dll
         <toolset>msvc:<linkflags>delayimp.lib 
         ;
   }

}

exe has_icu : ./has_icu_test.cpp  : $(ICU_OPTS) ;
explicit has_icu ;

alias icu_options : : : : [ check-target-builds has_icu : $(ICU_OPTS) : ] ;

SOURCES = 
   c_regex_traits.cpp
   cpp_regex_traits.cpp
   cregex.cpp
   fileiter.cpp
   icu.cpp
   instances.cpp
   posix_api.cpp
   regex.cpp
   regex_debug.cpp
   regex_raw_buffer.cpp
   regex_traits_defaults.cpp
   static_mutex.cpp
   w32_regex_traits.cpp
   wc_regex_traits.cpp
   wide_posix_api.cpp
   winstances.cpp 
   usinstances.cpp ;


lib boost_regex : ../src/$(SOURCES) icu_options
    :         
	     <link>shared:<define>BOOST_REGEX_DYN_LINK=1
	     #<toolset>gcc-mw:<link>static
	     #<toolset>gcc-mingw:<link>static
	     <toolset>gcc-cygwin:<link>static
    ;

boost-install boost_regex ;




