#! /bin/bash

# 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.

libname=""
src=""
header=""
all_dep=""

# current makefile:
out=""
# temporary file:
tout=""
# install target temp file:
iout=""
# debug flag:
debug="no"
# compile options:
opts=""
# main output sub-directory:
subdir=""
# vcl flag:
use_vcl="yes"

###############################################################
#
# gcc generator section:
#
###############################################################

gcc_shared="no"

function gcc_gen_lib()
{
	if test "$gcc_shared" == "yes"; then
		obj_dir="$libname""_shared"
		all_dep="$all_dep $subdir $subdir/$obj_dir ./$subdir/lib$libname.so"
	else
		obj_dir="$libname"
		all_dep="$all_dep $subdir $subdir/$obj_dir ./$subdir/lib$libname.a"
	fi
#
# set up section comments:
	cat >> $tout << EOF
########################################################
#
# section for lib$libname.a
#
########################################################
EOF
#
#	process source files:
	all_obj=""
	for file in $src
	do
		obj=`echo "$file" | sed 's/.*src\/\(.*\)cpp/\1o/g'`
		obj="$subdir/$obj_dir/$obj"
		all_obj="$all_obj $obj"
		echo "$obj: $file \$(ALL_HEADER)" >> $tout
		echo "	\$(CXX) \$(INCLUDES) -o $obj $opts \$(CXXFLAGS) \$(ICU_CXXFLAGS) $file" >> $tout
		echo "" >> $tout
	done
#
#	 now for the directories for this library:
	echo "$subdir/$obj_dir : " >> $tout
	echo "	mkdir -p $subdir/$obj_dir" >> $tout
	echo "" >> $tout
#
#	 now for the clean options for this library:
	all_clean="$all_clean $libname""_clean"
	echo "$libname"_clean : >> $tout
	echo "	rm -f $subdir/$obj_dir/*.o" >> $tout
	echo "" >> $tout
#
#	 now for the main target for this library:
          if test "$gcc_shared" == "yes"; then
		echo ./$subdir/lib$libname.so : $all_obj >> $tout
		echo "	\$(LINKER) -o $subdir/lib$libname.so \$(LDFLAGS)  \$(ICU_LDFLAGS) $all_obj \$(ICU_LIBS) \$(LIBS)" >> $tout
	else
		echo ./$subdir/lib$libname.a : $all_obj >> $tout
		echo "	ar -r $subdir/lib$libname.a $all_obj" >> $tout
		echo "	-ar -s $subdir/lib$libname.a" >> $tout
	fi
	echo "" >> $tout
}

function gcc_gen()
{
	out="gcc.mak"
	tout="temp"
	iout="temp_install"
	subdir="gcc"
	all_dep=""
	all_clean=""
	echo > $out
	echo > $tout
	echo > $iout

	libname="boost_regex-gcc-${boost_version}"
	opts="\$(C1)"
	gcc_gen_lib
	libname="boost_regex-gcc-d-${boost_version}"
	opts="\$(C2)"
	gcc_gen_lib
	
	
	cat > $out << EOF
# copyright John Maddock 2006-7
# 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.
#
# auto generated makefile for gcc compiler
#
# usage:
# make
#   brings libraries up to date
# make clean
#   deletes temporary object files (but not archives).
#

#
# the following environment variables are recognised:
# ICU_PATH= Path to ICU installation.
# CXXFLAGS= extra compiler options - note applies to all build variants
# INCLUDES= additional include directories
# LDFLAGS=  additional linker options
# LIBS=     additional library files

# compiler:
CXX=g++
LINKER=g++ -shared

#
# compiler options for release build:
#
C1=-c -O2 -I../../..
#
# compiler options for debug build:
#
C2=-c -g -I../../..

ifeq "\$(ICU_PATH)" ""
\$(warning "Building Boost.Regex without ICU / Unicode support:")
\$(warning "Hint: set ICU_PATH on the nmake command line to point ")
\$(warning "to your ICU installation if you have one.")
else
ICU_CXXFLAGS= -DBOOST_HAS_ICU=1 -I\$(ICU_PATH)/include
ICU_LDFLAGS= -L\$(ICU_PATH)/lib
ICU_LIBS= -licui18n -licuuc
\$(warning "Building Boost.Regex with ICU in \$(ICU_PATH)")
endif

EOF
	echo "" >> $out
	echo "ALL_HEADER=$header" >> $out
	echo "" >> $out
	echo "all : $subdir $all_dep" >> $out
	echo >> $out
	echo "$subdir :" >> $out
	echo "	mkdir -p $subdir" >> $out
	echo >> $out
	echo "clean : $all_clean" >> $out
	echo >> $out
	echo "install : all" >> $out
	cat $iout >> $out
	echo >> $out
	cat $tout >> $out
}

function gcc_gen_shared()
{
	out="gcc-shared.mak"
	tout="temp"
	iout="temp_install"
	subdir="gcc"
	all_dep=""
	all_clean=""
	echo > $out
	echo > $tout
	echo > $iout

	libname="boost_regex-gcc-${boost_version}"
	opts="\$(C1)"
	gcc_gen_lib
	libname="boost_regex-gcc-d-${boost_version}"
	opts="\$(C2)"
	gcc_gen_lib
	
	
	cat > $out << EOF
# copyright John Maddock 2006-7
# 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.
#
# auto generated makefile for gcc compiler
#
# usage:
# make
#   brings libraries up to date
# make clean
#   deletes temporary object files (but not archives).
#

#
# the following environment variables are recognised:
# ICU_PATH= Path to ICU installation.
# CXXFLAGS= extra compiler options - note applies to all build variants
# INCLUDES= additional include directories
# LDFLAGS=  additional linker options
# LIBS=     additional library files

# compiler:
CXX=g++
LINKER=g++ -shared

#
# compiler options for release build:
#
C1=-c -O2 -I../../.. -fPIC
#
# compiler options for debug build:
#
C2=-c -g -I../../.. -fPIC

ifeq "\$(ICU_PATH)" ""
\$(warning "Building Boost.Regex without ICU / Unicode support:")
\$(warning "Hint: set ICU_PATH on the nmake command line to point ")
\$(warning "to your ICU installation if you have one.")
else
ICU_CXXFLAGS= -DBOOST_HAS_ICU=1 -I\$(ICU_PATH)/include
ICU_LDFLAGS= -L\$(ICU_PATH)/lib
ICU_LIBS= -licui18n -licuuc
\$(warning "Building Boost.Regex with ICU in \$(ICU_PATH)")
endif

EOF
	echo "" >> $out
	echo "ALL_HEADER=$header" >> $out
	echo "" >> $out
	echo "all : $subdir $all_dep" >> $out
	echo >> $out
	echo "$subdir :" >> $out
	echo "	mkdir -p $subdir" >> $out
	echo >> $out
	echo "clean : $all_clean" >> $out
	echo >> $out
	echo "install : all" >> $out
	cat $iout >> $out
	echo >> $out
	cat $tout >> $out
}

#
# locate source files:
#
. common.sh

#
# generate gcc makefile:
gcc_gen
gcc_shared="yes"
gcc_gen_shared


#
# remove tmep files;
rm -f $tout $iout






