summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hurd/building/cross-compiling.mdwn524
1 files changed, 5 insertions, 519 deletions
diff --git a/hurd/building/cross-compiling.mdwn b/hurd/building/cross-compiling.mdwn
index 51508d20..5a5e3f60 100644
--- a/hurd/building/cross-compiling.mdwn
+++ b/hurd/building/cross-compiling.mdwn
@@ -18,6 +18,11 @@ Mach, GNU Hurd.
[[Thomas_Schwinge|tschwinge]] has written a shell script for building a
complete cross-build environment for GNU/Hurd systems.
+
+For now, find the shell scripts at
+<http://nic-nac-project.de/~schwinge/tmp/cross-gnu> and
+<http://nic-nac-project.de/~schwinge/tmp/cross-gnu-env>.
+
Read through it. Understand it. Then use it.
/!\ Be made aware that -- while it is of course possible to build a working
@@ -30,525 +35,6 @@ definitely needed for the glibc, Hurd and GCC source packages, as there are a
bunch of outstanding patches that are needed for getting a functional build.
-<pre>
-#!/bin/sh
-
-# Cross compile a GNU build environment.
-
-# Written by Thomas Schwinge <tschwinge@gnu.org>.
-
-# This script is placed into the public domain; nevertheless, please feel free
-# to send any suggestions, improvements, etc. back to me.
-
-# The files are canonically found at
-# <http://nic-nac-project.de/~schwinge/tmp/cross-gnu> and
-# <http://nic-nac-project.de/~schwinge/tmp/cross-gnu-env>.
-
-# Thanks to
-# * Thadeu Lima de Souza Cascardo for updating the instructions about getting
-# the source code of GCC using the Subversion repositories.
-
-# Prerequisites:
-#
-# A build environment for the system you're running the script on is required,
-# i.e. a C compiler with the basic libraries and `make'. You might also need
-# `flex' and `bison'.
-
-# Usage:
-#
-# Place `cross-gnu' and `cross-gnu-env' somewhere in `$PATH', e.g. in `~/bin/'.
-
-# Get the source code of the
-
-# * GNU Binutils, <http://gnu.org/software/binutils/>, `src/binutils'
-#
-# $ cvs -d:pserver:anoncvs@sources.redhat.com:/cvs/src \
-# co -r binutils-2_17-branch binutils
-# $ mv src binutils-2_17-branch
-#
-# Or fetch a tarball from <ftp://ftp.gnu.org/gnu/binutils/>.
-
-# * GNU Compiler Collection, <http://gcc.gnu.org/>, `src/gcc'
-#
-# $ svn co svn://gcc.gnu.org/svn/gcc/branches/BRANCH gcc
-# $ mv gcc BRANCH
-#
-# BRANCH is one of `gcc-3_3-branch', `gcc-3_4-branch', `gcc-4_0-branch',
-# `gcc-4_1-branch' or the tag of a released version like `gcc_3_4_3_release'.
-# Or fetch a tarball from <ftp://ftp.gnu.org/gnu/gcc/>.
-
-# * GNU C Library, <http://gnu.org/software/libc/>, `src/glibc'
-#
-# $ cvs -d:pserver:anoncvs@sources.redhat.com:/cvs/glibc \
-# co -r glibc-2_3-branch glibc
-# $ mv libc glibc-2_3-branch
-#
-# Change `glibc-2_3-branch' to `glibc-2_5-branch' to get the glibc 2.5 branch
-# or omit `-r glibc-2_3-branch' if you want to get the trunk, i.e. the glibc
-# 2.6 branch, but note that building both of them currently won't work
-# without heavy patching.
-#
-# Or fetch a tarball from <ftp://ftp.gnu.org/gnu/glibc/>.
-#
-# If you want to use GCC 4.1 or newer, you'll also need to apply the
-# following patch, for both glibc-2_3-branch and glibc-2_5-branch:
-# <http://nic-nac-project.de/~schwinge/tmp/init-first.c_vs._GCC_4.1.patch>.
-#
-# If you use a GNU Make version newer than 3.80, you also need to apply the
-# following patch to glibc-2_3-branch:
-# <http://sourceware.org/bugzilla/show_bug.cgi?id=2507#c2>.
-
-# * GNU Hurd, <http://hurd.gnu.org/>, `src/hurd'
-#
-# $ cvs -d:pserver:anoncvs@cvs.gnu.org:/cvsroot/hurd co hurd
-
-# * GNU Mach (gnumach-1-branch), <http://hurd.gnu.org/>, `src/gnumach'
-#
-# $ cvs -d:pserver:anoncvs@cvs.gnu.org:/cvsroot/hurd \
-# co -r gnumach-1-branch gnumach
-# $ mv gnumach gnumach-1-branch
-
-# * GNU Mach Interface Generator, <http://hurd.gnu.org/>, `src/mig'
-#
-# $ cvs -d:pserver:anoncvs@cvs.gnu.org:/cvsroot/hurd co mig
-
-# * GNU Debugger, <http://gnu.org/software/gdb/>, `src/gdb'
-#
-# This is optional and will only be compiled if present.
-#
-# $ cvs -d:pserver:anoncvs@sources.redhat.com:/cvs/src \
-# co -r gdb_6_6-branch gdb
-# $ mv src gdb_6_6-branch
-#
-# Or fetch a tarball from <ftp://ftp.gnu.org/gnu/gdb/>.
-
-# Unpack the tarballs if you downloaded any.
-
-# Create a directory where the cross build shall take place and `cd' to that
-# directory. Create a subdirectory `src' and create symbolic links for every
-# of the above packages: from `src/PACKAGE' to where you stored or unpacked it.
-# If you don't intend to build several cross compilers or use the source trees
-# otherwise, you can also directly store the source trees in `src/'. The
-# source trees can be shared between multiple cross build trees since the
-# package's build systems are supposed not to modify the files in the source
-# trees. Not all packages adhere to that, but they fail to do so only for
-# pre-processed documentation, etc., as far as I can tell.
-
-# Run
-# $ ROOT=. cross-gnu
-# ... to create the cross build environment in the current directory from the
-# sources in `src/'.
-
-# Later, run
-# $ ROOT=WHERE_THE_ROOT_OF_THE_CROSS_BUILD_TREE_IS; . cross-gnu-env
-# ... to set up `$PATH' (and some other environment variables; have a look at
-# cross-gnu-env), so that you can easily use e.g. the cross compiler running
-# `$TARGET-gcc'.
-
-# Notes:
-
-# You can re-run `cross-gnu' to rebuild the parts of the sources that have
-# changed since the last run. This might save a lot of time and is especially
-# useful if you aren't working with unpacked tarballs, but on CVS's branches or
-# want to quickly get a new tool chain with patches you applied to the source
-# trees.
-# I would, however, _not_ recommend to use this technique when doing major
-# changes to the source trees, like switching from gcc-3.3 to gcc-3.4.
-
-# There are several parts marked with `TODO' in this file; feel free to have a
-# look at these issues and send the outcome back to me.
-
-
-# Set up the environment.
-
-. cross-gnu-env
-
-case $? in 0) :;; *) (exit "$?");; esac &&
-
-
-# Be verbose.
-
-set -x &&
-
-
-# Create directories.
-
-mkdir -p "$ROOT" &&
-cd "$ROOT" &&
-mkdir -p bin "$SYS_ROOT"/{include,lib} "$TARGET" &&
-ln -sfn "$SYS_ROOT"/{include,lib} "$TARGET"/ &&
-
-
-# Install the cross GNU Binutils.
-
-mkdir -p "$BINUTILS_SRC".obj &&
-cd "$BINUTILS_SRC".obj &&
-# We use `config.status''s existence as an indicator whether the package was
-# configured already. (E.g. when running cross-gnu a second time to update the
-# tool chain.)
-if ./config.status --version > /dev/null 2>&1; then :; else
- "$BINUTILS_SRC"/configure \
- --target="$TARGET" \
- --prefix="$ROOT" \
- --with-sysroot="$SYS_ROOT" \
- --disable-nls
-fi &&
-"$MAKE" \
- all \
- install &&
-
-
-# Install a minimal cross GCC to build a cross MIG and the GNU C Library.
-
-mkdir -p "$GCC_SRC".obj &&
-cd "$GCC_SRC".obj &&
-# Perhaps we already have a complete cross GCC?
-if "$TARGET"-gcc --version > /dev/null 2>&1; then :; else
- if ./config.status > /dev/null 2>&1; then :; else
- "$GCC_SRC"/configure \
- --target="$TARGET" \
- --prefix="$ROOT" \
- --with-sysroot="$SYS_ROOT" \
- --disable-nls \
- --disable-shared \
- --without-headers \
- --with-newlib \
- --enable-languages=c
- fi &&
-
-# TODO: GCC 3.3 and GCC 3.4 need this for building libgcc.a. Not needed for
-# GCC 4.0.
- : > "$SYS_ROOT"/include/signal.h &&
- mkdir -p "$SYS_ROOT"/include/sys &&
- : > "$SYS_ROOT"/include/sys/ucontext.h &&
-
- if "$MAKE" \
- all-gcc \
- install-gcc &&
-# TODO: Make glibc happy. We can not yet build libgcc_eh, but glibc's build
-# system wants to link against that library. A totally empty file is fine for
-# binutils-2.16, but not for binutils-2.15.
-# <http://sources.redhat.com/ml/libc-alpha/2003-09/msg00100.html>.
- echo '/* Empty. */' > "$SYS_ROOT"/lib/libgcc_eh.a
- then
- # Remove the bogus files if building the cross compiler succeesded.
- rm config.status "$SYS_ROOT"/include/{signal.h,sys/ucontext.h}
- else
- # That indication file might already have been installed, but we do not yet
- # have a complete, working cross compiler.
- rm -f "$ROOT"/bin/"$TARGET"-gcc &&
- exit 100
- fi
-fi &&
-
-
-# Install GNU Mach's header files.
-
-mkdir -p "$GNUMACH_SRC".obj &&
-cd "$GNUMACH_SRC".obj &&
-if ./config.status --version > /dev/null 2>&1; then :; else
- # `$TARGET-gcc' doesn't work yet (to satisfy the Autoconf checks), but isn't
- # needed either.
- CC=gcc \
- "$GNUMACH_SRC"/configure \
- --host="$TARGET" \
- --prefix=
-fi &&
-if grep -q install-data "$GNUMACH_SRC"/Makefile.in; then
- "$MAKE" \
- DESTDIR="$SYS_ROOT" \
- install-data
-else
- # Old.
- "$MAKE" \
- prefix="$SYS_ROOT" \
- no_deps=t \
- install-headers
-fi &&
-
-
-# Install a cross GNU MIG.
-
-mkdir -p "$MIG_SRC".obj &&
-cd "$MIG_SRC".obj &&
-if ./config.status > /dev/null 2>&1; then :; else
- "$MIG_SRC"/configure \
- --target="$TARGET" \
- --prefix="$ROOT"
-fi &&
-"$MAKE" \
- all \
- install &&
-
-
-# Install the GNU Hurd's header files.
-
-mkdir -p "$HURD_SRC".obj &&
-cd "$HURD_SRC".obj &&
-if ./config.status --version > /dev/null 2>&1; then :; else
- # `$TARGET-gcc' doesn't work yet (to satisfy the Autoconf checks), but isn't
- # needed either.
- CC=gcc \
- "$HURD_SRC"/configure \
- --host="$TARGET" \
- --prefix= \
- --disable-profile
-fi &&
-"$MAKE" \
- prefix="$SYS_ROOT" \
- no_deps=t \
- install-headers &&
-# Below, we will reconfigure for allowing to build the pthreads library.
-if grep -q '^CC = gcc$' config.make
-then rm config.status
-else :
-fi &&
-
-
-# Install the GNU C Library.
-
-# Do we already have the GNU C library installed?
-if test -h "$SYS_ROOT"/lib/ld.so; then :; else
- mkdir -p "$GLIBC_SRC".obj &&
- cd "$GLIBC_SRC".obj &&
- if ./config.status > /dev/null 2>&1; then :; else
- # `--build' has to be set to make sure that glibc is cross compiled.
- # TODO: Unless overridden, the build system is forced to think that the
- # linker doesn't support the `-z relro' flag, because there are unfixed
- # bugs in glibc w.r.t. that flag. Likewise for `--without-tls'.
- "$GLIBC_SRC"/configure \
- --without-cvs \
- --build="`"$GLIBC_SRC"/scripts/config.guess`" \
- --host="$TARGET" \
- --prefix= \
- --with-headers="$SYS_ROOT"/include \
- --disable-profile \
- ${CROSS_GNU_TLS---without-tls} \
- ${CROSS_GNU_Z_RELRO-libc_cv_z_relro=no}
- fi &&
- if "$MAKE" \
- install_root="$SYS_ROOT" \
- all \
- install
- then
- # TODO: Why doesn't `make install' do that?
- ln -sf ld.so.1 "$SYS_ROOT"/lib/ld.so &&
- if [ "$CROSS_GNU_REINSTALL_GLIBC" = n ]; then :; else
- # Force re-linking files once libgcc_eh is available. TODO: Is the
- # following enough?
- rm -f "$GLIBC_SRC".obj/config.status
-# rm -rf "$GLIBC_SRC".obj
- fi
- else
- # That indication file might already have been installed, but we do not yet
- # have a complete, working installation of the GNU C library.
- rm -f "$SYS_ROOT"/lib/ld.so
- exit 100
- fi
-fi &&
-
-
-# Install the GNU Hurd's pthreads library.
-
-cd "$HURD_SRC".obj &&
-if ./config.status --version > /dev/null 2>&1; then :; else
- "$HURD_SRC"/configure \
- --host="$TARGET" \
- --prefix= \
- --disable-profile
-fi &&
-"$MAKE" \
- libpthread &&
-"$MAKE" \
- prefix="$SYS_ROOT" \
- libihash-install libpthread-install &&
-
-
-# Install a complete cross GCC.
-
-cd "$GCC_SRC".obj &&
-if ./config.status > /dev/null 2>&1; then :; else
- # TODO: At the moment we only configure for creating a C compiler.
- "$GCC_SRC"/configure \
- --target="$TARGET" \
- --prefix="$ROOT" \
- --with-sysroot="$SYS_ROOT" \
- --disable-nls \
- --enable-languages=c
-fi &&
-# Remove the bogus libgcc_eh.
-rm -f "$SYS_ROOT"/lib/libgcc_eh.a &&
-"$MAKE" \
- all \
- install &&
-
-
-# Install the GNU C Library.
-
-mkdir -p "$GLIBC_SRC".obj &&
-cd "$GLIBC_SRC".obj &&
-if ./config.status > /dev/null 2>&1; then :; else
- # `--build' has to be set to make sure that glibc is cross compiled.
- # TODO: Unless overridden, the build system is forced to think that the
- # linker doesn't support the `-z relro' flag, because there are unfixed
- # bugs in glibc w.r.t. that flag. Likewise for `--without-tls'.
- "$GLIBC_SRC"/configure \
- --without-cvs \
- --build="`"$GLIBC_SRC"/scripts/config.guess`" \
- --host="$TARGET" \
- --prefix= \
- --with-headers="$SYS_ROOT"/include \
- --disable-profile \
- ${CROSS_GNU_TLS---without-tls} \
- ${CROSS_GNU_Z_RELRO-libc_cv_z_relro=no}
-fi &&
-"$MAKE" \
- install_root="$SYS_ROOT" \
- all \
- install &&
-
-
-# Install a cross GDB, if requested.
-
-if test -d "$GDB_SRC"/; then
- mkdir -p "$GDB_SRC".obj &&
- cd "$GDB_SRC".obj &&
- if ./config.status > /dev/null 2>&1; then :; else
- "$GDB_SRC"/configure \
- --target="$TARGET" \
- --prefix="$ROOT" \
- --with-sysroot="$SYS_ROOT" \
- --disable-nls
- fi &&
- "$MAKE" \
- all \
- install &&
-
-
- # If possible, install a cross compiled `gdbserver' to be ran on the TARGET
- # system.
-
- if grep -q '86-\*-gnu\*' "$GDB_SRC"/gdb/gdbserver/README; then
- mkdir -p gdb/gdbserver &&
- cd gdb/gdbserver &&
- if ./config.status > /dev/null 2>&1; then :; else
- "$GDB_SRC"/gdb/gdbserver/configure \
- --host="$TARGET" \
- --prefix="$SYS_ROOT"
- fi &&
- "$MAKE" \
- all \
- install
- else :
- fi
-fi &&
-
-
-# Success.
-
-echo "$0"': Everything should be in place now.'
-</pre>
-
-## cross-gnu-env
-
-<pre>
-#!/bin/sh
-
-# Cross compile a GNU build environment.
-
-# Written by Thomas Schwinge <tschwinge@gnu.org>.
-
-# This script is placed into the public domain; nevertheless, please feel free
-# to send any suggestions, improvements, etc. back to me.
-
-# The files are canonically found at
-# <http://nic-nac-project.de/~schwinge/tmp/cross-gnu> and
-# <http://nic-nac-project.de/~schwinge/tmp/cross-gnu-env>.
-
-
-# Functions from Paul Jarc's prjlibs available at
-# <http://code.dogmap.org/prjlibs/>.
-
-# sh/set.sh
-case $? in 0) :;; *) (exit "$?");; esac &&
-prj_set() {
- eval "$1=\${2?}"
-}
-
-# sh/set_default.sh
-case $? in 0) :;; *) (exit "$?");; esac &&
-prj_set_default() {
- : "${2?}" &&
- eval "
- if test \"\${$1+x}\" = x; then :; else
- $1=\$2
- fi"
-}
-
-# sh/unset.sh
-case $? in 0) :;; *) (exit "$?");; esac &&
-prj_unset() {
- while test "$#" != 0; do
- { eval "$1=" &&
- unset "$1" &&
- shift
- } || return "$?"
- done
-}
-
-# sh/x2.sh
-case $? in 0) :;; *) (exit "$?");; esac &&
-prj_x2() {
- : "${2?}" &&
- "$@" &&
- export "$2"
-}
-
-case $? in 0) :;; *) (exit "$?");; esac &&
-
-
-# Create a clean environment.
-
-prj_x2 prj_set LC_ALL C &&
-prj_unset ASFLAGS CFLAGS CPPFLAGS CXXFLAGS LDFLAGS &&
-prj_unset MAKEFLAGS &&
-
-
-# Environment variables.
-
-# `$ROOT' defaults to `~/tmp/gnu'.
-prj_x2 prj_set_default ROOT ~/tmp/gnu &&
-# `$ROOT' must specify an absolute path.
-case $ROOT in
- /*)
- :;;
- *)
- ROOT=`cd "$ROOT" && pwd`;;
-esac &&
-
-prj_x2 prj_set_default SYS_ROOT "$ROOT"/sys_root &&
-
-prj_x2 prj_set_default TARGET i586-pc-gnu &&
-
-prj_x2 prj_set_default BINUTILS_SRC "$ROOT"/src/binutils &&
-prj_x2 prj_set_default GCC_SRC "$ROOT"/src/gcc &&
-prj_x2 prj_set_default GDB_SRC "$ROOT"/src/gdb &&
-prj_x2 prj_set_default GLIBC_SRC "$ROOT"/src/glibc &&
-prj_x2 prj_set_default GNUMACH_SRC "$ROOT"/src/gnumach &&
-prj_x2 prj_set_default HURD_SRC "$ROOT"/src/hurd &&
-prj_x2 prj_set_default MIG_SRC "$ROOT"/src/mig &&
-
-# TODO. See cross-gnu.
-prj_x2 prj_set_default CROSS_GNU_REINSTALL_GLIBC y &&
-
-prj_x2 prj_set PATH "$ROOT"/bin:"$PATH" &&
-
-if gmake --version 2> /dev/null | grep -q GNU
-then prj_x2 prj_set MAKE gmake
-else prj_x2 prj_set MAKE make
-fi
-</pre>
-
## References
* <http://lists.gnu.org/archive/html/bug-hurd/2004-09/msg00030.html>