osxcross/tools/tools.sh

461 lines
8.9 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
2015-05-30 21:01:48 +02:00
export LC_ALL="C"
function set_path_vars()
{
if [ -n "$OSXCROSS_VERSION" ]; then
export VERSION=$OSXCROSS_VERSION
export TARGET=$OSXCROSS_TARGET
export BASE_DIR=$OSXCROSS_BASE_DIR
export TARBALL_DIR=$OSXCROSS_TARBALL_DIR
export BUILD_DIR=$OSXCROSS_BUILD_DIR
export TARGET_DIR=$OSXCROSS_TARGET_DIR
export TARGET_DIR_SDK_TOOLS=$OSXCROSS_TARGET_DIR/SDK/tools
export PATCH_DIR=$OSXCROSS_PATCH_DIR
export SDK_DIR=$OSXCROSS_SDK_DIR
export SDK_VERSION=$OSXCROSS_SDK_VERSION
export SDK=$OSXCROSS_SDK
export LIBLTO_PATH=$OSXCROSS_LIBLTO_PATH
export LINKER_VERSION=$OSXCROSS_LINKER_VERSION
# Do not use these
unset OSXCROSS_VERSION OSXCROSS_OSX_VERSION_MIN
unset OSXCROSS_TARGET OSXCROSS_BASE_DIR
unset OSXCROSS_SDK_VERSION OSXCROSS_SDK
unset OSXCROSS_SDK_DIR OSXCROSS_TARBALL_DIR
unset OSXCROSS_PATCH_DIR OSXCROSS_TARGET_DIR
unset OSXCROSS_BUILD_DIR OSXCROSS_CCTOOLS_PATH
unset OSXCROSS_LIBLTO_PATH OSXCROSS_LINKER_VERSION
else
export BASE_DIR=$PWD
export TARBALL_DIR=$PWD/tarballs
export BUILD_DIR=$PWD/build
export TARGET_DIR=${TARGET_DIR:-$BASE_DIR/target}
export TARGET_DIR_SDK_TOOLS=$TARGET_DIR/SDK/tools
export PATCH_DIR=$PWD/patches
export SDK_DIR=$TARGET_DIR/SDK
fi
}
set_path_vars
PLATFORM=$(uname -s)
ARCH=$(uname -m)
SCRIPT=$(basename $0)
if [[ $PLATFORM == CYGWIN* ]]; then
echo "Cygwin is no longer supported." 1>&2
exit 1
fi
function require()
{
set +e
which $1 &>/dev/null
while [ $? -ne 0 ]
do
if [ -z "$UNATTENDED" ]; then
echo ""
read -p "Please install '$1' then press enter"
else
echo "Required dependency '$1' is not installed" 1>&2
exit 1
fi
which $1 &>/dev/null
done
set -e
}
if [[ $PLATFORM == *BSD ]] || [ $PLATFORM == "DragonFly" ]; then
MAKE=gmake
SED=gsed
else
MAKE=make
SED=sed
fi
if [ -z "$USESYSTEMCOMPILER" ]; then
if [ -z "$CC" ]; then
export CC="clang"
fi
if [ -z "$CXX" ]; then
export CXX="clang++"
fi
fi
if [ -z "$CMAKE" ]; then
CMAKE="cmake"
fi
if [ -n "$CC" ]; then
require $CC
fi
if [ -n "$CXX" ]; then
require $CXX
fi
require $SED
require $MAKE
require $CMAKE
require patch
require gunzip
update cctools to 870 and ld64 to 242 OSXCross *should* now work on Linux ARM devices with this update. Port changes: * commit f7818cbf61074ea6fbb56de1b50c0973afe3428f | Author: Thomas Pöchtrager | Date: Fri Jul 17 19:34:57 2015 +0200 | | add preliminary llvm-3.8 support | * commit 8482a95745f54062de974e65fdd28b0389f3c6a5 | Author: Thomas Pöchtrager | Date: Sat Jul 11 09:32:55 2015 +0200 | | * get rid of the openssl dependency | * make libuuid optional (based on http://git.io/vqbwu) | * commit a8e002367d64c5e3e3a195bba37aa1ccb306f897 | Author: Thomas Pöchtrager | Date: Sat Jul 11 08:45:49 2015 +0200 | | * undo unnecessary changes done by the original porter | * add cctools-port comments to changed code | * add codelite project | * commit 2b050dc41d1ae375a5af36b751d479be4513a6f3 | Author: Thomas Pöchtrager | Date: Tue Jun 23 19:31:00 2015 +0200 | | ios-toolchain: remove 'CC=cc' - just causes troubles | * commit f7f7c6180e5b7ae2897e3617e3475811c88a5173 | Author: Thomas Pöchtrager | Date: Sat May 30 15:51:27 2015 +0200 | | silence gcc 5.1 warnings | * commit 359b40b5bd40d86e0d1c9d40fb7bb2297130e903 | Author: Thomas Pöchtrager | Date: Sun Apr 19 21:33:15 2015 +0200 | | use KERN_PROC_ARGV instead of KERN_PROC_ENV | * commit 7a9b23fbb24c7250cb4caae2d97b79afbdefe503 | Author: Thomas Pöchtrager | Date: Sun Apr 19 20:35:01 2015 +0200 | | _NSGetExecutablePath() should now work properly on openbsd | * commit 47c29e6a7701a16268da57412a68e133818a32dd | Author: Thomas Pöchtrager | Date: Sat Apr 11 18:34:58 2015 +0200 | | clang 3.6 miscompiles ld64 on armhf (even at -O0); enforce gcc on arm until | i can figure out what's going on there | | probably related: | https://github.com/raspberrypi/linux/issues/766 | https://github.com/tpoechtrager/cctools-port/issues/1#issuecomment-59118615 | | backtrace: | | https://gist.github.com/tpoechtrager/d68c8352a3fd32165af4 | * commit 5e5b511a3eebd3fa9ece49bead85a1be29a25dfb | Author: Thomas Pöchtrager | Date: Thu Mar 19 21:28:44 2015 +0100 | | fix more potential -D_FORTIFY_SOURCE crashers | * commit 5098fc9f6dfba7eac18f5ae55b7e361314e0fb7b | Author: Thomas Pöchtrager | Date: Thu Mar 19 21:14:13 2015 +0100 | | strip: don't crash with -D_FORTIFY_SOURCE enabled (ubuntu gcc) | * commit 268c3de73b173673dc9ae932ab802f42247570ff | Author: Thomas Pöchtrager | Date: Wed Mar 18 21:29:21 2015 +0100 | | add arm to the tested host architectures | * commit ade8d819ad8fd2d04978a2da22e5efe06dc40dad | Author: Thomas Pöchtrager | Date: Wed Mar 18 21:29:06 2015 +0100 | | ios-toolchain: set COMPILER_PATH | * commit 700c6fd644f78b9427163e9f444fc15f2c73ed28 | Author: Thomas Pöchtrager | Date: Wed Mar 18 20:28:27 2015 +0100 | | configure.ac: target_cpu -> host_cpu | * commit bf9ac6a2c5846af3c2112c483a612937d8e3a037 | Author: Thomas Pöchtrager <tpoechtrager@users.noreply.github.com> | Date: Sun Mar 15 22:43:36 2015 +0100 | | update README | * commit 253ec0ff238ebc3b359d7f4fe2edc38b0aa3e428 | Author: Thomas Pöchtrager | Date: Sun Mar 15 22:26:45 2015 +0100 | | typo | * commit 42109667d4b080bbc8091235c036ed418d369d13 | Author: Thomas Pöchtrager | Date: Sun Mar 15 22:21:16 2015 +0100 | | * linux ppc/ppc64 & arm/arm64/aarch64 port | (compiles now - everything else is *untested*) | | other changes: | | * rename 'machochecker' to 'machocheck' | * get rid of duplicate $CFLAGS | * fix a typo in the ios toolchain README | * package.sh: remove the autom4te.cache directory | * commit 0c32be78e979641095a92480786a621e65282b92 | Author: Thomas Pöchtrager | Date: Mon Mar 9 20:01:33 2015 +0100 | | misc fixes: | * fix gcc warnings (even though they are not my fault) | * fix a typo in include/foreign/i386/_types.h (__INT64_TYPE_ -> __INT64_TYPE__) | * fix the cygwin + clang<=3.4 build | * commit 3f00c16b0fce9a7a151a88114209f17a46711637 | Author: Thomas Pöchtrager | Date: Sun Mar 8 20:49:50 2015 +0100 | | be more precise about the gcc requirement | * commit 1b9a93057b856c92190f3f8d32e507539f4669cd | Author: Thomas Pöchtrager | Date: Sun Mar 8 20:09:11 2015 +0100 | | update README | * commit 3cc1ba6fc7c862de258e7a29c840ea7d5eb04be1 | Author: Thomas Pöchtrager | Date: Sun Mar 8 17:47:09 2015 +0100 | | * windows (cygwin), openbsd and dragonflybsd port | * gcc compiler support | * add --with-llvm-config option | * fix 'ld: malformed 32-bit x.y.z version number: 3.19.0-7-generic' | * commit 7a2d21ca7f4e42c70c8ff85ec3e37ac6ef9d0de7 | Author: Thomas Pöchtrager | Date: Tue Feb 24 21:58:10 2015 +0100 | | map -> version-script | * commit 5135fb2541876f0af185589890f9e21b98ceb39c | Author: Thomas Pöchtrager | Date: Tue Feb 24 21:49:55 2015 +0100 | | an attempt to fix the otool disassembler | * commit 219f5f53ea42361ccb2c75bed311f1d57ce68966 | Author: Thomas Pöchtrager | Date: Mon Feb 23 21:32:47 2015 +0100 | | ar, lipo, otool (etc.) should also be linked with -rpath for libLTO | * commit 1efff3733f1cb483b27e18d6d14cd7ccf5571627 | Author: Thomas Pöchtrager | Date: Mon Feb 23 21:32:11 2015 +0100 | | add support for llvm 3.7 | * commit 8b6beadd337ac7e5d1d58d438e9afcd5165d1200 | Author: Thomas Pöchtrager | Date: Mon Feb 23 21:31:34 2015 +0100 | | silence/fix -Wabsolute-value warnings | * commit 59d21d2c793c51d205c8b4ab14b9b28e63c72445 (tag: 862-ld64-241.9-2) | Author: Thomas Pöchtrager | Date: Sun Dec 28 18:09:43 2014 +0100 | | ios-toolchain: build.sh: ignore 'git clean' return status | * commit 3d198530ae4c031e904f29414c7c46ac547d90b7 | Author: Thomas Pöchtrager | Date: Sun Dec 28 17:48:45 2014 +0100 | | ios-toolchain: take care of IPHONEOS_DEPLOYMENT_TARGET (env) | * commit 23658f2f20778374b43dcd80717b4f47845c2297 | Author: Thomas Pöchtrager | Date: Sun Dec 28 17:48:28 2014 +0100 | | the ios 8.1 sdk has mach_vm_trunc_page and mach_vm_round_page already defined | * commit 70b87ceec059f632641b41dfd2d9e63dbd069a0c | Author: Thomas Pöchtrager | Date: Sat Dec 27 12:33:50 2014 +0100 | | ios-toolchain: cleanup | * commit 9c0f520110f7f57a1060ac66329c55f8f71ecd8c | Author: Thomas Pöchtrager | Date: Sat Dec 27 12:25:26 2014 +0100 | | ios-toolchain: use -mlinker-version=241.9 in the 241.9 branch | * commit 8b0cbdaf820ee40fcb1e2e209cb6f858ffb8aa90 | Author: Thomas Pöchtrager | Date: Sat Dec 27 12:00:19 2014 +0100 | | strchr -> strrchr | * commit e9f701822aa209cf435c4b26eb4c7ab01001f5cb | Author: Thomas Pöchtrager | Date: Sat Dec 27 11:47:02 2014 +0100 | | add scripts / wrapper to build a simple ios toolchain | * commit cf456225d3551a8782c5222133455bb9139ecad5 | Author: Thomas Pöchtrager | Date: Fri Dec 26 10:55:34 2014 +0100 | | define _GNU_SOURCE for strnlen() | * commit 211fe3927f5d6c132d72164e898d146fcdf7577e | Author: sezero <sezero@users.noreply.github.com> | Date: Wed Dec 24 12:20:01 2014 +0200 | | autogen.sh fixes: run libtoolize 'after' creating the m4 directory. run aclocal with '-I m4' switches. | * commit a4f9fd8ad09cafb94bf465ae4e914f086458e5cc | Author: Thomas Pöchtrager <tpoechtrager@users.noreply.github.com> | Date: Wed Dec 24 11:35:37 2014 +0100 | | Update README.md | * commit 2201b7b4cbc3a3b29aa7d8e7ccf2576f1847a3e6 | Author: Thomas Pöchtrager | Date: Fri Nov 21 22:58:16 2014 +0100 | | add '-L/usr/pkg/lib' for NetBSD | * commit a303cc27ace751059caa27a34e5d9ae5cd0825ac | Author: Thomas Pöchtrager | Date: Fri Nov 21 22:10:18 2014 +0100 | | update README |
2015-07-17 23:25:59 +02:00
# enable debug messages
[ -n "$OCDEBUG" ] && set -x
# how many concurrent jobs should be used for compiling?
if [ -z "$JOBS" ]; then
JOBS=$(tools/get_cpu_count.sh || echo 1)
fi
# Don't run osxcross-conf for the top build.sh script
if [ $SCRIPT != "build.sh" ]; then
res=$(tools/osxcross_conf.sh || echo "")
if [ -z "$res" ] &&
[[ $SCRIPT != gen_sdk_package*.sh ]] &&
[ $SCRIPT != "build_wrapper.sh" ] &&
[[ $SCRIPT != build*_clang.sh ]] &&
[ $SCRIPT != "mount_xcode_image.sh" ]; then
echo "you must run ./build.sh first before you can start building $DESC"
exit 1
fi
if [ -z "$TOP_BUILD_SCRIPT" ]; then
eval "$res"
set_path_vars
2014-04-06 15:58:15 +02:00
fi
fi
# find sdk version to use
function guess_sdk_version()
{
tmp1=
tmp2=
tmp3=
file=
sdk=
guess_sdk_version_result=
sdkcount=$(find -L tarballs/ -type f | grep MacOSX | wc -l)
if [ $sdkcount -eq 0 ]; then
echo no SDK found in 'tarballs/'. please see README.md
exit 1
elif [ $sdkcount -gt 1 ]; then
sdks=$(find -L tarballs/ -type f | grep MacOSX)
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: SDK_VERSION=10.x [OSX_VERSION_MIN=10.x] [TARGET_DIR=...] ./build.sh)'
exit 1
else
sdk=$(find -L tarballs/ -type f | grep MacOSX)
tmp2=$(echo ${sdk/bz2/} | $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/'$(basename $sdk)
fi
if [ $guess_sdk_version_result ]; then
if [ $guess_sdk_version_result = 10.4 ]; then
guess_sdk_version_result=10.4u
fi
fi
export guess_sdk_version_result
}
# make sure there is actually a file with the given SDK_VERSION
function verify_sdk_version()
{
sdkv=$1
for file in tarballs/*; do
if [ -f "$file" ] && [ $(echo $file | grep OSX.*$sdkv) ]; then
echo "verified at "$file
sdk=$file
fi
done
if [ ! $sdk ] ; then
echo cant find SDK for OSX $sdkv in tarballs. exiting
exit
fi
}
function extract()
{
echo "extracting $(basename $1) ..."
2014-04-06 15:58:15 +02:00
local tarflags
tarflags="xf"
test -n "$OCDEBUG" && tarflags+="v"
case $1 in
*.pkg)
require cpio
2014-04-06 15:58:15 +02:00
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" 2>&1
2014-04-06 15:58:15 +02:00
exit 1
;;
esac
}
function get_exec_dir()
{
local dirs=$(dirs)
echo ${dirs##* }
}
function make_absolute_path()
{
local current_path
if [ $# -eq 1 ]; then
current_path=$PWD
else
current_path=$2
fi
case $1 in
/*) echo "$1" ;;
*) echo "${current_path}/$1" ;;
esac
}
function cleanup_tmp_dir()
{
if [ -n "$OC_KEEP_TMP_DIR" ]; then
echo "Not removing $TMP_DIR ..."
return
fi
echo "Removing $TMP_DIR ..."
rm -rf $TMP_DIR
}
function create_tmp_dir()
{
mkdir -p $BUILD_DIR
pushd $BUILD_DIR &>/dev/null
local tmp
for i in {1..100}; do
tmp="tmp_$RANDOM"
[ -e $tmp ] && continue
mkdir $tmp && break
done
if [ ! -d $tmp ]; then
echo "cannot create $BUILD_DIR/$tmp directory" 1>&2
exit 1
fi
TMP_DIR=$BUILD_DIR/$tmp
trap cleanup_tmp_dir EXIT
popd &>/dev/null
}
# f_res=1 = something has changed upstream
# f_res=0 = nothing has changed
function git_clone_repository
{
local url=$1
local branch=$2
local project_name=$3
if [ -n "$TP_OSXCROSS_DEV" ]; then
# copy files from local working directory
rm -rf $project_name
cp -r $TP_OSXCROSS_DEV/$project_name .
if [ -e ${project_name}/.git ]; then
pushd $project_name &>/dev/null
git clean -fdx &>/dev/null
popd &>/dev/null
fi
f_res=1
return
fi
if [ ! -d $project_name ]; then
local args=""
if [ -z "$FULL_CLONE" ] && [ $branch == "master" ]; then
args="--depth 1"
fi
git clone $url $args
fi
pushd $project_name &>/dev/null
git reset --hard &>/dev/null
git clean -fdx &>/dev/null
git fetch origin
git checkout $branch
git pull origin $branch
local new_hash=$(git rev-parse HEAD)
local old_hash=""
local hash_file="$BUILD_DIR/.${project_name}_git_hash"
if [ -f $hash_file ]; then
old_hash=$(cat $hash_file)
fi
echo -n $new_hash > $hash_file
if [ "$old_hash" != "$new_hash" ]; then
f_res=1
else
f_res=0
fi
popd &>/dev/null
}
function get_project_name_from_url()
{
local url=$1
local project_name
project_name=$(basename $url)
project_name=${project_name/\.git/}
echo -n $project_name
}
function build_success()
{
local project_name=$1
touch "$BUILD_DIR/.${CURRENT_BUILD_PROJECT_NAME}_build_complete"
unset CURRENT_BUILD_PROJECT_NAME
}
function build_msg()
{
echo ""
if [ $# -eq 2 ]; then
echo "## Building $1 ($2) ##"
else
echo "## Building $1 ##"
fi
echo ""
}
# f_res=1 = build the project
# f_res=0 = nothing to do
function get_sources()
{
local url=$1
local branch=$2
local project_name=$(get_project_name_from_url $url)
local build_complete_file="$BUILD_DIR/.${project_name}_build_complete"
CURRENT_BUILD_PROJECT_NAME=$project_name
build_msg $project_name $branch
if [[ "$SKIP_BUILD" == *$project_name* ]]; then
f_res=0
return
fi
git_clone_repository $url $branch $project_name
if [ $f_res -eq 1 ]; then
rm -f $build_complete_file
f_res=1
else
# nothing has changed upstream
if [ -f $build_complete_file ]; then
echo ""
echo "## Nothing to do ##"
echo ""
f_res=0
else
rm -f $build_complete_file
f_res=1
fi
fi
}
function create_symlink()
{
ln -sf $1 $2
}
function verbose_cmd()
{
echo "$@"
eval "$@"
}
function test_compiler()
{
2014-04-06 15:58:15 +02:00
echo -ne "testing $1 ... "
$1 $2 -O2 -Wall -o test
rm test
echo "works"
}
function test_compiler_cxx11()
{
2014-04-06 15:58:15 +02:00
set +e
echo -ne "testing $1 -stdlib=libc++ -std=c++11 ... "
$1 $2 -O2 -stdlib=libc++ -std=c++11 -Wall -o test &>/dev/null
if [ $? -eq 0 ]; then
rm test
echo "works"
else
echo "failed (ignored)"
fi
set -e
}
## Also used in gen_sdk_package_pbzx.sh ##
function build_xar()
{
pushd $BUILD_DIR &>/dev/null
get_sources https://github.com/tpoechtrager/xar.git master
if [ $f_res -eq 1 ]; then
pushd $CURRENT_BUILD_PROJECT_NAME/xar &>/dev/null
CFLAGS+=" -w" \
./configure --prefix=$TARGET_DIR
$MAKE -j$JOBS
$MAKE install -j$JOBS
popd &>/dev/null
build_success
fi
popd &>/dev/null
}
# exit on error
set -e