216 строки
9.1 KiB
Makefile
216 строки
9.1 KiB
Makefile
TOP=..
|
|
include $(TOP)/Make.config
|
|
|
|
# Keep all intermediate files always.
|
|
.SECONDARY:
|
|
|
|
ifeq ($(shell arch),arm64)
|
|
DOTNET_ARCH=arm64
|
|
else
|
|
DOTNET_ARCH=x64
|
|
endif
|
|
|
|
##
|
|
## Mono download vs. build
|
|
##
|
|
|
|
download: download-mono
|
|
download-mono: \
|
|
downloads/$(basename $(MONO_IOS_FILENAME)) \
|
|
|
|
downloads/$(basename $(MONO_IOS_FILENAME)): MONO_URL=$(MONO_IOS_URL)
|
|
|
|
include $(TOP)/mk/colors.mk
|
|
|
|
DOWNLOADS = \
|
|
downloads/$(MONO_IOS_FILENAME) \
|
|
|
|
# This target downloads the mono archives, there's one for Xamarin.iOS and one for Xamarin.Mac.
|
|
# If doing many clean builds, it's possible to copy the downloaded zip file to ~/Library/Caches/xamarin-macios
|
|
# to avoid having to download it every time. The zip files have to be copied manually, otherwise
|
|
# we'd end up filling up a lot of hard drives around the world.
|
|
$(DOWNLOADS):
|
|
$(Q) mkdir -p downloads
|
|
$(Q) echo "Downloading $(MONO_URL)..."
|
|
$(Q) if test -f ~/Library/Caches/xamarin-macios/$(notdir $@); then \
|
|
echo "Found a cached version of $(MONO_URL) in ~/Library/Caches/xamarin-macios/$(notdir $@)."; \
|
|
$(CP) ~/Library/Caches/xamarin-macios/$(notdir $@) $@.tmp; \
|
|
else \
|
|
EC=0; \
|
|
$(CURL_RETRY) $(MONO_URL) --output $@.tmp || EC=$$?; \
|
|
if [[ x$$EC == x22 ]]; then \
|
|
MSG="Could not download the archive %s because the URL doesn't exist. This can happen if bumping mono very soon after the corresponding commit was pushed to mono (i.e. the archive hasn't been built yet). If so, please wait a bit and try again."; \
|
|
printf "$(COLOR_RED)*** $$MSG$(COLOR_CLEAR)\n" "$(notdir $@)"; \
|
|
if test -n "$$FAILURE_REASON_PATH"; then printf "$$MSG\n" "[$(notdir $@)]($(MONO_URL))" >> "$$FAILURE_REASON_PATH"; fi; \
|
|
fi; \
|
|
if [[ x$$EC != x0 ]]; then exit $$EC; fi; \
|
|
if [[ "x$$MACIOS_CACHE_DOWNLOADS" != "x" ]]; then \
|
|
mkdir -p ~/Library/Caches/xamarin-macios/; \
|
|
$(CP) $@.tmp ~/Library/Caches/xamarin-macios/"$(notdir $@)"; \
|
|
echo "Cached the download of $(notdir $@) in ~/Library/Caches/xamarin-macios"; \
|
|
fi; \
|
|
fi
|
|
$(Q) mv $@.tmp $@
|
|
$(Q) echo "Downloaded $(MONO_URL)"
|
|
|
|
downloads/%: downloads/%.7z
|
|
$(Q) echo "Unzipping $*..."
|
|
$(Q) rm -Rf $@.tmp
|
|
$(Q) 7z x $< -o$@.tmp
|
|
$(Q) find $@.tmp -exec touch {} +
|
|
$(Q) mv $@.tmp $@
|
|
$(Q) echo "Unzipped $*."
|
|
|
|
downloads/%: downloads/%.nupkg
|
|
$(Q) echo "Unzipping $*..."
|
|
$(Q) rm -Rf $@.tmp
|
|
$(Q) unzip -d $@.tmp $<
|
|
$(Q) find $@.tmp -exec touch {} +
|
|
$(Q) mv $@.tmp $@
|
|
$(Q) echo "Unzipped $*."
|
|
|
|
downloads/$(DOTNET_INSTALL_NAME): dotnet-install.sh
|
|
$(Q) echo "Downloading and installing .NET $(DOTNET_VERSION) into $@..."
|
|
$(Q) ./dotnet-install.sh --install-dir "$@.tmp" --version "$(DOTNET_VERSION)" --architecture $(DOTNET_ARCH) --no-path $$DOTNET_INSTALL_EXTRA_ARGS
|
|
$(Q) rm -Rf "$@"
|
|
$(Q) mv "$@.tmp" "$@"
|
|
$(Q) echo "Downloaded and installed .NET $(DOTNET_VERSION) into $@."
|
|
|
|
# Create a symlink with a persistent (non-version-dependent) name
|
|
# The dependency on the stamp file is to ensure the symlink is re-created
|
|
# when the .NET version changes.
|
|
all-local:: downloads/dotnet
|
|
dotnet:: downloads/dotnet
|
|
downloads/dotnet: .stamp-dotnet-symlink-$(DOTNET_VERSION)
|
|
$(Q) mkdir -p downloads
|
|
$(Q) rm -f $@
|
|
$(Q) ln -s $(abspath downloads/$(DOTNET_INSTALL_NAME)) $@
|
|
|
|
.stamp-dotnet-symlink-$(DOTNET_VERSION): Makefile
|
|
$(Q) touch $@
|
|
|
|
# This is just a helpful target to print the url to the .pkg to download and install the current .NET version into the system.
|
|
print-dotnet-pkg-urls: dotnet-install.sh
|
|
$(Q) rm -f $@-found-it.stamp
|
|
$(Q) for url in $$(./dotnet-install.sh --version "$(DOTNET_VERSION)" --architecture $(DOTNET_ARCH) --no-path $$DOTNET_INSTALL_EXTRA_ARGS --dry-run | grep URL.*primary: | sed 's/.*primary: //'); do \
|
|
pkg=$${url/tar.gz/pkg}; \
|
|
if $(CURL) -I "$$pkg" >/dev/null 2>&1; then echo "$$pkg"; touch $@-found-it.stamp; break; fi; \
|
|
done
|
|
$(Q) if ! test -f $@-found-it.stamp; then echo "No working urls were found."; exit 1; fi
|
|
$(Q) rm -f $@-found-it.stamp
|
|
|
|
DOTNET_DOWNLOAD_URL?=https://dot.net/v1/dotnet-install.sh
|
|
|
|
dotnet-install.sh: Makefile
|
|
$(Q) $(CURL_RETRY) $(DOTNET_DOWNLOAD_URL) --output $@.tmp
|
|
$(Q) chmod +x $@.tmp
|
|
$(Q) mv $@.tmp $@
|
|
|
|
.stamp-download-mono: $(TOP)/Make.config $(TOP)/mk/mono.mk
|
|
$(MAKE) download-mono
|
|
$(Q) touch $@
|
|
|
|
ifdef CUSTOM_DOTNET
|
|
DOWNLOAD_DOTNET_VERSION=$(CUSTOM_DOTNET_VERSION)
|
|
else
|
|
ifneq ($(BUNDLED_NETCORE_PLATFORMS_PACKAGE_VERSION),)
|
|
DOWNLOAD_DOTNET_VERSION=$(BUNDLED_NETCORE_PLATFORMS_PACKAGE_VERSION)
|
|
endif
|
|
endif
|
|
|
|
.stamp-install-custom-dotnet-runtime-workloads:
|
|
ifneq ($(TRACKING_DOTNET_RUNTIME_SEPARATELY),)
|
|
@# mono toolchain
|
|
$(Q) mkdir -p ./downloads/$(DOTNET_INSTALL_NAME)/sdk-manifests/$(MONO_TOOLCHAIN_MANIFEST_VERSION_BAND)
|
|
$(Q) $(CP) $(TOP)/packages/microsoft.net.workload.mono.toolchain.net7.manifest-$(MONO_TOOLCHAIN_MANIFEST_VERSION_BAND)/$(DOWNLOAD_DOTNET_VERSION)/data/WorkloadManifest.* ./downloads/$(DOTNET_INSTALL_NAME)/sdk-manifests/$(MONO_TOOLCHAIN_MANIFEST_VERSION_BAND)/microsoft.net.workload.mono.toolchain.net7/
|
|
@# emscripten, which mono depends on
|
|
$(Q) mkdir -p ./downloads/$(DOTNET_INSTALL_NAME)/sdk-manifests/$(EMSCRIPTEN_MANIFEST_VERSION_BAND)
|
|
$(Q) $(CP) $(TOP)/packages/microsoft.net.workload.emscripten.net7.manifest-$(EMSCRIPTEN_MANIFEST_VERSION_BAND)/$(EMSCRIPTEN_MANIFEST_PACKAGE_VERSION)/data/WorkloadManifest.* ./downloads/$(DOTNET_INSTALL_NAME)/sdk-manifests/$(EMSCRIPTEN_MANIFEST_VERSION_BAND)/microsoft.net.workload.emscripten.net7/
|
|
$(Q) touch $@
|
|
endif
|
|
|
|
package-download/all-package-references.csproj: $(GIT_DIRECTORY)/HEAD $(GIT_DIRECTORY)/index ./create-csproj-for-all-packagereferences.sh
|
|
$(Q_GEN) ./create-csproj-for-all-packagereferences.sh --output "$(abspath $@.tmp)" $(if $(V),-v,)
|
|
$(Q) mv "$@.tmp" "$@"
|
|
|
|
.stamp-download-dotnet-packages: $(TOP)/Make.config downloads/$(DOTNET_INSTALL_NAME) package-download/all-package-references.csproj
|
|
$(Q_GEN) cd package-download && $(DOTNET) \
|
|
build \
|
|
download-packages.csproj \
|
|
/t:WriteBundledNETCorePlatformsPackageVersion \
|
|
/p:WriteFilePath=$(CURDIR)/BundledNETCorePlatformsPackageVersion.txt \
|
|
/p:PackageRuntimeIdentifiers="$(DOTNET_RUNTIME_IDENTIFIERS)" \
|
|
/p:PackageRuntimeIdentifiersCoreCLR="$(DOTNET_CORECLR_RUNTIME_IDENTIFIERS)" \
|
|
/p:CustomDotNetVersion="$(DOWNLOAD_DOTNET_VERSION)" \
|
|
/p:MonoToolChainManifestVersionBand="$(MONO_TOOLCHAIN_MANIFEST_VERSION_BAND)" \
|
|
/p:EmscriptenManifestVersionBand="$(EMSCRIPTEN_MANIFEST_VERSION_BAND)" \
|
|
/p:TrackingDotNetRuntimeSeparately="$(TRACKING_DOTNET_RUNTIME_SEPARATELY)" \
|
|
/bl \
|
|
$(DOTNET_BUILD_VERBOSITY)
|
|
$(MAKE) .stamp-install-custom-dotnet-runtime-workloads
|
|
$(Q) touch $@
|
|
|
|
.stamp-install-t4: $(TOP)/.config/dotnet-tools.json .stamp-download-dotnet-packages
|
|
@# https://github.com/dotnet/sdk/issues/16165
|
|
$(Q) rm -f ~/.dotnet/toolResolverCache/*/dotnet-t4
|
|
$(Q) rm -f ~/.dotnet/toolResolverCache/*/dotnet-ilrepack
|
|
$(DOTNET) tool restore
|
|
$(Q) touch $@
|
|
|
|
BundledNETCorePlatformsPackageVersion.txt: .stamp-download-dotnet-packages
|
|
|
|
DOTNET_DOWNLOADS = \
|
|
downloads/$(DOTNET_INSTALL_NAME) \
|
|
.stamp-download-dotnet-packages \
|
|
.stamp-install-t4 \
|
|
|
|
dotnet:: $(DOTNET_DOWNLOADS)
|
|
all-local:: $(DOTNET_DOWNLOADS)
|
|
|
|
clean-local::
|
|
$(Q) rm -Rf downloads .stamp-download-mono
|
|
|
|
all-local:: .stamp-mono-ios-sdk-destdir
|
|
|
|
.stamp-mono-ios-sdk-destdir: .stamp-$(MONO_BUILD_MODE)
|
|
ln -sf $(MONO_IOS_SDK_DESTDIR) mono-ios-sdk-destdir
|
|
$(Q) touch $@
|
|
|
|
#
|
|
# .NET
|
|
#
|
|
|
|
DOTNET_COMMON_DIRECTORIES += \
|
|
$(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),$(DOTNET_DESTDIR)/$($(platform)_NUGET_SDK_NAME)) \
|
|
$(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),$(DOTNET_DESTDIR)/$($(platform)_NUGET_SDK_NAME)/tools) \
|
|
|
|
DOTNET_COMMON_TARGETS = \
|
|
$(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),$(DOTNET_DESTDIR)/$($(platform)_NUGET_SDK_NAME)/Versions.plist) \
|
|
$(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),$(DOTNET_DESTDIR)/$($(platform)_NUGET_SDK_NAME)/tools/buildinfo) \
|
|
|
|
define VersionInfo
|
|
$(DOTNET_DESTDIR)/$($(1)_NUGET_SDK_NAME)/Versions.plist: $(TOP)/builds/Versions-$(1).plist.in Makefile $(TOP)/Make.config $(TOP)/versions-check.csharp | $(DOTNET_DESTDIR)/$($(1)_NUGET_SDK_NAME)
|
|
$$(Q) $(TOP)/versions-check.csharp $$< "$(DOTNET_MIN_IOS_SDK_VERSION)" "$(MAX_IOS_DEPLOYMENT_TARGET)" "$(DOTNET_MIN_TVOS_SDK_VERSION)" "$(MAX_TVOS_DEPLOYMENT_TARGET)" "$(MIN_WATCH_OS_VERSION)" "$(MAX_WATCH_DEPLOYMENT_TARGET)" "$(DOTNET_MIN_MACOS_SDK_VERSION)" "$(MACOS_SDK_VERSION)" "$(DOTNET_MIN_MACCATALYST_SDK_VERSION)" "$(MACCATALYST_SDK_VERSION)"
|
|
$$(Q_GEN) sed -e 's/@XCODE_VERSION@/$(XCODE_VERSION)/g' -e "s/@MONO_VERSION@/$(DOTNET_VERSION)/g" $$< > $$@.tmp
|
|
$$(Q) mv $$@.tmp $$@
|
|
endef
|
|
$(foreach platform,$(DOTNET_PLATFORMS),$(eval $(call VersionInfo,$(platform))))
|
|
|
|
define BuildInfo
|
|
$(DOTNET_DESTDIR)/$($(1)_NUGET_SDK_NAME)/tools/buildinfo: $(TOP)/Make.config.inc $(GIT_DIRECTORY)/index | $(DOTNET_DESTDIR)/$($(1)_NUGET_SDK_NAME)/tools
|
|
$$(Q_GEN) echo "Version: $$($(2)_NUGET_VERSION)" > $$@.tmp
|
|
$$(Q) echo "Hash: $$(shell git log --oneline -1 --pretty=%h)" >> $$@.tmp
|
|
$$(Q) echo "Branch: $$(CURRENT_BRANCH)" >> $$@.tmp
|
|
$$(Q) echo "Build date: $$(shell date '+%Y-%m-%d %H:%M:%S%z')" >> $$@.tmp
|
|
$$(Q) mv $$@.tmp $$@
|
|
endef
|
|
$(foreach platform,$(DOTNET_PLATFORMS),$(eval $(call BuildInfo,$(platform),$(shell echo $(platform) | tr a-z A-Z))))
|
|
|
|
$(DOTNET_COMMON_DIRECTORIES):
|
|
$(Q) mkdir -p $@
|
|
|
|
install-dotnet: $(DOTNET_COMMON_TARGETS)
|
|
install-local:: install-dotnet
|
|
all-local:: install-dotnet
|
|
|