1- export OS_NAME := $(shell uname)
2- export OS_ARCH := $(shell uname -m)
3- export NO_SUDO ?= false
41V ?= 0
52prefix = /usr/local
63CONFIGURATION = Debug
74RUNTIME := $(shell which mono64 2> /dev/null && echo mono64 || echo mono) --debug=casts
85SOLUTION = Xamarin.Android.sln
96TEST_TARGETS = build-tools/scripts/RunTests.targets
107API_LEVEL ?=
8+ PREPARE_ARGS =
9+ PREPARE_BUILD_LOG = bin/Build$(CONFIGURATION ) /bootstrap-build.binlog
10+ PREPARE_RESTORE_LOG = bin/Build$(CONFIGURATION ) /bootstrap-restore.binlog
11+ PREPARE_SOURCE_DIR = build-tools/xaprepare
12+ PREPARE_SOLUTION = $(PREPARE_SOURCE_DIR ) /xaprepare.sln
13+ PREPARE_EXE = $(PREPARE_SOURCE_DIR ) /xaprepare/bin/$(CONFIGURATION ) /xaprepare.exe
14+ PREPARE_COMMON_MSBUILD_FLAGS = /p:Configuration=$(CONFIGURATION ) $(PREPARE_MSBUILD_ARGS ) $(MSBUILD_ARGS )
15+ PREPARE_MSBUILD_FLAGS = /binaryLogger:"$(PREPARE_BUILD_LOG ) " $(PREPARE_COMMON_MSBUILD_FLAGS )
16+ PREPARE_RESTORE_FLAGS = /binaryLogger:"$(PREPARE_RESTORE_LOG ) " $(PREPARE_COMMON_MSBUILD_FLAGS )
17+ PREPARE_SCENARIO =
18+ PREPARE_CI ?= 0
19+ PREPARE_AUTOPROVISION ?= 0
20+ PREPARE_IGNORE_MONO_VERSION ?= 1
21+
22+ _PREPARE_CI_MODE_ARGS = --no-emoji --run-mode=CI -a
23+ _PREPARE_ARGS =
24+
25+ all :
26+ $(call MSBUILD_BINLOG,all,$(_SLN_BUILD ) ) $(MSBUILD_FLAGS ) $(SOLUTION )
27+
28+ -include bin/Build$(CONFIGURATION ) /rules.mk
29+
30+ ifeq ($(OS_NAME ) ,)
31+ export OS_NAME := $(shell uname)
32+ endif
33+
34+ ifeq ($(OS_ARCH ) ,)
35+ export OS_ARCH := $(shell uname -m)
36+ endif
37+
38+ export NO_SUDO ?= false
39+
40+ ifneq ($(NO_SUDO ) ,false)
41+ _PREPARE_ARGS += --auto-provisioning-uses-sudo=false
42+ endif
43+
44+ ifneq ($(V ) ,0)
45+ MONO_OPTIONS += --debug
46+ NUGET_VERBOSITY = -Verbosity Detailed
47+ _PREPARE_ARGS += -v:d
48+ endif
49+
50+ ifneq ($(PREPARE_CI ) ,0)
51+ _PREPARE_ARGS += $(_PREPARE_CI_MODE_ARGS )
52+ endif
53+
54+ ifneq ($(PREPARE_AUTOPROVISION ) ,0)
55+ _PREPARE_ARGS += --auto-provision=yes --auto-provision-uses-sudo=yes
56+ endif
1157
1258ifeq ($(OS_NAME ) ,Darwin)
13- export MACOSX_DEPLOYMENT_TARGET := 10.11
59+ ifeq ( $( HOMEBREW_PREFIX ) ,)
1460HOMEBREW_PREFIX ?= $(shell brew --prefix)
61+ endif
1562else
1663HOMEBREW_PREFIX := $prefix
1764endif
1865
19- ifneq ($(V ) ,0)
20- MONO_OPTIONS += --debug
21- NUGET_VERBOSITY = -Verbosity Detailed
66+ ifeq ($(wildcard Configuration.OperatingSystem.props) ,)
67+ PREPARE_MSBUILD_FLAGS += "/p:HostHomebrewPrefix=$(HOMEBREW_PREFIX ) "
2268endif
2369
24- ifneq ($(MONO_OPTIONS ) ,)
25- export MONO_OPTIONS
70+ ifneq ($(PREPARE_SCENARIO ) ,)
71+ _PREPARE_ARGS += -s:" $( PREPARE_SCENARIO ) "
2672endif
2773
74+ _PREPARE_ARGS += $(PREPARE_ARGS )
75+
2876include build-tools/scripts/msbuild.mk
2977
3078ifeq ($(USE_MSBUILD ) ,1)
@@ -34,12 +82,9 @@ _SLN_BUILD = MSBUILD="$(MSBUILD)" tools/scripts/xabuild
3482endif # $(USE_MSBUILD) == 1
3583
3684ifneq ($(API_LEVEL ) ,)
37- MSBUILD_FLAGS += /p:AndroidApiLevel=$(API_LEVEL ) /p:AndroidFrameworkVersion=$(word $(API_LEVEL ) , $(ALL_FRAMEWORKS ) )
85+ MSBUILD_FLAGS += /p:AndroidApiLevel=$(API_LEVEL ) /p:AndroidFrameworkVersion=$(word $(API_LEVEL ) , $(ALL_FRAMEWORKS ) ) /p:AndroidPlatformId= $( word $( a ) , $( ALL_PLATFORM_IDS ) )
3886endif
3987
40- all ::
41- $(call MSBUILD_BINLOG,all,$(_SLN_BUILD ) ) $(MSBUILD_FLAGS ) $(SOLUTION )
42-
4388all-tests ::
4489 MSBUILD=" $( MSBUILD) " $(call MSBUILD_BINLOG,all-tests,tools/scripts/xabuild) $(MSBUILD_FLAGS ) Xamarin.Android-Tests.sln
4590
@@ -70,87 +115,6 @@ uninstall::
70115 rm -rf " $( prefix) /lib/mono/xbuild/Xamarin/Android"
71116 rm -rf " $( prefix) /lib/mono/xbuild-frameworks/MonoAndroid"
72117
73- ifeq ($(OS_NAME ) ,Linux)
74- export LINUX_DISTRO := $(shell lsb_release -i -s || true)
75- export LINUX_DISTRO_RELEASE := $(shell lsb_release -r -s || true)
76- prepare :: linux-prepare
77- endif # $(OS_NAME)=Linux
78-
79- prepare :: prepare-paths prepare-msbuild
80-
81- linux-prepare ::
82- BINFMT_MISC_TROUBLE=" cli win" \
83- BINFMT_WARN=no ; \
84- for m in ${BINFMT_MISC_TROUBLE} ; do \
85- if [ -f " /proc/sys/fs/binfmt_misc/$$ m" ]; then \
86- BINFMT_WARN=yes ; \
87- fi ; \
88- done ; \
89- if [ " x${BINFMT_WARN} " = " xyes" ]; then \
90- cat Documentation/binfmt_misc-warning-Linux.txt ; \
91- fi ; \
92- if [ -f build-tools/scripts/dependencies/linux-prepare-$( LINUX_DISTRO) -$( LINUX_DISTRO_RELEASE) .sh ]; then \
93- sh build-tools/scripts/dependencies/linux-prepare-$(LINUX_DISTRO ) -$(LINUX_DISTRO_RELEASE ) .sh $(LINUX_DISTRO_RELEASE ) ; \
94- elif [ -f build-tools/scripts/dependencies/linux-prepare-$( LINUX_DISTRO) .sh ]; then \
95- sh build-tools/scripts/dependencies/linux-prepare-$(LINUX_DISTRO ) .sh $(LINUX_DISTRO_RELEASE ) ; \
96- fi
97-
98- # $(call GetPath,path)
99- GetPath = $(shell $(MSBUILD ) $(MSBUILD_FLAGS ) /p:DoNotLoadOSProperties=True /nologo /v:minimal /t:Get$(1 ) FullPath build-tools/scripts/Paths.targets | tr -d '[[:space:]]' )
100-
101- MSBUILD_PREPARE_PROJS = \
102- src/mono-runtimes/mono-runtimes.csproj \
103- src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj
104-
105- prepare-deps : prepare-cmake-mingw-toolchain
106- git submodule update --init --recursive
107- ./build-tools/scripts/generate-os-info Configuration.OperatingSystem.props
108- mkdir -p bin/Build$(CONFIGURATION )
109- $(call MSBUILD_BINLOG,prepare-deps) build-tools/dependencies/dependencies.csproj
110-
111- #
112- # $(1): output file name
113- #
114- define create_cmake_toolchain
115- prepare-cmake-mingw-toolchain:: bin/Build$(CONFIGURATION ) /$(1 )
116-
117- bin/Build$(CONFIGURATION ) /$(1 ) : build-tools/scripts/$(1 ) .in
118- mkdir -p $$(dir $$@ )
119- sed -e 's;@HOMEBREW_PREFIX@;$$(HOMEBREW_PREFIX ) ;g' < $$< > $$@
120- endef
121-
122- $(eval $(call create_cmake_toolchain,mingw-32.cmake))
123- $(eval $(call create_cmake_toolchain,mingw-64.cmake))
124-
125- prepare-external : prepare-deps
126- nuget restore $(NUGET_VERBOSITY ) $(SOLUTION )
127- nuget restore $(NUGET_VERBOSITY ) Xamarin.Android-Tests.sln
128- (cd external/xamarin-android-tools && make prepare CONFIGURATION=$( CONFIGURATION) )
129- (cd $( call GetPath,JavaInterop) && make prepare CONFIGURATION=$( CONFIGURATION) JI_MAX_JDK=8)
130- (cd $( call GetPath,JavaInterop) && make bin/Build$( CONFIGURATION) /JdkInfo.props CONFIGURATION=$( CONFIGURATION) JI_MAX_JDK=8)
131-
132- prepare-bundle : prepare-external
133- $(call MSBUILD_BINLOG,prepare-bundle) build-tools/download-bundle/download-bundle.csproj
134- $(call MSBUILD_BINLOG,prepare-restore) $(MSBUILD_FLAGS ) tests/Xamarin.Forms-Performance-Integration/Xamarin.Forms.Performance.Integration.csproj /t:Restore
135-
136- prepare-props : prepare-bundle
137- cp $(call GetPath,JavaInterop) /external/Mono.Cecil* " $( call GetPath,MonoSource) /external"
138- cp " $( call GetPath,JavaInterop) /product.snk" " $( call GetPath,MonoSource) "
139- cp build-tools/scripts/Configuration.Java.Interop.Override.props external/Java.Interop/Configuration.Override.props
140- cp $(call GetPath,MonoSource) /mcs/class/msfinal.pub .
141-
142- prepare-msbuild : prepare-props
143- ifeq ($(USE_MSBUILD ) ,1)
144- for proj in $(MSBUILD_PREPARE_PROJS); do \
145- $(call MSBUILD_BINLOG,prepare-msbuild) "$$proj" || exit 1; \
146- done
147- endif # msbuild
148-
149- prepare-image-dependencies :
150- $(call MSBUILD_BINLOG,prepare-image-deps) build-tools/scripts/PrepareImageDependencies.targets /t:PrepareImageDependencies \
151- /p:AndroidSupportedHostJitAbis=mxe-Win32:mxe-Win64
152- cat bin/Build$(CONFIGURATION ) /prepare-image-dependencies.sh | tr -d ' \r' > prepare-image-dependencies.sh
153-
154118include build-tools/scripts/BuildEverything.mk
155119
156120# Must be after BuildEverything.mk - it uses variables defined there
@@ -159,59 +123,10 @@ include tests/api-compatibility/api-compatibility.mk
159123
160124topdir := $(shell pwd)
161125
162-
163- XA_BUILD_PATHS_OUT = bin/Test$(CONFIGURATION ) /XABuildPaths.cs
164-
165- prepare-paths : $(XA_BUILD_PATHS_OUT )
166-
167- $(XA_BUILD_PATHS_OUT ) : bin/Test% /XABuildPaths.cs: build-tools/scripts/XABuildPaths.cs.in
168- mkdir -p $(shell dirname $@ )
169- sed -e ' s;@CONFIGURATION@;$*;g' \
170- -e ' s;@TOP_DIRECTORY@;$(topdir);g' < $< > $@
171- cat $@
172-
173-
174- # Usage: $(call CALL_CREATE_THIRD_PARTY_NOTICES,path,licenseType,includeExternalDeps,includeBuildDeps)
175- define CREATE_THIRD_PARTY_NOTICES
176- $(call MSBUILD_BINLOG,create-tpn,$(MSBUILD ) ) $(_MSBUILD_ARGS ) \
177- $(topdir ) /build-tools/ThirdPartyNotices/ThirdPartyNotices.csproj \
178- /p:Configuration=$(CONFIGURATION ) \
179- /p:ThirdPartyNoticeFile=$(topdir ) /$(1 ) \
180- /p:ThirdPartyNoticeLicenseType=$(2 ) \
181- /p:TpnIncludeExternalDependencies=$(3 ) \
182- /p:TpnIncludeBuildDependencies=$(4 )
183- endef # CREATE_THIRD_PARTY_NOTICES
184-
185- prepare :: prepare-tpn
186-
187- TPN_LICENSE_FILES = $(shell grep -h '<LicenseFile>' external/* .tpnitems src/* .tpnitems \
188- | sed -E 's,<LicenseFile>(.* ) </LicenseFile>,\1,g;s,.\(MSBuildThisFileDirectory\),$(topdir ) /external/,g' \
189- | tr \\ / )
190-
191- # Usage: $(call CREATE_THIRD_PARTY_NOTICES_RULE,path,licenseType,includeExternalDeps,includeBuildDeps)
192- define CREATE_THIRD_PARTY_NOTICES_RULE
193- prepare-tpn:: $(1 )
194-
195- $(1 ) $(topdir ) /$(1 ) : build-tools/ThirdPartyNotices/ThirdPartyNotices.csproj \
196- $(wildcard external/* .tpnitems src/* .tpnitems build-tools/* .tpnitems) \
197- $(TPN_LICENSE_FILES )
198- $(call CREATE_THIRD_PARTY_NOTICES,$(1 ) ,$(2 ) ,$(3 ) ,$(4 ) )
199- endef # CREATE_THIRD_PARTY_NOTICES_RULE
200-
201- THIRD_PARTY_NOTICE_LICENSE_TYPE = microsoft-oss
202-
203- $(eval $(call CREATE_THIRD_PARTY_NOTICES_RULE,ThirdPartyNotices.txt,foundation,False,False))
204- $(eval $(call CREATE_THIRD_PARTY_NOTICES_RULE,bin/$(CONFIGURATION)/lib/xamarin.android/ThirdPartyNotices.txt,$(THIRD_PARTY_NOTICE_LICENSE_TYPE),True,False))
205-
206126# Used by External XA Build
207127EXTERNAL_XA_PATH =$(topdir )
208128EXTERNAL_GIT_PATH =$(topdir ) /external
209129
210- prepare-external-git-dependencies :
211- msbuild build-tools/xa-prep-tasks/xa-prep-tasks.csproj /p:Configuration=$(CONFIGURATION )
212- msbuild build-tools/xa-prep-tasks/xa-prep-tasks.csproj /p:Configuration=$(CONFIGURATION ) \
213- /t:CheckoutExternalGitSources /p:ExternalSourceDependencyDirectory=' $(EXTERNAL_GIT_PATH)'
214-
215130-include $(EXTERNAL_GIT_PATH ) /monodroid/xa-integration.mk
216131
217132run-all-tests :
@@ -257,3 +172,68 @@ list-nunit-tests:
257172 $(MSBUILD ) $(MSBUILD_FLAGS ) $(TEST_TARGETS ) /t:ListNUnitTests
258173
259174include build-tools/scripts/runtime-helpers.mk
175+
176+ .PHONY : prepare-build-init
177+ prepare-build-init :
178+ mkdir -p $(dir $(PREPARE_BUILD_LOG ) )
179+ msbuild $(PREPARE_RESTORE_FLAGS ) $(PREPARE_SOLUTION ) /t:Restore
180+
181+ .PHONY : prepare-build
182+ prepare-build : prepare-build-init
183+ msbuild $(PREPARE_MSBUILD_FLAGS ) $(PREPARE_SOLUTION )
184+
185+ .PHONY : prepare-build-ci
186+ prepare-build-ci : prepare-build-init
187+ msbuild $(PREPARE_MSBUILD_FLAGS ) $(PREPARE_SOLUTION ) $(_MSBUILD_ARGS )
188+
189+ .PHONY : prepare
190+ prepare :: prepare-build
191+ mono --debug $(PREPARE_EXE ) $(_PREPARE_ARGS )
192+
193+ .PHONY : prepare-help
194+ prepare-help : prepare-build
195+ mono --debug $(PREPARE_EXE ) -h
196+
197+ # Hack: The current commercial pipeline doesn't pass all the required arguments when preparing the build, in particular it doesn't override the
198+ # ABI targets to build and so the prepare step configures only for the default set (armeabi-v7a, arm64-v8a, x86, $HOST_OS) which is not enough.
199+ # The `jenkins` rule in `BuildEverything.mk`, invoked by the commercial pipeline, now calls the rule below in which we rebuild the bootstrapper
200+ # with all the required properties set to include all the ABIs - it should fix the build. After the PR is merged, the commercial pipeline should
201+ # be modified to do the right thing instead.
202+ #
203+ # Commercial pipeline should also set PREPARE_CI=1 when calling targets. Since this is currently not done, we have to pass $(_PREPARE_CI_MODE_ARGS)
204+ # directly below
205+ #
206+ .PHONY : prepare-jenkins
207+ prepare-jenkins : prepare-build-ci prepare-commercial
208+ @echo preparing jenkins build
209+ mono --debug $(PREPARE_EXE ) $(_PREPARE_ARGS ) $(_PREPARE_CI_MODE_ARGS )
210+
211+ # This should go away once we can modify the commercial pipeline for the bootstrapper
212+ .PHONY : prepare-commercial
213+ ifeq ($(USE_COMMERCIAL_INSTALLER_NAME ) ,true)
214+ prepare-commercial :
215+ cd $(TOP ) && ./configure --with-xamarin-android=' $(XAMARIN_ANDROID_PATH)'
216+ mkdir -p $(XA_MSBUILD_DIR )
217+
218+ else
219+ prepare-commercial :
220+ endif
221+
222+ .PHONY : prepare-update-mono
223+
224+ prepare-update-mono : prepare-build-ci
225+ mono --debug $(PREPARE_EXE ) $(_PREPARE_ARGS ) $(_PREPARE_CI_MODE_ARGS ) /s:UpdateMono
226+
227+ # These targets exist only temporarily to satisfy requirements of the commercial build (since we can't modify the pipeline script in this PR)
228+ .PHONY : prepare-deps
229+
230+ # Commercial pipeline installs an older version of Mono and in effect we fail. `prepare-deps` is called after provisionator is ran and so we
231+ # can, temporarily, re-update Mono here. After the PR is merged and commercial pipeline updated, this step should be removed.
232+ prepare-deps : prepare-update-mono
233+ @echo prepare-deps is no-op, prepare-jenkins or prepare do the work instead
234+
235+ prepare-image-dependencies : prepare-build-ci
236+ mono --debug $(PREPARE_EXE ) $(_PREPARE_ARGS ) $(_PREPARE_CI_MODE_ARGS ) -s:PrepareImageDependencies
237+
238+ prepare-external-git-dependencies : prepare-build-ci prepare-update-mono
239+ mono --debug $(PREPARE_EXE ) $(_PREPARE_ARGS ) $(_PREPARE_CI_MODE_ARGS ) -s:PrepareExternalGitDependencies
0 commit comments