2 TITLE: Multiple GCC Installations
4 AUTHOR: Eric Crahen <crahen@cse.buffalo.edu>
9 This is a set of instructions for people interested in installing
10 and using several versions of gcc on thier system. The compiler's
11 public interfaces are renamed to include version numbers (e.g.
12 gcc-2.95.3), version specific dependancies, such as includes and
13 shared libraries are storeed in different locations and evironment
14 variables replace can be used to select a compiler (rather than
15 global names such as /usr/bin or /lib/cpp)
21 First, you need to obtain the version of gcc you wish to compile
22 and install along with any patches that come with it. The example,
23 will demonstrate how to install two common versions of the compiler.
27 ftp://sourceware.cygnus.com/pub/gcc/old-releases/egcs/
28 http://gcc.gnu.org/install/glibc-2.2.patch
32 ftp://ftp.gnu.org/pub/gnu/gcc/
35 COMPILE THE SOURCE & INSTALL:
38 Next, the source needs to be configured. This is done in the usual
39 way, the important configuration options are the following:
42 --enable-version-specific-runtime-libs
44 Keeps the version specific runtime libraries in a compiler specific
45 directory rather than placing them right in ${libdir}. You can read
46 more about this in the gcc documentation (install/CONFIGURE).
48 --program-transform-name
50 Transforms the binary file names when they are installed using a
51 sed regular expression. This option will be used to append the version
52 number as a suffix to the binary names. You can read more about this
53 by running configure (./configure --help).
56 The following two examples demonstrate a typical use of these options.
60 sed -e s/gcc-2.95.2/egcs-1.1.2/ glibc-2.2.patch | patch -p0; \
61 mkdir egcs-build && cd egcs-build && \
62 ../egcs-1.1.2/configure --prefix=/usr \
63 --enable-languages --enable-languages=c,c++ \
64 --enable-threads=posix \
65 --enable-version-specific-runtime-libs \
66 --program-transform-name="s/\\\\(.*\\\\)/\\\\1-2.91.66/" && \
67 make bootstrap && make install && \
68 ln -s /usr/bin/gcc-2.91.66 cc-2.91.66
72 bzip2 -dc gcc-2.95.3-2.patch.bz2 | patch -Np1; &&
73 mkdir ../gcc-build && cd ../gcc-build &&
74 ../gcc-2.95.3/configure --prefix=/usr \
75 --enable-languages --enable-languages=c,c++ \
76 --enable-threads=posix \
77 --enable-version-specific-runtime-libs \
78 --program-transform-name="s/\\\\(.*\\\\)/\\\\1-2.95.3/" && \
79 make bootstrap && make install \
80 ln -s /usr/bin/gcc-2.95.3 cc-2.95.3
83 CONFIGURE YOUR ENVIRONMENT:
86 To configure the environment, several variables need to be set. One
87 is the PATH, it should include the path to wherever the binaries
88 have been installed. If the binaries are installed in a location like
89 /usr/bin then that location needs to be in your PATH. The two
90 variables that are used to select the compiler also need to be set.
91 These are CC and CXX and they should point to cc-version and
92 c++-version respectively.
94 For example, if you want gcc-2.95.3 to be the default, the following
101 These commands can be placed in an rc file that will be executed when
102 your shell is spawned. For example, /etc/profile or ~/.bashrc.
104 GNU tools, such as autoconf or make can detect your compiler by
105 looking at these variables. In most cases, there is nothing extra that
106 will need to be done to use these variables to select a compiler.
107 However, there are exceptions and there are notes at the end of the
108 document about those exceptions.
111 SELECTING A DIFFERENT COMPILER:
114 Selecting a different compiler simply becomes a matter of chaning
115 the value of the CC and CXX variables.
117 For instance, to switch from the currently selected compiler to
118 egcs the following commands can be used
130 1.) The '--program-transform-name' option doesn't do anything!?
133 This is can be frustrating because you won't find the error until
134 you have compiled and installed the source and notices the binary
135 names have not changed. The reason is almost certainly because the
136 regular expression has not been escaped properly. Test your expression
137 with sed and quadruple the number of \'s used to escape it.
139 Why? Well, suppose you want to add a suffix to a word. The following
140 sed expression does this. You need to escape special characters for
143 echo name | sed -e "s/\(.*\)/\1-suffix/"
145 If you want to get that expression into a Makefile as a string that
146 the Makefile will eventually execute, you have to escape that
149 s/\\(.*\\)/\\1-suffix/
151 So, to get the string show above from a shell prompt into any program
152 you have to escape it again for the shell. So you end up with,
154 s/\\\\(.*\\\\)/\\\\1-suffix/
156 And the configure option becomes,
158 --program-transform-name="s/\\\\(.*\\\\)/\\\\1-suffix/"
161 2.) Things compile, but they are broken!?
164 You may be are mixing compiler versions. Make sure your CC and CXX
165 variables are both using the binaries with the same suffix.
168 DON'T (suffixes are mismatched)
173 DO (suffixes are matched)
179 3.) glibc doesn't compile now!?
181 Because glibc assumes your c preprocessor is named cpp and is
182 located in /lib/cpp you may have difficulty compiling glibc.
183 To make glibc choose the correct preprocessor binary the following
184 path can be applied to the source for glibc-2.2.4 so the correct
185 compiler will be chosen for a linux system.
187 cat > glibc-2.2.4-cpp0.patch << "EOF"
189 2002-20 Eric Crahen <crahen@cse.buffalo.edu>
191 Make sunrpc compile selecting the version specific
192 c preprocessor reported by whatever gcc CC points at.
194 --- glibc-2.2.4-vanilla/sunrpc/rpc_main.c Thu Apr 12 17:02:07 2001
195 +++ glibc-2.2.4/sunrpc/rpc_main.c Sun Jan 20 20:35:51 2002
196 @@ -1323,7 +1323,7 @@
199 size_t len = strlen (argv[i]);
200 - pathbuf = malloc (len + 5);
201 + pathbuf = malloc (len + 6);
205 @@ -1331,7 +1331,7 @@
207 stpcpy (stpcpy (pathbuf,
214 --- glibc-2.2.4-vanilla/sunrpc/Makefile Mon Jul 23 13:55:17 2001
215 +++ glibc-2.2.4/sunrpc/Makefile Sun Jan 20 20:31:26 2002
219 # Tell rpcgen where to find the C preprocessor.
220 -rpcgen-cmd = $(built-program-cmd) -Y `$(CC) -print-file-name=cpp | \
222 +rpcgen-cmd = $(built-program-cmd) -Y `$(CC) -print-file-name=cpp0 | \
225 # Install the rpc data base file.
226 $(inst_sysconfdir)/rpc: etc.rpc $(+force)
230 4.) The kernel doesn't compile now!?
233 In the kernel, 'gcc' is hard coded gcc into the Makefile. One way to
234 overcome this is to use sed.
236 sed -e s/gcc/$CC/ Makefile | make -f - dep && \
237 sed -e s/gcc/$CC/ Makefile | make -f - modules && \
238 sed -e s/gcc/$CC/ Makefile | make -f - modules_install && \
239 sed -e s/gcc/$CC/ Makefile | make -f - bzImage
242 5.) XFree86 doesn't compile now / An X11 program doesn't compile !?
245 Compiling this is tricky when you don't have a common name for your
246 compiler. XFree86 is setup using imake which keeps a database of
247 dependancies. Typically, imake assumes certain compilers are installed
248 and looks for them using the common names and locations /lib/cpp and
249 /usr/bin/gcc. These assumptions can be changed by updating the correct
250 configuration file in the xc/config/cf directory.
252 For a linux system, you can update that file with the following
255 cp config/cf/linux.cf config/cf/linux.cf.orig && \
256 IMAKECPP=`$CC -print-file-name=cpp0` && export IMAKECPP && \
257 sed -e "s/gcc/$CC/;s/.++/$CXX/;" config/cf/linux.cf.orig > \
259 sed -e s,\\\/lib\\\/cpp,`echo $IMAKECPP | sed 's|/|\\\\/|g'`, \
260 /tmp/linux.cf | sed '/# define CppCmd/a \
262 # define RawCppCmd CppCmd -A- \
264 ' > config/cf/linux.cf && \
267 The top part of this command allows both make and imake to
268 use the compiler names you specify in CC and CXX.
272 sed '/# define CppCmd/a\
274 # define RawCppCmd CppCmd -A- \
277 Tells the preprocessor to use the correct undef option.
278 By default, it will attempt to used -undef, which may not
279 work with your compiler depending on the version and how you've
280 compiled it. The wrong undef option will cause you to end up with
281 a bunch of blank man pages.
283 Some X11 program use imake, so you might want to place those
284 first few lines (those that define IMAKECPP) in an rc file.
286 6.) Another program doesn't compile now!?
289 I've shown two of the trickier programs to compile. The vast majority
290 of source not configurable using autoconf will set a variable for the
291 compiler in a Makefile. To overcome that, all that needs to be done is
292 to override that variable.
294 You can tell make to look at your environment using 'make -e'.
296 You can set some vairables 'using make VAR=val'.
299 7.) My cross compiler isn't renamed!?
302 This is because of how gcc built. You can change the
303 program_transform_name variable in the Makefile, but you can't change
304 the program_transform_cross_name variable. To update that you'd need
305 to edit the Makefile template in the gcc subdirectory of your gcc
306 source tree. Below is a patch for this that will patch the two
307 compilers used as examples throughout the document.
309 cat > gcc-cross-rename.patch << "EOF"
311 2002-21 Eric Crahen <crahen@cse.buffalo.edu>
313 * Rename the cross compiler binaries to have a version
314 suffix for GCC-2.95.3 and EGCS-1.1.2
316 --- gcc-2.95.3/gcc/Makefile.in.orig Mon Jan 21 09:19:33 2002
317 +++ gcc-2.95.3/gcc/Makefile.in Mon Jan 21 09:20:47 2002
318 @@ -2569,7 +2569,7 @@
319 $(INSTALL_PROGRAM) xgcc$(exeext) $(bindir)/$(GCC_INSTALL_NAME)$(exeext); \
320 rm -f $(bindir)/$(target_alias)-gcc-1$(exeext); \
321 $(LN) $(bindir)/$(GCC_INSTALL_NAME)$(exeext) $(bindir)/$(target_alias)-gcc-1$(exeext); \
322 - mv $(bindir)/$(target_alias)-gcc-1$(exeext) $(bindir)/$(target_alias)-gcc$(exeext); \
323 + mv $(bindir)/$(target_alias)-gcc-1$(exeext) $(bindir)/$(target_alias)-gcc-2.95.3$(exeext); \
326 # Install the info files.
328 --- egcs-1.1.2/gcc/Makefile.in.orig Mon Jan 21 08:41:22 2002
329 +++ egcs-1.1.2/gcc/Makefile.in Mon Jan 21 08:57:45 2002
330 @@ -2403,7 +2403,7 @@
331 $(INSTALL_PROGRAM) xgcc$(exeext) $(bindir)/$(GCC_INSTALL_NAME)$(exeext); \
332 rm -f $(bindir)/$(target_alias)-gcc-1$(exeext); \
333 $(LN) $(bindir)/$(GCC_INSTALL_NAME)$(exeext) $(bindir)/$(target_alias)-gcc-1$(exeext); \
334 - mv $(bindir)/$(target_alias)-gcc-1$(exeext) $(bindir)/$(target_alias)-gcc$(exeext); \
335 + mv $(bindir)/$(target_alias)-gcc-1$(exeext) $(bindir)/$(target_alias)-gcc-2.91.66$(exeext); \
338 # Install the info files.