# configure.lang for GNU CC
# This script is run by configure for configuration of language
# subdirectories which conform to the old GCC configure mechansim
# for such subdirectories.

# Copyright (C) 1997 Free Software Foundation, Inc.

#This file is part of GNU CC.

#GNU CC is free software; you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation; either version 2, or (at your option)
#any later version.

#GNU CC is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.

#You should have received a copy of the GNU General Public License
#along with GNU CC; see the file COPYING.  If not, write to
#the Free Software Foundation, 59 Temple Place - Suite 330,
#Boston, MA 02111-1307, USA.

savesrcdir=$srcdir

for subdir in . $oldstyle_subdirs
do
	# We only want to do this in language subdirs, but we have to handle
	# the case of $oldstyle_subdirs = "".
	if [ $subdir = . ]
	then
		continue
	fi

	oldsrcdir=$savesrcdir

	# Re-adjust the path
	case $oldsrcdir in
	/*)
		srcdir=$oldsrcdir/$subdir
		;;
	*)
		oldsrcdir=../${oldsrcdir}
		srcdir=$oldsrcdir/$subdir
		;;
	esac
	mainsrcdir=$oldsrcdir
	STARTDIR=`pwd`
	test -d $subdir || mkdir $subdir
	cd $subdir

	# Create Makefile.tem from Makefile.in.
	# Make it set VPATH if necessary so that the sources are found.
	# Also change its value of srcdir.
	# Also create a .gdbinit file which runs the one in srcdir
	# and tells GDB to look there for source files.
	case $srcdir in
	. | ./$subdir | .././$subdir)
		rm -f Makefile.tem
		cp Makefile.in Makefile.tem
		chmod +w Makefile.tem
		;;
	*)
		rm -f Makefile.tem
		echo "VPATH = ${srcdir}" \
		  | cat - ${srcdir}/Makefile.in \
		  | sed "s@^srcdir = \.@srcdir = ${srcdir}@" > Makefile.tem
		rm -f .gdbinit
		echo "dir ." > .gdbinit
		echo "dir ${srcdir}" >> .gdbinit
		echo "dir ${mainsrcdir}" >> .gdbinit
		if [ x$gdb_needs_out_file_path = xyes ]
		then
			echo "dir ${mainsrcdir}/config/"`dirname ${out_file}` >> .gdbinit
		fi
		echo "source ${mainsrcdir}/.gdbinit" >> .gdbinit
		;;
	esac

	# Conditionalize the makefile for this host machine.
	rm -f Makefile.xx Makefile.ll
	merged_frags=
	for f in .. ${host_xmake_file}
	do
		if [ -f ${mainsrcdir}/config/$f ]
		then
			cat ${mainsrcdir}/config/$f >> Makefile.ll
			if [ x"${merged_frags}" != x ]
			then
				merged_frags="${merged_frags} and "
			fi
			merged_frags="${merged_frags}${f}"
		fi
	done
	if [ x"${merged_frags}" != x ]
	then
		sed -e "/####host/  r Makefile.ll" Makefile.tem > Makefile.xx
		echo "Merged ${merged_frags}."
		rm -f Makefile.tem
		mv Makefile.xx Makefile.tem
		rm -f Makefile.ll
	fi

	# Add a definition for MAKE if system wants one.
	case "$SET_MAKE" in
	?*)
		rm -f Makefile.xx
		(echo "$SET_MAKE"; cat Makefile.tem) >Makefile.xx
		rm -f Makefile.tem
		mv Makefile.xx Makefile.tem
	esac

	# Add a definition for INSTALL if system wants one.
	# This substitutes for lots of x-* files.
	if [ x$build_broken_install = x ]
	then true
	else
		rm -f Makefile.xx
		abssrcdir=`cd ${srcdir}; pwd`
		sed "s|^INSTALL = .*|INSTALL = ${abssrcdir}/install.sh -c|" Makefile.tem > Makefile.xx
		rm -f Makefile.tem
		mv Makefile.xx Makefile.tem
	fi

	# If using -program-transform-name, override the installation names.
	if [ "x${program_transform_set}" = "xyes" ] ; then
		sed -e "s/^program_transform_name[ 	]*=.*$/program_transform_name =
$program_transform_name/" \
		    -e "s/^program_transform_cross_name[
]*=.*$/program_transform_cross_name = $program_transform_name/" \
		    Makefile.tem > Makefile.xx
		rm -f Makefile.tem
		mv Makefile.xx Makefile.tem
	fi

	# Conditionalize the makefile for this target machine.
	rm -f Makefile.xx Makefile.ll
	merged_frags=
	for f in .. ${tmake_file}
	do
		if [ -f ${mainsrcdir}/config/$f ]
		then
			cat ${mainsrcdir}/config/$f >> Makefile.ll
			if [ x"${merged_frags}" != x ]
			then
				merged_frags="${merged_frags} and "
			fi
			merged_frags="${merged_frags}$f"
		fi
	done
	if [ x"${merged_frags}" != x ]
	then
		sed -e "/####target/  r Makefile.ll" Makefile.tem > Makefile.xx
		echo "Merged ${merged_frags}."
		rm -f Makefile.tem
		mv Makefile.xx Makefile.tem
		rm -f Makefile.ll
	fi

	# If the host supports
	# symlinks, point stage[123] at ../stage[123] so bootstrapping and the
	# installation procedure can still use CC="stage1/xgcc -Bstage1/".
	# If the host doesn't support symlinks, FLAGS_TO_PASS has been
	# modified to solve the problem there.
	for t in stage1 stage2 stage3 stage4 include
	do
		rm -f $t
		$symbolic_link ../$t $t 2>/dev/null
	done

	# Remove all formfeeds, since some Makes get confused by them.
	# Also arrange to give the variables `target', `target_alias',
	# `host_xmake_file', `tmake_file', `prefix', `local_prefix',
	# `exec_prefix', `INSTALL_HEADERS_DIR', `exeext'
	# values in the Makefile from the values they have in this script.
	rm -f Makefile.xx
	# Create an empty Makefile.sed first, to work around a Nextstep 3.3 bug.
	echo 's|||' > Makefile.sed
	rm Makefile.sed
	echo 's|||' > Makefile.sed
	echo "s|^target=.*$|target=${target}|" >> Makefile.sed
	echo "s|^target_alias=.*$|target=${target_alias}|" >> Makefile.sed
	echo "s|^xmake_file=.*$|xmake_file=${dep_host_xmake_file}|" >> Makefile.sed
	echo "s|^tmake_file=.*$|tmake_file=${dep_tmake_file}|" >> Makefile.sed
	echo "s|^version=.*$|version=${version}|" >> Makefile.sed
	echo "s|^GCC_THREAD_FILE=.*$|GCC_THREAD_FILE=${thread_file}|" >> Makefile.sed
	echo "s|^prefix[ 	]*=.*|prefix = $prefix|" >> Makefile.sed
	echo "s|^local_prefix[ 	]*=.*|local_prefix = $local_prefix|" >> Makefile.sed
	echo "s|^exec_prefix[ 	]*=.*|exec_prefix = $exec_prefix|" >> Makefile.sed
	echo "s|^INSTALL_HEADERS_DIR[ 	]*=.*$|INSTALL_HEADERS_DIR = ${build_install_headers_dir}|" >> Makefile.sed
	echo "s|^exeext[ 	]*=.*$|exeext = ${build_exeext}|" >> Makefile.sed
	sed -f Makefile.sed Makefile.tem > Makefile.xx
	rm -f Makefile.tem Makefile.sed
	mv Makefile.xx Makefile.tem

	# Install Makefile for real, after making final changes.
	# Define macro CROSS_COMPILE in compilation
	# if this is a cross-compiler.
	# Also use all.cross instead of all.internal
	# and add cross-make to Makefile.
	if [ x$host != x$target ]
	then
		rm -f Makefile.xx
		echo "CROSS=-DCROSS_COMPILE" > Makefile.xx
		sed -e "/####cross/  r ${mainsrcdir}/cross-make" Makefile.tem >> Makefile.xx
		rm -f Makefile.tem
		mv Makefile.xx Makefile.tem
	fi

	# When building gcc with a cross-compiler, we need to fix a few things.
	# This must come after cross-make as we want all.build to override
	# all.cross.
  	if [ x$build != x$host ]
	then
		rm -f Makefile.xx
		echo "build= $build" > Makefile.xx
		echo "host= $host" >> Makefile.xx
    		sed -e "s|objc-runtime$||" \
		    -e "/####build/  r ${mainsrcdir}/build-make" Makefile.tem >> Makefile.xx
		rm -f Makefile.tem
		mv Makefile.xx Makefile.tem
	fi

	rm -f Makefile
	mv Makefile.tem Makefile
	echo "Created \`$subdir/Makefile'."

	cd $STARTDIR
done   # end of current-dir SUBDIRS loop

# Restore this, remember we're invoked with `.'.
srcdir=$savesrcdir
