diff --git a/README.md b/README.md index a31c483..7cbdfdd 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,14 @@ If you want, then you can build an up-to-date vanilla GCC as well. ### WHAT IS NOT WORKING (YET)? ### -* Debug info is weak, because of the [missing](https://github.com/tpoechtrager/osxcross/blob/master/patches/gcc-dsymutil.patch) - [`dsymutil`](http://www.manpagez.com/man/1/dsymutil) (shows only function names, no line numbers) -* GCC itself [doesn't build with GCC](https://github.com/tpoechtrager/osxcross/commit/12f5dcdde4bc1000180d25ffda229f0a13cf723d), - but builds fine when clang is used to build GCC +* Debug info is weak because of the [missing](https://github.com/tpoechtrager/osxcross/blob/master/patches/gcc-dsymutil.patch) + [`dsymutil`](http://www.manpagez.com/man/1/dsymutil) (debugger shows only function names). + The source code of dsymutil is not publicly available, so it can't be ported to other systems. + But you probably don't want debug symbols anyway if you build on a non OS X system. + +* GCC itself [doesn't build with GCC](https://github.com/tpoechtrager/osxcross/commit/12f5dcdde4bc1000180d25ffda229f0a13cf723d), + but builds fine when clang is used to build GCC. -Everything else besides that should work. ### WHAT CAN I BUILD WITH IT? ### diff --git a/build.sh b/build.sh index d7fd977..dd16e55 100755 --- a/build.sh +++ b/build.sh @@ -2,12 +2,7 @@ pushd "${0%/*}" &>/dev/null -export LC_ALL="C" -export CC=clang -export CXX=clang++ - -# How many concurrent jobs should be used for compiling? -JOBS=`tools/get_cpu_count.sh` || exit 1 +source tools/tools.sh # SDK version to use SDK_VERSION=10.8 @@ -24,29 +19,12 @@ LINKER_VERSION=134.9 # Don't change this OSXCROSS_VERSION=0.5 -function require -{ - which $1 &>/dev/null - while [ $? -ne 0 ] - do - echo "" - read -p "Install $1 then press enter" - which $1 &>/dev/null - done -} - -BASE_DIR=`pwd` TARBALL_DIR=$BASE_DIR/tarballs BUILD_DIR=$BASE_DIR/build TARGET_DIR=$BASE_DIR/target PATCH_DIR=$BASE_DIR/patches SDK_DIR=$TARGET_DIR/SDK -JOBSSTR="jobs" -if [ $JOBS -eq 1 ]; then - JOBSSTR="job" -fi - if [ -z "$OSX_VERSION_MIN" ]; then OSX_VERSION_MIN="default" fi @@ -58,11 +36,9 @@ case $SDK_VERSION in 10.7*) TARGET=darwin11 ;; 10.8*) TARGET=darwin12 ;; 10.9*) TARGET=darwin13 ;; - *) echo "Invalid SDK Version"; exit 1 ;; + *) echo "Invalid SDK Version" && exit 1 ;; esac -set -e - echo "" echo "Building OSXCross toolchain, Version: $OSXCROSS_VERSION" echo "" @@ -98,9 +74,14 @@ set -e CLANG_TARGET_OPTION=`./oclang/check_target_option.sh` -pushd $BUILD_DIR +pushd $BUILD_DIR &>/dev/null -trap 'test $? -eq 0 || rm -f $BUILD_DIR/have_cctools*' EXIT +function remove_locks() +{ + rm -rf $BUILD_DIR/have_cctools* +} + +source $BASE_DIR/tools/trap_exit.sh if [ "`ls $TARBALL_DIR/cctools*.tar.* | wc -l | tr -d ' '`" != "1" ]; then echo "" @@ -121,7 +102,7 @@ rm -rf xar* tar xJfv $TARBALL_DIR/cctools*.tar.xz tar xzfv $TARBALL_DIR/xar*.tar.gz -pushd cctools*/cctools +pushd cctools*/cctools &>/dev/null patch -p0 < $PATCH_DIR/cctools-ld64-1.patch patch -p0 < $PATCH_DIR/cctools-ld64-2.patch patch -p0 < $PATCH_DIR/cctools-ld64-3.patch @@ -133,37 +114,37 @@ echo "" ./configure --prefix=$TARGET_DIR --target=x86_64-apple-$TARGET make -j$JOBS make install -j$JOBS -popd +popd &>/dev/null -pushd $TARGET_DIR/bin +pushd $TARGET_DIR/bin &>/dev/null CCTOOLS=`find . -name "x86_64-apple-darwin*"` CCTOOLS=($CCTOOLS) for CCTOOL in ${CCTOOLS[@]}; do CCTOOL_I386=`echo "$CCTOOL" | sed 's/x86_64/i386/g'` ln -sf $CCTOOL $CCTOOL_I386 done -popd +popd &>/dev/null fi # have cctools if [ ! -f "have_xar_$TARGET" ]; then if [ -n "$FORCE_XAR_BUILD" ] || [ `echo "$SDK_VERSION<=10.5" | bc -l` -eq 1 ]; then -pushd xar* +pushd xar* &>/dev/null set +e sed -i 's/-Wall/-w/g' configure set -e ./configure --prefix=$TARGET_DIR make -j$JOBS make install -j$JOBS -popd +popd &>/dev/null fi # SDK <= 10.5 fi # have xar if [ ! -f "have_cctools_$TARGET" ]; then -function check +function check_cctools { [ -f "/$TARGET_DIR/bin/$1-apple-$TARGET-lipo" ] || exit 1 [ -f "/$TARGET_DIR/bin/$1-apple-$TARGET-ld" ] || exit 1 @@ -173,8 +154,8 @@ function check [ -f "/$TARGET_DIR/bin/$1-apple-$TARGET-strip" ] || exit 1 } -check i386 -check x86_64 +check_cctools i386 +check_cctools x86_64 touch "have_cctools_${CCTOOLS_REVHASH}_$TARGET" @@ -218,14 +199,14 @@ esac rm -rf $SDK_DIR/MacOSX$SDK_VERSION* 2>/dev/null mv -f SDKs/*$SDK_VERSION* $SDK_DIR -pushd $SDK_DIR/MacOSX$SDK_VERSION.sdk +pushd $SDK_DIR/MacOSX$SDK_VERSION.sdk &>/dev/null set +e ln -s $SDK_DIR/MacOSX$SDK_VERSION.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/std*.h usr/include 2>/dev/null $BASE_DIR/oclang/find_intrinsic_headers.sh $SDK_DIR/MacOSX$SDK_VERSION.sdk set -e -popd +popd &>/dev/null -popd +popd &>/dev/null WRAPPER=$TARGET_DIR/bin/x86_64-apple-$TARGET-oclang cp -f oclang/oclang $WRAPPER @@ -233,7 +214,7 @@ cp -f oclang/oclang $WRAPPER WRAPPER_SCRIPT=`basename $WRAPPER` WRAPPER_DIR=`dirname $WRAPPER` -pushd $WRAPPER_DIR +pushd $WRAPPER_DIR &>/dev/null ln -sf $WRAPPER_SCRIPT o32-clang ln -sf $WRAPPER_SCRIPT o32-clang++ @@ -251,7 +232,7 @@ ln -sf $WRAPPER_SCRIPT x86_64-apple-$TARGET-clang ln -sf $WRAPPER_SCRIPT x86_64-apple-$TARGET-clang++ ln -sf $WRAPPER_SCRIPT x86_64-apple-$TARGET-clang++-libc++ -popd +popd &>/dev/null OSXCROSS_CONF="$TARGET_DIR/bin/osxcross-conf" OSXCROSS_ENV="$TARGET_DIR/bin/osxcross-env" @@ -296,15 +277,6 @@ echo "echo \"export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\$BDIR/../lib${LIB_PATH}"\ chmod +x $OSXCROSS_CONF $OSXCROSS_ENV - -function test_compiler -{ - echo -ne "testing $1 ... " - $1 $2 -O2 -Wall -o test - rm test - echo "works" -} - export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:`cat $BUILD_DIR/cctools*/cctools/tmp/ldpath`" # libLTO.so echo "" @@ -316,9 +288,9 @@ test_compiler o32-clang++ $BASE_DIR/oclang/test.cpp test_compiler o64-clang++ $BASE_DIR/oclang/test.cpp echo "" -echo "Now add the following line" +echo "Now add" echo "" -echo "\`$OSXCROSS_ENV\`" +echo -e "\e[32m\`$OSXCROSS_ENV\`\e[0m" echo "" echo "to your ~/.bashrc or ~/.profile (including the '\`')" echo "" diff --git a/build_gcc.sh b/build_gcc.sh index 08c4030..f5bae52 100755 --- a/build_gcc.sh +++ b/build_gcc.sh @@ -2,24 +2,13 @@ pushd "${0%/*}" &>/dev/null -export LC_ALL="C" export LIBRARY_PATH="" -export CC=clang -export CXX=clang++ +DESC=gcc +source tools/tools.sh `tools/osxcross_conf.sh` -if [ $? -ne 0 ]; then - echo "you need to complete ./build.sh first, before you can start building gcc" - exit 1 -fi - -set -e - -# How many concurrent jobs should be used for compiling? -JOBS=`tools/get_cpu_count.sh` - # GCC version to build # (<4.7 will not work properly with libc++) GCC_VERSION=4.8.2 @@ -27,32 +16,24 @@ GCC_VERSION=4.8.2 # GCC mirror GCC_MIRROR="ftp://ftp.gwdg.de/pub/misc/gcc/releases" -function require -{ - which $1 &>/dev/null - while [ $? -ne 0 ] - do - echo "" - read -p "Install $1 then press enter" - which $1 &>/dev/null - done -} - set +e require wget set -e -BASE_DIR=`pwd` +pushd $OSXCROSS_BUILD_DIR &>/dev/null -pushd $OSXCROSS_BUILD_DIR +function remove_locks() +{ + rm -rf $OSXCROSS_BUILD_DIR/have_gcc* +} -trap 'test $? -eq 0 || rm -f $OSXCROSS_BUILD_DIR/have_gcc*' EXIT +source $BASE_DIR/tools/trap_exit.sh if [ ! -f "have_gcc_${GCC_VERSION}_${OSXCROSS_TARGET}" ]; then -pushd $OSXCROSS_TARBALL_DIR +pushd $OSXCROSS_TARBALL_DIR &>/dev/null wget -c "$GCC_MIRROR/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.bz2" -popd +popd &>/dev/null echo "cleaning up ..." rm -rf gcc* 2>/dev/null @@ -60,7 +41,7 @@ rm -rf gcc* 2>/dev/null echo "extracting gcc ..." tar xf "$OSXCROSS_TARBALL_DIR/gcc-$GCC_VERSION.tar.bz2" -pushd gcc*$GCC_VERSION* +pushd gcc*$GCC_VERSION* &>/dev/null rm -f $OSXCROSS_TARGET_DIR/bin/*-gcc* rm -f $OSXCROSS_TARGET_DIR/bin/*-g++* @@ -68,7 +49,7 @@ rm -f $OSXCROSS_TARGET_DIR/bin/*-g++* patch -p0 < $OSXCROSS_PATCH_DIR/gcc-dsymutil.patch mkdir -p build -pushd build +pushd build &>/dev/null if [ "`uname -s`" == "FreeBSD" ]; then export CPATH="/usr/local/include" @@ -101,14 +82,14 @@ fi $MAKE -j$JOBS $MAKE install -j$JOBS -popd #build -popd #gcc +popd &>/dev/null # build +popd &>/dev/null # gcc touch "have_gcc_${GCC_VERSION}_${OSXCROSS_TARGET}" -fi #have gcc +fi # have gcc -popd #build dir +popd &>/dev/null # build dir WRAPPER=$OSXCROSS_TARGET_DIR/bin/x86_64-apple-${OSXCROSS_TARGET}-ogcc cp ogcc/ogcc $WRAPPER @@ -116,7 +97,7 @@ cp ogcc/ogcc $WRAPPER WRAPPER_SCRIPT=`basename $WRAPPER` WRAPPER_DIR=`dirname $WRAPPER` -pushd $WRAPPER_DIR +pushd $WRAPPER_DIR &>/dev/null if [ ! -f i386-apple-$OSXCROSS_TARGET-base-gcc ]; then mv x86_64-apple-$OSXCROSS_TARGET-gcc x86_64-apple-$OSXCROSS_TARGET-base-gcc @@ -142,15 +123,7 @@ ln -sf $WRAPPER_SCRIPT x86_64-apple-$OSXCROSS_TARGET-gcc ln -sf $WRAPPER_SCRIPT x86_64-apple-$OSXCROSS_TARGET-g++ ln -sf $WRAPPER_SCRIPT x86_64-apple-$OSXCROSS_TARGET-g++-libc++ -popd #wrapper dir - -function test_compiler -{ - echo -ne "testing $1 ... " - $1 $2 -O2 -Wall -o test - rm test - echo "works" -} +popd &>/dev/null # wrapper dir echo "" diff --git a/build_libcxx.sh b/build_libcxx.sh index 69297ac..9696862 100755 --- a/build_libcxx.sh +++ b/build_libcxx.sh @@ -2,19 +2,11 @@ pushd "${0%/*}" &>/dev/null -export LC_ALL="C" - -`tools/osxcross_conf.sh` - -if [ $? -ne 0 ]; then - echo "you need to complete ./build.sh first, before you can start building libc++" - exit 1 -fi - -set -e +DESC=libc++ +source tools/tools.sh if [ `echo "${OSXCROSS_SDK_VERSION}<10.7" | bc -l` -eq 1 ]; then - echo "you must use the SDK from 10.7 or newer to get libc++ compiled" + echo "you must use the SDK from 10.7 or newer to get $DESC compiled" exit 1 fi @@ -24,47 +16,39 @@ JOBS=`tools/get_cpu_count.sh` # libc++ version to build LIBCXX_VERSION=3.3 -function require -{ - which $1 &>/dev/null - while [ $? -ne 0 ] - do - echo "" - read -p "Install $1 then press enter" - which $1 &>/dev/null - done -} - -BASE_DIR=`pwd` - set +e require wget require cmake set -e -pushd $OSXCROSS_BUILD_DIR +pushd $OSXCROSS_BUILD_DIR &>/dev/null -trap 'test $? -eq 0 || rm -f $OSXCROSS_BUILD_DIR/have_libcxx*' EXIT +function remove_locks() +{ + rm -f $OSXCROSS_BUILD_DIR/have_libcxx* +} + +source $BASE_DIR/tools/trap_exit.sh if [ ! -f "have_libcxx_${LIBCXX_VERSION}_${OSXCROSS_TARGET}" ]; then -pushd $OSXCROSS_TARBALL_DIR +pushd $OSXCROSS_TARBALL_DIR &>/dev/null wget -c "http://llvm.org/releases/3.3/libcxx-${LIBCXX_VERSION}.src.tar.gz" -popd +popd &>/dev/null tar xzfv "$OSXCROSS_TARBALL_DIR/libcxx-${LIBCXX_VERSION}.src.tar.gz" -pushd libcxx-${LIBCXX_VERSION}* +pushd libcxx-${LIBCXX_VERSION}* &>/dev/null rm -rf build mkdir build -pushd build +pushd build &>/dev/null # remove conflicting versions rm -rf $OSXCROSS_SDK/usr/include/c++/v1 rm -rf $OSXCROSS_SDK/usr/lib/libc++.dylib rm -rf $OSXCROSS_SDK/usr/lib/libc++.*.dylib -function cmakeerror() +function cmake_error() { echo -e "\e[1m" echo "It looks like CMake failed." @@ -91,19 +75,19 @@ cmake .. \ -DCMAKE_INSTALL_PREFIX=$OSXCROSS_SDK/../libcxx_$OSXCROSS_SDK_VERSION \ -DCMAKE_AR=$OSXCROSS_CCTOOLS_PATH/x86_64-apple-$OSXCROSS_TARGET-ar \ -DCMAKE_RANLIB=$OSXCROSS_CCTOOLS_PATH/x86_64-apple-$OSXCROSS_TARGET-ranlib \ - -DCMAKE_CXX_FLAGS="-arch i386 -arch x86_64" || cmakeerror + -DCMAKE_CXX_FLAGS="-arch i386 -arch x86_64" || cmake_error make -j$JOBS make install -j$JOBS -popd #build -popd #libcxx +popd &>/dev/null # build +popd &>/dev/null # libcxx touch "have_libcxx_${LIBCXX_VERSION}_${OSXCROSS_TARGET}" -fi #have libcxx +fi # have libcxx -popd #build dir +popd &>/dev/null # build dir function test_compiler_clang { diff --git a/tools/get_cpu_count.sh b/tools/get_cpu_count.sh index 3170d20..19307dd 100755 --- a/tools/get_cpu_count.sh +++ b/tools/get_cpu_count.sh @@ -2,6 +2,8 @@ set -e +which cc &>/dev/null || { echo "1" && exit 0; } + prog="cpucount" pushd "${0%/*}" >/dev/null 2>&1 @@ -11,6 +13,6 @@ case "$(uname -s)" in prog="${prog}.exe" ;; esac -test ! -f $prog && cc cpucount.c -o cpucount +test ! -f $prog && cc cpucount.c -o cpucount &>/dev/null eval "./${prog}" diff --git a/tools/osxcross_conf.sh b/tools/osxcross_conf.sh index d09e93d..b8e7c1f 100755 --- a/tools/osxcross_conf.sh +++ b/tools/osxcross_conf.sh @@ -2,9 +2,8 @@ pushd "${0%/*}" &>/dev/null -OSXCROSS_CONF=`which osxcross-conf 2>/dev/null` -test $? -eq 0 || OSXCROSS_CONF="../target/bin/osxcross-conf" -test -f $OSXCROSS_CONF || exit 1 +OSXCROSS_CONF="../target/bin/osxcross-conf" +test -f $OSXCROSS_CONF || { OSXCROSS_CONF=`which osxcross-conf 2>/dev/null` || exit 1; } $OSXCROSS_CONF || exit 1 `dirname $OSXCROSS_CONF`/osxcross-env diff --git a/tools/tools.sh b/tools/tools.sh new file mode 100644 index 0000000..8a08b68 --- /dev/null +++ b/tools/tools.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +BASE_DIR=`pwd` + +export LC_ALL="C" +export CC=clang +export CXX=clang++ + +# enable debug messages +test -n "$OCDEBUG" && set -x + +# how many concurrent jobs should be used for compiling? +JOBS=`tools/get_cpu_count.sh` + +if [ "`basename $0`" != "build.sh" ]; then + `tools/osxcross_conf.sh` + + if [ $? -ne 0 ]; then + echo "you need to complete ./build.sh first, before you can start building $DESC" + exit 1 + fi +fi + +function require +{ + which $1 &>/dev/null + while [ $? -ne 0 ] + do + echo "" + read -p "Please install $1 then press enter" + which $1 &>/dev/null + done +} + +function test_compiler +{ + echo -ne "testing $1 ... " + $1 $2 -O2 -Wall -o test + rm test + echo "works" +} + +# exit on error +set -e diff --git a/tools/trap_exit.sh b/tools/trap_exit.sh new file mode 100644 index 0000000..5e487d7 --- /dev/null +++ b/tools/trap_exit.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +function _exit() +{ + EC=$? + if [ $EC -ne 0 ]; then + SCRIPT=`basename $0` + echo "" + echo "exiting with abnormal exit code ($EC)" + test -n "$OCDEBUG" || echo "run 'OCDEBUG=1 ./$SCRIPT' to enable debug messages" + echo "removing stale locks..." + remove_locks + echo "if it is happening the first time, then just re-run the script" + echo "" + fi +} + +trap _exit EXIT +