[gnu.gcc.bug] Managing different configurations

bothner@WSL.DEC.COM (04/20/89)

[This message bounced the first time.]

It is desirable to keep sources files separate from "make"
directories (where compilations are done, and where binaries
are executed). This allows multiple simultaneous configurations
(binary versions) made from the same sources. A more immediate
reason for many is g++, where two sets of binaries are made from
a largely overlapping set of sources. One solution is to use
links (as done by the X sources, and g++), but I find that a
messy approach. An alternative is to use the power of GNU make,
including source paths.

I describe an experiment I did for doing this. It has the advantage
that it is compatible with existing Makefiles, for those who have
vanilla makes. Only a minor and compatible change to config.*
is needed, which will not affect current uses. The Makefiles need
not be changed. The set-up is a little more complicated the first
time, though shell-scripts can be written to automate the task (just
like config was written to automate choosing machine desciptions).
The big win (in addition to being able to deal with multiple versions)
is that it makes installing upgrades easier (especially for g++).

I have tested the scheme enough to compile c++.

METHOD:

First, put the master tar sources in gcc/gcc-1.34.
Make gcc/mi (for machine independent) be a symbolic link to gcc/gcc-1.34.
Create gcc/vax (say) for the binaries. Put the following Makefile in it:

SRC=../mi
MACHINE=vax
VPATH=$(SRC)
include $(SRC)/Makefile
CFLAGS = -g -I. -I- -I$(SRC)
.PHONY: config
config:
	$(SRC)/config.gcc -path $(SRC) $(MACHINE)
	rm -f move-if-change
	ln -s $(SRC)/move-if-change .

The first two lines specify where the sources are, and what version
we are building in this (gcc/vax) directory. The actual make rules
come from the \unmodified/ distributed Makefile. The include
search path must be specified to look in the source directory.
(The latter has only been tested for the g++ version, below.)
The config target sets up machine-specific links, using a modified
config.gcc.

The change to config.gcc to accept a new "path" option.
Note that if no "path" option is given, config.gcc acts are currently.
*** config.gcc.orig	Tue Apr 18 14:45:39 1989
- --- config.gcc	Tue Apr 18 15:22:17 1989
***************
*** 40,45
  #hard_link="echo ln"
  #symbolic_link="echo ln -s"
  
  case $# in
  2)
  	vint=on

- --- 40,57 -----
  #hard_link="echo ln"
  #symbolic_link="echo ln -s"
  
+ # get path from where to get the configuration sources
+ case $1 in
+ -p | -path)
+ 	path=$2/
+ 	shift
+ 	shift
+ 	;;
+ *)
+ 	path=
+ 	;;
+ esac
+ 
  case $# in
  2)
  	vint=on
***************
*** 217,223
  		set $files; file=$1; shift; files=$*
  		set $links; link=$1; shift; links=$*
  
! 		if [ ! -r $file ]
  		then
  			echo "$progname: cannot create a link \`$link',"
  			echo "since the file \`$file' does not exist."

- --- 229,235 -----
  		set $files; file=$1; shift; files=$*
  		set $links; link=$1; shift; links=$*
  
! 		if [ ! -r $path$file ]
  		then
  			echo "$progname: cannot create a link \`$link',"
  			echo "since the file \`$path$file' does not exist."
***************
*** 220,226
  		if [ ! -r $file ]
  		then
  			echo "$progname: cannot create a link \`$link',"
! 			echo "since the file \`$file' does not exist."
  			exit 1
  		fi
  

- --- 232,238 -----
  		if [ ! -r $path$file ]
  		then
  			echo "$progname: cannot create a link \`$link',"
! 			echo "since the file \`$path$file' does not exist."
  			exit 1
  		fi
  
***************
*** 227,233
  		$remove -f $link
  		rm -f config.status
  		# Make a symlink if possible, otherwise try a hard link
! 		$symbolic_link $file $link 2>/dev/null || $hard_link $file $link
  
  		if [ ! -r $link ]
  		then

- --- 239,245 -----
  		$remove -f $link
  		rm -f config.status
  		# Make a symlink if possible, otherwise try a hard link
! 		$symbolic_link $path$file $link 2>/dev/null ||
$hard_link $path$file $link
  
  		if [ ! -r $link ]
  		then

Now we do the same thing for g++.
First put the sources in g++/src-g++.
Create (say) g++/vax.
Let g++/gcc contain or point to the gcc source (gcc/gcc-1.34).

The g++/vax Makefile is:

PSRC=../src-g++
CSRC=../gcc
MACHINE=vax
VPATH=$(PSRC):$(CSRC)
include $(PSRC)/Makefile
CFLAGS = -g -DSOS -DESKIT -O -I. -I- -I$(PSRC) -I$(CSRC)
.PHONY: config
config:
	$(PSRC)/config.g++ -path $(CSRC) $(MACHINE)
	rm -f move-if-change
	ln -s $(CSRC)/move-if-change .

Here PSRC is the cPlus sources, while CSRC is the gCc sources.
Both make and cpp search both directories (after the current one).
Finally, here are the patches to config.g++:

*** config.g++.orig	Thu Mar 30 02:09:25 1989
- --- config.g++	Tue Apr 18 15:43:52 1989
***************
*** 40,45
  #hard_link="echo ln"
  #symbolic_link="echo ln -s"
  
  case $# in
  2)
  	vint=on

- --- 40,57 -----
  #hard_link="echo ln"
  #symbolic_link="echo ln -s"
  
+ # get path from where to get the configuration sources
+ case $1 in
+ -p | -path)
+ 	path=$2/
+ 	shift
+ 	shift
+ 	;;
+ *)
+ 	path=
+ 	;;
+ esac
+ 
  case $# in
  2)
  	vint=on
***************
*** 208,215
  	cpu_type=${cpu_type=$machine}
  	configuration_file=${configuration_file=xm-$cpu_type.h}
  	machine_type=${machine_type=$machine}
! 	target_machine=tm-${machine_type}+.h
! 	sed 's/\([^A-Za-z]\)crt0.o/\1crt0+.o/g' < tm-$machine_type.h >
$target_machine
  	machine_description=${cpu_type}.md
  	aux_output=${aux_output=output-$cpu_type.c}
  

- --- 220,227 -----
  	cpu_type=${cpu_type=$machine}
  	configuration_file=${configuration_file=xm-$cpu_type.h}
  	machine_type=${machine_type=$machine}
! 	target_machine=tm-${machine_type}.h
! 	sed 's/\([^A-Za-z]\)crt0.o/\1crt0+.o/g' <
${path}tm-$machine_type.h > $target_machine
  	machine_description=${cpu_type}.md
  	aux_output=${aux_output=output-$cpu_type.c}
  
***************
*** 230,236
  		set $files; file=$1; shift; files=$*
  		set $links; link=$1; shift; links=$*
  
! 		if [ ! -r $file ]
  		then
  			echo "$progname: cannot create a link \`$link',"
  			echo "since the file \`$file' does not exist."

- --- 242,248 -----
  		set $files; file=$1; shift; files=$*
  		set $links; link=$1; shift; links=$*
  
! 		if [ ! -r $path$file ]
  		then
  			echo "$progname: cannot create a link \`$link',"
  			echo "since the file \`$path$file' does not exist."
***************
*** 233,239
  		if [ ! -r $file ]
  		then
  			echo "$progname: cannot create a link \`$link',"
! 			echo "since the file \`$file' does not exist."
  			exit 1
  		fi
  

- --- 245,251 -----
  		if [ ! -r $path$file ]
  		then
  			echo "$progname: cannot create a link \`$link',"
! 			echo "since the file \`$path$file' does not exist."
  			exit 1
  		fi
  
***************
*** 240,246
  		$remove -f $link
  		rm -f config.status
  		# Make a symlink if possible, otherwise try a hard link
! 		$symbolic_link $file $link 2>/dev/null || $hard_link $file $link
  
  		if [ ! -r $link ]
  		then

- --- 252,258 -----
  		$remove -f $link
  		rm -f config.status
  		# Make a symlink if possible, otherwise try a hard link
! 		$symbolic_link $path$file $link 2>/dev/null ||
$hard_link $path$file $link
  
  		if [ ! -r $link ]
  		then
***************
*** 244,250
  
  		if [ ! -r $link ]
  		then
! 			echo "$progname: unable to link \`$link' to \`$file'."
  			exit 1
  		fi
  		echo "Linked \`$link' to \`$file'."

- --- 256,262 -----
  
  		if [ ! -r $link ]
  		then
! 			echo "$progname: unable to link \`$link' to \`$path$file'."
  			exit 1
  		fi
  		echo "Linked \`$link' to \`$file$file'."
***************
*** 247,253
  			echo "$progname: unable to link \`$link' to \`$file'."
  			exit 1
  		fi
! 		echo "Linked \`$link' to \`$file'."
  	done
  
  	if [ xx${vint} = xx ]

- --- 259,265 -----
  			echo "$progname: unable to link \`$link' to \`$path$file'."
  			exit 1
  		fi
! 		echo "Linked \`$link' to \`$file$file'."
  	done
  
  	if [ xx${vint} = xx ]

Actually, I don't understand why config.g++ differs from config.gcc.
Assuming this is just for historical reasons, we could replace
the config target in the g++/vax/Makefile.
config:
	$(CSRC)/config.gcc -path $(CSRC) $(MACHINE)