diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index ed8a8f87..03953723 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -14,6 +14,11 @@ env: SCL_AZURE_ARTIFACTS_API_KEY: ${{ secrets.SCL_AZURE_ARTIFACTS_API_KEY }} SCL_GITHUB_NUGET_FEED_USERNAME: ${{ secrets.SCL_GITHUB_NUGET_FEED_USERNAME }} + BINDINGS_IOS___SDK_VERSION: "17.5" + BINDINGS_IOS___XCODE_IDE_DEV_PATH: "/Applications/Xcode_15.4.app/Contents/Developer" + + BINDINGS_MACCATALYST___SDK_VERSION: "14.5" + BINDINGS_MACCATALYST___XCODE_IDE_DEV_PATH: "/Applications/Xcode_15.4.app/Contents/Developer" on: workflow_call: # so that other workflows can trigger this @@ -57,20 +62,26 @@ jobs: - name: '🏗 📦 Build, Pack & Announce New Release (if appropriate)' shell: 'bash' run: | - cd "${{env.BUILD_REPOSITORY_FOLDERPATH}}/Laerdal.Scripts" \ - && \ - dotnet \ - msbuild \ - "Laerdal.Builder.targets" \ - -m:1 \ - -p:Should_Skip_MacCatalyst="false" \ - \ - -p:PackageOutputPath="${{env.BUILD_REPOSITORY_FOLDERPATH}}/Artifacts" \ - -p:Laerdal_Gradle_Path="/opt/homebrew/opt/gradle@7/bin/gradle" \ - -p:Laerdal_Source_Branch="${{env.LAERDAL_SOURCE_BRANCH}}" \ - -p:Laerdal_Repository_Path="${{env.LAERDAL_REPOSITORY_PATH}}" \ - -p:Laerdal_Github_Access_Token="${{env.SCL_GITHUB_ACCESS_TOKEN}}" \ - -p:Laerdal_Test_Results_Folderpath="${{env.BUILD_REPOSITORY_FOLDERPATH}}/TestResults" + cd "${{env.BUILD_REPOSITORY_FOLDERPATH}}/Laerdal.Scripts" \ + && \ + dotnet \ + msbuild \ + "Laerdal.Builder.targets" \ + -m:1 \ + -p:Should_Skip_MacCatalyst="false" \ + \ + -p:PackageOutputPath="${{env.BUILD_REPOSITORY_FOLDERPATH}}/Artifacts" \ + -p:Laerdal_Gradle_Path="/opt/homebrew/opt/gradle@7/bin/gradle" \ + -p:Laerdal_Source_Branch="${{env.LAERDAL_SOURCE_BRANCH}}" \ + -p:Laerdal_Repository_Path="${{env.LAERDAL_REPOSITORY_PATH}}" \ + -p:Laerdal_Github_Access_Token="${{env.SCL_GITHUB_ACCESS_TOKEN}}" \ + -p:Laerdal_Test_Results_Folderpath="${{env.BUILD_REPOSITORY_FOLDERPATH}}/TestResults" \ + \ + -p:Laerdal_Bindings_iOS___Sdk_Version="${{env.BINDINGS_IOS___SDK_VERSION}}" \ + -p:Laerdal_Bindings_iOS___Xcode_Ide_Dev_Path="${{env.BINDINGS_IOS___XCODE_IDE_DEV_PATH}}" \ + \ + -p:Laerdal_Bindings_MacCatalyst___Sdk_Version="${{env.BINDINGS_MACCATALYST___SDK_VERSION}}" \ + -p:Laerdal_Bindings_MacCatalyst___Xcode_Ide_Dev_Path="${{env.BINDINGS_MACCATALYST___XCODE_IDE_DEV_PATH}}" - name: '📡 Publish Test Results' # https://github.com/marketplace/actions/publish-test-results uses: 'EnricoMi/publish-unit-test-result-action/macos@v2' diff --git a/Laerdal.McuMgr.Bindings.Android/Laerdal.McuMgr.Bindings.Android.csproj b/Laerdal.McuMgr.Bindings.Android/Laerdal.McuMgr.Bindings.Android.csproj index 6d183065..25e7e29c 100644 --- a/Laerdal.McuMgr.Bindings.Android/Laerdal.McuMgr.Bindings.Android.csproj +++ b/Laerdal.McuMgr.Bindings.Android/Laerdal.McuMgr.Bindings.Android.csproj @@ -55,10 +55,10 @@ true - 1.0.1071.0 - 1.0.1071.0 - 1.0.1071.0 - 1.0.1071.0 + 1.0.1150.0 + 1.0.1150.0 + 1.0.1150.0 + 1.0.1150.0 $(PackageId) $(Authors) diff --git a/Laerdal.McuMgr.Bindings.MacCatalyst/Laerdal.McuMgr.Bindings.MacCatalyst.csproj b/Laerdal.McuMgr.Bindings.MacCatalyst/Laerdal.McuMgr.Bindings.MacCatalyst.csproj index daeb7303..080faeff 100644 --- a/Laerdal.McuMgr.Bindings.MacCatalyst/Laerdal.McuMgr.Bindings.MacCatalyst.csproj +++ b/Laerdal.McuMgr.Bindings.MacCatalyst/Laerdal.McuMgr.Bindings.MacCatalyst.csproj @@ -33,6 +33,10 @@ $([System.IO.Path]::Combine($(MSBuildThisFileDirectory), 'Frameworks')) $(NativeFrameworkParentFolderpath)/McuMgrBindingsiOS.framework + + + + @@ -65,10 +69,10 @@ $(AllowedReferenceRelatedFileExtensions);.pdb - 1.0.1039.0 - 1.0.1039.0 - 1.0.1039.0 - 1.0.1039.0 + 1.0.1150.0 + 1.0.1150.0 + 1.0.1150.0 + 1.0.1150.0 $(PackageId) McuMgr Bindings for MacCatalyst - MAUI ready @@ -158,7 +162,16 @@ - + + + <_CliCommand>$(_CliCommand) SWIFT_OUTPUT_PATH='$(NativeFrameworkParentFolderpath)' + <_CliCommand>$(_CliCommand) XCODE_IDE_DEV_PATH='$(Laerdal_Bindings_MacCatalyst___Xcode_Ide_Dev_Path)' + <_CliCommand>$(_CliCommand) XCODEBUILD_TARGET_SDK='macosx' + <_CliCommand>$(_CliCommand) XCODEBUILD_TARGET_SDK_VERSION='$(Laerdal_Bindings_MacCatalyst___Sdk_Version)' + <_CliCommand>$(_CliCommand) ./Laerdal.Mac.CompileAndGenerateFatLibs.sh + + + diff --git a/Laerdal.McuMgr.Bindings.MacCatalystAndIos.Native/Laerdal.Mac.CompileAndGenerateFatLibs.sh b/Laerdal.McuMgr.Bindings.MacCatalystAndIos.Native/Laerdal.Mac.CompileAndGenerateFatLibs.sh index 2e7c9e2b..4bd77773 100755 --- a/Laerdal.McuMgr.Bindings.MacCatalystAndIos.Native/Laerdal.Mac.CompileAndGenerateFatLibs.sh +++ b/Laerdal.McuMgr.Bindings.MacCatalystAndIos.Native/Laerdal.Mac.CompileAndGenerateFatLibs.sh @@ -8,171 +8,190 @@ # # Note that all parameters passed to xcodebuild must be in the form of -parameter value instead of --parameter +declare XCODE_IDE_DEV_PATH="${XCODE_IDE_DEV_PATH:-}" + declare XCODEBUILD_TARGET_SDK="${XCODEBUILD_TARGET_SDK:-iphoneos}" declare XCODEBUILD_TARGET_SDK_VERSION="${XCODEBUILD_TARGET_SDK_VERSION}" # xcodebuild -showsdks -if [ "$XCODEBUILD_TARGET_SDK" == "iphoneos" ] && [ -z "$XCODEBUILD_TARGET_SDK_VERSION" ]; then # ios - XCODEBUILD_TARGET_SDK_VERSION="17.2" +if [ "${XCODEBUILD_TARGET_SDK}" == "iphoneos" ] && [ -z "${XCODEBUILD_TARGET_SDK_VERSION}" ]; then # ios + XCODEBUILD_TARGET_SDK_VERSION="17.5" # requires xcode 15.4 -elif [ "$XCODEBUILD_TARGET_SDK" == "macosx" ] && [ -z "$XCODEBUILD_TARGET_SDK_VERSION" ]; then # maccatalyst - XCODEBUILD_TARGET_SDK_VERSION="14.2" +elif [ "${XCODEBUILD_TARGET_SDK}" == "macosx" ] && [ -z "${XCODEBUILD_TARGET_SDK_VERSION}" ]; then # maccatalyst + XCODEBUILD_TARGET_SDK_VERSION="14.5" # requires xcode 15.4 fi declare SWIFT_BUILD_CONFIGURATION="${SWIFT_BUILD_CONFIGURATION:-Release}" declare SUPPORTS_MACCATALYST="${SUPPORTS_MACCATALYST:-NO}" -declare XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY="$XCODEBUILD_TARGET_SDK$XCODEBUILD_TARGET_SDK_VERSION" +declare XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY="${XCODEBUILD_TARGET_SDK}${XCODEBUILD_TARGET_SDK_VERSION}" declare SWIFT_OUTPUT_PATH="${SWIFT_OUTPUT_PATH:-./VendorFrameworks/swift-framework-proxy/}" declare SWIFT_PROJECT_NAME="McuMgrBindingsiOS" -declare SWIFT_BUILD_PATH="./$SWIFT_PROJECT_NAME/build" +declare SWIFT_BUILD_PATH="./${SWIFT_PROJECT_NAME}/build" declare SWIFT_BUILD_SCHEME="McuMgrBindingsiOS" -declare SWIFT_PROJECT_PATH="./$SWIFT_PROJECT_NAME/$SWIFT_PROJECT_NAME.xcodeproj" +declare SWIFT_PROJECT_PATH="./${SWIFT_PROJECT_NAME}/${SWIFT_PROJECT_NAME}.xcodeproj" declare SWIFT_PACKAGES_PATH="./packages" declare OUTPUT_FOLDER_POSTFIX="" -if [ "$XCODEBUILD_TARGET_SDK" == "macosx" ]; then - OUTPUT_FOLDER_POSTFIX="maccatalyst" # special case for mac catalyst +if [ "${XCODEBUILD_TARGET_SDK}" == "macosx" ]; then + OUTPUT_FOLDER_POSTFIX="" # special case for mac catalyst sdk 15.2 wanted this to be "-maccatalyst" but sdk 15.4 wants it to be empty go figure ... else - OUTPUT_FOLDER_POSTFIX="$XCODEBUILD_TARGET_SDK" + OUTPUT_FOLDER_POSTFIX="-${XCODEBUILD_TARGET_SDK}" fi -declare OUTPUT_FOLDER_NAME="$SWIFT_BUILD_CONFIGURATION-$OUTPUT_FOLDER_POSTFIX" # Release-iphoneos or Release-maccatalyst note that we intentionally *omitted* the sdk-version from the folder name -declare OUTPUT_SHARPIE_HEADER_FILES_PATH="SharpieOutput/SwiftFrameworkProxy.Binding" # contains the resulting files ApiDefinitions.cs and StructsAndEnums.cs +declare OUTPUT_FOLDER_NAME="${SWIFT_BUILD_CONFIGURATION}${OUTPUT_FOLDER_POSTFIX}" # Release-iphoneos or Release-maccatalyst note that we intentionally *omitted* the sdk-version +declare OUTPUT_SHARPIE_HEADER_FILES_PATH="SharpieOutput/SwiftFrameworkProxy.Binding" # from the folder name contains the resulting files ApiDefinitions.cs and StructsAndEnums.cs -function print_macos_sdks() { - echo "** xcode path : '$( "xcode-select" -p )'" - echo "** xcode version : '$( "xcodebuild" -version )'" +function print_setup() { + echo "** xcode path : '$( "xcode-select" --print-path )'" + echo "** xcode version : '$( "xcodebuild" -version )'" echo "** xcode sdks :" xcodebuild -showsdks echo "** xcode sdks visible to sharpie :" sharpie xcode -sdks echo - echo "** SWIFT_BUILD_PATH : '$SWIFT_BUILD_PATH' " - echo "** SWIFT_OUTPUT_PATH : '$SWIFT_OUTPUT_PATH' " - echo "** SWIFT_BUILD_SCHEME : '$SWIFT_BUILD_SCHEME' " - echo "** SWIFT_PROJECT_NAME : '$SWIFT_PROJECT_NAME' " - echo "** SWIFT_PROJECT_PATH : '$SWIFT_PROJECT_PATH' " - echo "** SWIFT_PACKAGES_PATH : '$SWIFT_PACKAGES_PATH' " - echo "** SWIFT_BUILD_CONFIGURATION : '$SWIFT_BUILD_CONFIGURATION' " + echo "** SWIFT_BUILD_PATH : '${SWIFT_BUILD_PATH}' " + echo "** SWIFT_OUTPUT_PATH : '${SWIFT_OUTPUT_PATH}' " + echo "** SWIFT_BUILD_SCHEME : '${SWIFT_BUILD_SCHEME}' " + echo "** SWIFT_PROJECT_NAME : '${SWIFT_PROJECT_NAME}' " + echo "** SWIFT_PROJECT_PATH : '${SWIFT_PROJECT_PATH}' " + echo "** SWIFT_PACKAGES_PATH : '${SWIFT_PACKAGES_PATH}' " + echo "** SWIFT_BUILD_CONFIGURATION : '${SWIFT_BUILD_CONFIGURATION}' " + echo + echo "** OUTPUT_FOLDER_NAME : '${OUTPUT_FOLDER_NAME}' " + echo "** OUTPUT_SHARPIE_HEADER_FILES_PATH : '${OUTPUT_SHARPIE_HEADER_FILES_PATH}' " + echo + echo "** SUPPORTS_MACCATALYST : '${SUPPORTS_MACCATALYST}' " echo - echo "** OUTPUT_FOLDER_NAME : '$OUTPUT_FOLDER_NAME' " - echo "** OUTPUT_SHARPIE_HEADER_FILES_PATH : '$OUTPUT_SHARPIE_HEADER_FILES_PATH' " + echo "** XCODE_IDE_DEV_PATH : '${XCODE_IDE_DEV_PATH:-(No path specified so the system-wide default xcode currently in effect will be used)}'" echo - echo "** SUPPORTS_MACCATALYST : '$SUPPORTS_MACCATALYST' " - echo "** XCODEBUILD_TARGET_SDK : '$XCODEBUILD_TARGET_SDK' " + echo "** XCODEBUILD_TARGET_SDK : '${XCODEBUILD_TARGET_SDK}' " echo "** XCODEBUILD_TARGET_SDK_VERSION : '${XCODEBUILD_TARGET_SDK_VERSION:-(No specific version specified so the latest version will be used)}'" - echo "** XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY : '$XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY' " + echo "** XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY : '${XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY}' " echo } +function set_system_wide_default_xcode_ide() { + declare -r currentXcodeDevPath=$( "xcode-select" --print-path ) + if [ "${XCODE_IDE_DEV_PATH}" != "" ] && [ "${currentXcodeDevPath}" != "${XCODE_IDE_DEV_PATH}" ]; then + echo "** Setting Xcode IDE path to '${XCODE_IDE_DEV_PATH}' - remember to manually revert it back to '${currentXcodeDevPath}' after the build is done!" + sudo xcode-select --switch "${XCODE_IDE_DEV_PATH}" + local exitCode=$? + + if [ ${exitCode} -ne 0 ]; then + echo "** [FAILED] Failed to set xcode-select to '${XCODE_IDE_DEV_PATH}'" + exit 1 + fi + fi +} + function build() { - echo "** Build $OUTPUT_FOLDER_NAME framework for device" + echo "** Building '${OUTPUT_FOLDER_NAME}' framework for device ..." echo "**** (Build 1/3) Cleanup any possible traces of previous builds" - rm -Rf "$SWIFT_BUILD_PATH" - rm -Rf "$SWIFT_PACKAGES_PATH" - rm -Rf "$OUTPUT_SHARPIE_HEADER_FILES_PATH" + rm -Rf "${SWIFT_BUILD_PATH}" + rm -Rf "${SWIFT_PACKAGES_PATH}" + rm -Rf "${OUTPUT_SHARPIE_HEADER_FILES_PATH}" - echo "**** (Build 2/3) Restore packages for '$XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY'" + echo "**** (Build 2/3) Restore packages for '${XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY}'" xcodebuild \ - -sdk "$XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY" \ + -sdk "${XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY}" \ -arch "arm64" \ - -scheme "$SWIFT_BUILD_SCHEME" \ - -project "$SWIFT_PROJECT_PATH" \ - -configuration "$SWIFT_BUILD_CONFIGURATION" \ - -clonedSourcePackagesDirPath "$SWIFT_PACKAGES_PATH" \ + -scheme "${SWIFT_BUILD_SCHEME}" \ + -project "${SWIFT_PROJECT_PATH}" \ + -configuration "${SWIFT_BUILD_CONFIGURATION}" \ + -clonedSourcePackagesDirPath "${SWIFT_PACKAGES_PATH}" \ -resolvePackageDependencies local exitCode=$? - if [ $exitCode -ne 0 ]; then - echo "** [FAILED] Failed to download dependencies for '$XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY'" + if [ ${exitCode} -ne 0 ]; then + echo "** [FAILED] Failed to download dependencies for '${XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY}'" exit 1 fi - echo "**** (Build 3/3) Build for '$XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY'" + echo "**** (Build 3/3) Build for '${XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY}'" # https://stackoverflow.com/a/74478244/863651 xcodebuild \ - -sdk "$XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY" \ + -sdk "${XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY}" \ -arch "arm64" \ - -scheme "$SWIFT_BUILD_SCHEME" \ - -project "$SWIFT_PROJECT_PATH" \ - -configuration "$SWIFT_BUILD_CONFIGURATION" \ - -derivedDataPath "$SWIFT_BUILD_PATH" \ - -clonedSourcePackagesDirPath "$SWIFT_PACKAGES_PATH" \ + -scheme "${SWIFT_BUILD_SCHEME}" \ + -project "${SWIFT_PROJECT_PATH}" \ + -configuration "${SWIFT_BUILD_CONFIGURATION}" \ + -derivedDataPath "${SWIFT_BUILD_PATH}" \ + -clonedSourcePackagesDirPath "${SWIFT_PACKAGES_PATH}" \ CODE_SIGN_IDENTITY="" \ CODE_SIGNING_ALLOWED="NO" \ - SUPPORTS_MACCATALYST="$SUPPORTS_MACCATALYST" \ + SUPPORTS_MACCATALYST="${SUPPORTS_MACCATALYST}" \ CODE_SIGNING_REQUIRED="NO" local exitCode=$? - if [ $exitCode -ne 0 ]; then - echo "** [FAILED] Failed to build '$XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY'" + if [ ${exitCode} -ne 0 ]; then + echo "** [FAILED] Failed to build '${XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY}'" exit 1 fi } function create_fat_binaries() { - echo "** Create fat binaries for '$XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY-$SWIFT_BUILD_CONFIGURATION'" + echo "** Create fat binaries for '${XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY}-${SWIFT_BUILD_CONFIGURATION}'" - echo "**** (FatBinaries 1/8) Copy '$XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY' build as a fat framework" + echo "**** (FatBinaries 1/8) Copy '${XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY}' build as a fat framework" cp \ -R \ - "$SWIFT_BUILD_PATH/Build/Products/$OUTPUT_FOLDER_NAME" \ - "$SWIFT_BUILD_PATH/fat" + "${SWIFT_BUILD_PATH}/Build/Products/${OUTPUT_FOLDER_NAME}" \ + "${SWIFT_BUILD_PATH}/fat" local exitCode=$? - if [ $exitCode -ne 0 ]; then + if [ ${exitCode} -ne 0 ]; then echo "** [FAILED] Failed to copy" exit 1 fi echo "**** LISTING 'PRODUCTS' FILES" - ls -lR "$SWIFT_BUILD_PATH/Build/Products/" + ls -lR "${SWIFT_BUILD_PATH}/Build/Products/" echo "**** LISTING LIPO INPUT FILES" - ls -lR "$SWIFT_BUILD_PATH/Build/Products/$OUTPUT_FOLDER_NAME/$SWIFT_PROJECT_NAME.framework/$SWIFT_PROJECT_NAME" + ls -lR "${SWIFT_BUILD_PATH}/Build/Products/${OUTPUT_FOLDER_NAME}/${SWIFT_PROJECT_NAME}.framework/${SWIFT_PROJECT_NAME}" - echo "**** (FatBinaries 2/8) Turn artifacts in '$OUTPUT_FOLDER_NAME' into fat libraries" + echo "**** (FatBinaries 2/8) Turn artifacts in '${OUTPUT_FOLDER_NAME}' into fat libraries" lipo \ -create \ - -output "$SWIFT_BUILD_PATH/fat/$SWIFT_PROJECT_NAME.framework/$SWIFT_PROJECT_NAME" \ - "$SWIFT_BUILD_PATH/Build/Products/$OUTPUT_FOLDER_NAME/$SWIFT_PROJECT_NAME.framework/$SWIFT_PROJECT_NAME" + -output "${SWIFT_BUILD_PATH}/fat/${SWIFT_PROJECT_NAME}.framework/${SWIFT_PROJECT_NAME}" \ + "${SWIFT_BUILD_PATH}/Build/Products/${OUTPUT_FOLDER_NAME}/${SWIFT_PROJECT_NAME}.framework/${SWIFT_PROJECT_NAME}" local exitCode=$? - if [ $exitCode -ne 0 ]; then + if [ ${exitCode} -ne 0 ]; then echo "** [FAILED] Failed to combine configurations" exit 1 fi echo "**** LISTING LIPO OUTPUT FILES" - ls -lR "$SWIFT_BUILD_PATH/fat/$SWIFT_PROJECT_NAME.framework/$SWIFT_PROJECT_NAME" + ls -lR "${SWIFT_BUILD_PATH}/fat/${SWIFT_PROJECT_NAME}.framework/${SWIFT_PROJECT_NAME}" echo "**** (FatBinaries 3/8) Verify results" lipo \ -info \ - "$SWIFT_BUILD_PATH/fat/$SWIFT_PROJECT_NAME.framework/$SWIFT_PROJECT_NAME" + "${SWIFT_BUILD_PATH}/fat/${SWIFT_PROJECT_NAME}.framework/${SWIFT_PROJECT_NAME}" local exitCode=$? - if [ $exitCode -ne 0 ]; then + if [ ${exitCode} -ne 0 ]; then echo "** [FAILED] Failed to verify results" exit 1 fi echo "**** (FatBinaries 4/8) Copy fat frameworks to the output folder" - rm -Rf "$SWIFT_OUTPUT_PATH" && - mkdir -p "$SWIFT_OUTPUT_PATH" && + rm -Rf "${SWIFT_OUTPUT_PATH}" && + mkdir -p "${SWIFT_OUTPUT_PATH}" && cp -Rf \ - "$SWIFT_BUILD_PATH/fat/$SWIFT_PROJECT_NAME.framework" \ - "$SWIFT_OUTPUT_PATH" + "${SWIFT_BUILD_PATH}/fat/${SWIFT_PROJECT_NAME}.framework" \ + "${SWIFT_OUTPUT_PATH}" local exitCode=$? - if [ $exitCode -ne 0 ]; then + if [ ${exitCode} -ne 0 ]; then echo "** [FAILED] Failed to copy fat frameworks" exit 1 fi @@ -181,16 +200,16 @@ function create_fat_binaries() { set -x sharpie \ bind \ - -sdk "$XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY" \ - -scope "$SWIFT_OUTPUT_PATH/$SWIFT_PROJECT_NAME.framework/Headers/" \ - -output "$OUTPUT_SHARPIE_HEADER_FILES_PATH" \ - -namespace "$SWIFT_PROJECT_NAME" \ - "$SWIFT_OUTPUT_PATH/$SWIFT_PROJECT_NAME.framework/Headers/$SWIFT_PROJECT_NAME-Swift.h" \ + -sdk "${XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY}" \ + -scope "${SWIFT_OUTPUT_PATH}/${SWIFT_PROJECT_NAME}.framework/Headers/" \ + -output "${OUTPUT_SHARPIE_HEADER_FILES_PATH}" \ + -namespace "${SWIFT_PROJECT_NAME}" \ + "${SWIFT_OUTPUT_PATH}/${SWIFT_PROJECT_NAME}.framework/Headers/${SWIFT_PROJECT_NAME}-Swift.h" \ -clang -arch arm64 # vital needed for mac-catalyst local exitCode=$? set +x - if [ $exitCode -ne 0 ]; then + if [ ${exitCode} -ne 0 ]; then echo "** [FAILED] Failed to generate binding api definitions and structs" exit 1 fi @@ -198,53 +217,53 @@ function create_fat_binaries() { echo "**** (FatBinaries 6/8) Print metadata files in their original form" echo - echo "$OUTPUT_SHARPIE_HEADER_FILES_PATH/ApiDefinitions.cs (original):" + echo "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/ApiDefinitions.cs (original):" echo "===================================================" - cat "$OUTPUT_SHARPIE_HEADER_FILES_PATH/ApiDefinitions.cs" + cat "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/ApiDefinitions.cs" echo echo "====================================================" echo echo - echo "$OUTPUT_SHARPIE_HEADER_FILES_PATH/StructsAndEnums.cs (original):" + echo "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/StructsAndEnums.cs (original):" echo "====================================================" - cat "$OUTPUT_SHARPIE_HEADER_FILES_PATH/StructsAndEnums.cs" + cat "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/StructsAndEnums.cs" echo echo "====================================================" echo echo "**** (FatBinaries 7/8) Replace NativeHandle -> IntPtr in the generated c# files" - rm -f "$OUTPUT_SHARPIE_HEADER_FILES_PATH"/*.bak || : + rm -f "${OUTPUT_SHARPIE_HEADER_FILES_PATH}"/*.bak || : # starting from net8 sharpie seems to generate a file that is missing the using CoreBluetooth; directive from the top of the file so we have to add it ourselves - sed -i.bak '1s/^/using CoreBluetooth;\n/' "$OUTPUT_SHARPIE_HEADER_FILES_PATH/ApiDefinitions.cs" + sed -i.bak '1s/^/using CoreBluetooth;\n/' "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/ApiDefinitions.cs" find \ - "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ -type f \ -exec sed -i.bak "s/NativeHandle[ ]/IntPtr /gi" {} \; - rm -f "$OUTPUT_SHARPIE_HEADER_FILES_PATH"/*.bak || : + rm -f "${OUTPUT_SHARPIE_HEADER_FILES_PATH}"/*.bak || : # also need to get rid of stupid autogenerated [verify(...)] attributes which are intentionally placed there # by sharpie to force manual verification of the .cs files that have been autogenerated # # https://learn.microsoft.com/en-us/xamarin/cross-platform/macios/binding/objective-sharpie/platform/verify find \ - "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ -type f \ -exec sed -i.bak 's/\[Verify\s*\(.*\)\]//gi' {} \; - rm -f "$OUTPUT_SHARPIE_HEADER_FILES_PATH"/*.bak || : + rm -f "${OUTPUT_SHARPIE_HEADER_FILES_PATH}"/*.bak || : # [BaseType (typeof(NSObject), Name = "...")] -> [BaseType (typeof(NSObject))] # find \ - # "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + # "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ # -type f \ # -exec sed -i.bak 's/\[BaseType\s*\(.*_TtC17McuMgrBindingsiOS17IOSDeviceResetter.*\)\]/[BaseType (typeof(NSObject), Name = "IOSDeviceResetter")]/gi' {} \; # - # rm -f "$OUTPUT_SHARPIE_HEADER_FILES_PATH"/*.bak || : + # rm -f "${OUTPUT_SHARPIE_HEADER_FILES_PATH}"/*.bak || : # https://learn.microsoft.com/en-us/xamarin/ios/internals/registrar?force_isolation=true#new-registrar-required-changes-to-bindings # @@ -253,81 +272,82 @@ function create_fat_binaries() { # so I'm not 100% sure why the [Protocol] attribute does away with the observed error but it does the trick of solving the problem somehow find \ - "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ -type f \ -exec sed -i.bak 's/interface IOSFileUploader/[Protocol] interface IOSFileUploader/gi' {} \; find \ - "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ -type f \ -exec sed -i.bak 's/interface IOSFileDownloader/[Protocol] interface IOSFileDownloader/gi' {} \; find \ - "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ -type f \ -exec sed -i.bak 's/interface IOSDeviceResetter/[Protocol] interface IOSDeviceResetter/gi' {} \; find \ - "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ -type f \ -exec sed -i.bak 's/interface IOSFirmwareEraser/[Protocol] interface IOSFirmwareEraser/gi' {} \; find \ - "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ -type f \ -exec sed -i.bak 's/interface IOSFirmwareInstaller/[Protocol] interface IOSFirmwareInstaller/gi' {} \; - rm -f "$OUTPUT_SHARPIE_HEADER_FILES_PATH"/*.bak || : + rm -f "${OUTPUT_SHARPIE_HEADER_FILES_PATH}"/*.bak || : # https://stackoverflow.com/a/49477937/863651 its vital to add [BaseType] to the interface otherwise compilation will fail find \ - "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ -type f \ -exec sed -i.bak 's/interface IOSListenerForFileUploader/[BaseType(typeof(NSObject))] [Model] interface IOSListenerForFileUploader/gi' {} \; find \ - "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ -type f \ -exec sed -i.bak 's/interface IOSListenerForFileDownloader/[BaseType(typeof(NSObject))] [Model] interface IOSListenerForFileDownloader/gi' {} \; find \ - "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ -type f \ -exec sed -i.bak 's/interface IOSListenerForDeviceResetter/[BaseType(typeof(NSObject))] [Model] interface IOSListenerForDeviceResetter/gi' {} \; find \ - "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ -type f \ -exec sed -i.bak 's/interface IOSListenerForFirmwareEraser/[BaseType(typeof(NSObject))] [Model] interface IOSListenerForFirmwareEraser/gi' {} \; find \ - "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ -type f \ -exec sed -i.bak 's/interface IOSListenerForFirmwareInstaller/[BaseType(typeof(NSObject))] [Model] interface IOSListenerForFirmwareInstaller/gi' {} \; # some plain methods unfortunately get autoprojected into properties by sharpie so we need to fix that find \ - "$OUTPUT_SHARPIE_HEADER_FILES_PATH/" \ + "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/" \ -type f \ -exec sed -i.bak 's/bool TryInvalidateCachedTransport { get; }/bool TryInvalidateCachedTransport();/gi' {} \; - rm -f "$OUTPUT_SHARPIE_HEADER_FILES_PATH"/*.bak || : + rm -f "${OUTPUT_SHARPIE_HEADER_FILES_PATH}"/*.bak || : echo "**** (FatBinaries 8/8) Print metadata files in their eventual form" echo - echo "$OUTPUT_SHARPIE_HEADER_FILES_PATH/ApiDefinitions.cs (eventual):" + echo "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/ApiDefinitions.cs (eventual):" echo "===================================================" - cat "$OUTPUT_SHARPIE_HEADER_FILES_PATH/ApiDefinitions.cs" + cat "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/ApiDefinitions.cs" echo echo "====================================================" echo echo - echo "$OUTPUT_SHARPIE_HEADER_FILES_PATH/StructsAndEnums.cs (eventual):" + echo "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/StructsAndEnums.cs (eventual):" echo "====================================================" - cat "$OUTPUT_SHARPIE_HEADER_FILES_PATH/StructsAndEnums.cs" + cat "${OUTPUT_SHARPIE_HEADER_FILES_PATH}/StructsAndEnums.cs" echo echo "====================================================" echo } function main() { - print_macos_sdks - build - create_fat_binaries + set_system_wide_default_xcode_ide # order + print_setup # order + build # order + create_fat_binaries # order echo "** Done!" } diff --git a/Laerdal.McuMgr.Bindings.NetStandard/Laerdal.McuMgr.Bindings.NetStandard.csproj b/Laerdal.McuMgr.Bindings.NetStandard/Laerdal.McuMgr.Bindings.NetStandard.csproj index d84b1442..bbcef837 100644 --- a/Laerdal.McuMgr.Bindings.NetStandard/Laerdal.McuMgr.Bindings.NetStandard.csproj +++ b/Laerdal.McuMgr.Bindings.NetStandard/Laerdal.McuMgr.Bindings.NetStandard.csproj @@ -37,10 +37,10 @@ $(AllowedReferenceRelatedFileExtensions);.pdb - 1.0.1039.0 - 1.0.1039.0 - 1.0.1039.0 - 1.0.1039.0 + 1.0.1150.0 + 1.0.1150.0 + 1.0.1150.0 + 1.0.1150.0 $(PackageId) McuMgr C# Implementation (WIP) diff --git a/Laerdal.McuMgr.Bindings.iOS/Laerdal.McuMgr.Bindings.iOS.csproj b/Laerdal.McuMgr.Bindings.iOS/Laerdal.McuMgr.Bindings.iOS.csproj index 73425131..0b4d34d9 100644 --- a/Laerdal.McuMgr.Bindings.iOS/Laerdal.McuMgr.Bindings.iOS.csproj +++ b/Laerdal.McuMgr.Bindings.iOS/Laerdal.McuMgr.Bindings.iOS.csproj @@ -34,6 +34,10 @@ $([System.IO.Path]::Combine($(MSBuildThisFileDirectory), 'Frameworks')) $(NativeFrameworkParentFolderpath)/McuMgrBindingsiOS.framework + + + + @@ -66,10 +70,10 @@ $(AllowedReferenceRelatedFileExtensions);.pdb - 1.0.1039.0 - 1.0.1039.0 - 1.0.1039.0 - 1.0.1039.0 + 1.0.1150.0 + 1.0.1150.0 + 1.0.1150.0 + 1.0.1150.0 $(PackageId) McuMgr Bindings for iOS - MAUI ready @@ -159,7 +163,16 @@ - + + + <_CliCommand>$(_CliCommand) SWIFT_OUTPUT_PATH='$(NativeFrameworkParentFolderpath)' + <_CliCommand>$(_CliCommand) XCODE_IDE_DEV_PATH='$(Laerdal_Bindings_iOS___Xcode_Ide_Dev_Path)' + <_CliCommand>$(_CliCommand) XCODEBUILD_TARGET_SDK='iphoneos' + <_CliCommand>$(_CliCommand) XCODEBUILD_TARGET_SDK_VERSION='$(Laerdal_Bindings_iOS___Sdk_Version)' + <_CliCommand>$(_CliCommand) ./Laerdal.Mac.CompileAndGenerateFatLibs.sh + + + diff --git a/Laerdal.McuMgr/Laerdal.McuMgr.csproj b/Laerdal.McuMgr/Laerdal.McuMgr.csproj index 3782687d..caecd107 100644 --- a/Laerdal.McuMgr/Laerdal.McuMgr.csproj +++ b/Laerdal.McuMgr/Laerdal.McuMgr.csproj @@ -55,10 +55,10 @@ $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb - 1.0.1039.0 - 1.0.1039.0 - 1.0.1039.0 - 1.0.1039.0 + 1.0.1150.0 + 1.0.1150.0 + 1.0.1150.0 + 1.0.1150.0 $(PackageId) $(Authors) @@ -149,21 +149,21 @@ - + - + - + - + diff --git a/Laerdal.Scripts/Laerdal.Builder.targets b/Laerdal.Scripts/Laerdal.Builder.targets index d30f82fa..60c88402 100644 --- a/Laerdal.Scripts/Laerdal.Builder.targets +++ b/Laerdal.Scripts/Laerdal.Builder.targets @@ -29,12 +29,13 @@ %0A + Release true $(BUILD_ARTIFACTSTAGINGDIRECTORY) $([System.IO.Path]::Combine($(MSBuildThisFileDirectory), `..`, `Artifacts/`)) - + $([System.IO.Path]::Combine($(MSBuildThisFileDirectory), `..`, `TestResults`)) @@ -42,7 +43,17 @@ true false - + + + + + + + + + + + gradle $(BUILD_SOURCEBRANCH) $(BUILD_REPOSITORY_NAME) @@ -58,11 +69,11 @@ - - + + - - + + @@ -78,9 +89,9 @@ main develop - <_Laerdal_Version_Script_Parameters>$(_Laerdal_Version_Script_Parameters) -o '$(Laerdal_Version_Details_Filepath)' - <_Laerdal_Version_Script_Parameters>$(_Laerdal_Version_Script_Parameters) --major '$(Laerdal_Version_Major)' - <_Laerdal_Version_Script_Parameters>$(_Laerdal_Version_Script_Parameters) --master-branch '$(Laerdal_Master_Branch_Name)' + <_Laerdal_Version_Script_Parameters>$(_Laerdal_Version_Script_Parameters) -o '$(Laerdal_Version_Details_Filepath)' + <_Laerdal_Version_Script_Parameters>$(_Laerdal_Version_Script_Parameters) --major '$(Laerdal_Version_Major)' + <_Laerdal_Version_Script_Parameters>$(_Laerdal_Version_Script_Parameters) --master-branch '$(Laerdal_Master_Branch_Name)' <_Laerdal_Version_Script_Parameters>$(_Laerdal_Version_Script_Parameters) --develop-branch '$(Laerdal_Develop_Branch_Name)' @@ -136,27 +147,27 @@ - <_replaceRegexInFile InputFile="$(ProjectFile)" Regex="<Version>.*?</Version>" ReplacementText="<Version>$(Version)</Version>" /> - <_replaceRegexInFile InputFile="$(ProjectFile)" Regex="<FileVersion>.*?</FileVersion>" ReplacementText="<FileVersion>$(Version)</FileVersion>" /> - <_replaceRegexInFile InputFile="$(ProjectFile)" Regex="<PackageVersion>.*?</PackageVersion>" ReplacementText="<PackageVersion>$(Version)</PackageVersion>" /> - <_replaceRegexInFile InputFile="$(ProjectFile)" Regex="<AssemblyVersion>.*?</AssemblyVersion>" ReplacementText="<AssemblyVersion>$(Version)</AssemblyVersion>" /> + <_replaceRegexInFile InputFile="$(ProjectFile)" Regex="<Version>.*?</Version>" ReplacementText="<Version>$(Version)</Version>"/> + <_replaceRegexInFile InputFile="$(ProjectFile)" Regex="<FileVersion>.*?</FileVersion>" ReplacementText="<FileVersion>$(Version)</FileVersion>"/> + <_replaceRegexInFile InputFile="$(ProjectFile)" Regex="<PackageVersion>.*?</PackageVersion>" ReplacementText="<PackageVersion>$(Version)</PackageVersion>"/> + <_replaceRegexInFile InputFile="$(ProjectFile)" Regex="<AssemblyVersion>.*?</AssemblyVersion>" ReplacementText="<AssemblyVersion>$(Version)</AssemblyVersion>"/> <_replaceRegexInFile InputFile="$(ProjectFile)" Regex="<PackageReference Include="Laerdal.McuMgr.Bindings.Android" Version=".*?"" - ReplacementText="<PackageReference Include="Laerdal.McuMgr.Bindings.Android" Version="$(Version)"" /> + ReplacementText="<PackageReference Include="Laerdal.McuMgr.Bindings.Android" Version="$(Version)""/> <_replaceRegexInFile InputFile="$(ProjectFile)" Regex="<PackageReference Include="Laerdal.McuMgr.Bindings.iOS" Version=".*?"" - ReplacementText="<PackageReference Include="Laerdal.McuMgr.Bindings.iOS" Version="$(Version)"" /> + ReplacementText="<PackageReference Include="Laerdal.McuMgr.Bindings.iOS" Version="$(Version)""/> <_replaceRegexInFile InputFile="$(ProjectFile)" Regex="<PackageReference Include="Laerdal.McuMgr.Bindings.MacCatalyst" Version=".*?"" - ReplacementText="<PackageReference Include="Laerdal.McuMgr.Bindings.MacCatalyst" Version="$(Version)"" /> + ReplacementText="<PackageReference Include="Laerdal.McuMgr.Bindings.MacCatalyst" Version="$(Version)""/> <_replaceRegexInFile InputFile="$(ProjectFile)" Regex="<PackageReference Include="Laerdal.McuMgr.Bindings.NetStandard" Version=".*?"" - ReplacementText="<PackageReference Include="Laerdal.McuMgr.Bindings.NetStandard" Version="$(Version)"" /> + ReplacementText="<PackageReference Include="Laerdal.McuMgr.Bindings.NetStandard" Version="$(Version)""/> - - - + + + @@ -193,6 +204,7 @@ <_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)GradlePath=$(Laerdal_Gradle_Path); <_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)Configuration=$(Configuration); <_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)PackageOutputPath=$(PackageOutputPath); + <_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)ContinuousIntegrationBuild=$(Is_CI_Build); <_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)Should_Skip_MacCatalyst=$(Should_Skip_MacCatalyst); @@ -209,14 +221,15 @@ - - - - - + + + + + + - + @@ -229,10 +242,10 @@ Properties="Configuration=$(Configuration);Should_Skip_MacCatalyst=$(Should_Skip_MacCatalyst);"/> - $(TestParameters) test 'Laerdal.McuMgr.Tests/Laerdal.McuMgr.Tests.csproj' - $(TestParameters) --logger 'trx;LogFileName=TEST-Laerdal.McuMgr.Tests.xml' - $(TestParameters) --verbosity '4' - $(TestParameters) --configuration '$(Configuration)' + $(TestParameters) test 'Laerdal.McuMgr.Tests/Laerdal.McuMgr.Tests.csproj' + $(TestParameters) --logger 'trx;LogFileName=TEST-Laerdal.McuMgr.Tests.xml' + $(TestParameters) --verbosity '4' + $(TestParameters) --configuration '$(Configuration)' $(TestParameters) --results-directory '$(Laerdal_Test_Results_Folderpath)' @@ -266,19 +279,19 @@ Condition=" '$(Laerdal_Should_Tag_And_Release)' == 'True' " AfterTargets="RunTests"> - - - - + + + + $([System.IO.Path]::Combine($(MSBuildThisFileDirectory), `Laerdal.CreateNewReleaseInGithub.sh`)) - <_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --log - <_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --git-branch '$(Laerdal_Source_Branch)' - <_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --tag-version '$(Laerdal_Version_Base)' - <_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --access-token '$(Laerdal_Github_Access_Token)' - <_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --repository-path '$(Laerdal_Repository_Path)' + <_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --log + <_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --git-branch '$(Laerdal_Source_Branch)' + <_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --tag-version '$(Laerdal_Version_Base)' + <_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --access-token '$(Laerdal_Github_Access_Token)' + <_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --repository-path '$(Laerdal_Repository_Path)' diff --git a/Laerdal.Scripts/Laerdal.SetupBuildEnvironment.sh b/Laerdal.Scripts/Laerdal.SetupBuildEnvironment.sh index bce73781..625f1c28 100644 --- a/Laerdal.Scripts/Laerdal.SetupBuildEnvironment.sh +++ b/Laerdal.Scripts/Laerdal.SetupBuildEnvironment.sh @@ -134,13 +134,13 @@ echo "** XCode Installations:" ls -ld /Applications/Xcode* || exit 90 -sudo xcode-select -s /Applications/Xcode_15.2.app/Contents/Developer -declare exitCode=$? -if [ $exitCode != 0 ]; then - echo "##vso[task.logissue type=error]Failed to apply 'xcode-select'." - exit 90 -fi -echo +#sudo xcode-select -s /Applications/Xcode.app/Contents/Developer +#declare exitCode=$? +#if [ $exitCode != 0 ]; then +# echo "##vso[task.logissue type=error]Failed to apply 'xcode-select'." +# exit 90 +#fi +#echo echo echo "** XCode SDKs:" diff --git a/README.md b/README.md index 86c3c215..4c46a07e 100644 --- a/README.md +++ b/README.md @@ -70,9 +70,9 @@ The following types of operations are supported on devices running on Nordic's n ## ✅ Nuget Platform-Support Matrix -| Stack | Android | iOS | MacCatalyst (MacOS / iPad / iOS) | Windows / UWP (NetStandard2.0) | -|-----------|---------------------------------------------------------------------------|-----------------------------------|-------------------------------------------------|----------------------------------------------------------------------------------| -| DotNet 8+ | ✅ Min 5.0 / Recommended 11.0+ / Max 14.0
(api-levels: 20 / 30 / 34) | ✅ 11.0+
(sdk: iphoneos16.2) | ✅ 13.1+
(MacOS: 10.15+, iOS/iPadOS: 13+ ) | 🚧 (Much much later ...) | +| Stack | Android | iOS | MacCatalyst (MacOS / iPad / iOS) | Windows / UWP (NetStandard2.0) | +|-----------|---------------------------------------------------------------------------|--------------------------------------------------------------------------|--------------------------------------------------|----------------------------------------------------------------------------------| +| DotNet 8+ | ✅ Min 5.0 / Recommended 11.0+ / Max 14.0
(api-levels: 20 / 30 / 34) | ✅ 17.0+ ( requires iPhoneXR or better )
( sdk: iphoneos-sdk 17.5 ) | ✅ 13.1+
( MacOS: 10.15+, iOS/iPadOS: 13+ ) | 🚧 (Much much later ...) | ## ❗️ Salient Points @@ -88,6 +88,9 @@ to the device.** - **At the time of this writing the generated ios-nugets are built based on the iphoneos16.2 sdk** - **For the time being Nordics' Android/Java libs are compiled in a way that emits Java1.8 bytecode so as to keep the libraries backwards compatible with versions of Android all the way back to 7. Our Java "glue-code" under 'Laerdal.McuMgr.Bindings.Android.Native' is compiled in the same fashion.** + +- **To compile the iOS/MacCatalyst libs on localdev with their default settings you will need MacOS with XCode version 15.4 and iPhoneOS SDK 17.5.** + The reason McuMgr libs only support iPhones that can run iOS17 or better is simply because as of April 2024 all iOS and iPadOS apps submitted to the App Store must be built with a minimum of Xcode 15.x and the iOS 17.x SDK! The iOS 17.x SDK only supports iPhones/iPads that can run version 17.x of their respective OSes or better. ## 🚀 Using the Nugets in your Projects @@ -96,7 +99,7 @@ Add the following Nuget packages. Laerdal.McuMgr Laerdal.McuMgr.Bindings.iOS (only add this to those projects of yours that target iOS) Laerdal.McuMgr.Bindings.Android (only add this to those projects of yours that target Android) - Laerdal.McuMgr.Bindings.MacCatalyst (WIP!) (only add this to those projects of yours that target MacCatalyst aka MacDesktop+iPad) + Laerdal.McuMgr.Bindings.MacCatalyst (only add this to those projects of yours that target MacCatalyst aka MacDesktop+iPad) Laerdal.McuMgr.Bindings.NetStandard (WIP!) (only add this to those projects of yours that target Windows/UWP) Make sure to always get the latest versions of the above packages. @@ -213,13 +216,13 @@ private void FirmwareInstaller_StateChanged(object sender, StateChangedEventArgs FirmwareInstallationStage = ea.NewState.ToString(); FirmwareInstallationOverallProgressPercentage = GetProgressMilestonePercentageForState(ea.NewState) ?? FirmwareInstallationOverallProgressPercentage; - //00 if a firmware installation fails then we retry up to 10 times for a total of 11 times each - // time we reattempt we start from scratch so the state will be reset back to being none again etc + //00 if a firmware installation fails then we retry up to 10 times each time we + // reattempt we start from scratch so the state will be reset back to being none again etc } private void FirmwareInstaller_FirmwareUploadProgressPercentageAndDataThroughputChanged(EventPattern eventPattern) { - var ea = eventPattern.EventArgs; + var ea = eventPattern.EventArgs; //00 FirmwareUploadAverageThroughputInKilobytes = ea.AverageThroughput; if (FirmwareInstallationOverallProgressPercentage < 50) //10 hack @@ -405,7 +408,7 @@ private void CleanupDeviceResetter() Note: The very first upload always feels slow and takes quite a bit of time to commence because Zephyr chipsets perform filesystem cleanup. There is nothing we can do about this. - The culprit lies in issues plaguging littlefs + The culprit lies in issues plaguing littlefs https://github.com/littlefs-project/littlefs/issues/797 https://github.com/littlefs-project/littlefs/issues/783 @@ -413,6 +416,7 @@ private void CleanupDeviceResetter() ```c# + private Dictionary _massFileUploadSelectedFileNamesAndTheirRawBytes; //set this appropriately private async Task PickLocalFilesToMassUploadButtonClickedAsync() { try @@ -449,10 +453,7 @@ private void CleanupDeviceResetter() } catch (Exception ex) { - App.DisplayAlert( - title: "Error", - message: $"Failed to pick local files!\r\n\r\n{ex}" - ); + App.DisplayAlert(title: "Error", message: $"Failed to pick local files!\r\n\r\n{ex}"); } //00 in ios using openreadasync is the only way to get the raw bytes out of the file if we use the standard readers of C# @@ -469,7 +470,7 @@ private void CleanupDeviceResetter() try { - _massFileUploader = new FileUploader.FileUploader(/*Android or iOS device*/); + _massFileUploader = new FileUploader.FileUploader(/*Android device*/); ToggleSubscriptionsOnMassFileUploaderEvents(subscribeNotUnsubscribe: true); @@ -673,19 +674,17 @@ To build the nugets from source follow these instructions: #### 1) Checkout ```bash -git clone git@github.com:Laerdal-Medical/scl-mcumgr.git mcumgr.mst +git clone git@github.com:Laerdal-Medical/Laerdal.McuMgr.git mcumgr.mst # or for develop -git clone git@github.com:Laerdal-Medical/scl-mcumgr.git --branch develop mcumgr.dev +git clone git@github.com:Laerdal-Medical/Laerdal.McuMgr.git --branch develop mcumgr.dev ``` #### 2) Make sure you have .Net7 and .Net-Framework 4.8+ installed on your machine along with the workloads for maui, android and ios ```bash # cd into the root folder of the repo -declare dotnet_7_workload_version="7.0.101" \ -&& \ sudo dotnet \ workload \ install \ @@ -697,14 +696,20 @@ sudo dotnet \ maui-tizen \ maui-android \ maui-maccatalyst \ - --from-rollback-file=https://maui.blob.core.windows.net/metadata/rollbacks/${dotnet_7_workload_version}.json && \ cd "Laerdal.McuMgr.Bindings.iOS" \ && \ sudo dotnet \ workload \ restore \ - --from-rollback-file=https://maui.blob.core.windows.net/metadata/rollbacks/${dotnet_7_workload_version}.json +&& \ +cd - \ +&& \ +cd "Laerdal.McuMgr.Bindings.MacCatalyst" \ +&& \ +sudo dotnet \ + workload \ + restore \ && \ cd - \ && \ @@ -713,17 +718,10 @@ cd "Laerdal.McuMgr.Bindings.Android" \ sudo dotnet \ workload \ restore \ - --from-rollback-file=https://maui.blob.core.windows.net/metadata/rollbacks/${dotnet_7_workload_version}.json +&& \ cd - -# note#1 theoretically 'dotnet workload restore' on the root level should also do the trick but in practice it sometimes runs into problems -# -# note#2 microsoft encourages us to always update to and use the latest workloads in practice devs have complained that they've -# run into headaches with this approach and would rather pin versions explicitly as shown above chances are you will have -# one or more workloads forcibly updated to greater versions and if that's indeed the case then it's nearly impossible for -# you to roll the workload versions back to the ones shown here most probably your build system will still work and you won't -# run into trouble if you do you will either have to (a) reinstall .net7 from scratch or (b) use docker as your build system -# to enforce strict workload-versioning on builds +# note theoretically 'dotnet workload restore' on the root level should also do the trick but in practice it sometimes runs into problems ``` After running the above command running 'dotnet workload list' should print out something like this on Windows: @@ -731,34 +729,31 @@ After running the above command running 'dotnet workload list' should print out ```bash > dotnet workload list -Installed Workload Id Manifest Version Installation Source --------------------------------------------------------------------------------- -android 33.0.95/7.0.100 SDK 7.0.400, VS 17.7.34202.233 -ios 16.4.7107/7.0.100 SDK 7.0.400, VS 17.7.34202.233 -maui 7.0.96/7.0.100 SDK 7.0.400 -maui-android 7.0.96/7.0.100 SDK 7.0.400, VS 17.7.34202.233 -maui-ios 7.0.96/7.0.100 SDK 7.0.400, VS 17.7.34202.233 -maui-maccatalyst 7.0.96/7.0.100 SDK 7.0.400, VS 17.7.34202.233 -maui-windows 7.0.96/7.0.100 SDK 7.0.400, VS 17.7.34202.233 -wasm-tools-net6 7.0.11/7.0.100 SDK 7.0.400 -maccatalyst 16.4.7107/7.0.100 VS 17.7.34202.233 +Installed Workload Id Manifest Version Installation Source +--------------------------------------------------------------------------------- +android 34.0.113/8.0.100 SDK 8.0.300, VS 17.10.35027.167 +aspire 8.0.2/8.0.100 SDK 8.0.300, VS 17.10.35027.167 +ios 17.2.8078/8.0.100 SDK 8.0.300, VS 17.10.35027.167 +maccatalyst 17.2.8078/8.0.100 SDK 8.0.300, VS 17.10.35027.167 +maui 8.0.61/8.0.100 SDK 8.0.300 +maui-android 8.0.61/8.0.100 SDK 8.0.300 +maui-ios 8.0.61/8.0.100 SDK 8.0.300 +maui-maccatalyst 8.0.61/8.0.100 SDK 8.0.300 +maui-tizen 8.0.61/8.0.100 SDK 8.0.300 +maui-windows 8.0.61/8.0.100 SDK 8.0.300, VS 17.10.35027.167 ``` #### 3) Make sure that Java17 is installed on your machine along with Gradle 7.6 (Gradle 8.x or above will NOT work!) #### 4) Make sure you have installed Android SDKs starting from 31 up. You will need to install them using the Visual Studio installer. If you use Rider you will need to install them a second time using the Rider Android SDK manager too! -#### 5) (optional) If you want to develop locally without pulling nugets from the feed make sure you add to your nuget sources the local filesystem-path to the folder 'Artifacts' - -Same goes for the testbed-ui app. If you want to build it locally you'll have to add to nuget sources the local file-system path 'Artifacts'. - -#### 6) Set MSBuild version to ver.17 +#### 5) Set MSBuild version to ver.17 -#### 7) On Mac make sure to install XCode 14.3+ (if you have multiple XCodes installed then make SDK 14.3+ the default by running 'sudo xcode-select -s /Applications/Xcode_XYZ.app/Contents/Developer'). +#### 6) On Mac make sure to install XCode 14.3+ (if you have multiple XCodes installed then make SDK 14.3+ the default by running 'sudo xcode-select --switch /Applications/Xcode_XYZ.app/Contents/Developer'). -#### 8) On Windows you have to also make sure you have enabled in the OS (registry) 'Long Path Support' otherwise the build will fail due to extremely long paths. +#### 7) On Windows you will probably have to also enable in the OS (registry) 'Long Path Support' otherwise the build will most probably fail due to extremely long paths being involved during the build process. -#### 9) Open 'Laerdal.McuMgr.sln' and build it. +#### 8) Open 'Laerdal.McuMgr.sln' and build it. You'll find the resulting nugets in the folder `Artifacts/`. @@ -774,14 +769,14 @@ You'll find the resulting nugets in the folder `Artifacts/`. # on macos *sh dotnet \ msbuild \ - Laerdal.Builder.targets \ + Laerdal.Builder.targets \ '"/m:1"' \ '"/p:Laerdal_Version_Full=1.0.x.0"' # on windows powershell & dotnet ^ msbuild ^ - Laerdal.Builder.targets ^ + Laerdal.Builder.targets ^ '"/m:1"' ^ '"/p:Laerdal_Version_Full=1.0.x.0"' @@ -817,6 +812,7 @@ the aspects being affected. - [Nordic nRF Connect Device Manager](https://github.com/NordicSemiconductor/Android-nRF-Connect-Device-Manager) - [Nordic Infocenter](https://infocenter.nordicsemi.com/index.jsp?topic=%2Fstruct_welcome%2Fstruct%2Fwelcome.html) +- [iPhone models and supported iOS versions](https://iosref.com/ios) ## Credits & Acknowledgements