diff --git a/Make.config b/Make.config index 506a42ef32..3a92276395 100644 --- a/Make.config +++ b/Make.config @@ -221,6 +221,7 @@ NUNITLITE_PATH=$(TOP)/external/NUnitLite OPENTK_PATH=$(TOP)/external/opentk MODERNHTTPCLIENT_PATH=$(TOP)/external/ModernHttpClient XAMARIN_MACDEV_PATH=$(TOP)/external/Xamarin.MacDev +MACCORE_PATH=$(TOP)/../maccore MONO_PREFIX ?= /Library/Frameworks/Mono.framework/Versions/Current SYSTEM_MCS=$(MONO_PREFIX)/bin/mcs @@ -271,5 +272,9 @@ PRODUCT_KEY_PATH?=$(TOP)/product.snk include $(TOP)/mk/quiet.mk +ifdef ENABLE_XAMARIN +-include $(MACCORE_PATH)/Make.config +endif + .SUFFIXES: MAKEFLAGS += --no-builtin-rules diff --git a/Makefile b/Makefile index 0204949d62..bf1e64fe77 100644 --- a/Makefile +++ b/Makefile @@ -177,3 +177,7 @@ fix-install-permissions: sudo chown -R $(USER) /Library/Frameworks/Mono.framework/External/ sudo chown -R $(USER) /Library/Frameworks/Xamarin.iOS.framework sudo chown -R $(USER) /Library/Frameworks/Xamarin.Mac.framework + +ifdef ENABLE_XAMARIN +SUBDIRS += $(MACCORE_PATH) +endif diff --git a/builds/Makefile b/builds/Makefile index 3575db6774..76fc2c6744 100644 --- a/builds/Makefile +++ b/builds/Makefile @@ -11,6 +11,7 @@ IPHONEOS_PREFIX=$(MONOTOUCH_PREFIX)/SDKs/MonoTouch.iphoneos.sdk/usr ifdef ENABLE_XAMARIN XAMARIN_AUTOGEN_FLAGS=--enable-extension-module=xamarin XAMARIN_CONFIGURE_FLAGS=--enable-extension-module=xamarin +-include $(MACCORE_PATH)/builds/Makefile.include endif ifndef DISABLE_STRIP diff --git a/external/.gitignore b/external/.gitignore new file mode 100644 index 0000000000..166bcbc362 --- /dev/null +++ b/external/.gitignore @@ -0,0 +1,2 @@ +mono-extensions + diff --git a/mk/versions.mk b/mk/versions.mk index d5e5092a86..97eb53e45b 100644 --- a/mk/versions.mk +++ b/mk/versions.mk @@ -2,7 +2,7 @@ # usage $(call CheckSubmoduleTemplate (mono,MONO,mono)) define CheckSubmoduleTemplate -#$(eval NEEDED_$(2)_VERSION:=$(shell git ls-tree HEAD --full-tree -- external/$(1) | awk -F' ' '{printf "%s",$$3}')) +#$(eval NEEDED_$(2)_VERSION:=$(shell git --git-dir $(abspath $($(2)_PATH)/../..)/.git --work-tree $(abspath $($(2)_PATH)/../..) ls-tree HEAD --full-tree -- external/$(1) | awk -F' ' '{printf "%s",$$3}')) #$(eval $(2)_VERSION:=$$$$(shell cd $($(2)_PATH) 2>/dev/null && git rev-parse HEAD 2>/dev/null)) check-$(1):: @@ -42,7 +42,7 @@ ifneq ($$(IGNORE_$(2)_VERSION),) @echo "*** Not resetting $(1) because IGNORE_$(2)_VERSION is set" else @echo "*** git submodule update --init --recursive --force -- $(TOP)/external/$(1)" - @git submodule update --init --recursive --force -- $(TOP)/external/$(1) + cd $(abspath $($(2)_PATH)/../..) && git submodule update --init --recursive --force -- ./external/$(1) endif print-$(1):: @@ -68,6 +68,8 @@ $(eval $(call CheckSubmoduleTemplate,opentk,OPENTK)) $(eval $(call CheckSubmoduleTemplate,ModernHttpClient,MODERNHTTPCLIENT)) $(eval $(call CheckSubmoduleTemplate,Xamarin.MacDev,XAMARIN_MACDEV)) +include $(TOP)/mk/xamarin.mk + # some hackish reset-* targets to deal with what needs to happen in various parts of the build tree when you reset a module reset-mono:: diff --git a/mk/xamarin.mk b/mk/xamarin.mk new file mode 100644 index 0000000000..cc587b266d --- /dev/null +++ b/mk/xamarin.mk @@ -0,0 +1,96 @@ +ifdef ENABLE_XAMARIN +NEEDED_MACCORE_VERSION := 32be4a29841f17f835d37d759a461267c7079b00 +NEEDED_MACCORE_BRANCH := xamarin-macios + +MACCORE_DIRECTORY := maccore +MACCORE_MODULE := git@github.com:xamarin/maccore.git +MACCORE_VERSION := $(shell cd $(MACCORE_PATH) 2> /dev/null && git rev-parse HEAD 2> /dev/null) +MACCORE_BRANCH := $(shell cd $(MACCORE_PATH) 2> /dev/null && git symbolic-ref --short HEAD 2> /dev/null) +MACCORE_REMOTE := origin +MACCORE_BRANCH_AND_REMOTE := $(NEEDED_MACCORE_BRANCH) $(MACCORE_REMOTE)/$(NEEDED_MACCORE_BRANCH) +NEEDED_MACCORE_REMOTE := $(MACCORE_REMOTE) + +define CheckVersionTemplate +check-$(1):: + @if test x$$(IGNORE_$(2)_VERSION) = "x"; then \ + if test ! -d $($(2)_PATH); then \ + if test x$$(RESET_VERSIONS) != "x"; then \ + make reset-$(1) || exit 1; \ + else \ + echo "Your $(1) checkout is missing, please run 'make reset-$(1)'"; \ + touch .check-versions-failure; \ + fi; \ + else \ + if test "x$($(2)_VERSION)" != "x$(NEEDED_$(2)_VERSION)" ; then \ + if test x$$(RESET_VERSIONS) != "x"; then \ + make reset-$(1) || exit 1; \ + else \ + echo "Your $(1) version is out of date, please run 'make reset-$(1)' (found $($(2)_VERSION), expected $(NEEDED_$(2)_VERSION))"; \ + test -z "$(BUILD_REVISION)" || $(MAKE) test-$(1); \ + touch .check-versions-failure; \ + fi; \ + elif test "x$($(2)_BRANCH)" != "x$(NEEDED_$(2)_BRANCH)" ; then \ + if test x$$(RESET_VERSIONS) != "x"; then \ + test -z "$(BUILD_REVISION)" || $(MAKE) test-$(1); \ + make reset-$(1) || exit 1; \ + else \ + echo "Your $(1) branch is out of date, please run 'make reset-$(1)' (found $($(2)_BRANCH), expected $(NEEDED_$(2)_BRANCH))"; \ + touch .check-versions-failure; \ + fi; \ + else \ + echo "$(1) is up-to-date."; \ + fi; \ + fi; \ + fi + +test-$(1):: + @echo $(1) + @echo " $(2)_DIRECTORY=$($(2)_DIRECTORY)" + @echo " $(2)_MODULE=$($(2)_MODULE)" + @echo " NEEDED_$(2)_VERSION=$(NEEDED_$(2)_VERSION)" + @echo " $(2)_VERSION=$($(2)_VERSION)" + @echo " $(2)_BRANCH_AND_REMOTE=$($(2)_BRANCH_AND_REMOTE)" + @echo " NEEDED_$(2)_BRANCH=$(NEEDED_$(2)_BRANCH)" + @echo " NEEDED_$(2)_REMOTE=$(NEEDED_$(2)_REMOTE)" + @echo " $(2)_BRANCH=$($(2)_BRANCH)" + @echo " $(2)_PATH=$($(2)_PATH) => $(abspath $($(2)_PATH))" + +reset-$(1):: + @if test -d $($(2)_PATH); then \ + if ! (cd $($(2)_PATH) && git show $(NEEDED_$(2)_VERSION) >/dev/null 2>&1 && git log -1 $(NEEDED_$(2)_REMOTE) >/dev/null 2>&1) ; then \ + echo "*** git fetch `basename $$($(2)_PATH)`" && (cd $($(2)_PATH) && git fetch); \ + fi; \ + else \ + echo "*** git clone $($(2)_MODULE) --recursive $($(2)_DIRECTORY) -b $(NEEDED_$(2)_BRANCH)"; \ + mkdir -p `dirname $($(2)_PATH)`; \ + (cd $(abspath $($(2)_PATH)/..) && git clone $($(2)_MODULE) --recursive $($(2)_DIRECTORY) -b $(NEEDED_$(2)_BRANCH)); \ + fi + @if test x$$(IGNORE_$(2)_VERSION) = "x"; then \ + echo "*** [$(1)] git checkout -f" $(NEEDED_$(2)_BRANCH) && (cd $($(2)_PATH) && git checkout -f $(NEEDED_$(2)_BRANCH) || git checkout -f -b $($(2)_BRANCH_AND_REMOTE)); \ + echo "*** [$(1)] git reset --hard $(NEEDED_$(2)_VERSION)" && (cd $($(2)_PATH) && git reset --hard $(NEEDED_$(2)_VERSION)); \ + fi + @echo "*** [$(1)] git submodule update --init --recursive" && (cd $($(2)_PATH) && git submodule update --init --recursive) + +print-$(1):: + @printf "*** %-16s %-45s %s (%s)\n" "$(DIRECTORY_$(2))" "$(MODULE_$(2))" "$(NEEDED_$(2)_VERSION)" "$(NEEDED_$(2)_BRANCH)" + +.PHONY: check-$(1) reset-$(1) print-$(1) + +reset-versions:: reset-$(1) +check-versions:: check-$(1) +print-versions:: print-$(1) + +DEPENDENCY_DIRECTORIES += $($(2)_PATH) + +endef + +builds/.stamp-cloned-maccore: + @# we need to touch the stamp first, otherwise we'll + @# go into an infinite loop when we re-launch make. + @touch $@ + $(Q) $(MAKE) reset-maccore || rm -f $@ + +$(eval $(call CheckVersionTemplate,maccore,MACCORE)) +-include $(MACCORE_PATH)/mk/versions.mk +$(MACCORE_PATH)/mk/versions.mk: | builds/.stamp-cloned-maccore +endif diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000000..c934fc6de1 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,5 @@ +TOP=.. +include $(TOP)/Make.config + +%: + $(MAKE) -C $(MACCORE_PATH)/tests $@