diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index 5491cf6d6..b85731b98 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -31,6 +31,11 @@ jobs: submodules: recursive fetch-depth: 0 + - name: Ensure source code revision + run: scripts/ensure-code-revision.sh + working-directory: platform/android + shell: bash + - name: Cache node modules uses: actions/cache@v2 env: diff --git a/.github/workflows/macos-release.yml b/.github/workflows/macos-release.yml index 86b8edb62..32e66a715 100644 --- a/.github/workflows/macos-release.yml +++ b/.github/workflows/macos-release.yml @@ -16,6 +16,7 @@ jobs: SYMBOLS: NO HOMEBREW_NO_AUTO_UPDATE: 1 HOMEBREW_NO_INSTALL_CLEANUP: 1 + CILAUNCH: true defaults: run: working-directory: platform/ios @@ -73,13 +74,11 @@ jobs: - name: Install packaging dependencies run: | ./platform/ios/scripts/install-packaging-dependencies.sh - env: - CILAUNCH: true - name: Build package run: make xpackage - + - name: Deploy package run: make xdeploy env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/platform/android/scripts/ensure-code-revision.sh b/platform/android/scripts/ensure-code-revision.sh new file mode 100755 index 000000000..2da0d55a4 --- /dev/null +++ b/platform/android/scripts/ensure-code-revision.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail +set -u + +function step { >&2 echo -e "\033[1m\033[36m* $@\033[0m"; } +function finish { >&2 echo -en "\033[0m"; } +trap finish EXIT + +VERSION_TAG=${VERSION_TAG:-''} +if [[ -z ${VERSION_TAG} ]]; then + step "Determining version number from most recent relevant git tag…" + VERSION_TAG=$( git describe --tags --match=android-v*.*.* --abbrev=0 ) + echo "Found tag: ${VERSION_TAG}" +fi + +if [[ $( echo ${VERSION_TAG} | grep --invert-match android-v ) ]]; then + echo "Error: ${VERSION_TAG} is not a valid android version tag" + echo "VERSION_TAG should be in format: android-vX.X.X-pre.X" + exit 1 +fi + +step "Checking out source code at ${VERSION_TAG}" +git checkout ${VERSION_TAG} \ No newline at end of file diff --git a/platform/ios/CMakeLists.txt b/platform/ios/CMakeLists.txt index a5ad73c54..75ab9f173 100644 --- a/platform/ios/CMakeLists.txt +++ b/platform/ios/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.9) +cmake_minimum_required(VERSION 3.19) message(source-dir=${CMAKE_SOURCE_DIR} current-dir=${CMAKE_CURRENT_SOURCE_DIR} current-binary-dir=${CMAKE_CURRENT_BINARY_DIR}) diff --git a/platform/ios/ios.cmake b/platform/ios/ios.cmake index d00b80267..f16b2ed90 100644 --- a/platform/ios/ios.cmake +++ b/platform/ios/ios.cmake @@ -4,6 +4,12 @@ if(NOT DEFINED IOS_DEPLOYMENT_TARGET) set(IOS_DEPLOYMENT_TARGET "9.0") endif() +# Override default CMake NATIVE_ARCH_ACTUAL +# https://gitlab.kitware.com/cmake/cmake/-/issues/20893 +# https://stackoverflow.com/a/22689917/5531400 +set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)") +set_target_properties(mbgl-core PROPERTIES XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH[variant=Debug] "YES") + macro(initialize_ios_target target) set_target_properties(${target} PROPERTIES XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "${IOS_DEPLOYMENT_TARGET}") set_target_properties(${target} PROPERTIES XCODE_ATTRIBUTE_ENABLE_BITCODE "YES") diff --git a/platform/ios/platform/ios/scripts/deploy-swift-package.sh b/platform/ios/platform/ios/scripts/deploy-swift-package.sh index f59b30faa..8c7c9058e 100755 --- a/platform/ios/platform/ios/scripts/deploy-swift-package.sh +++ b/platform/ios/platform/ios/scripts/deploy-swift-package.sh @@ -95,6 +95,8 @@ if github-release info --tag ${VERSION_TAG} | grep --quiet "draft: ✗"; then fi PUBLISH_VERSION=$( echo ${VERSION_TAG} | sed 's/^ios-v//' ) +git checkout ${VERSION_TAG} + npm install --ignore-scripts mkdir -p ${BINARY_DIRECTORY} diff --git a/platform/ios/platform/macos/macos.xcodeproj/project.pbxproj b/platform/ios/platform/macos/macos.xcodeproj/project.pbxproj index 05e15e11e..f1e82ba0c 100644 --- a/platform/ios/platform/macos/macos.xcodeproj/project.pbxproj +++ b/platform/ios/platform/macos/macos.xcodeproj/project.pbxproj @@ -2191,7 +2191,6 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 15256; DYLIB_INSTALL_NAME_BASE = "@rpath"; - "EXCLUDED_ARCHS[sdk=*]" = arm64; FRAMEWORK_VERSION = A; INFOPLIST_FILE = sdk/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; diff --git a/platform/ios/platform/macos/scripts/deploy-packages.sh b/platform/ios/platform/macos/scripts/deploy-packages.sh index 180543fdc..f68e20eb8 100755 --- a/platform/ios/platform/macos/scripts/deploy-packages.sh +++ b/platform/ios/platform/macos/scripts/deploy-packages.sh @@ -47,7 +47,7 @@ publish() { else file_name=mapbox-macos-sdk-${PUBLISH_VERSION}-${suffix}.zip fi - step "Compressing ${file_name}…" + step "Compressing ${file_name}-> ${PWD}../deploy/${file_name}" cd build/macos/pkg rm -f ../deploy/${file_name} zip -yr ../deploy/${file_name} * @@ -129,6 +129,14 @@ fi npm install --ignore-scripts mkdir -p ${BINARY_DIRECTORY} +step "Generating release notes…" +RELEASE_NOTES=$( ./platform/macos/scripts/release-notes.js github ) + +if [[ -z "${RELEASE_NOTES}" ]]; then + echo "Release notes cannot be empty." + exit 1 +fi + if [[ "${GITHUB_RELEASE}" == true ]]; then step "Create GitHub release…" if [[ $( echo ${PUBLISH_VERSION} | awk '/[0-9]-/' ) ]]; then @@ -137,6 +145,7 @@ if [[ "${GITHUB_RELEASE}" == true ]]; then github-release release \ --tag "macos-v${PUBLISH_VERSION}" \ --name "macos-v${PUBLISH_VERSION}" \ + --description "${RELEASE_NOTES}" \ --draft ${PUBLISH_PRE_FLAG} fi diff --git a/platform/ios/platform/macos/scripts/release-notes-github.md.ejs b/platform/ios/platform/macos/scripts/release-notes-github.md.ejs new file mode 100644 index 000000000..d0affd8d5 --- /dev/null +++ b/platform/ios/platform/macos/scripts/release-notes-github.md.ejs @@ -0,0 +1,2 @@ +<%-CHANGELOG-%> + diff --git a/platform/ios/platform/macos/scripts/release-notes-jazzy.md.ejs b/platform/ios/platform/macos/scripts/release-notes-jazzy.md.ejs new file mode 100644 index 000000000..fe81ab0c6 --- /dev/null +++ b/platform/ios/platform/macos/scripts/release-notes-jazzy.md.ejs @@ -0,0 +1,15 @@ +# [MapLibre Maps SDK for macos] + +The MapLibre Maps SDK for macos is an open-source framework for embedding interactive map views with scalable, customizable vector maps into Cocoa Touch applications on iOS 9.0 and above using Objective-C, Swift, or Interface Builder. It takes stylesheets that conform to the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/), applies them to vector tiles that conform to the [Mapbox Vector Tile Specification](https://www.mapbox.com/developers/vector-tiles/), and renders them using OpenGL. + +## Changes in version <%-CURRENTVERSION%> + +<%-CURRENTCHANGELOG%> + +## Recent changes + +<% OTHERRELEASES.forEach(function(release) { %> +### <%-release.version%> + +<%-release.changelog%> +<% }) -%> diff --git a/platform/ios/platform/macos/scripts/release-notes.js b/platform/ios/platform/macos/scripts/release-notes.js new file mode 100755 index 000000000..6e46863c0 --- /dev/null +++ b/platform/ios/platform/macos/scripts/release-notes.js @@ -0,0 +1,103 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const execSync = require('child_process').execSync; +const ejs = require('ejs'); +const _ = require('lodash'); +const semver = require('semver'); + +const changelogPath = 'platform/macos/CHANGELOG.md'; +const changelog = fs.readFileSync(changelogPath, 'utf8'); + +let outputMode = {}; +switch(process.argv[2]) { + case "jazzy": + outputMode.isJazzy = true; break; + case "github": + default: + outputMode.isGitHub = true; +} + +/* + Find current and immediately previous releases by parsing git tags. +*/ +let currentVersion = execSync('git describe --tags --match=macos-v*.*.* --abbrev=0') + .toString() + .trim() + .replace('macos-v', ''); + +let gitTags = execSync('git tag --list macos-v*.*.*') + .toString() + .split('\n') + .map(function (tag) { + tag = tag.replace('macos-v', '').trim(); + return semver.clean(tag); + }); +let previousVersion = semver.maxSatisfying(gitTags, "<" + currentVersion); + +/* + Parse the raw changelog text and split it into individual releases. + + This regular expression: + - Matches lines starting with "## x.x.x". + - Groups the version number. + - Skips the (optional) release date. + - Groups the changelog content. + - Ends when another "## x.x.x" is found. +*/ +const regex = /^## (\d+\.\d+\.\d+).*?\n(.+?)(?=\n^## \d+\.\d+\.\d+.*?\n)/gms; + +let releaseNotes = []; +while (match = regex.exec(changelog)) { + releaseNotes.push({ + 'version': match[1], + 'changelog': match[2].trim(), + }); +} + +/* + Match the current tag with the most appropriate release notes. +*/ +const versionsInReleaseNotes = _.map(releaseNotes, 'version'); +const bestReleaseNotesForCurrentVersion = semver.minSatisfying(versionsInReleaseNotes, ">=" + currentVersion); +const currentReleaseNotes = _.find(releaseNotes, { version: bestReleaseNotesForCurrentVersion }); + +if (!currentReleaseNotes) { + console.error('Could not find a release section satisfying %s in %s — did you forget to rename the "master" section to %s?', currentVersion, changelogPath, currentVersion.split("-")[0]); + process.exit(1); +} + +/* + Fill and print the release notes template. +*/ +let templatedReleaseNotes; + +if (outputMode.isGitHub) { + templatedReleaseNotes = ejs.render(fs.readFileSync('platform/macos/scripts/release-notes-github.md.ejs', 'utf8'), { + 'CURRENTVERSION': currentVersion, + 'PREVIOUSVERSION': previousVersion, + 'CHANGELOG': currentReleaseNotes.changelog, + 'isPrerelease': semver.prerelease(currentVersion) + }); +} + +if (outputMode.isJazzy) { + const minorReleaseSeries = semver.major(currentVersion) + "." + semver.minor(currentVersion) + ".0"; + const range = ">=" + minorReleaseSeries + " <" + currentVersion; + const otherReleasesInSeries = _.filter(releaseNotes, function(release) { + return semver.satisfies(release.version, range); + }); + + otherReleasesInSeries.forEach(function(release) { + // Bump section headings from h3 to h4. + release.changelog = release.changelog.replace(/^### /gm, '#### '); + }); + + templatedReleaseNotes = ejs.render(fs.readFileSync('platform/macos/scripts/release-notes-jazzy.md.ejs', 'utf8'), { + 'CURRENTVERSION': currentVersion, + 'CURRENTCHANGELOG': currentReleaseNotes.changelog, + 'OTHERRELEASES': otherReleasesInSeries + }); +} + +process.stdout.write(templatedReleaseNotes); diff --git a/platform/macos/macos.cmake b/platform/macos/macos.cmake index bb140d02c..03192d803 100644 --- a/platform/macos/macos.cmake +++ b/platform/macos/macos.cmake @@ -1,5 +1,11 @@ set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11") +# Override default CMake NATIVE_ARCH_ACTUAL +# https://gitlab.kitware.com/cmake/cmake/-/issues/20893 +# https://stackoverflow.com/a/22689917/5531400 +set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)") +set_target_properties(mbgl-core PROPERTIES XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH[variant=Debug] "YES") + set_target_properties(mbgl-core PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES) if(MBGL_WITH_OPENGL)