diff --git a/CHANGELOG b/CHANGELOG index d4d965b..6a8146f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +0.6: +- added: NetBSD support +- added: dependencies installer script (Don Bright) + 0.5: - fixed: help clang to find its own intrinsic headers (this issue appears to be fixed in clang 3.4+) - changed: attempt to make the toolchain less path dependent @@ -8,7 +12,7 @@ 0.4: - added: gcc support -- added: a workaround for buggish unistd.h headers, no more need to edit /usr/include/unistd.h +- added: a workaround for buggy unistd.h headers 0.3: - added: SDK download links to README diff --git a/README.md b/README.md index 88802ba..85aceeb 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -## OS X Cross toolchain for Linux and FreeBSD ## +## OS X Cross toolchain for Linux, FreeBSD and NetBSD ## ### WHAT IS THE GOAL OF OSXCROSS? ### -The goal of OSXCross is to provide a well working OS X cross toolchain for Linux and FreeBSD. +The goal of OSXCross is to provide a well working OS X cross toolchain for Linux, FreeBSD and NetBSD. ### HOW DOES IT WORK? ### @@ -16,7 +16,7 @@ If you want, then you can build an up-to-date vanilla GCC as well. ### WHAT IS NOT WORKING (YET)? ### * GCC itself [doesn't build with GCC](https://github.com/tpoechtrager/osxcross/commit/12f5dcdde4bc1000180d25ffda229f0a13cf723d), - but builds fine when clang is used to build GCC. + but builds fine when clang is used to build GCC. ### WHAT CAN I BUILD WITH IT? ### @@ -28,13 +28,14 @@ Download the SDK version (links below) you want to the tarball/ (important!) dir Then ensure you have the following installed on your Linux/FreeBSD box: -`Clang 3.2+`, `llvm-devel`, `automake`, `autogen`, `libtool`, +`Clang 3.2+`, `llvm-devel`, `automake`, `autogen`, `libtool`, `patch`, `libxml2-devel` (<=10.5 only), `uuid-devel`, `openssl-devel` and the `bash shell`. -Hint 1: You can run 'sudo tools/get_dependencies.sh' to get these automatically. +Hint 1: You can run 'sudo tools/get_dependencies.sh' to get these automatically. Hint 2: On Ubuntu 12.04 LTS you can use [llvm.org/apt](http://llvm.org/apt) to get a newer version of clang. -Then run `./build.sh` to build the cross toolchain (it will search 'tarballs' for your downloaded SDK and then build in its own directory). +Then run `./build.sh` to build the cross toolchain. +(It will search 'tarballs' for your downloaded SDK and then build in its own directory.) **Don't forget** to add the printed `` `/osxcross-env` `` to your `~/.profile` or `~/.bashrc`. Then either run `source ~/.profile` or restart your shell session. diff --git a/build.sh b/build.sh index 8f81583..31c3542 100755 --- a/build.sh +++ b/build.sh @@ -5,7 +5,7 @@ pushd "${0%/*}" &>/dev/null source tools/tools.sh # find sdk version to use -guess_sdk_version() +function guess_sdk_version() { tmp1= tmp2= @@ -13,7 +13,7 @@ guess_sdk_version() file= sdk= guess_sdk_version_result= - sdkcount=`find tarballs/ | grep MacOSX | wc -l` + sdkcount=`find tarballs/ -type f | grep MacOSX | wc -l` if [ $sdkcount -eq 0 ]; then echo no SDK found in 'tarballs/'. please see README.md exit 1 @@ -22,14 +22,14 @@ guess_sdk_version() for sdk in $sdks; do echo $sdk; done echo 'more than one MacOSX SDK tarball found. please set' echo 'SDK_VERSION environment variable for the one you want' - echo '(for example: run SDK_VERSION=10.x build.sh )' + echo '(for example: SDK_VERSION=10.x [OSX_VERSION_MIN=10.x] ./build.sh)' exit 1 else sdk=`find tarballs/ | grep MacOSX` tmp2=`echo $sdk | sed s/[^0-9.]//g` tmp3=`echo $tmp2 | sed s/\\\.*$//g` guess_sdk_version_result=$tmp3 - echo 'found SDK version' $guess_sdk_version_result 'at tarballs/'$sdk + echo 'found SDK version' $guess_sdk_version_result 'at tarballs/'`basename $sdk` fi if [ $guess_sdk_version_result ]; then if [ $guess_sdk_version_result = 10.4 ]; then @@ -40,7 +40,7 @@ guess_sdk_version() } # make sure there is actually a file with the given SDK_VERSION -verify_sdk_version() +function verify_sdk_version() { sdkv=$1 for file in tarballs/*; do @@ -56,7 +56,8 @@ verify_sdk_version() } if [ $SDK_VERSION ]; then - echo 'SDK VERSION set in environment variable: ' $SDK_VERSION + echo 'SDK VERSION set in environment variable:' $SDK_VERSION + test $SDK_VERSION = 10.4 && SDK_VERSION=10.4u else guess_sdk_version SDK_VERSION=$guess_sdk_version_result @@ -66,14 +67,20 @@ verify_sdk_version $SDK_VERSION # Minimum targeted OS X version # Must be <= SDK_VERSION # You can comment this variable out, -# if you want to use the compilers default value -OSX_VERSION_MIN=10.5 +# if you want to use the compiler's default value +if [ -z "$OSX_VERSION_MIN" ]; then + if [ $SDK_VERSION = 10.4u ]; then + OSX_VERSION_MIN=10.4 + else + OSX_VERSION_MIN=10.5 + fi +fi # ld version LINKER_VERSION=134.9 # Don't change this -OSXCROSS_VERSION=0.5 +OSXCROSS_VERSION=0.6 TARBALL_DIR=$BASE_DIR/tarballs BUILD_DIR=$BASE_DIR/build @@ -114,11 +121,9 @@ mkdir -p $BUILD_DIR mkdir -p $TARGET_DIR mkdir -p $SDK_DIR -set +e require $CC require $CXX require clang -require make require sed require patch require gunzip @@ -126,7 +131,6 @@ require cpio require autogen require automake require libtool -set -e CLANG_TARGET_OPTION=`./oclang/check_target_option.sh` @@ -150,26 +154,31 @@ CCTOOLS_REVHASH=`ls $TARBALL_DIR/cctools*.tar.* | \ tr '_' ' ' | tr '.' ' ' | \ awk '{print $3}'` +# CCTOOLS if [ ! -f "have_cctools_${CCTOOLS_REVHASH}_$TARGET" ]; then rm -rf cctools* rm -rf xar* rm -rf bc* -xz -cd $TARBALL_DIR/cctools*.tar.xz | tar xvf - +extract $TARBALL_DIR/cctools*.tar.xz 1 1 1 pushd cctools*/cctools &>/dev/null +pushd .. &>/dev/null +patch -p0 -l < $PATCH_DIR/cctools-63f6742.patch +popd &>/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 +echo "" ./autogen.sh echo "" echo "if you see automake warnings, ignore them" echo "automake 1.14+ is supposed to print a lot of warnings" echo "" ./configure --prefix=$TARGET_DIR --target=x86_64-apple-$TARGET -make -j$JOBS -make install -j$JOBS +$MAKE -j$JOBS +$MAKE install -j$JOBS popd &>/dev/null pushd $TARGET_DIR/bin &>/dev/null @@ -181,48 +190,56 @@ for CCTOOL in ${CCTOOLS[@]}; do done popd &>/dev/null -fi # have cctools - +fi +# CCTOOLS END +# BC set +e which bc &>/dev/null NEED_BC=$? set -e - if [ $NEED_BC -ne 0 ]; then -tar xfv $TARBALL_DIR/bc*.tar.bz2 +extract $TARBALL_DIR/bc*.tar.bz2 2 pushd bc* &>/dev/null CFLAGS="-w" ./configure --prefix=$TARGET_DIR --without-flex -make -j$JOBS -make install -j$JOBS +$MAKE -j$JOBS +$MAKE install -j$JOBS popd &>/dev/null -fi # NEED BC +fi +# BC END +SDK=`ls $TARBALL_DIR/MacOSX$SDK_VERSION*` -if [ ! -f "have_xar_$TARGET" ]; then -if [ -n "$FORCE_XAR_BUILD" ] || [ `echo "$SDK_VERSION<=10.5" | bc -l` -eq 1 ]; then +# XAR +if [[ $SDK == *.pkg ]]; then -tar xzfv $TARBALL_DIR/xar*.tar.gz +set +e +which xar &>/dev/null +NEED_XAR=$? +set -e + +if [ $NEED_XAR -ne 0 ]; then + +extract $TARBALL_DIR/xar*.tar.gz 2 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 +test "`uname -s`" = "NetBSD" && patch -p0 -l < $PATCH_DIR/xar-netbsd.patch +CFLAGS+=" -w" ./configure --prefix=$TARGET_DIR +$MAKE -j$JOBS +$MAKE install -j$JOBS popd &>/dev/null -fi # SDK <= 10.5 -fi # have xar +fi +fi +# XAR END if [ ! -f "have_cctools_$TARGET" ]; then -function check_cctools +function check_cctools() { [ -f "/$TARGET_DIR/bin/$1-apple-$TARGET-lipo" ] || exit 1 [ -f "/$TARGET_DIR/bin/$1-apple-$TARGET-ld" ] || exit 1 @@ -237,6 +254,8 @@ check_cctools x86_64 touch "have_cctools_${CCTOOLS_REVHASH}_$TARGET" +echo "" + fi # HAVE_CCTOOLS set +e @@ -255,24 +274,7 @@ do done set -e -SDK=`ls $TARBALL_DIR/MacOSX$SDK_VERSION*` -SDK_FILENAME=`basename $SDK` - -echo "extracting $SDK_FILENAME ..." - -case $SDK in - *.pkg) - which xar &>/dev/null || { echo "please build with: FORCE_XAR_BUILD=1 ./build.sh" && exit 1; } - xar -xf $SDK - cat Payload | gunzip -dc | cpio -i 2>/dev/null - ;; - *.tar.xz) - xz -cd $SDK | tar xvf - - ;; - *.tar.gz) - gunzip -dc $SDK | tar xvf - - ;; -esac +extract $SDK 1 1 rm -rf $SDK_DIR/MacOSX$SDK_VERSION* 2>/dev/null mv -f SDKs/*$SDK_VERSION* $SDK_DIR @@ -363,12 +365,24 @@ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:`cat $BUILD_DIR/cctools*/cctools/tmp/ld echo "" -if [ `echo "$SDK_VERSION>=10.9" | bc -l` -eq 1 ] && ( [ $OSX_VERSION_MIN == "default" ] || +if [ -n $OSX_VERSION_MIN ]; then +if [ `echo "${SDK_VERSION/u/}<$OSX_VERSION_MIN" | bc -l` -eq 1 ]; then + echo "OSX_VERSION_MIN must be <= SDK_VERSION" + trap "" EXIT + exit 1 +elif [ `echo "$OSX_VERSION_MIN<10.4" | bc -l` -eq 1 ]; then + echo "OSX_VERSION_MIN must be >= 10.4" + trap "" EXIT + exit 1 +fi + +if [ `echo "${SDK_VERSION/u/}>=10.9" | bc -l` -eq 1 ] && ( [ $OSX_VERSION_MIN == "default" ] || [ `echo "$OSX_VERSION_MIN>=10.9" | bc -l` -eq 1 ] ); then export SCRIPT=`basename $0` ./build_libcxx.sh || exit 0 fi +fi # OSX_VERSION_MIN set test_compiler o32-clang $BASE_DIR/oclang/test.c test_compiler o64-clang $BASE_DIR/oclang/test.c diff --git a/build_gcc.sh b/build_gcc.sh index 17900c8..4b7e3b5 100755 --- a/build_gcc.sh +++ b/build_gcc.sh @@ -2,7 +2,7 @@ pushd "${0%/*}" &>/dev/null -export LIBRARY_PATH="" +unset LIBRARY_PATH DESC=gcc source tools/tools.sh @@ -16,9 +16,7 @@ GCC_VERSION=4.8.2 # GCC mirror GCC_MIRROR="ftp://ftp.gwdg.de/pub/misc/gcc/releases" -set +e require wget -set -e pushd $OSXCROSS_BUILD_DIR &>/dev/null @@ -38,8 +36,8 @@ popd &>/dev/null echo "cleaning up ..." rm -rf gcc* 2>/dev/null -echo "extracting gcc ..." -tar xf "$OSXCROSS_TARBALL_DIR/gcc-$GCC_VERSION.tar.bz2" +extract "$OSXCROSS_TARBALL_DIR/gcc-$GCC_VERSION.tar.bz2" 1 +echo "" pushd gcc*$GCC_VERSION* &>/dev/null @@ -49,18 +47,12 @@ rm -f $OSXCROSS_TARGET_DIR/bin/*-g++* mkdir -p build pushd build &>/dev/null -if [ "`uname -s`" == "FreeBSD" ]; then - export CPATH="/usr/local/include" - export LDFLAGS="-L/usr/local/lib $LDFLAGS" - MAKE=gmake - IS_FREEBSD=1 -else - MAKE=make - IS_FREEBSD=0 +if [[ "`uname -s`" == *BSD ]]; then + export CPATH="/usr/local/include:/usr/pkg/include:$CPATH" + export LDFLAGS="-L/usr/local/lib -L/usr/pkg/lib $LDFLAGS" + export LD_LIBRARY_PATH="/usr/local/lib:/usr/pkg/lib:$LD_LIBRARY_PATH" fi -require $MAKE - ../configure \ --target=x86_64-apple-$OSXCROSS_TARGET \ --with-ld=$OSXCROSS_TARGET_DIR/bin/x86_64-apple-$OSXCROSS_TARGET-ld \ diff --git a/build_libcxx.sh b/build_libcxx.sh index 69aee32..94fe25c 100755 --- a/build_libcxx.sh +++ b/build_libcxx.sh @@ -13,10 +13,8 @@ fi # libc++ version to build LIBCXX_VERSION=3.4 -set +e require wget require cmake -set -e pushd $OSXCROSS_BUILD_DIR &>/dev/null @@ -33,7 +31,7 @@ pushd $OSXCROSS_TARBALL_DIR &>/dev/null wget -c "http://llvm.org/releases/${LIBCXX_VERSION}/libcxx-${LIBCXX_VERSION}.src.tar.gz" popd &>/dev/null -tar xzfv "$OSXCROSS_TARBALL_DIR/libcxx-${LIBCXX_VERSION}.src.tar.gz" +extract "$OSXCROSS_TARBALL_DIR/libcxx-${LIBCXX_VERSION}.src.tar.gz" pushd libcxx-${LIBCXX_VERSION}* &>/dev/null rm -rf build mkdir build @@ -94,7 +92,7 @@ fi # have libcxx popd &>/dev/null # build dir -function test_compiler_clang +function test_compiler_clang() { echo -ne "testing $2 -stdlib=libc++ ... " $1 $3 -O2 -stdlib=libc++ -std=c++11 -Wall -o test @@ -102,7 +100,7 @@ function test_compiler_clang echo "ok" } -function test_compiler_gcc +function test_compiler_gcc() { echo -ne "testing $2 ... " $1 $3 -O2 -std=c++0x -Wall -o test diff --git a/ogcc/ogcc b/ogcc/ogcc index cef8359..482a92c 100755 --- a/ogcc/ogcc +++ b/ogcc/ogcc @@ -84,6 +84,7 @@ else fi export COMPILER_PATH="$OSXCROSS_CCTOOLS_PATH:$COMPILER_PATH" +export LD_LIBRARY_PATH="/usr/local/lib:/usr/pkg/lib:$LD_LIBRARY_PATH" $COMPILER $OSX_VERSION_MIN_OPT $OSXCROSS_OPT_ARGS ${1+"$@"} diff --git a/patches/cctools-63f6742.patch b/patches/cctools-63f6742.patch new file mode 100644 index 0000000..3836409 --- /dev/null +++ b/patches/cctools-63f6742.patch @@ -0,0 +1,289 @@ +commit 63f674235b363b7d762d075b4f1eddc09d10686b +Author: Thomas Pöchtrager +Date: Mon Mar 24 21:16:34 2014 +0100 + + support NetBSD + +diff --git cctools/ar/contents.c cctools/ar/contents.c +index b5bf05d..9df1a33 100644 +--- cctools/ar/contents.c ++++ cctools/ar/contents.c +@@ -81,7 +81,9 @@ static char rcsid[] = "$OpenBSD: contents.c,v 1.2 1996/06/26 05:31:19 deraadt Ex + #include "archive.h" + #include "extern.h" + ++#ifndef HAVE_STRMODE + extern void strmode(int mode, char *p); ++#endif + + /* + * contents -- +diff --git cctools/configure.ac cctools/configure.ac +index 31f075b..17c0d09 100644 +--- cctools/configure.ac ++++ cctools/configure.ac +@@ -10,11 +10,10 @@ AC_ARG_PROGRAM + CC=clang + CXX=clang++ + +-CFLAGS="$CFLAGS `cat tmp/cflags 2>/dev/null` -O3" +-CXXFLAGS="$CXXFLAGS `cat tmp/cxxflags 2>/dev/null` -O3" ++CFLAGS="$CFLAGS `cat tmp/cflags 2>/dev/null` -isystem /usr/local/include -isystem /usr/pkg/include -O3" ++CXXFLAGS="$CXXFLAGS `cat tmp/cxxflags 2>/dev/null` -isystem /usr/local/include -isystem /usr/pkg/include -O3" + LDFLAGS="$LDFLAGS -L/usr/local/lib `cat tmp/ldflags 2>/dev/null`" + export LD_LIBRARY_PATH="`cat tmp/ldpath 2>/dev/null`" +-export C_INCLUDE_PATH="$C_INCLUDE_PATH:/usr/local/include" + + CPP="clang -E" + +@@ -225,6 +224,17 @@ AC_COMPILE_IFELSE( + ) + CFLAGS=$ORIGCFLAGS + ++ORIGCFLAGS=$CFLAGS ++CFLAGS="$CFLAGS -Wno-char-subscripts" ++AC_MSG_CHECKING([if -Wno-char-subscripts is supported]) ++AC_COMPILE_IFELSE( ++ [AC_LANG_SOURCE([[const char hw[] = "Hello, World\n";]])], ++ [WARNINGS="$WARNINGS -Wno-char-subscripts" ++ AC_MSG_RESULT([yes])], ++ [AC_MSG_RESULT([no])] ++) ++CFLAGS=$ORIGCFLAGS ++ + AC_SUBST([WARNINGS], [$WARNINGS]) + + +@@ -251,6 +261,8 @@ AC_SUBST(CRYPT_LIBS) + AC_C_BIGENDIAN([AC_SUBST([ENDIAN_FLAG],[-D__BIG_ENDIAN__=1])], + [AC_SUBST([ENDIAN_FLAG],[-D__LITTLE_ENDIAN__=1])]) + ++AC_CHECK_FUNCS([strmode]) ++ + AC_CONFIG_FILES([Makefile libstuff/Makefile]) + AC_CONFIG_FILES([ar/Makefile]) + AC_CONFIG_FILES([as/Makefile]) +diff --git cctools/include/foreign/i386/endian.h cctools/include/foreign/i386/endian.h +index 2dbebcb..2fbd938 100644 +--- cctools/include/foreign/i386/endian.h ++++ cctools/include/foreign/i386/endian.h +@@ -96,9 +96,9 @@ + + #define BYTE_ORDER __DARWIN_BYTE_ORDER + +-#ifndef __FreeBSD__ ++#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) + #include +-#endif /* !__FreeBSD__ */ ++#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */ + + #endif /* defined(KERNEL) || (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) */ + #endif /* !_I386__ENDIAN_H_ */ +diff --git cctools/include/foreign/i386/signal.h cctools/include/foreign/i386/signal.h +index d729a28..5ddde95 100644 +--- cctools/include/foreign/i386/signal.h ++++ cctools/include/foreign/i386/signal.h +@@ -40,9 +40,9 @@ typedef int sig_atomic_t; + + #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) + +-#ifndef __FreeBSD__ ++#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) + #include +-#endif /* __FreeBSD__ */ ++#endif /* !__FreeBSD__ && !__NetBSD__ && !__OpenBSD__ */ + + #ifdef __APPLE_API_OBSOLETE + +diff --git cctools/include/foreign/i386/types.h cctools/include/foreign/i386/types.h +index 80e9e80..13d95ec 100644 +--- cctools/include/foreign/i386/types.h ++++ cctools/include/foreign/i386/types.h +@@ -67,6 +67,9 @@ + #define _MACHTYPES_H_ + + #ifndef __ASSEMBLER__ ++#if defined(__NetBSD__) || defined(__OpenBSD__) ++#include_next /* __cpu_simple_lock_t */ ++#endif /* __NetBSD__ || __OpenBSD__ */ + #include + #include + /* +@@ -90,9 +93,17 @@ typedef int int32_t; + typedef unsigned int u_int32_t; + #ifndef _INT64_T + #define _INT64_T ++#if !defined(__NetBSD__) && !defined(__OpenBSD__) + typedef long long int64_t; ++#else ++typedef long int64_t; ++#endif /* ! __NetBSD__ && !__OpenBSD__ */ + #endif ++#if !defined(__NetBSD__) && !defined(__OpenBSD__) + typedef unsigned long long u_int64_t; ++#else ++typedef unsigned long u_int64_t; ++#endif /* ! __NetBSD__ && !__OpenBSD__ */ + + #if __LP64__ + typedef int64_t register_t; +diff --git cctools/include/foreign/mach/vm_inherit.h cctools/include/foreign/mach/vm_inherit.h +index d6440e4..27cf97b 100644 +--- cctools/include/foreign/mach/vm_inherit.h ++++ cctools/include/foreign/mach/vm_inherit.h +@@ -72,7 +72,11 @@ + * vm_inherit_t inheritance codes. + */ + +-typedef unsigned int vm_inherit_t; /* might want to change this */ ++#if defined(__NetBSD__) || defined(__OpenBSD__) ++typedef int vm_inherit_t; /* might want to change this */ ++#else ++typedef unsigned int vm_inherit_t; /* might want to change this */ ++#endif /* __NetBSD__ || __OpenBSD__ */ + + /* + * Enumeration of valid values for vm_inherit_t. +diff --git cctools/include/foreign/mach/vm_prot.h cctools/include/foreign/mach/vm_prot.h +index 6fe17d4..e5c8c12 100644 +--- cctools/include/foreign/mach/vm_prot.h ++++ cctools/include/foreign/mach/vm_prot.h +@@ -88,6 +88,7 @@ typedef int vm_prot_t; + * The default protection for newly-created virtual memory + */ + ++#undef VM_PROT_DEFAULT + #define VM_PROT_DEFAULT (VM_PROT_READ|VM_PROT_WRITE) + + /* +diff --git cctools/include/foreign/machine/_limits.h cctools/include/foreign/machine/_limits.h +index ef021a2..61ceec2 100644 +--- cctools/include/foreign/machine/_limits.h ++++ cctools/include/foreign/machine/_limits.h +@@ -25,7 +25,7 @@ + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +-#ifdef __FreeBSD__ ++#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) + #include_next + #else + #ifndef _BSD_MACHINE__LIMITS_H_ +@@ -42,4 +42,4 @@ + #endif + + #endif /* _BSD_MACHINE__LIMITS_H_ */ +-#endif /* __FreeBSD__ */ ++#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */ +diff --git cctools/include/foreign/machine/_types.h cctools/include/foreign/machine/_types.h +index d1b89b4..789a323 100644 +--- cctools/include/foreign/machine/_types.h ++++ cctools/include/foreign/machine/_types.h +@@ -25,7 +25,7 @@ + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +-#ifdef __FreeBSD__ ++#if defined(__FreeBSD__) + #include_next + #else + #ifndef _BSD_MACHINE__TYPES_H_ +diff --git cctools/include/foreign/machine/endian.h cctools/include/foreign/machine/endian.h +index 9fd936a..2341cdd 100644 +--- cctools/include/foreign/machine/endian.h ++++ cctools/include/foreign/machine/endian.h +@@ -28,7 +28,7 @@ + /* + * Copyright 1995 NeXT Computer, Inc. All rights reserved. + */ +-#ifdef __FreeBSD__ ++#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) + #include_next + #else + #ifndef _BSD_MACHINE_ENDIAN_H_ +@@ -45,4 +45,4 @@ + #endif + + #endif /* _BSD_MACHINE_ENDIAN_H_ */ +-#endif /* __FreeBSD__ */ ++#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */ +diff --git cctools/ld64/src/3rd/helper.c cctools/ld64/src/3rd/helper.c +index b75c215..d387c54 100644 +--- cctools/ld64/src/3rd/helper.c ++++ cctools/ld64/src/3rd/helper.c +@@ -14,7 +14,7 @@ + #include + #include + +-#ifdef __FreeBSD__ ++#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) + #include + #endif + +@@ -27,6 +27,8 @@ void __assert_rtn(const char *func, const char *file, int line, const char *msg) + { + #ifdef __FreeBSD__ + __assert(msg, file, line, func); ++#elif defined(__NetBSD__) || defined(__OpenBSD__) ++ __assert(msg, line, file); + #else + __assert(msg, file, line); + #endif /* __FreeBSD__ */ +diff --git cctools/ld64/src/ld/ld.cpp cctools/ld64/src/ld/ld.cpp +index ee337a0..45b7f95 100644 +--- cctools/ld64/src/ld/ld.cpp ++++ cctools/ld64/src/ld/ld.cpp +@@ -37,9 +37,9 @@ + #include + #include + #include +-#ifndef __FreeBSD__ ++#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) + #include +-#endif /* __FreeBSD__ */ ++#endif /* !__FreeBSD__ && !__NetBSD__ && !__OpenBSD__ */ + #include + #include + #include +@@ -757,7 +757,7 @@ int main(int argc, const char* argv[]) + // implement assert() function to print out a backtrace before aborting + void __assert_rtn(const char* func, const char* file, int line, const char* failedexpr) + { +-#ifndef __FreeBSD__ ++#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) + Snapshot *snapshot = Snapshot::globalSnapshot; + + snapshot->setSnapshotMode(Snapshot::SNAPSHOT_DEBUG); +@@ -783,7 +783,7 @@ void __assert_rtn(const char* func, const char* file, int line, const char* fail + snapshot->recordAssertionMessage("%d %p %s + %ld\n", i, callStack[i], symboName, offset); + } + fprintf(stderr, "A linker snapshot was created at:\n\t%s\n", snapshot->rootDir()); +-#endif /* __FreeBSD__ */ ++#endif /* !__FreeBSD__ && !__NetBSD__ && !__OpenBSD__ */ + fprintf(stderr, "ld: Assertion failed: (%s), function %s, file %s, line %d.\n", failedexpr, func, file, line); + exit(1); + } +diff --git cctools/libstuff/dylib_roots.c cctools/libstuff/dylib_roots.c +index eb661b0..74b6519 100644 +--- cctools/libstuff/dylib_roots.c ++++ cctools/libstuff/dylib_roots.c +@@ -32,6 +32,7 @@ + #include + #endif + #include ++#include + #include "stuff/bool.h" + #include "stuff/SymLoc.h" + #include "stuff/ofile.h" +diff --git tools/find_lto_header.sh tools/find_lto_header.sh +index 665683d..6ce5979 100755 +--- tools/find_lto_header.sh ++++ tools/find_lto_header.sh +@@ -26,6 +26,7 @@ try "-3.2" + try "-3.3" + try "-3.4" + try "-3.5" ++try "-devel" + + try "32" + try "33" diff --git a/patches/xar-netbsd.patch b/patches/xar-netbsd.patch new file mode 100644 index 0000000..b17c27f --- /dev/null +++ b/patches/xar-netbsd.patch @@ -0,0 +1,92 @@ +--- lib/linuxattr.c ++++ lib/linuxattr.c +@@ -52,9 +52,7 @@ + #include + #endif + +-#ifdef HAVE_SYS_STATFS_H /* Nonexistant future OS needs this */ +-#include +-#endif ++#include + + #ifdef HAVE_SYS_MOUNT_H + #include +@@ -138,7 +136,7 @@ + #if defined(HAVE_SYS_XATTR_H) && defined(HAVE_LGETXATTR) && !defined(__APPLE__) + char *i, *buf = NULL; + int ret, retval=0, bufsz = 1024; +- struct statfs sfs; ++ struct statvfs sfs; + char *fsname = NULL; + struct _linuxattr_context context; + +@@ -165,8 +163,9 @@ + if( ret == 0 ) goto BAIL; + + memset(&sfs, 0, sizeof(sfs)); +- statfs(file, &sfs); ++ statvfs(file, &sfs); + ++#if 0 + switch(sfs.f_type) { + case EXT3_SUPER_MAGIC: fsname = "ext3"; break; /* assume ext3 */ + case JFS_SUPER_MAGIC: fsname = "jfs" ; break; +@@ -174,6 +173,15 @@ + case XFS_SUPER_MAGIC: fsname = "xfs" ; break; + default: retval=0; goto BAIL; + }; ++#endif ++ ++ fsname = sfs.f_fstypename; ++ ++ if(strcmp(fsname, "ext3") && strcmp(fsname, "jfs") && ++ strcmp(fsname, "reiser") && strcmp(fsname, "xfs")) { ++ retval=0; ++ goto BAIL; ++ } + + for( i=buf; (i-buf) < ret; i += strlen(i)+1 ) { + xar_ea_t e; +@@ -202,7 +210,7 @@ + { + #if defined HAVE_SYS_XATTR_H && defined(HAVE_LSETXATTR) && !defined(__APPLE__) + const char *fsname = "bogus"; +- struct statfs sfs; ++ struct statvfs sfs; + int eaopt = 0; + struct _linuxattr_context context; + xar_prop_t p; +@@ -217,19 +225,31 @@ + /* Check for EA extraction behavior */ + + memset(&sfs, 0, sizeof(sfs)); +- if( statfs(file, &sfs) != 0 ) { ++ if( statvfs(file, &sfs) != 0 ) { + char *tmp, *bname; + tmp = strdup(file); + bname = dirname(tmp); +- statfs(bname, &sfs); ++ statvfs(bname, &sfs); + free(tmp); + } ++#if 0 + switch(sfs.f_type) { + case EXT3_SUPER_MAGIC: fsname = "ext3"; break; /* assume ext3 */ + case JFS_SUPER_MAGIC: fsname = "jfs" ; break; + case REISERFS_SUPER_MAGIC:fsname = "reiser" ; break; + case XFS_SUPER_MAGIC: fsname = "xfs" ; break; + }; ++#endif ++ ++ { ++ const char *pp = fsname; ++ fsname = sfs.f_fstypename; ++ ++ if(strcmp(fsname, "ext3") && strcmp(fsname, "jfs") && ++ strcmp(fsname, "reiser") && strcmp(fsname, "xfs")) { ++ fsname = pp; ++ } ++ } + + for(p = xar_prop_pfirst(f); p; p = xar_prop_pnext(p)) { + const char *fs = NULL; diff --git a/tools/get_dependencies.sh b/tools/get_dependencies.sh index 6e57fef..fe2854b 100755 --- a/tools/get_dependencies.sh +++ b/tools/get_dependencies.sh @@ -14,7 +14,7 @@ get_fedora_deps() get_freebsd_deps() { for pkgname in llvm-devel automake autogen libtool \ - libxml2 e2fsprogs-libuuid openssl bash make; do + libxml2 e2fsprogs-libuuid openssl bash gmake; do echo $pkgname pkg install $pkgname done diff --git a/tools/tools.sh b/tools/tools.sh index 8a08b68..c1ff9c7 100644 --- a/tools/tools.sh +++ b/tools/tools.sh @@ -21,8 +21,9 @@ if [ "`basename $0`" != "build.sh" ]; then fi fi -function require +function require() { + set +e which $1 &>/dev/null while [ $? -ne 0 ] do @@ -30,9 +31,54 @@ function require read -p "Please install $1 then press enter" which $1 &>/dev/null done + set -e } -function test_compiler +if [[ "`uname -s`" == *BSD ]]; then + MAKE=gmake +else + MAKE=make +fi + +require $MAKE + +function extract() +{ + test $# -ge 2 -a $# -lt 4 && test $2 -eq 2 && echo "" + echo "extracting `basename $1` ..." + + local tarflags + + tarflags="xf" + test -n "$OCDEBUG" && tarflags+="v" + + case $1 in + *.pkg) + which xar &>/dev/null || exit 1 + xar -xf $1 + cat Payload | gunzip -dc | cpio -i 2>/dev/null && rm Payload + ;; + *.tar.xz) + xz -dc $1 | tar $tarflags - + ;; + *.tar.gz) + gunzip -dc $1 | tar $tarflags - + ;; + *.tar.bz2) + bzip2 -dc $1 | tar $tarflags - + ;; + *) + echo "Unhandled archive type" + exit 1 + ;; + esac + + if [ $# -eq 2 -o $# -eq 4 ]; then + echo "" + fi +} + +function test_compiler() { echo -ne "testing $1 ... " $1 $2 -O2 -Wall -o test diff --git a/tools/trap_exit.sh b/tools/trap_exit.sh index b56fa26..ba4a006 100644 --- a/tools/trap_exit.sh +++ b/tools/trap_exit.sh @@ -22,7 +22,7 @@ function _exit() remove_locks echo "if it is happening the first time, then just re-run the script" echo "" - check_for_bug_1242300 + test $SCRIPT = "build.sh" && check_for_bug_1242300 fi }