Skip to content

Commit

Permalink
Add build system.
Browse files Browse the repository at this point in the history
  • Loading branch information
rolfbjarne committed Apr 21, 2016
1 parent dcef37d commit 39ef301
Show file tree
Hide file tree
Showing 8 changed files with 657 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Make.config.local
Make.config.inc

262 changes: 262 additions & 0 deletions Make.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,262 @@
include $(TOP)/mk/subdirs.mk

# calculate commit distance and store it in a file so that we don't have to re-calculate it every time make is executed.

-include $(TOP)/Make.config.inc
$(TOP)/Make.config.inc: $(TOP)/Make.config
@rm -f $@
@printf "IOS_COMMIT_DISTANCE:=$(shell LANG=C; export LANG && git log `git blame $(TOP)/Make.config HEAD | grep IOS_PACKAGE_VERSION= | sed 's/ .*//' `..HEAD --oneline | wc -l | sed 's/ //g')\n" >> $@
@printf "MAC_COMMIT_DISTANCE:=$(shell LANG=C; export LANG && git log `git blame $(TOP)/Make.config HEAD | grep MAC_PACKAGE_VERSION= | sed 's/ .*//' `..HEAD --oneline | wc -l | sed 's/ //g')\n" >> $@
@if which ccache > /dev/null 2>&1; then printf "ENABLE_CCACHE=1\nexport CCACHE_BASEDIR=$(abspath $(TOP)/..)\n" >> $@; echo "Found ccache on the system, enabling it"; fi

PACKAGE_HEAD_REV=$(shell git rev-parse HEAD)

#
# A release branch requires updating:
#
# PACKAGE_HEAD_BRANCH (set to the release branch name, this shows up in the IDE's version information, as well as mtouch/mmp --version)
# IOS_PACKAGE_VERSION (major/minor #)
# MAC_PACKAGE_VERSION (major/minor #)
# (and updating the same on master as well, to next version)
#

#
# PACKAGE_HEAD_BRANCH determines the branch name (for wrench builds) that shows up in the
# IDE's version information, as well as mtouch/mmp --version and the AssemblyInformationalVersion
# for product assemblies.
#
# For developer builds, we check with git which branch is the current one (we can't do that
# on wrench, because wrench technically builds hashes, not branches)
#
#
PACKAGE_HEAD_BRANCH=master
ifeq ($(BUILD_REVISION),)
CURRENT_BRANCH:=$(shell git rev-parse --abbrev-ref HEAD)
else
CURRENT_BRANCH:=$(PACKAGE_HEAD_BRANCH)
endif

IOS_PRODUCT=Xamarin.iOS
IOS_PACKAGE_NAME=Xamarin.iOS
IOS_PACKAGE_NAME_LOWER=$(shell echo $(IOS_PACKAGE_NAME) | tr "[:upper:]" "[:lower:]")
# NEVER customize IOS_PACKAGE_VERSION itself, other parts (mtouch, web updater) are using the IOS_PACKAGE_VERSION_* variables
IOS_PACKAGE_VERSION=9.9.0.$(IOS_COMMIT_DISTANCE)
IOS_PACKAGE_VERSION_MAJOR=$(word 1, $(subst ., ,$(IOS_PACKAGE_VERSION)))
IOS_PACKAGE_VERSION_MINOR=$(word 2, $(subst ., ,$(IOS_PACKAGE_VERSION)))
IOS_PACKAGE_VERSION_REV=$(word 3, $(subst ., ,$(IOS_PACKAGE_VERSION)))
IOS_PACKAGE_VERSION_BUILD=$(IOS_COMMIT_DISTANCE)
IOS_PACKAGE_UPDATE_ID=$(shell printf "2%02d%02d%02d%03d" $(IOS_PACKAGE_VERSION_MAJOR) $(IOS_PACKAGE_VERSION_MINOR) $(IOS_PACKAGE_VERSION_REV) $(IOS_PACKAGE_VERSION_BUILD))

# Xcode 7.3
XCODE_VERSION=7.3
XCODE_URL=http://storage.bos.xamarin.com/bot-provisioning/Xcode_7.3.dmg
XCODE_DEVELOPER_ROOT=/Applications/Xcode73.app/Contents/Developer

# Minimum Mono version
MIN_MONO_VERSION=4.0
MAX_MONO_VERSION=4.4.99
MIN_MONO_URL=http://download.mono-project.com/archive/4.0.4/macos-10-x86/MonoFramework-MDK-4.0.4.4.macos10.xamarin.x86.pkg

# Minimum Xamarin Studio version
MIN_XAMARIN_STUDIO_URL=http://download.xamarin.com/studio/Mac/XamarinStudio-5.10.3.51-0.dmg
MIN_XAMARIN_STUDIO_VERSION=5.10.3.51
MAX_XAMARIN_STUDIO_VERSION=6.1.0.9999

# Minimum OSX versions
MIN_OSX_BUILD_VERSION=10.11
MIN_OSX_VERSION_FOR_IOS=10.10
MIN_OSX_VERSION_FOR_MAC=10.10

IOS_SDK_VERSION=9.3
OSX_SDK_VERSION=10.11
WATCH_SDK_VERSION=2.2
TVOS_SDK_VERSION=9.2

MIN_IOS_SDK_VERSION=5.1.1
MIN_OSX_SDK_VERSION=10.7
MIN_WATCHOS_SDK_VERSION=2.0
MIN_TVOS_SDK_VERSION=9.0

INCLUDE_IOS=1
INCLUDE_MAC=1
INCLUDE_WATCH=1
INCLUDE_TVOS=1

-include $(TOP)/Make.config.local

ifdef ENABLE_CCACHE
# Note the space at the end the line
CCACHE=ccache
endif

ifdef DISABLE_APPLETLS
APPLETLS_DEFINES = -d:XAMARIN_NO_TLS
TLS_PROVIDER_ASSEMBLY_NAMES =
else
APPLETLS_DEFINES = -d:XAMARIN_APPLETLS
TLS_PROVIDER_ASSEMBLY_NAMES = \
Mono.Security.Providers.NewSystemSource Mono.Security.Providers.DotNet \
Mono.Security.Providers.NewTls
endif

XCODE_MAC_SDKROOT=$(XCODE_DEVELOPER_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(OSX_SDK_VERSION).sdk

MAC_CC=$(CCACHE)$(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -isysroot $(XCODE_MAC_SDKROOT) -mmacosx-version-min=$(MIN_OSX_VERSION_FOR_MAC)
MAC_CXX=$(CCACHE)$(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -isysroot $(XCODE_MAC_SDKROOT) -mmacosx-version-min=$(MIN_OSX_VERSION_FOR_MAC)

# This is the temporary directory where the various builds are installed
BUILD_DESTDIR=$(abspath $(TOP)/builds/install)
MAC_INSTALL_VERSION ?= git
IOS_INSTALL_VERSION ?= git

IOS_DESTDIR ?= $(TOP)/_ios-build
IOS_TARGETDIR ?= $(IOS_DESTDIR)

USE_SOURCE_LINKS ?= 1

IOS_FRAMEWORK_DIR=/Library/Frameworks/Xamarin.iOS.framework
# Prefix used to install monotouch
ifndef MONOTOUCH_PREFIX
MONOTOUCH_PREFIX=$(IOS_FRAMEWORK_DIR)/Versions/$(IOS_INSTALL_VERSION)
endif

XCODE_CC=$(CCACHE)$(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
XCODE_CXX=$(CCACHE)$(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++

# make sure we have full paths. The patsubst function is to remove any trailing slash (this may leave the variable empty)
override IOS_DESTDIR := $(patsubst %/,%,$(abspath $(IOS_DESTDIR)))
override IOS_TARGETDIR := $(patsubst %/,%,$(abspath $(IOS_TARGETDIR)))
MONOTOUCH_PREFIX := $(abspath $(MONOTOUCH_PREFIX))

MONOTOUCH_MONO_PATH?=$(abspath $(MONO_PATH)/mcs/class/lib/monotouch/)

IOS_PACKAGE_FILENAME=$(IOS_PACKAGE_NAME_LOWER)-$(IOS_PACKAGE_VERSION).pkg
IOS_PACKAGE_UTI=com.xamarin.$(IOS_PACKAGE_NAME_LOWER).pkg

IOS_COMMON_DEFINES=-DMONOTOUCH

IOS_CC=$(XCODE_CC)
IOS_CXX=$(XCODE_CXX)
SIMULATOR_BIN_PATH=$(XCODE_DEVELOPER_ROOT)/Platforms/iPhoneSimulator.platform/Developer/usr/bin
SIMULATOR_CC=$(IOS_CC)

CFLAGS= -Wall -fms-extensions -Wno-format-security

ifdef ENABLE_BITCODE_ON_IOS
BITCODE_CFLAGS=-fembed-bitcode-marker
# Overwrite the default
MIN_IOS_SDK_VERSION=9.0
endif

SIMULATOR_SDK=$(XCODE_DEVELOPER_ROOT)/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator$(IOS_SDK_VERSION).sdk

OBJC_CFLAGS=-ObjC++ -std=c++0x -fno-exceptions

COMMON_SIMULATOR_CFLAGS=-mios-simulator-version-min=$(MIN_IOS_SDK_VERSION) -isysroot $(SIMULATOR_SDK) $(CFLAGS) -g $(IOS_COMMON_DEFINES)
SIMULATOR86_CFLAGS=$(COMMON_SIMULATOR_CFLAGS) -arch i386
SIMULATOR64_CFLAGS=$(COMMON_SIMULATOR_CFLAGS) -arch x86_64
COMMON_SIMULATOR_OBJC_CFLAGS=-fobjc-abi-version=2 -fobjc-legacy-dispatch $(CFLAGS) $(OBJC_CFLAGS)
SIMULATOR86_OBJC_CFLAGS=$(COMMON_SIMULATOR_OBJC_CFLAGS) $(SIMULATOR86_CFLAGS)
SIMULATOR64_OBJC_CFLAGS=$(COMMON_SIMULATOR_OBJC_CFLAGS) $(SIMULATOR64_CFLAGS)

MONOTOUCH_SIMULATOR_SDK=$(MONOTOUCH_PREFIX)/SDKs/MonoTouch.iphonesimulator.sdk

DEVICE_BIN_PATH=$(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin
DEVICE_CC=$(IOS_CC)
DEVICE_CXX=$(IOS_CXX)

IOS_CSC=$(SYSTEM_MCS) -nostdlib -r:mscorlib.dll -lib:$(MONOTOUCH_MONO_PATH)

DEVICE_OBJC_CFLAGS=$(OBJC_CFLAGS) $(BITCODE_CFLAGS)

DEVICE_SDK=$(XCODE_DEVELOPER_ROOT)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$(IOS_SDK_VERSION).sdk
DEVICE7_CFLAGS= -arch armv7 -mno-thumb -miphoneos-version-min=$(MIN_IOS_SDK_VERSION) -isysroot $(DEVICE_SDK) $(CFLAGS) $(IOS_COMMON_DEFINES)
DEVICE7S_CFLAGS=-arch armv7s -mno-thumb -miphoneos-version-min=$(MIN_IOS_SDK_VERSION) -isysroot $(DEVICE_SDK) $(CFLAGS) $(IOS_COMMON_DEFINES)
DEVICE64_CFLAGS=-arch arm64 -miphoneos-version-min=7.0 -isysroot $(DEVICE_SDK) $(CFLAGS) $(IOS_COMMON_DEFINES)
DEVICE7_OBJC_CFLAGS =$(DEVICE7_CFLAGS) $(DEVICE_OBJC_CFLAGS)
DEVICE7S_OBJC_CFLAGS=$(DEVICE7S_CFLAGS) $(DEVICE_OBJC_CFLAGS)
DEVICE64_OBJC_CFLAGS=$(DEVICE64_CFLAGS) $(DEVICE_OBJC_CFLAGS)
MONOTOUCH_DEVICE_SDK=$(MONOTOUCH_PREFIX)/SDKs/MonoTouch.iphoneos.sdk

# iOS

XAMARIN_IOSSIMULATOR_SDK = $(MONOTOUCH_SIMULATOR_SDK)
XAMARIN_IPHONEOS_SDK = $(MONOTOUCH_DEVICE_SDK)

# WatchOS

XAMARIN_WATCHSIMULATOR_SDK = $(MONOTOUCH_PREFIX)/SDKs/Xamarin.WatchSimulator.sdk
XAMARIN_WATCHOS_SDK = $(MONOTOUCH_PREFIX)/SDKs/Xamarin.WatchOS.sdk

SIMULATORWATCH_SDK = $(XCODE_DEVELOPER_ROOT)/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk
SIMULATORWATCH_CFLAGS = -arch i386 -mwatchos-simulator-version-min=$(MIN_WATCHOS_SDK_VERSION) -isysroot $(SIMULATORWATCH_SDK) $(CFLAGS) -g $(IOS_COMMON_DEFINES)
SIMULATORWATCH_OBJC_CFLAGS = $(SIMULATORWATCH_CFLAGS) $(COMMON_SIMULATOR_OBJC_CFLAGS)

DEVICEWATCH_SDK = $(XCODE_DEVELOPER_ROOT)/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk
DEVICEWATCH_CFLAGS = -arch armv7k -mwatchos-version-min=$(MIN_WATCHOS_SDK_VERSION) -isysroot $(DEVICEWATCH_SDK) $(CFLAGS) -fembed-bitcode $(IOS_COMMON_DEFINES)
DEVICEWATCH_OBJC_CFLAGS = $(DEVICEWATCH_CFLAGS) $(DEVICE_OBJC_CFLAGS)

# TVOS

XAMARIN_TVSIMULATOR_SDK = $(MONOTOUCH_PREFIX)/SDKs/Xamarin.AppleTVSimulator.sdk
XAMARIN_TVOS_SDK = $(MONOTOUCH_PREFIX)/SDKs/Xamarin.AppleTVOS.sdk

SIMULATORTV_SDK = $(XCODE_DEVELOPER_ROOT)/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk
SIMULATORTV_CFLAGS = -arch x86_64 -mtvos-simulator-version-min=$(MIN_TVOS_SDK_VERSION) -isysroot $(SIMULATORTV_SDK) $(CFLAGS) -g $(IOS_COMMON_DEFINES)
SIMULATORTV_OBJC_CFLAGS = $(SIMULATORTV_CFLAGS) $(COMMON_SIMULATOR_OBJC_CFLAGS)

DEVICETV_SDK = $(XCODE_DEVELOPER_ROOT)/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk
DEVICETV_CFLAGS = -arch arm64 -mtvos-version-min=$(MIN_TVOS_SDK_VERSION) -isysroot $(DEVICETV_SDK) $(CFLAGS) -fembed-bitcode $(IOS_COMMON_DEFINES)
DEVICETV_OBJC_CFLAGS = $(DEVICETV_CFLAGS) $(DEVICE_OBJC_CFLAGS)

MONO_PREFIX ?= /Library/Frameworks/Mono.framework/Versions/Current
SYSTEM_MCS=$(MONO_PREFIX)/bin/mcs
SYSTEM_SN=$(MONO_PREFIX)/bin/sn
SYSTEM_MONO=$(MONO_PREFIX)/bin/mono
SYSTEM_MKBUNDLE=$(MONO_PREFIX)/bin/mkbundle
SYSTEM_XBUILD=$(MONO_PREFIX)/bin/xbuild
SYSTEM_RESGEN=$(MONO_PREFIX)/bin/resgen

PKG_CONFIG=$(MONO_PREFIX)/bin/pkg-config

MAC_PRODUCT=Xamarin.Mac
MAC_PACKAGE_NAME=xamarin.mac
MAC_PACKAGE_NAME_LOWER=$(shell echo $(MAC_PACKAGE_NAME) | tr "[:upper:]" "[:lower:]")

MAC_PACKAGE_VERSION=2.9.0.$(MAC_COMMIT_DISTANCE)
MAC_PACKAGE_VERSION_MAJOR=$(word 1, $(subst ., ,$(MAC_PACKAGE_VERSION)))
MAC_PACKAGE_VERSION_MINOR=$(word 2, $(subst ., ,$(MAC_PACKAGE_VERSION)))
MAC_PACKAGE_VERSION_REV=$(word 3, $(subst ., ,$(MAC_PACKAGE_VERSION)))
MAC_PACKAGE_VERSION_BUILD=$(word 4, $(subst ., ,$(MAC_PACKAGE_VERSION)))
MAC_PACKAGE_VERSION_MAJOR_MINOR=$(MAC_PACKAGE_VERSION_MAJOR).$(MAC_PACKAGE_VERSION_MINOR)
MAC_PACKAGE_UPDATE_ID=$(shell echo $(subst ., ,$(MAC_PACKAGE_VERSION).$(MAC_PACKAGE_VERSION_BUILD)) | awk '{printf "2%02d%02d%02d%03d",$$1,$$2,$$3,$$4}')
MAC_PACKAGE_TITLE=Xamarin $(MAC_PACKAGE_NAME) $(MAC_PACKAGE_VERSION)

MAC_DESTDIR ?= $(TOP)/_mac-build
MAC_TARGETDIR ?= $(MAC_DESTDIR)

# make sure we have full paths. The patsubst function is to remove any trailing slash (this may leave the variable empty)
override MAC_DESTDIR := $(patsubst %/,%,$(abspath $(MAC_DESTDIR)))
override MAC_TARGETDIR := $(patsubst %/,%,$(abspath $(MAC_TARGETDIR)))

MAC_FRAMEWORK_DIR = /Library/Frameworks/Xamarin.Mac.framework
MAC_FRAMEWORK_VERSIONED_DIR = $(MAC_FRAMEWORK_DIR)/Versions/$(MAC_PACKAGE_VERSION)
MAC_FRAMEWORK_CURRENT_DIR = $(MAC_FRAMEWORK_DIR)/Versions/$(MAC_INSTALL_VERSION)

MAC_PACKAGE_FILENAME=$(MAC_PACKAGE_NAME_LOWER)-$(MAC_PACKAGE_VERSION).pkg
MAC_PACKAGE_DMG_FILENAME=$(MAC_PACKAGE_NAME_LOWER)-$(MAC_PACKAGE_VERSION).dmg
MAC_PACKAGE_DMG_DIRNAME="$(MAC_PACKAGE_TITLE)"
MAC_PACKAGE_UTI=com.$(MAC_PACKAGE_NAME_LOWER).pkg
MAC_PACKAGE_INSTALL_LOCATION=$(MAC_FRAMEWORK_VERSIONED_DIR)

MDTOOL?=DYLD_FALLBACK_LIBRARY_PATH=$(HOME)/lib:/usr/local/lib:/lib:/usr/lib:/Library/Frameworks/Mono.framework/Versions/Current/lib $(SYSTEM_MONO) "/Applications/Xamarin Studio.app/Contents/Resources/lib/monodevelop/bin/mdtool.exe"
MDB_REBASE_EXE = $(abspath $(MONO_PATH))/mcs/class/lib/net_4_x/mdbrebase.exe
MDB_REBASE = MONO_PATH=$(dir $(MDB_REBASE_EXE)) $(TOP)/builds/install/tools64/bin/mono --debug $(MDB_REBASE_EXE)
TT = $(SYSTEM_MONO) "/Applications/Xamarin Studio.app/Contents/Resources/lib/monodevelop/AddIns/MonoDevelop.TextTemplating/TextTransform.exe"

PRODUCT_KEY_PATH?=$(TOP)/product.snk

include $(TOP)/mk/quiet.mk

.SUFFIXES:
MAKEFLAGS += --no-builtin-rules
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
TOP=.
SUBDIRS=
include $(TOP)/Make.config
include $(TOP)/mk/versions.mk
79 changes: 79 additions & 0 deletions configure
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
#!/bin/sh -e

function show_help () {
cat <<EOL
Usage: configure [options]
-h, --help Displays this help
--disable-mac Disable most of the Mac-related parts.
--disable-ios Disable most of the iOS-related parts.
The iOS build depend on some parts of the Mac build, so
a complete separation is not possible (neither desirable,
some parts will always be enabled to catch common programmer
errors causing build breaks).
The main reasons for disabling either part is to have faster
builds and disable the non-relevant tests.
--disable-strip: If executables should be stripped or not.
Disable to make it easier to debug executables using lldb.
--enable-ccache
--disable-ccache Enable/disable ccache. Default: enabled if detected.
--enable-xamarin Enable additional Xamarin-specific parts of the build.
EOL
}

rm -f Make.config.local

if test -z "$1"; then
echo "configure: all default values assumed."
exit 0
fi

while test x$1 != x; do
case $1 in
--disable-mac)
echo "INCLUDE_MAC=" >> Make.config.local
echo "Mac Build disabled (partially)"
shift
;;
--disable-ios)
echo "INCLUDE_IOS=" >> Make.config.local
echo "INCLUDE_WATCH=" >> Make.config.local
echo "INCLUDE_TVOS=" >> Make.config.local
echo "iOS Build disabled (partially)"
shift
;;
--disable-strip)
echo "DISABLE_STRIP=1" >> Make.config.local
shift
;;
--disable-ccache)
echo "ENABLE_CCACHE=" >> Make.config.local
shift
;;
--enable-ccache)
if ! CCACHE=$(which ccache); then
echo "Could not find ccache"
else
echo "ENABLE_CCACHE=1" >> Make.config.local
echo "cache enabled"
fi
shift
;;
--enable-xamarin)
echo "ENABLE_XAMARIN=1" >> Make.config.local
shift
;;
--help|-h)
show_help
exit 0
;;
*)
echo Unknown configure argument $1 >&2
shift
;;
esac
done
Loading

0 comments on commit 39ef301

Please sign in to comment.