# old stage 2 based on a broken stage 1, so carefull what to pick
# into the next version..
#######################################
##### TODO FROM HERE
#######################################
# TODO: m4. autoconf, automake, libtool are not really bootstrappable in x-tools
# basic packages, non-virtual one from above: kernel, shell, pacman, editor, coreutils, development
# tools (some of them can be bootstrapped inside like the autotools, perl; and they also should!)
# linux-headers is important so we can build kmod inside the chroot
# linux itself is tricky. For now we will boot with direct kernel parameters and binary in libvirt/qemu
PACKAGES= \
\
\
libffi"
###
TODO FROM HERE
# TODO:
# autoreconf needs autotools/m4 and dependencies (crosstool-ng autotools are broken for me)\
# libunistring for gettext
# libffi for glib2
pushd $HOME/x-tools/i486-unknown-linux-gnu/i486-unknown-linux-gnu/sysroot
bsdtar xf $STAGE1_CHROOT/packages/i486/autoconf-2.69-4-any.pkg.tar.gz
bsdtar xf $STAGE1_CHROOT/packages/i486/automake-1.15.1-1-any.pkg.tar.gz
bsdtar xf $STAGE1_CHROOT/packages/i486/libffi-3.2.1-2-i486.pkg.tar.gz
popd
cd ..
done
# special patches for some packages
###################################
# autoconf needs help2man, checks need fortan (wow. that package is old!)
# depends contains base-devel stuff?! diffutils
sed -i 's@makedepends\(.*\)@#makedepends\1@g' autoconf/PKGBUILD
sed -i 's@checkdepends\(.*\)@#checkdepends\1@g' autoconf/PKGBUILD
sed -i 's@depends\(.*\)@#depends=\1@g' autoconf/PKGBUILD
# automake needs dejagnu for testing, not now, disabling checks
sed -i 's@checkdepends\(.*\)@#checkdepends\1@g' automake/PKGBUILD
# libool: trusting the toolchain here, no silly checks :-)
sed -i 's@makedepends\(.*\)@#makedepends\1@g' libtool/PKGBUILD
# afterpatching; autreconf has a hard-coded #! /bin/perl -w bang,
# seriously!
chmod u+w /home/cross/x-tools/i486-unknown-linux-gnu/i486-unknown-linux-gnu/sysroot/usr/bin/autoreconf
sed -i 's@^#/bin/perl@/home/cross/x-tools/i486-unknown-linux-gnu/i486-unknown-linux-gnu/sysroot/usr/bin/perl@g' \
/home/cross/x-tools/i486-unknown-linux-gnu/i486-unknown-linux-gnu/sysroot/usr/bin/autoreconf
# glib2
#######
# take gettext from host
sed -i 's@makedepends\(.*\)@#makedepends\1@g' glib2/PKGBUILD
# get arch-meson wrapper, doens't build without it!
# ok, forget meson, completly broken, resorting to autotools.
# autoreconf: running: /home/cross/x-tools/i486-unknown-linux-gnu/bin/autoconf --force
# configure.ac:88: error: possibly undefined macro: AC_DEFINE
# huh?
# retooling seems to be near impossible! ok, autoconf broken, meson unusable.. sweet
Found pkg-config: /bin/pkg-config (0.27.1)
Dependency libpcre found: NO
Library m found: YES
Not looking for a fallback subproject for the dependency libffi because:
Automatic wrap-based fallback dependency downloading is disabled.
Meson encountered an error in file meson.build, line 1439, column 0:
Native dependency 'libffi' not found
==> ERROR: A failure occurred in build().
Aborting...
=> this is all very wrong!
# libarchive calls autoreconf, this is quite annoying as perl in crosstool-nt or
###
# stil in phase two, no proper autotools, let's apply the out-of-chroot trick once more..
# do the autoreconf -fi outside, create a package libarchive-3.3.2-retooled.tgz
# libarchive has trouble with wchar_t (and has quite some other trouble around autoconf it seems)
# remove the wchar_t and wchar_t sizeof test in configure.ac manutally before retooling
# and of course tests fail!
# no checks again
sed -i "s@^source=.*@source=('libarchive-3.3.2-retooled.tgz')@g" libarchive/PKGBUILD
sed -i "s@^sha256sums=.*@sha256sums=('1f856e6f5cc0e1479f381e381a031ba19d09f80b51ac88e74b2c140fc78606e8')@g" libarchive/PKGBUILD
sed -i 's@autoreconf@#autoreconf@g' libarchive/PKGBUILD
# generic build
###############
for p in $PACKAGES
# for some packages we cannot execute tests (because the dependencies to install in
# the toolchain environment would be too much)
# autoconf: --nocheck
# automake: --nockeck
# pacman: --nocheck
# mpfr: --nocheck
# for ncurses, readline for bash
# autoreconf needs autotools/m4 and dependencies (crosstool-ng autotools are broken for me)
# libunistring for gettext
# libffi for glib2
bsdtar xf $STAGE1_CHROOT/packages/i486/libffi-3.2.1-2-i486.pkg.tar.gz
popd
cd ..
done
testing:
# common issues
###############
TODOS: in linux package makepkg
https://github.com/libarchive/libarchive/issues/411
https://rubenerd.com/sata-on-qemu/
/usr/libexec/qemu-kvm --enable-kvm -cpu 486 -m 32 -vnc 0.0.0.0:2 \
-kernel linux/pkg/linux/boot/vmlinuz-linux \
-append 'root=/dev/hda1 nomodeset init=/etc/rc console=ttyS0 console=tty0' \
-cdrom /data/isos/arch486.iso -hda /data/libvirt/arch486.qcow2 -nographic
qemu-system-i386 --enable-kvm -cpu 486 -m 32 -cdrom /data/isos/arch486.iso \
-hda /data/libvirt/arch486.qcow2 -curses -boot d \
-netdev user,id=net0,net=10.0.0.0/24,host=10.0.0.2,dhcpstart=10.0.0.16,hostfwd=tcp::2222-:22 \
-device rtl8139,netdev=net0
qemu-system-i386 --enable-kvm -cpu 486 -m 32 \
-hda /home/cross/arch486.img -curses -boot d \
-netdev user,id=net0,net=10.0.0.0/24,host=10.0.0.2,dhcpstart=10.0.0.16,hostfwd=tcp::2222-:22 \
-device rtl8139,netdev=net0
PHASE 2
#######
Test what we can build inside the chroot.
When we get all dependencies right, we go into the real environment (which is
i486 and thus not SMP and slow- ok, we could use distcc, but anyway)
Main problem: we have trouble to run fakeroot in a chroot
fakeroot: nested operation not yet supported
makepkf -F takes care of that (thanks for providing minial fakeroot support)
but pacman also takes an -F parameter
-> INFAKEROOT=1 in /usr/bin/makepkg
As pacman seems to have some trouble, we overwrite the temp packages inside
the chroot and replace the files on the filesystem forcefully:
error: could not register 'temp' database (wrong or NULL argument passed)
In this round don't skip dependencies and tests if possible.
cp pkg/arch-install-scripts/usr/bin/arch-chroot /usr/local/bin/.
arch-chroot /home/cross/i486-root/
# package specific things
# perl
######
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
# openssl
sed -i 's@i686@i486@g' openssl/PKGBUILD
sed -i 's@no-ssl3-method@no-sse2 no-ssl3-method@g' openssl/PKGBUILD
# xz
# with gcc 7.2 we get new errors
sed -i 's@--enable-werror@--disable-werror@g' xz/PKGBUILD
# help2man
# needs perl-locale-gettext, which needs gettext, which needs glib2
# which needs meson (so a big nogo currently!)
# obviously it builds also without gettext..
sed -i 's@^depends\(.*\)@#depends\1@g' help2man/PKGBUILD
# bc
# requires texinfo, is this part of base-devel?
# bootstrap --force
# no /usr/lib32
# ./fbc -c ./libmath.b libmath.h
# libelf
########
In file included from /usr/include/error.h:52:0,
from xmalloc.c:33:
/usr/include/bits/error.h: In function 'error':
/usr/include/bits/error.h:40:5: error: format not a string literal, argument types not checked [-Werror=format-nonliteral]
__error_noreturn (__status, __errnum, __format, __va_arg_pack ());
^~~~~~~~~~~~~~~~
=> -isystem in gcc specfile needed, not -I
#
# libxml2
# go without icu for now, icu needs C++
# also, python bindings and git are not really needed
sed -i 's@^depends\(.*\)@#depends\1@g' libxml2/PKGBUILD
sed -i 's@^makedepends\(.*\)@#makedepends\1@g' libxml2/PKGBUILD
build()
{
sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0 /g' libtool
make
}
sed -i 's@--with-icu@@' libxml2/PKGBUILD
# dito package
# really, what is it with people!
# take: ftp://xmlsoft.org/libxml2/libxml2-2.9.7.tar.gz
#source=(git+https://git.gnome.org/browse/libxml2#commit=$_commit
# no tests, c++ tests would fail
./configure: line 13042: syntax error near unexpected token `Z,zlib,'
./configure: line 13042: ` PKG_CHECK_MODULES(Z,zlib,'
==> ERROR: A failure occurred in build().
Aborting...
-> zlib probing needs pkg-config, which is it's own disaster, so disable
zlib for now.
=> hack out the broken PKG_CHECK_MODULES out of configure!
-> same trick for LZMA (equally broken) and ICU
-> disable testing for now, either it takes long or it hangs
# libgcrypt
# download location broken, download by hand, adapt PKGBUILD
# libxslt: same disaster as libxml2
# no python, no check
# kmod: circular dependency on linux-headers, let's build
# linux/linux-headers correctly outside the chroot and install
# them here (at least linux-headers)
# gtk-doc draws in Gnome bullshit again
sed -i 's@^makedepends\(.*\)@#makedepends\1@g' kmod/PKGBUILD
# libtirpc: break the cyrcle with systemd (via krb5)
sed -i 's@^makedepends\(.*\)@#makedepends\1@g' libtirpc/PKGBUILD
sed -i 's@^depends\(.*\)@#depends\1@g' libtirpc/PKGBUILD
# configure: error: gssapi.h not found. Use --disable-gssapi, or install GSS-API.
# --disable-gssapi
# pam:
# dependency w3m is for documentation, let's remove it
rm: cannot remove '/build/pam/pkg/pam/usr/share/doc/Linux-PAM/sag-pam_userdb.html': No such file or directory
also remove section in PKGBUILD
# inetutils:
# disable checks
# iroute2
# trying with iptables, as iptables draws in tons of things
sed -i 's@^makedepends\(.*\)@#makedepends\1@g' iproute2/PKGBUILD
sed -i 's@^depends\(.*\)@#depends\1@g' iproute2/PKGBUILD
# bison
# --nocheck: fails miserably to compile tests (C++ missing?)
# linux-headers: fails hapilly and has tons of weird stuff in it
install: failed to access ‘/home/cross/build/linux/pkg/linux-headers/usr/lib/modules/4.13.13-1/build’: No such file or directory
_package-headers()
=> mkdir -p "${_builddir}" everywhere, the problem is install -D on Centos, obviously broken!
# kmod
configure: error: The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.
Alternatively, you may set the environment variables liblzma_CFLAGS
and liblzma_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
To get pkg-config, see .
See `config.log' for more details
==> ERROR: A failure occurred in build().
Aborting...
=> let's try to set lzma ourselves or disable it, get around pkg-config probing
# no pkg-config, no docu, try to work around
sed -i 's@--enable-gtk-doc@--disable-gtk-doc@g' kmod/PKGBUILD
sed -i 's@./configure@liblzma_CFLAGS=-I/usr/include liblzma_LIBS=-llzma ./configure@g' kmod/PKGBUILD
sed -i 's@./configure@zlib_CFLAGS=-I/usr/include zlib_LIBS=-lz ./configure@g' kmod/PKGBUILD
=> ok heck: linking errors
sed -i 's@--with-xz@--without-xz@g' kmod/PKGBUILD
sed -i 's@--with-zlib@--without-zlib@g' kmod/PKGBUILD
# libidn
# --nocheck, testing hangs
# iputils
# remove git again
# no docu, hack out manually
sed -i 's@^makedepends\(.*\)@#makedepends\1@g' iptuils/PKGBUILD
# perl-error
# no checks, needs perl test-pod
sed -i 's@^checkdepends\(.*\)@#checkdepends\1@g' perl-error/PKGBUILD
# shadow
# git treatment again.
# no docu
# --disable-man
# git
sed -i 's@^makedepends\(.*\)@#makedepends\1@g' git/PKGBUILD
# no make doc
# disable most things in build
# disable doc in install-doc
# NO_GETTEXT=1
# --nocheck
=> no luck
# lz4:
# git tweaking again, use 1.8.0 tarball
# tar:
# checking whether mknod can create fifo without root privileges... configure: error: in `/build/tar/src/tar-1.29':
# configure: error: you should not run configure as root (set FORCE_UNSAFE_CONFIGURE=1 in environment to bypass this check)
# See `config.log' for more details
=> oh, please, bugger off!
sed -i 's@./configure@FORCE_UNSAFE_CONFIGURE=1 ./configure@g' tar/PKGBUILD
#TODO:
# lz4
# git package again
sed -i 's@^makedepends\(.*\)@#makedepends\1@g' lz4/PKGBUILD
#TODO: cracklib util-linux e2fsprogs libldap keyutils krb5 they end in circlejerk with systemd!
# we will solve that later by building a non-systemd version and then bootstrapping first systemd
# git: out of reach for now, far too many dependencies
perl-error git
# for now we don't rebuild ca-certificates, we had to copy them funilly anyway, and it's
# just a bunch of certs. So, in phase 3 or 4 then..
# curl
######
# curl needs asciidoc and p11-kit, don't build them, use them from the host
sed -i 's@makedepends\(.*\)@#makedepends\1@g' curl/PKGBUILD
# build with minimal features, enough to make pacman download packages
sed -i 's@depends\(.*\)@depends=('ca-certificates' 'openssl' 'zlib')@g' curl/PKGBUILD
# zsh, perl is used to create a completion file for curl and zsh?
sed -i 's@--with-gssapi@--with-gssapi --without-zsh-functions-dir@g' curl/PKGBUILD
# pacman
########
# pacman's tests mostly fail on non-Archlinux, so skip them
# asciidoc is a makedepend, we can use the one on the host
sed -i 's@makedepends\(.*\)@#makedepends\1@g' pacman/PKGBUILD
sed -i 's@checkdepends\(.*\)@#checkdepends\1@g' pacman/PKGBUILD
# minimal dependencies, we don't sign anything yet
sed -i "s/'gpgme'//g" pacman/PKGBUILD
sed -i "s/'pacman-mirrorlist'//g" pacman/PKGBUILD
sed -i "s/'archlinux-keyring'//g" pacman/PKGBUILD
# we need pkg-config, otherwise pacman find libarchive in the wrong
# place, but pkg-config needs glib2 and glib2 is built using meson (urgh!)
# when we take the host version, lets patch the host pkgconfig file to
# use the sysroot of the toolchain
# we simply set LIBARCHIVE_CFLAGS and LIBARCHIVE_LIBS to get rid of pkg-config probing
sed -i 's@./configure@LIBARCHIVE_CFLAGS=-I/usr/include LIBARCHIVE_LIBS=-larchive ./configure@g' pacman/PKGBUILD
# --nocheck still, as we don't have python yet
# and of course :-)
sed -i 's/exit 1 # \$E_USER_ABORT/# exit 1 # $E_USER_ABORT/g' /home/cross/i486-root/usr/bin/makepkg
# TODO
install: cannot stat '/build/pacman/src/pacman.conf.i486': No such file or directory
==> ERROR: A failure occurred in package().
Aborting...
=> use the /etc/pacman-i486.conf from the chroot as pacman.conf.i486 (we still have the temp
repo and we force the Architecture)
sed -i "s/686)/486)/g" pacman/PKGBUILD
sed -i 's/mycarch="i686"/mycarch="i486")/g' pacman/PKGBUILD
sed -i 's/mychost="i686-pc-linux-gnu"/mychost="i486-pc-linux-gnu"/g' pacman/PKGBUILD
sed -i 's/myflags="-march=i686"/myflags=-march=i486/g' pacman/PKGBUILD
# coreutils
###########
sed -i 's@./configure@FORCE_UNSAFE_CONFIGURE=1 ./configure@g' coreutils/PKGBUILD
# TODO: needed in stage 2?
# apply man generation patch (one has to wonder, is it maintained at all?)
# help2man errors: help2man: can't get `--help' info from man/chmod.td/chmod
# http://ftp.lfs-matrix.net/pub/clfs/conglomeration/coreutils/coreutils-8.28-noman.patch
# based on a patch by William Harrington (kb0iic at cross-lfs dot org) 2014-10-30 for coreutils 8.23
#sed -i 's@source=(@source=(coreutils-8.28-noman.patch @' PKGBUILD
#sed -i "s@md5sums=(@md5sums=('SKIP' @" PKGBUILD
#sed -i '/build()/ i \ prepare() { \n\ cd ${pkgname}-${pkgver}\n\ patch -Np1 < ${srcdir}/coreutils-8.28-noman.patch \n }' PKGBUILD
# zlib
######
strip: /lib/libz.so.1: no version information available (required by /lib/libbfd-2.29.1.so)
=> this is because some tools are built with other versions (toolchain vs. chroot)
=> so we must not install zlib before we rebuild binutils
# util-linux
############
# disable some dependencies on systemd, python, PAM (chfn_chsh)
# and other stuff we don't need
# libtool seems broken
sed -i 's@makedepends\(.*\)@#makedepends\1@g' PKGBUILD
sed -i 's@ \+depends\(.*\)@#depends\1@g' PKGBUILD
sed -i 's@--with-python=3@--without-python \\@g' PKGBUILD
sed -i '/--without-python/ a \ --without-systemd --without-systemdsystemunitdir' PKGBUILD
sed -i 's@./configure@./configure --host=i486-unknown-linux-gnu@g' PKGBUILD
sed -i '/--without-python \\/ a \ --disable-chfn-chsh \\' PKGBUILD
sed -i '/--without-python \\/ a \ --disable-shared --enable-static \\' PKGBUILD
sed -i 's@\(chmod 4755 "$pkgdir"/usr/bin/{newgrp,ch{sh,fn}}\)@#\1@g' PKGBUILD
sed -i "s@\(sed -i '/ListenStream.*\)@#\1@g" PKGBUILD
sed -i 's@\(rm "$pkgdir.*\)@#\1@g' PKGBUILD
# chgrp: chgrp: invalid group: 'tty'invalid group: 'tty'
# /etc/group belongs to filesystem, but has only a root entry when installed
=> filesystem package: post.install hook has not been executed (filesystem.install)
=> for now do it manually
groupadd -g 5 tty
# IMPORTANT DNAGER: the test suite is crazzy and destroys the host!! use --nocheck
# packaging generates tons of errors, lets hope, they are not critical.
# cp: omitting directory ‘/’
# => at least util-linux needs !strip OPTIONS (makepkg-i486.conf)
#rm "$pkgdir"/usr/lib/lib*.{a,so}*
# pcre
######
# no C++
sed -i 's@./configure@./configure --disable-cpp@g' pcre/PKGBUILD
# --nocheck as we have trouble to find shared libraries
# gmp
#####
# no C++
sed -i 's@--enable-cxx@--disable-cxx@g' gmp/PKGBUILD
# gawk
######
# we don't have a valid locale yet, disable NLS
# and disable testing
sed -i 's@./configure@./configure --disable-nls@g' PKGBUILD
# openssh
#########
# package suffers from featuritis
# remove ldns and kerberos5 support, keep libedit (as it's easy to build)
# ssh => not good, openssl <> unbound <> openssl cycle and mess
sed -i 's@^makedepends\(.*\)@#makedepends\1@g' PKGBUILD
sed -i 's@^depends\(.*\)@#depends\1@g' PKGBUILD
sed -i 's@--with-ldns@--without-ldns@g' PKGBUILD
sed -i 's@--with-kerberos5=/usr@--without-kerberos5@g' PKGBUILD
#ln: failed to create symbolic link '/build/openssh/pkg/openssh/usr/share/man/man1/slogin.1.gz': No such file or directory
sed -i 's@\(ln -sf ssh.1.gz.*\)@#\1@g' PKGBUILD
# git
#####
# manual PKGBUILD fix
# install: cannot stat 'contrib/credential/libsecret/git-credential-libsecret': No such file or directory
# => PKGBUILD is a mess, sorry!
# no asciidoc, as this needs python2
#asciidoc -b docbook -d manpage -f ../../Documentation/asciidoc.conf \
# -agit_version=2.15.0 git-subtree.txt
# disable make install-doc
#make: pkg-config: Command not found
#make: pkg-config: Command not found
#make: Leaving directory '/build/git/src/git-2.15.0/contrib/subtree'
#mv: cannot stat '/build/git/pkg/git/usr/share/perl5/site_perl/Git/*': No such file or directory
=> hack away python, perl, systemd, contrib, docu and other things we don't need right now
git clone...
Cloning into 'strusBase'...
fatal: cannot run ssh: No such file or directory
fatal: unable to fork
fatal: Unable to find remote helper for 'https'
fatal: Unable to find remote helper for 'http'
=> we need ssh
# tcl
#####
# disable tests: cynical, disable unit tests of a software needed for testing
# autoconf
##########
# checks need fortan (wow. that package is old!)
# depends contains base-devel stuff?! diffutils
sed -i 's@makedepends\(.*\)@#makedepends\1@g' autoconf/PKGBUILD
sed -i 's@checkdepends\(.*\)@#checkdepends\1@g' autoconf/PKGBUILD
# not bad, but lets disable testing for now:
# ERROR: 455 tests were run,
# 5 failed (4 expected failures).
# 48 tests were skipped.
# automake
##########
# automake needs dejagnu for testing, not now, disabling checks
sed -i 's@checkdepends\(.*\)@#checkdepends\1@g' automake/PKGBUILD
# TOTAL: 2901
# PASS: 2673
# SKIP: 164
# XFAIL: 41
# FAIL: 21
# XPASS: 0
# ERROR: 2
=> ok, but let's disable testing
# dejagnu
#########
# has hard-wired AC_PROG_CXX in configure, remove internal C++ tests
sed -i '/.\/configure/ i \ sed -i "s@AC_PROG_CXX@#AC_PROG_CXX@" configure.ac' dejagnu/PKGBUILD
sed -i '/configure.ac/ a \ sed -i "s@\\(unit_SOURCES.*\\)@#\\1@g" Makefile.am' dejagnu/PKGBUILD
sed -i '/configure.ac/ a \ sed -i "s@\\(check_PROGRAMS*\\)@#\\1@g" Makefile.am' dejagnu/PKGBUILD
sed -i '/Makefile.am/ a \ autoreconf' dejagnu/PKGBUILD
# wget
######
# no gnutls, no libpsl
sed -i 's@^depends\(.*\)@#depends\1@g' PKGBUILD
sed -i 's@--enable-nls@--disable-nls@g' PKGBUILD
sed -i 's@--with-ssl=gnutls@--with-ssl=openssl@g' PKGBUILD
sed -i '/.\/configure/ a \ --without-libpsl \\' PKGBUILD
# work around pkg-config
sed -i 's@./configure@OPENSSL_CFLAGS=-I/usr/include OPENSSL_LIBS="-lssl lcrypto" ./configure@g' PKGBUILD
# needs myriads of perl modules for testing => --nocheck
sed -i 's@^checkdepends\(.*\)@#checkdepends\1@g' PKGBUILD
# binutils
##########
# risky, risky
sed -i 's/glibc>=2.26/glib/g' binutils/PKGBUILD
# this is in gold, so let's disable gold! We don't have C++ (yet), so this should not matter..
sed -i 's@--enable-gold@--disable-gold@g' binutils/PKGBUILD
# libunwind
###########
# no TeX, no docu
sed -i 's@^makedepends\(.*\)@#makedepends\1@g' libunwind/PKGBUILD
# TODO: gcc
#####
TODO:
sed -i 's@^makedepends\(.*\)@#makedepends\1@g' binutils/PKGBUILD
sed -i 's@^checkdepends\(.*\)@#checkdepends\1@g' binutils/PKGBUILD
sed -i 's@^depends\(.*\)@#depends\1@g' binutils/PKGBUILD
# gcc
#####
# no gcc-ada and doxygen
sed -i '/makedepend/ s/gcc-ada //g' gcc/PKGBUILD
sed -i '/makedepend/ s/doxygen //g' gcc/PKGBUILD
# avoid huge git checkouts
sed -i 's@git+https://gcc.gnu.org/git/gcc.git.*@ftp://ftp.mpi-sb.mpg.de/pub/gnu/mirror/gcc.gnu.org/pub/gcc/releases/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.gz@' gcc/PKGBUILD
sed -i 's@cd gcc$@cd ${pkgname}-${pkgver}@g' gcc/PKGBUILD
sed -i 's@$srcdir/gcc/configure@$srcdir/${pkgname}-${pkgver}/configure@g' gcc/PKGBUILD
# we don't have a working C++ compiler right now, be must bootstrap
# doesn't work, we need c++ sind 4.8!
#sed -i '/--enable-shared/ a \ --enable-bootstrap \\' gcc/PKGBUILD
# remove ADA, we don't have (and will most likely never have a GNAT binary to
# bootstrap ADA itself), on the other hand, there is nothing using ADA anyway.
# at least not in packages/community
sed -i '/pkgname/ s/gcc-ada//g' gcc/PKGBUILD
sed -i '/enable-languages/ s/ada//g' gcc/PKGBUILD
# send bugs to the right place
sed -i 's@https://bugs.archlinux.org/@https://bugs.archlinux32.org/@g' gcc/PKGBUILD
# so, I don't know what GNU people call bootstrapping, but this definitely isn't for C!
/usr/include/c++/7.2.0/cstdlib:75:15: fatal error: stdlib.h: No such file or directory
=> let's try to fix the C++ compiler then..
# this is really really dangerous, let's hope, it works
=> find /usr/include/c++/7.2.0 -type f -exec sed -i 's/#include_next/#include/g' {} \;
# /build/gcc/src/gcc-7.2.0/libgo/testsuite/gotest: line 624: 28445 Killed ./a.out -test.short -test.timeout=${timeout}s "$@"
=> ok, enough, go without testing
==> Starting package_gcc-go()...
make: *** i486-pc-linux-gnu/libgo: No such file or directory. Stop.
==> ERROR: A failure occurred in package_gcc-go().
Aborting...
=> fails, oh well, nobody needs go :-)
only c language
no checkdepdns, makedepnds
why the hell, I switched off c++, so wy are still cpp probes being done!?
/lib/cpp hardcoded, seriosly!!
# in prepare()
ln -s ../bin/cpp /home/cross/x-tools/i486-unknown-linux-gnu/lib/cpp
find . -name configure -exec sed -i 's@/lib/cpp@/home/cross/x-tools/i486-unknown-linux-gnu/bin/cpp@g' {} \;
since 4.8 gcc is written in C++, fine. so we have to have a crosstool-ng C++ or
=> we add C++ to the crosstool-ng toolchain, easier and more secure
included from /home/cross/build/gcc/src/gcc-7.2.0/gcc/genmddeps.c:19:0:
/home/cross/build/gcc/src/gcc-7.2.0/gcc/system.h:540:34: error: declaration of C function ‘const cha
r* strsignal(int)’ conflicts with
extern const char *strsignal (int);
^
In file included from /usr/include/c++/4.8.2/cstring:42:0,
from /home/cross/build/gcc/src/gcc-7.2.0/gcc/system.h:235,
from /home/cross/build/gcc/src/gcc-7.2.0/gcc/genmddeps.c:19:
/usr/include/string.h:562:14: error: previous declaration ‘char* strsignal(int)’ here
extern char *strsignal (int __sig) __THROW; ^
In file included from ./bconfig.h:5:0,
=> so, we get to an end here, c++ is taken from the host while cross-compiling?!
-> remove glibc-devel on the host!
-> draw the g++ link, autoconf fails in gcc in funny ways (not finding uint64_t)
-> carefull, we build a gcc over a crossng-gcc, not sure, this is supported..
-> aha. if mpfr, mpc and gmp are not installed and taken from sysroot but from i486-root
some pathes get messed up.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82590
https://www.mail-archive.com/gcc-bugs@gcc.gnu.org/msg550065.html
https://gcc.gnu.org/bugzilla/show_bug.cgi?format=multiple&id=54692
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65863
-> huh?
https://gcc.gnu.org/ml/gcc-help/2016-06/msg00016.html
- > yes, this is the inicatition I needed, mpfr, gmp and mpc point to a weird location
The stage one compiler doesn't find the shared library, o well:
/home/cross/build/gcc/src/gcc-build/./gcc/cc1: error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory
-> export LD_LIBRARY_PATH=/home/cross/x-tools/i486-unknown-linux-gnu/i486-unknown-linux-gnu/sysroot/usr/lib
And it never ends:
In file included from /home/cross/build/gcc/src/gcc-7.2.0/libgcc/libgcc2.c:27:0:
/home/cross/build/gcc/src/gcc-7.2.0/libgcc/../gcc/tsystem.h:87:10: fatal error: stdio.h: No such file or directory
#include
^~~~~~~~~
compilation terminated.
make[2]: *** [Makefile:491: _muldi3.o] Error 1
-> https://gcc.gnu.org/ml/gcc-help/2012-04/msg00088.html
-> so, let's try giving it a --with-sysroot to the crosstool-ng dirs
-> and this means also it got past stage 1 compilers :-)
/home/cross/x-tools/i486-unknown-linux-gnu/lib/gcc/i486-unknown-linux-gnu/4.9.4/../../../../i486-unknown-linux-gnu/bin/ld: /home/cross/build/gcc/src/gcc-build/./gcc/liblto_plugin.so: error loading plugin: /home/cross/build/gcc/src/gcc-build/./gcc/liblto_plugin.so: wrong ELF class: ELFCLASS32
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile:982: libgcc_s.so] Error 1
=> for now, remove LTO stuff in PKGBUILD
make: *** i486-unknown-linux-gnu/libstdc++-v3/doc: No such file or directory. Stop.
==> ERROR: A failure occurred in build().
Aborting...
=> remove the PKGBUILD line # make -C $CHOST/libstdc++-v3/doc DESTDIR="$pkgdir" doc-install-man
libstdc++-v3/
=> # make documentation
#make -C $CHOST/libstdc++-v3/doc doc-man-doxygen
install: failed to access ‘/home/cross/build/gcc/pkg/gcc/usr/lib/gcc/i486-unknown-linux-gnu/7.2.0/’: No such file or directory
=> gcc auto-probed itself into i486-pc-linux-gnu, so the installed files are there
CHOST="i486-pc-linux-gnu"
make: Leaving directory '/home/cross/build/gcc/src/gcc-build/gcc'
install: failed to access ‘/home/cross/build/gcc/pkg/gcc/usr/lib/gcc/i486-unknown-linux-gnu/7.2.0/’: No such file or directory
=> sweet, let's try a symlink
_libdir=usr/lib/gcc/$CHOST/$pkgver
=> hard-code: to _libdir=usr/lib/gcc/i486-pc-linux-gnu/$pkgver
=> nope, now others break
this is hardly the ArchLinux way: vanilla and upstream
again CHOST set to i486-pc-linux-gnu
=> this package is a disaster!
=> we have a mess with two CHOSTS, one for crosstool-ng (unknown) and
one for our chroot
# remove traces of ADA
rm "$pkgdir"/usr/share/info/{gccgo,gfortran.info}
# rm: cannot remove ‘/home/cross/build/gcc/pkg/gcc/usr/share/info/gccgo’: No such file or directory
# rm "$pkgdir"/usr/share/info/{gccgo,gfortran.info}
/home/cross/x-tools/i486-unknown-linux-gnu/lib/gcc/i486-unknown-linux-gnu/4.9.4/../../../../i486-unknown-linux-gnu/bin/ld: cannot find -lquadmath
collect2: error: ld returned 1 exit status
libtool: install: error: relink `libgfortran.la' with the above command before installing it
make: *** [Makefile:1331: install-toolexeclibLTLIBRARIES] Error 1
make: Leaving directory '/home/cross/build/gcc/src/gcc-build/i486-unknown-linux-gnu/libgfortran'
==> ERROR: A failure occurred in package_gcc-libs().
Aborting...
=> libquadmath must be retooled before libfortran
=> nope libfortran simply fails to relink => remove it
install: cannot stat ‘/home/cross/build/gcc/src/gcc/COPYING.RUNTIME’: No such file or directory
=> sweet, remove it
error: failed to commit transaction (conflicting files)
gcc: /home/cross/i486-root/usr/lib/libstdc++.a exists in filesystem (owned by gcc-libs)
gcc: /home/cross/i486-root/usr/lib/libstdc++.la exists in filesystem (owned by gcc-libs)
Errors occurred, no packages were upgraded.
=> well, force the package
test.c:1:10: fatal error: stdio.h: No such file or directory
# END TODO: gcc
# libtool
#########
# patched heavily again, git version cannot be bootstrapped use official tarball
# glibc
#######
# use 2.25 version, not 2.26. Keep the ABI intact!
# endless loop? gawk -f ../scripts/gen-as-const.awk pthread-pi-defines.sym \
# two reasons: clock and artifacts walk backwards or forward in time
# chroot on server with chroot, hard to have an asynchronous clock?
# or glibc is already installed on the system (where not?), so how the
# hell can it be possibly built!
# => oh, this would be cruel.
# or 3rd reason, we have a glibc shim, maybe this one causes some trouble
# => why?
# or libtool fixing, whatever fixing means (https://forums.gentoo.org/viewtopic-t-496052-start-0.html)
# => nope.
# -isystem /usr/includ ein gcc spec? quite likely!
# ah: old friend:
build/glibc/src/glibc-build/libc.a(dl-sysdep.o): In function `.L18':
dl-sysdep.c:(.text+0x8c): undefined reference to `__memcmp_ia32'
/build/glibc/src/glibc-build/libc.a(dl-sysdep.o): In function `.L87':
dl-sysdep.c:(.text+0x11f): undefined reference to `__memcmp_ia32'
/build/glibc/src/glibc-build/libc.a(dl-sysdep.o): In function `.L19':
dl-sysdep.c:(.text+0x152): undefined reference to `__memcmp_ia32'
/build/glibc/src/glibc-build/libc.a(dl-sysdep.o): In function `.L85':
dl-sysdep.c:(.text+0x19c): undefined reference to `__memcmp_ia32'
dl-sysdep.c:(.text+0x1b7): undefined reference to `__memcmp_ia32'
/build/glibc/src/glibc-build/libc.a(dl-sysdep.o):dl-sysdep.c:(.text+0x202): more undefined references to `__memcmp_ia32' follow
elf/sln
=> USE_MULTIARCH
=> --disable-multi-arch
=> let's test this time, too dangerous to loose the chroot otherwise!
# older 2.25 misses a binutils 2.29 patch:
https://git.busybox.net/buildroot/diff/package/glibc/0005-fix-binutils-2-29-build.patch?id=cf821efbd0b24690b52f379d4a9934a16073762e
{standard input}: Assembler messages:
{standard input}: Error: `loc1@GLIBC_2.0' can't be versioned to common symbol 'loc1'
{standard input}: Error: `loc2@GLIBC_2.0' can't be versioned to common symbol 'loc2'
{standard input}: Error: `locs@GLIBC_2.0' can't be versioned to common symbol 'locs'
make[2]: *** [../o-iterator.mk:9: /build/glibc/src/glibc-build/misc/regexp.os] Error 1
PACKAGES="iana-etc filesystem linux-api-headers tzdata ncurses readline bash \
gdbm perl openssl bzip2 xz m4 help2man flex bc elfutils \
libtool libxml2 libgpg-error libgcrypt libxslt \
docbook-xml docbook-xsl xmlto libcap libtirpc pambase pam inetutils bison iproute2 kmod \
sysfsutils libidn iputils \
expat acl attr lz4 tar libarchive curl pacman \
joe coreutils util-linux pcre grep findutils file diffutils ed patch \
autoconf automake libedit openssh pcre2 git libunwind strace wget \
gmp mpfr gawk libmpc zlib tcl expect dejagnu binutils gcc libtool glibc"
for p in $PACKAGES; do
asp export $p
done
for p in $PACKAGES
cd $p
sed -i "s/^arch=.*/arch=('i486')/" PKGBUILD
# for some packages we cannot execute tests (because the dependencies to install in
# the toolchain environment would be too much)
# perl: --nocheck
# openssl: --nocheck
# libelf: --nocheck
# libtool: --nocheck
# libxml2: --nocheck
# libxslt: --nocheck
# inetutils: --nocheck
# bison: --nocheck
# libarchive: --nocheck
# pacman: --nocheck
# util-linux: --nocheck
# pcre: --nocheck
# gawk: --nocheck
# tcl: --nocheck
makepkg -C --config /etc/makepkg.conf --skipchecksums --skippgpcheck > $p.log 2>&1
# TODO:
# some package break in parallel builds or produce really funky
# error messages or/and results
# binutils: use makepkg-noparallel.conf
# gcc: use makepkg-noparallel.conf for debuging, the real build works fine in parallel
cp -v *.pkg.tar.gz /packages/i486/.
pacman --noconfirm --config /etc/pacman-i486.conf -U *.pkg.tar.gz
# replace all pacman articats and clean caches
rm -rf /packages/i486/temp* /var/cache/pacman/pkg/*
repo-add /packages/i486/temp.db.tar.gz /packages/i486/*pkg.tar.gz
#repo-add -n /packages/i486/temp.db.tar.gz /packages/i486/*pkg.tar.gz
pacman --noconfirm --config /etc/pacman-i486.conf -r / -S $p
pacman --config /etc/pacman-i486.conf -r / -Q | grep $p
done
# aftermatch for gcc/binutils
#collect2: unable to find ld: this sounds bad, like an archicture mismatch somewhere
#in binutils/gcc
=> this is the cross compiled gcc for i486 inside the chroot, it expects
its platform dependend stuff in /usr/lib/gcc/i486-unknown-linux-gnu/7.2.0
=> we can temporarily fix this:
ln -s /usr/bin/ld /usr/lib/gcc/i486-unknown-linux-gnu/7.2.0/ld
etc.
# libz.so missing?
ln -s libz.so.1 /usr/lib/libz.so
# aftermatch for glibc
# bacause pacman cannot set file permissions
chmod u+x /usr/bin/* /lib/*.so*
# kernel headers:
#/usr/include/linux/errno.h missing
#/usr/include/adm/errno.h missing
=> a libarchive compression issue, files missing, because they are in pkg of
linux-api-headers?!
remove debug packages
error: failed to commit transaction (conflicting files)
/usr/lib/libstdc++.a exists in both 'gcc-libs' and 'gcc'
/usr/lib/libstdc++.la exists in both 'gcc-libs' and 'gcc'
/usr/lib/libblkid.a exists in both 'util-linux' and 'libutil-linux'
/usr/lib/libblkid.la exists in both 'util-linux' and 'libutil-linux'
/usr/lib/libfdisk.a exists in both 'util-linux' and 'libutil-linux'
/usr/lib/libfdisk.la exists in both 'util-linux' and 'libutil-linux'
/usr/lib/libmount.a exists in both 'util-linux' and 'libutil-linux'
/usr/lib/libmount.la exists in both 'util-linux' and 'libutil-linux'
/usr/lib/libsmartcols.a exists in both 'util-linux' and 'libutil-linux'
/usr/lib/libsmartcols.la exists in both 'util-linux' and 'libutil-linux'
/usr/lib/libuuid.a exists in both 'util-linux' and 'libutil-linux'
/usr/lib/libuuid.la exists in both 'util-linux' and 'libutil-linux'
Errors occurred, no packages were upgraded.
=> ok, we loose files and permissions
# in 'real' 486
###############
next round: do those problems persist
error: could not register 'temp' database (wrong or NULL argument passed)
installed binaries have wrong permissions (no execute permission), a pacman issue?
shilly flags? libarchive problem?
git: https helpers
chmod 0777 /usr/lib/git-core/git-remote-*
later: for inside the chroot
# uname module hack
###################
# as root
# we need i486, so setarch doesn't work for us, because it emulates only,
# a i686, use the hacked uname kernel module:
wget http://clfs.org/files/extras/uname_hack-20080713.tar.bz2
tar xf uname_hack-20080713.tar.bz2
cd uname_hack
# swap memset arguments:
# /root/uname_hack/uname_hack.c:50:2: warning: 'memset' used with constant zero length parameter; this could be due to transposed parameters [-Wmemset-transposed-args]
# memset(uname_hack_uts_machine, uname_hack_uts_machine_len, '\0');
# ^~~~~~
# Building modules, stage 2.
make uname_hack_fake_machine=i486
insmod uname_hack.ko
#lib/config.guess in automake returns i486-pc-linux-gnu
# uname -m returns i486
cd ..
# patch our hosts pacman.conf, so it doesn't get fooled by the architecture hack
sed -i 's@^Architecture.*@Architecture = x86_64@g' /etc/pacman.conf
# optional packages for stage 1
# TODO: do we need this for old machines?
# linux-firmware
# use git from the host for now
#sed -i 's@makedepends\(.*\)@#makedepends\1@g' linux-firmware/PKGBUILD