mono-build.sh
#!/bin/bash
###########################################################################
##  Copyright (C) Wizardry and Steamworks 2012 - License: GNU GPLv3      ##
##  Please see: http://www.gnu.org/licenses/gpl.html for legal details,  ##
##  rights of fair usage, the disclaimer and warranty conditions.        ##
###########################################################################
#
###
# Builds mono 3.0.1 on an iOS device provided that the 
# device has a build-environment set-up. The final stage 
# signs the resulting binaries and bundles mono.
##
# This script requires the CoreFoundation headers to be 
# transferred to the device before compiling.
###
 
# versions
MONO_VERSION=3.0.1
LIBICONV_VERSION=1.7
 
# check build programs.
BUILD_PROGS=( "/usr/bin/awk" \
              "/usr/bin/ldid" \
              "/usr/bin/gcc" \
              "/usr/bin/tar" \
              "/usr/bin/curl" \
              "/usr/bin/autoconf" \
              "/usr/bin/automake" \
              "/usr/bin/make" \
              "/bin/cat" \
              "/usr/bin/file" \
              "/usr/local/bin/perl" )
for BF in "${BUILD_PROGS[@]}"; do
 if [ ! -x "$BF" ]; then
   echo "Required build dependency not found: $BF"
   echo "Please install the relevant files and run this script again."
   exit 1
 fi
done
unset BUILD_PROGS
 
# check headers.
BUILD_HEADERS=( "/System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h" \
                "/usr/include/crt_externs.h" )
for BF in "${BUILD_HEADERS[@]}"; do
 if [ ! -f "$BF" ]; then
   echo "Required build dependency not found: $BF"
   echo "Please check that you have transfered CoreFoundation to the device and that you have a valid build environment on your device."
   exit 1
 fi
done
unset BUILD_HEADERS
 
# check for patch
if [ ! -f mono_ios.patch ]; then
  echo "Patch file mono_ios.patch not found. The patch should be placed in the same directory as this script."
  exit 1
fi
 
# grab current directory
CWD=`pwd`
# grab libiconv compile and install to temporary path
echo "Downloading libiconv..."
if [ ! -f "libiconv-$LIBICONV_VERSION.tar.gz" ]; then
  curl -OkL "http://ftp.gnu.org/pub/gnu/libiconv/libiconv-$LIBICONV_VERSION.tar.gz"
fi
if [ ! -f "libiconv-$LIBICONV_VERSION.tar.gz" ]; then
  echo "Downloading libiconv failed..."
fi
echo "Extracting libiconv..."
tar -xf "libiconv-$LIBICONV_VERSION.tar.gz"
rm -rf "libiconv-$LIBICONV_VERSION.tar.gz"
cd "libiconv-$LIBICONV_VERSION"
echo "Compiling libiconv..."
CFLAGS="-Os" CXXFLAGS="-Os" CPPFLAGS="-Os" ./configure --prefix=/usr \
            --sysconfdir=/etc \
            --localstatedir=/var
if [ $? -ne 0 ]; then
  echo "Configuring libiconv failed..."
  exit 1
fi
make -j1
if [ $? -ne 0 ]; then
  echo "Compiling libiconv failed..."
  exit 1
fi
make install DESTDIR=/tmp/libiconv
cd $CWD
echo "Cleaning up..."
rm -rf "libiconv-$LIBICONV_VERSION"
# grab mono, compile and install to temporary path
echo "Downloading mono..."
if [ ! -f "mono-$MONO_VERSION.tar.bz2" ]; then
  curl -OkL "http://download.mono-project.com/sources/mono/mono-$MONO_VERSION.tar.bz2"
fi
if [ ! -f "mono-$MONO_VERSION.tar.bz2" ]; then
  echo "Downloading mono failed..."
fi
echo "Extracting mono..."
tar -jxf "mono-$MONO_VERSION.tar.bz2"
rm -rf "mono-$MONO_VERSION.tar.bz2"
cd "mono-$MONO_VERSION"
echo "Patching mono..."
if [ ! -f ../mono_ios.patch ]; then
  echo "Patch file mono_ios.patch not found. The patch should be placed in the same directory as this script."
  exit 1
fi
cat ../mono_ios.patch | patch -p1 --dry-run
if [ $? -ne 0 ]; then
  echo "Failed to patch mono..."
  exit 1
fi
cat ../mono_ios.patch | patch -p1
echo "Compiling mono..."
# BUG: build fails with --with-shared_mono=no so we build shared
CFLAGS="-Os" CXXFLAGS="-Os" CPPFLAGS="-Os" ./configure --prefix=/usr \
            --sysconfdir=/etc \
            --localstatedir=/var \
            --enable-nls=no \
            --enable-small-config \
            --with-tls=pthread \
            --disable-mono-debugger \
            --with-sigaltstack=no \
            --with-sgen=no \
            --with-glib=embedded \
            --disable-system-aot \
            --enable-minimal=aot \
            --with-static_mono=no \
            --enable-static=no \
            --with-libiconv-prefix=/tmp/libiconv
if [ $? -ne 0 ]; then
  echo "Configuring mono failed..."
  exit 1
fi
make -j1
if [ $? -ne 0 ]; then
  echo "Compiling mono failed..."
  exit 1
fi
make install DESTDIR=/tmp/mono
cd $CWD
echo "Cleaning up..."
rm -rf "mono-$MONO_VERSION"
# bundle the result
echo "Making bundle..."
mkdir -p /tmp/mono/DEBIAN
cat > /tmp/mono/DEBIAN/control << EOF
Package: org.grimore.mono
Name: mono
Version: $MONO_VERSION
Architecture: iphoneos-arm
Description: the mono C# compiler
  Mono is an open source, cross-platform, implementation
  of C# and the CLR that is binary compatible with
  Microsoft.NET, designed to allow developers to easily
  create cross platform applications.
  No icons are added to the home screen.
  No Screenshots for this item.
Homepage: http://grimore.org/ios:mono
Maintainer: Wizardry and Steamworks <wizardry.steamworks@gmail.com>
Author: Wizardry and Steamworks (WaS) <wizardry.steamworks@gmail.com>
Sponsor: Wizardry and Steamworks <http://grimore.org>
Section: Development
 
EOF
# sign binaries
echo "Signing binaries..."
for i in `find /tmp/mono -type f`; do
  FT=`file -b $i | awk '{ print $1 }'`
  case $FT in
    Mach-O )
      EXE=`file -b $i | awk '{ print $2 }'`
      if [[ $EXE == "executable" ]]; then
        ldid -S $i
      fi
      ;;
    Bourne )
      chmod +x $i
      ;;
    * )
      ;;
  esac
done
echo "Packaging..."
dpkg-deb -Zlzma -b /tmp/mono /tmp/mono.deb
# clean-up
echo "Cleaning temporary files..."
rm -rf /tmp/libiconv
rm -rf /tmp/mono
 
echo "Mono package ready at /tmp/mono.deb."

ios/mono/mono_build_script.txt ยท Last modified: 2022/04/19 08:28 by 127.0.0.1

Access website using Tor Access website using i2p Wizardry and Steamworks PGP Key


For the contact, copyright, license, warranty and privacy terms for the usage of this website please see the contact, license, privacy, copyright.