diff options
author | Thomas Schwinge <tschwinge@gnu.org> | 2007-11-13 18:14:55 +0100 |
---|---|---|
committer | Thomas Schwinge <tschwinge@gnu.org> | 2007-11-13 18:14:55 +0100 |
commit | 2d29a23f0c62bebe57ae31c22f7e96d8506aa400 (patch) | |
tree | 4c23d19a7923dc66807d05b850dc9bc4f3cdf775 /hurd/building/cross-compiling.mdwn | |
parent | eda08f86a615dddace8b28f46ed71103a821b9ba (diff) |
Don't *include* the shell scripts, but *link* to them.
This is for a reason: I manage them in a RCS and from time to time publish
updates. They're not going to be maintained inside the wiki system, but will
eventually be included in the Hurd's source code base.
Diffstat (limited to 'hurd/building/cross-compiling.mdwn')
-rw-r--r-- | hurd/building/cross-compiling.mdwn | 524 |
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> |