This is the mail archive of the
crossgcc@sourceware.org
mailing list for the crossgcc project.
See the CrossGCC FAQ for lots
more information.
Solaris 9 crosstool cookbook (long)
- From: "Robert Lippmann" <rlippmann at hotmail dot com>
- To: crossgcc at sourceware dot org
- Date: Wed, 14 Dec 2005 00:08:48 -0500
- Subject: Solaris 9 crosstool cookbook (long)
- Bcc:
Hi all,
After fighting for many days to try and get Dan Kegel's crosstool working on
Solaris, I
finally succeeded. I figured I'd document the troubles I ran into (mostly
due to Solaris
having a default shell of Bourne shell), in the hopes that it would help
others (and maybe
provide patches to add portability to the tool :)
Anyway, I'm running Solaris 9, and needed to install gcc 3.4.4, glibc 2.3.5
(because I want
to use this machine as a node for distcc compiles for my gentoo box).
Not sure if there's any difference with Solaris 10, or different versions of
gcc/glibc,
but hopefully this will serve as a starting point.
I grabbed the GNU stuff from sunfreeware.com (binutils, gawk, coreutils,
textinfo, gcc, etc).
I made sure that /usr/local/bin was first in my path, and got to work.
First thing I encountered was a problem in getandpatch.sh, namely, the shell
didn't like:
for arg; do
so I changed both occurrences into:
for arg
do
Next, I needed to fix a patch, namely gcc-3.4.4/fix-fixincl.patch. Change
the double quotes
around the sed commands to single quotes:
+SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e
"s,[^/]*/\.\.\/,," -e ta`
to
+SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e
's,[^/]*/\.\.\/,,' -e ta`
and
+ if test "x${SYSTEM_HEADER_DIR}" = "x`echo
"${gcc_tooldir}/sys-include" | sed -e :a -
e "s,[^/]*/\.\.\/,," -e ta`";
to
+ if test "x${SYSTEM_HEADER_DIR}" = "x`echo
"${gcc_tooldir}/sys-include" | sed -e :a -
e 's,[^/]*/\.\.\/,,' -e ta`";
if you don't, when running, you'll receive an error similar to:
chmod 755 ../fixinc.sh
make[2]: Leaving directory
`/export/home/rlippmann/crosstool-0.38/build/i686-unknown-linux-gnu
/gcc-3.4.4-glibc-2.3.5/build-gcc-core/gcc/fixinc'
The directory that should contain system headers does not exist:
sed: -e expression #2, char 3: unterminated `s' command
/bin/sh: : cannot execute
/bin/sh: /]*/../,, -e ta: not found
sed: -e expression #2, char 3: unterminated `s' command
/bin/sh: : cannot execute
/bin/sh: : cannot execute
/bin/sh: /]*/../,, -e ta: not found
make[1]: *** [stmp-fixinc] Error 1
make[1]: Leaving directory
`/export/home/rlippmann/crosstool-0.38/build/i686-unknown-linux-gnu
/gcc-3.4.4-glibc-2.3.5/build-gcc-core/gcc'
make: *** [all-gcc] Error 2
sed: -e expression #2, char 3: unterminated `s' command
/bin/sh: /]*/../,, -e ta: not found
Next, we add a patch to the glibc build bug (Debian Bug #207391). Create a
file in the patche
s/glibc-{version} directory, called, say versioninfo.patch:
--- glibc-2.3.5/csu/Makefile.old Sun Dec 11 14:11:32 2005
+++ glibc-2.3.5/csu/Makefile Sun Dec 11 14:12:39 2005
@@ -241,7 +241,7 @@
esac; \
files="$(all-Banner-files)"; \
if test -n "$$files"; then \
- echo "\"Available extensions:\\n\""; \
+ printf '"Available extensions:\\n"\n'; \
sed -e '/^#/d' -e 's/^[[:space:]]*/ /' \
-e 's/^\(.*\)$$/\"\1\\n\"/' $$files; \
fi) > $@T
If you don't do this, at build time, you will see an error like:
In file included from version.c:33:
/export/home/rlippmann/crosstool-0.38/build/i686-unknown-linux-gnu/gcc-3.4.4-glibc-2.3.5/build
-glibc/csu/version-info.h:2: error: missing terminating " character
/export/home/rlippmann/crosstool-0.38/build/i686-unknown-linux-gnu/gcc-3.4.4-glibc-2.3.5/build
-glibc/csu/version-info.h:3: error: missing terminating " character
version.c:40: error: parse error before string constant
make[2]: ***
[/export/home/rlippmann/crosstool-0.38/build/i686-unknown-linux-gnu/gcc-3.4.4-gli
bc-2.3.5/build-glibc/csu/version.o] Error 1
make[2]: Leaving directory
`/export/home/rlippmann/crosstool-0.38/build/i686-unknown-linux-gnu
/gcc-3.4.4-glibc-2.3.5/glibc-2.3.5/csu'
make[1]: *** [csu/subdir_lib] Error 2
make[1]: Leaving directory
`/export/home/rlippmann/crosstool-0.38/build/i686-unknown-linux-gnu
/gcc-3.4.4-glibc-2.3.5/glibc-2.3.5'
make: *** [lib] Error 2
Next, we need to apply the attached patch to crosstool.sh. It basically
works around the
fact that configure for the initial glibc header install requires GNU
binutils, and the
Sunfreeware compiler (and Solaris companion cd gcc) use the Solaris
linker/assembler.
If you don't apply this patch, you'll see an error like:
checking for makeinfo... makeinfo
checking version of makeinfo... 4.5, ok
checking for sed... sed
checking version of sed... 4.1.1, ok
checking for autoconf... autoconf
checking whether autoconf works... no
configure: error:
*** These critical programs are missing or too old: as ld
*** Check the INSTALL file for required versions.
Finally, we can build. With a bit of luck, you'll get all the way to the
point where you get
this error:
_POSIX_V6_WIDTH_RESTRICTED_ENVS`; do \
/usr/local/bin/install -c
/export/home/rlippmann/crosstool-0.38/build/i686-unknown-lin
ux-gnu/gcc-3.4.4-glibc-2.3.5/build-glibc/posix/getconf
/opt/crosstool/gcc-3.4.4-glibc-2.3.5/i6
86-unknown-linux-gnu/i686-unknown-linux-gnu/libexec/getconf/$spec.new; \
mv -f
/opt/crosstool/gcc-3.4.4-glibc-2.3.5/i686-unknown-linux-gnu/i686-unknown-linux-g
nu/libexec/getconf/$spec.new
/opt/crosstool/gcc-3.4.4-glibc-2.3.5/i686-unknown-linux-gnu/i686-
unknown-linux-gnu/libexec/getconf/$spec; \
done
/export/home/rlippmann/crosstool-0.38/build/i686-unknown-linux-gnu/gcc-3.4.4-glibc-2.3.5/build
-glibc/elf/ld-linux.so.2: syntax error at line 1: `(' unexpected
make[2]: ***
[/opt/crosstool/gcc-3.4.4-glibc-2.3.5/i686-unknown-linux-gnu/i686-unknown-linux-g
nu/libexec/getconf] Error 2
make[2]: Leaving directory
`/export/home/rlippmann/crosstool-0.38/build/i686-unknown-linux-gnu
/gcc-3.4.4-glibc-2.3.5/glibc-2.3.5/posix'
make[1]: *** [posix/subdir_install] Error 2
make[1]: Leaving directory
`/export/home/rlippmann/crosstool-0.38/build/i686-unknown-linux-gnu
/gcc-3.4.4-glibc-2.3.5/glibc-2.3.5'
make: *** [install] Error 2
which is because ld-linux.so.2 is a 386 elf binary, not sparc. I'm not
certain why I didn't
have this problem on a Cygwin build, so a complete fix probably would
involve seeing what the
Cygwin build did to work around this problem (or not run into it in the
first place).
Anyway, all this step appears to be doing is running getconf on the
installed headers to find
out what _POSIX_V6_WIDTH_RESTRICTED_ENVS is. According to my linux box, it
should be:
[rlippmann@akko ~]$ getconf _POSIX_V6_WIDTH_RESTRICTED_ENVS
POSIX_V6_ILP32_OFF32
POSIX_V6_ILP32_OFFBIG
so, we edit build/*/*/glibc-{version}/posix/Makefile, and change the long,
ugly:
for spec in .... \
; do
to
for spec in POSIX_V6_ILP32_OFF32 POSIX_V6_ILP32_OFFBIG \
; do
and re-run (don't forget to use --nounpack, or you'll hose these changes).
Voila, you should have a complete linux toolchain on Solaris.
hth,
-- rob
--- crosstool.sh Tue Dec 13 23:27:02 2005
+++ crosstool.sh.new Mon Dec 12 23:52:35 2005
@@ -398,12 +398,54 @@
# is ok here, since all we want are the basic headers at this point.
# Override libc_cv_ppc_machine so glibc-cvs doesn't complain
# 'a version of binutils that supports .machine "altivec" is needed'.
+
+ # ugly solaris hack
+ if [ "`uname`" = "SunOS" ]
+ then
+ # sunfreeware and companion CD gccs use Solaris native ld and as, need to check
+ # and hack around this as glibc configure requires GNU ld and as and gives up if
+ # it doesn't find them
+ #
+ # hack assumes that GNU binutils are first in PATH
+ #
+ # should really be able to set AS=`which as` and LD=`which ld` or
+ # templd=`which ld`; --with-binutils=`basename $templd`, but neither of those seem
+ # to work, so need to resort to these nasty internal variable settings
+ if `gcc -print-prog-name=ld` -V </dev/null 2>&1 | grep GNU >/dev/null 2>&1
+ then
+ # gnu ld, do nothing
+ sleep 1
+ else
+ if `which ld` -V </dev/null 2>&1 | grep GNU >/dev/null 2>&1
+ then
+ # override configures ld
+ SOLARIS_HACK="libc_cv_prog_ld_gnu=yes ac_cv_prog_LD=`which ld`"
+ echo SOLARIS_HACK=$SOLARIS_HACK
+ else
+ abort "GNU ld not first in PATH"
+ fi
+ fi
+ # and do the same for as
+ if `gcc -print-prog-name=as` -V </dev/null 2>&1 | grep GNU >/dev/null 2>&1
+ then
+ # gnu as, do nothing
+ sleep 1
+ else
+ if `which as` -V </dev/null 2>&1 | grep GNU >/dev/null 2>&1
+ then
+ SOLARIS_HACK="$SOLARIS_HACK libc_cv_prog_as_gnu=yes ac_cv_prog_AS=`which as`"
+ echo SOLARIS_HACK=$SOLARIS_HACK
+ else
+ abort "GNU as not first in PATH"
+ fi
+ fi
+ fi
libc_cv_ppc_machine=yes \
CC=gcc \
${GLIBC_DIR}/configure --prefix=/usr \
--build=$BUILD --host=$TARGET \
--without-cvs --disable-sanity-checks --with-headers=$HEADERDIR \
- --enable-hacker-mode
+ --enable-hacker-mode $SOLARIS_HACK
fi
if grep -q GLIBC_2.3 ${GLIBC_DIR}/ChangeLog; then
------
Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com