From b848d53c8471748c751e1f00cd886ddb9ca0cb02 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sun, 11 Dec 2011 12:17:19 +0100 Subject: [PATCH 1/4] Build preload lib to fake output of uname. --- lfs/fake-environ | 58 +++++++++++++++++++++++++++++++++++++++ make.sh | 4 ++- src/fake-environ/Makefile | 31 +++++++++++++++++++++ src/fake-environ/uname.c | 50 +++++++++++++++++++++++++++++++++ tools/make-functions | 21 ++++++++++++++ 5 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 lfs/fake-environ create mode 100644 src/fake-environ/Makefile create mode 100644 src/fake-environ/uname.c diff --git a/lfs/fake-environ b/lfs/fake-environ new file mode 100644 index 000000000..b72491253 --- /dev/null +++ b/lfs/fake-environ @@ -0,0 +1,58 @@ +############################################################################### +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2007 Michael Tremer & Christian Schmidt # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +############################################################################### + +############################################################################### +# Definitions +############################################################################### + +include Config + +VER = 1.0 + +THISAPP = fake-environ +DIR_APP = $(DIR_SRC)/$(THISAPP) +TARGET = $(DIR_INFO)/$(THISAPP)-tools$(PASS) + +############################################################################### +# Top-level Rules +############################################################################### + +install : $(TARGET) + +check : + +download : + +md5 : + +############################################################################### +# Installation Details +############################################################################### + +$(TARGET) : + @$(PREBUILD) + @rm -rf $(DIR_APP) + cp -rvf $(DIR_SRC)/src/$(THISAPP) $(DIR_APP) + + cd $(DIR_APP) && make install CFLAGS="$(CFLAGS)" \ + TOOLS_DIR="/tools" + + @rm -rf $(DIR_APP) + @$(POSTBUILD) diff --git a/make.sh b/make.sh index f98d84ad2..8b9f48a2b 100755 --- a/make.sh +++ b/make.sh @@ -37,7 +37,7 @@ KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }'` MACHINE=`uname -m` GIT_TAG=$(git tag | tail -1) # Git Tag GIT_LASTCOMMIT=$(git log | head -n1 | cut -d" " -f2 |head -c8) # Last commit -TOOLCHAINVER=1 +TOOLCHAINVER=2 BUILDMACHINE=$MACHINE if [ "$MACHINE" = "x86_64" ]; then @@ -242,6 +242,7 @@ buildtoolchain() { export NATIVEGCC GCCmajor=${NATIVEGCC:0:1} GCCminor=${NATIVEGCC:2:1} GCCrelease=${NATIVEGCC:4:1} ORG_PATH=$PATH export PATH=$BASEDIR/build/usr/local/bin:$BASEDIR/build/tools/bin:$PATH + lfsmake1 fake-environ PASS=1 lfsmake1 ccache PASS=1 lfsmake1 make PASS=1 lfsmake1 binutils PASS=1 @@ -253,6 +254,7 @@ buildtoolchain() { fi lfsmake1 glibc lfsmake1 cleanup-toolchain PASS=1 + lfsmake1 fake-environ PASS=2 lfsmake1 tcl lfsmake1 expect lfsmake1 dejagnu diff --git a/src/fake-environ/Makefile b/src/fake-environ/Makefile new file mode 100644 index 000000000..a75bdf27f --- /dev/null +++ b/src/fake-environ/Makefile @@ -0,0 +1,31 @@ + +ifeq "$(CFLAGS)" "" + $(error CLFAGS not defined.) +endif + +ifeq "$(TOOLS_DIR)" "" + $(error TOOLS_DIR not defined.) +endif + +LIB = libpakfire_preload.so + +SOURCES = $(wildcard *.c) +OBJECTS = $(patsubst %.c,%.o,$(SOURCES)) + +.PHONY: all +all: $(LIB) + +%.o: %.c Makefile + $(CC) $(CFLAGS) -o $@ -c $< + +$(LIB): $(OBJECTS) + $(CC) $(CFLAGS) -shared -o $@ $? -ldl + +.PHONY: install +install: all + -mkdir -pv $(TOOLS_DIR)/lib/ + install -p -m 755 $(LIB) $(TOOLS_DIR)/lib + +.PHONY: clean +clean: + $(LIB) diff --git a/src/fake-environ/uname.c b/src/fake-environ/uname.c new file mode 100644 index 000000000..2485a810f --- /dev/null +++ b/src/fake-environ/uname.c @@ -0,0 +1,50 @@ + + +#include +#include +#include +#include /* for EXIT_FAILURE */ +#include /* for _exit() */ +#include +#include +#include +#include +#include + +#ifndef RTLD_NEXT +#define RTLD_NEXT ((void *) -1l) +#endif + +typedef int (*uname_t)(struct utsname * buf); + +static void *get_libc_func(const char *funcname) { + char *error; + + void *func = dlsym(RTLD_NEXT, funcname); + if ((error = dlerror()) != NULL) { + fprintf(stderr, "I can't locate libc function `%s' error: %s", funcname, error); + _exit(EXIT_FAILURE); + } + + return func; +} + +int uname(struct utsname *buf) { + char *env = NULL; + + /* Call real uname to get the information we need. */ + uname_t real_uname = (uname_t)get_libc_func("uname"); + int ret = real_uname((struct utsname *) buf); + + /* Replace release if requested. */ + if ((env = getenv("UTS_RELEASE")) != NULL) { + strncpy(buf->release, env, _UTSNAME_RELEASE_LENGTH); + } + + /* Replace machine type if requested. */ + if ((env = getenv("UTS_MACHINE")) != NULL) { + strncpy(buf->machine, env, _UTSNAME_MACHINE_LENGTH); + } + + return ret; +} diff --git a/tools/make-functions b/tools/make-functions index e693ff94f..144411cd3 100644 --- a/tools/make-functions +++ b/tools/make-functions @@ -270,10 +270,26 @@ exiterror() { exit 1 } +fake_environ() { + [ -e "${BASEDIR}/build/tools/lib/libpakfire_preload.so" ] || return + + local env="LD_PRELOAD=/tools/lib/libpakfire_preload.so" + + # Fake kernel version, because some of the packages do not compile + # with kernel 3.0 and later. + env="${env} UTS_RELEASE=${KVER}" + + # Fake machine version. + env="${env} UTS_MACHINE=${MACHINE}" + + echo "${env}" +} + entershell() { if [ ! -e $BASEDIR/build/usr/src/lfs/ ]; then exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/" fi + echo "Entering to a shell inside LFS chroot, go out with exit" $linux32 chroot $LFS /tools/bin/env -i HOME=/root TERM=$TERM PS1='\u:\w\$ ' \ PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \ @@ -288,6 +304,7 @@ entershell() { MACHINE="$MACHINE" \ MACHINE_TYPE="$MACHINE_TYPE" \ KGCC="ccache /usr/bin/gcc" \ + $(fake_environ) \ /tools/bin/bash if [ $? -ne 0 ]; then beautify message FAIL @@ -371,6 +388,7 @@ lfsmake1() { ROOT=$LFS \ KVER=$KVER \ MAKETUNING=$MAKETUNING \ + $(fake_environ) \ install >> $LOGFILE 2>&1 local COMPILE_SUCCESS=$? local PKG_TIME_END=`date +%s` @@ -401,6 +419,7 @@ lfsmake2() { KVER=$KVER MAKETUNING=$MAKETUNING \ BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \ MACHINE_TYPE="$MACHINE_TYPE" \ + $(fake_environ) \ /tools/bin/bash -x -c "cd /usr/src/lfs && \ make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1 local COMPILE_SUCCESS=$? @@ -433,6 +452,7 @@ ipfiremake() { KVER=$KVER MAKETUNING=$MAKETUNING \ BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \ MACHINE_TYPE="$MACHINE_TYPE" \ + $(fake_environ) \ /bin/bash -x -c "cd /usr/src/lfs && \ make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1 @@ -464,6 +484,7 @@ ipfiredist() { KVER=$KVER \ BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \ MACHINE_TYPE="$MACHINE_TYPE" \ + $(fake_environ) \ /bin/bash -x -c "cd /usr/src/lfs && \ make -f $1 LFS_BASEDIR=/usr/src dist" >>$LOGFILE 2>&1 From 5e3aa60749506205f13c6db588930de61e84f46f Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sun, 11 Dec 2011 12:29:54 +0100 Subject: [PATCH 2/4] Enable build for armv5tel on armv7l. --- tools/make-functions | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/make-functions b/tools/make-functions index 144411cd3..a55f29cf7 100644 --- a/tools/make-functions +++ b/tools/make-functions @@ -225,7 +225,7 @@ if [ 'x86_64' = $MACHINE -o 'i686' = $MACHINE -o 'i586' = $MACHINE ]; then CXXFLAGS="-O2 -march=i586 -pipe -fomit-frame-pointer" C2FLAGS="-O2 -march=i586 -mtune=i586 -pipe -fomit-frame-pointer" CXX2FLAGS="-O2 -march=i586 -mtune=i586 -pipe -fomit-frame-pointer" -elif [ 'armv5tejl' = $MACHINE -o 'armv5tel' = $MACHINE ]; then +elif [ 'armv5tejl' = $MACHINE -o 'armv5tel' = $MACHINE -o 'armv7l' = $MACHINE ]; then echo "`date -u '+%b %e %T'`: Machine is ARM (or equivalent)" >> $LOGFILE MACHINE=armv5tel MACHINE_TYPE=arm @@ -235,7 +235,7 @@ elif [ 'armv5tejl' = $MACHINE -o 'armv5tel' = $MACHINE ]; then C2FLAGS="$CFLAGS" CXX2FLAGS="$CXXFLAGS" else - echo "`date -u '+%b %e %T'`: Can't determine your architecture - $MACHINE" >> $LOGFILE + echo "`date -u '+%b %e %T'`: Can't determine your architecture - $MACHINE" exit 1 fi From 8bd492fd495cdf954d65052bc1470a08cd13fbd8 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sun, 11 Dec 2011 13:15:27 +0100 Subject: [PATCH 3/4] CFLAGS: Explicitely enforce softfp. --- tools/make-functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/make-functions b/tools/make-functions index a55f29cf7..783b46e14 100644 --- a/tools/make-functions +++ b/tools/make-functions @@ -230,7 +230,7 @@ elif [ 'armv5tejl' = $MACHINE -o 'armv5tel' = $MACHINE -o 'armv7l' = $MACHINE ]; MACHINE=armv5tel MACHINE_TYPE=arm BUILDTARGET=${MACHINE}-unknown-linux-gnueabi - CFLAGS="-O2 -march=armv5te -fomit-frame-pointer -pipe" + CFLAGS="-O2 -march=armv5te -mfloat-abi=soft -fomit-frame-pointer -pipe" CXXFLAGS="$CFLAGS" C2FLAGS="$CFLAGS" CXX2FLAGS="$CXXFLAGS" From f13d4e0b09e9aa8f8a47b402438848deaf5a26d1 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sun, 11 Dec 2011 13:22:24 +0100 Subject: [PATCH 4/4] Fix detection weather a toolchain can be built on host. --- make.sh | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/make.sh b/make.sh index 8b9f48a2b..415c19588 100755 --- a/make.sh +++ b/make.sh @@ -229,9 +229,28 @@ prepareenv() { } buildtoolchain() { - if [ "$(uname -m)" = "x86_64" ]; then - exiterror "Cannot build toolchain on x86_64. Please use the download." - fi + local error=false + case "${MACHINE}:$(uname -m)" in + # x86 + i586:i586|i586:i686) + # These are working. + ;; + i586:*) + error=true + ;; + + # ARM + armv5tel:armv5tel|armv5tel:armv5tejl) + # These are working. + ;; + armv5tel:*) + error=true + ;; + esac + + ${error} && \ + exiterror "Cannot build ${MACHINE} toolchain on $(uname -m). Please use the download if any." + if [ "$(uname -r | grep ipfire)" ]; then exiterror "Cannot build toolchain on ipfire. Please use the download." fi