2013-12-16 21:53:21 +01:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
2015-05-30 21:01:48 +02:00
|
|
|
export LC_ALL="C"
|
|
|
|
|
2019-11-02 13:26:21 +01:00
|
|
|
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
|
|
|
|
}
|
2013-12-16 21:53:21 +01:00
|
|
|
|
2019-11-02 13:26:21 +01:00
|
|
|
set_path_vars
|
2014-07-17 22:43:29 +02:00
|
|
|
|
2015-07-19 22:28:10 +02:00
|
|
|
PLATFORM=$(uname -s)
|
|
|
|
ARCH=$(uname -m)
|
2019-11-06 20:42:24 +01:00
|
|
|
OPERATING_SYSTEM=$(uname -o 2>/dev/null || echo "-")
|
2015-08-22 23:15:27 +02:00
|
|
|
SCRIPT=$(basename $0)
|
2015-07-19 22:28:10 +02:00
|
|
|
|
2019-11-02 13:26:21 +01:00
|
|
|
if [[ $PLATFORM == CYGWIN* ]]; then
|
2019-06-01 19:57:44 +02:00
|
|
|
echo "Cygwin is no longer supported." 1>&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2013-12-16 21:53:21 +01:00
|
|
|
|
2019-06-01 19:57:44 +02:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2019-06-02 09:40:04 +02:00
|
|
|
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
|
2019-06-01 19:57:44 +02:00
|
|
|
|
|
|
|
require $SED
|
|
|
|
require $MAKE
|
|
|
|
require $CMAKE
|
|
|
|
require patch
|
|
|
|
require gunzip
|
|
|
|
|
2015-07-17 23:25:59 +02:00
|
|
|
|
2013-12-16 21:53:21 +01:00
|
|
|
# enable debug messages
|
2015-08-22 23:15:27 +02:00
|
|
|
[ -n "$OCDEBUG" ] && set -x
|
2013-12-16 21:53:21 +01:00
|
|
|
|
2019-11-02 13:26:21 +01:00
|
|
|
# how many concurrent jobs should be used for compiling?
|
|
|
|
if [ -z "$JOBS" ]; then
|
|
|
|
JOBS=$(tools/get_cpu_count.sh || echo 1)
|
|
|
|
fi
|
2013-12-16 21:53:21 +01:00
|
|
|
|
2019-11-02 13:26:21 +01:00
|
|
|
# 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
|
2015-08-31 21:02:38 +02:00
|
|
|
|
2019-11-02 13:26:21 +01:00
|
|
|
if [ -z "$TOP_BUILD_SCRIPT" ]; then
|
2015-08-31 21:02:38 +02:00
|
|
|
eval "$res"
|
2019-11-02 13:26:21 +01:00
|
|
|
set_path_vars
|
2014-04-06 15:58:15 +02:00
|
|
|
fi
|
2013-12-16 21:53:21 +01:00
|
|
|
fi
|
|
|
|
|
2019-06-01 19:57:44 +02:00
|
|
|
|
|
|
|
# find sdk version to use
|
|
|
|
function guess_sdk_version()
|
2013-12-16 21:53:21 +01:00
|
|
|
{
|
2019-06-01 19:57:44 +02:00
|
|
|
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'
|
2019-10-23 16:06:00 +02:00
|
|
|
echo '(for example: SDK_VERSION=10.x [OSX_VERSION_MIN=10.x] [TARGET_DIR=...] ./build.sh)'
|
2019-06-01 19:57:44 +02:00
|
|
|
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
|
2015-06-21 19:35:09 +02:00
|
|
|
fi
|
2019-06-01 19:57:44 +02:00
|
|
|
fi
|
|
|
|
export guess_sdk_version_result
|
2013-12-16 21:53:21 +01:00
|
|
|
}
|
|
|
|
|
2019-06-01 19:57:44 +02:00
|
|
|
# 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
|
|
|
|
}
|
2015-07-19 22:28:10 +02:00
|
|
|
|
2014-03-24 23:11:25 +01:00
|
|
|
|
|
|
|
function extract()
|
|
|
|
{
|
2015-07-19 22:28:10 +02:00
|
|
|
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)
|
2015-07-19 22:28:10 +02:00
|
|
|
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 -
|
|
|
|
;;
|
|
|
|
*)
|
2015-08-22 23:15:27 +02:00
|
|
|
echo "Unhandled archive type" 2>&1
|
2014-04-06 15:58:15 +02:00
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
2014-03-24 23:11:25 +01:00
|
|
|
}
|
|
|
|
|
2015-07-19 22:28:10 +02:00
|
|
|
|
2019-08-16 10:09:22 +02:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2019-06-01 19:57:44 +02:00
|
|
|
function cleanup_tmp_dir()
|
2015-08-22 23:15:27 +02:00
|
|
|
{
|
2019-06-01 19:57:44 +02:00
|
|
|
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
|
2016-10-29 19:26:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function create_symlink()
|
|
|
|
{
|
|
|
|
ln -sf $1 $2
|
2015-07-19 22:28:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-04-06 22:27:59 +02:00
|
|
|
function verbose_cmd()
|
|
|
|
{
|
|
|
|
echo "$@"
|
|
|
|
eval "$@"
|
|
|
|
}
|
|
|
|
|
2019-06-01 19:57:44 +02:00
|
|
|
|
2014-03-24 23:11:25 +01:00
|
|
|
function test_compiler()
|
2013-12-16 21:53:21 +01:00
|
|
|
{
|
2014-04-06 15:58:15 +02:00
|
|
|
echo -ne "testing $1 ... "
|
|
|
|
$1 $2 -O2 -Wall -o test
|
|
|
|
rm test
|
|
|
|
echo "works"
|
2013-12-16 21:53:21 +01:00
|
|
|
}
|
|
|
|
|
2014-03-28 21:04:32 +01:00
|
|
|
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
|
2014-03-28 21:04:32 +01:00
|
|
|
}
|
|
|
|
|
2019-06-01 19:57:44 +02:00
|
|
|
## 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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-12-16 21:53:21 +01:00
|
|
|
# exit on error
|
|
|
|
set -e
|