diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 80a3d5a..3334320 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -19,7 +19,24 @@ jobs: arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" /usr/local/bin/brew install glib || true # this can error on linking - name: Build - run: xcodebuild archive -scheme vd_agent -archivePath vd_agent.xcarchive + run: | + xcodebuild archive \ + -scheme vd_agent \ + -destination 'generic/platform=macOS' \ + -archivePath vd_agent.xcarchive \ + ARCHS='arm64 x86_64' \ + ONLY_ACTIVE_ARCH=NO \ + ENABLE_USER_SCRIPT_SANDBOXING=NO + - name: Verify universal binaries + run: | + set -euo pipefail + for bin in spice-vdagent spice-vdagentd; do + path=$(find vd_agent.xcarchive/Products -type f -name "$bin" ! -path '*.dSYM*' | head -1) + info=$(lipo -info "$path") + echo "$info" + echo "$info" | grep -q x86_64 + echo "$info" | grep -q arm64 + done - name: Archive run: tar -acf vd_agent.xcarchive.tgz vd_agent.xcarchive - name: Upload diff --git a/README.md b/README.md index cd0592f..af1f901 100644 --- a/README.md +++ b/README.md @@ -60,10 +60,15 @@ architectures at the default location. $ /usr/local/bin/brew install glib # x86_64 >>> -Then, you can build the project with Xcode or `xcodebuild` +Then, you can build the project with Xcode or `xcodebuild`. Release archives +are **universal** (`arm64` + `x86_64`) so the same `.pkg` runs on Apple Silicon +and Intel guests (including QEMU/KVM). >>> - $ xcodebuild archive -scheme vd_agent -archivePath vd_agent.xcarchive + $ xcodebuild archive -scheme vd_agent -archivePath vd_agent.xcarchive \ + -destination 'generic/platform=macOS' \ + ARCHS='arm64 x86_64' ONLY_ACTIVE_ARCH=NO + $ lipo -info vd_agent.xcarchive/Products/usr/local/bin/spice-vdagent >>> Afterwards, you can sign the output and create an installer package with a paid diff --git a/vd_agent.xcodeproj/project.pbxproj b/vd_agent.xcodeproj/project.pbxproj index 1af5ddc..cd1e9cc 100644 --- a/vd_agent.xcodeproj/project.pbxproj +++ b/vd_agent.xcodeproj/project.pbxproj @@ -415,7 +415,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -e\n\nfor ((i=0; i<$SCRIPT_OUTPUT_FILE_COUNT; i++)); do\n output_var=\"SCRIPT_OUTPUT_FILE_$i\"\n output_path=\"${!output_var}\"\n output_dir=\"$(dirname \"$output_path\")\"\n name=\"$(basename \"$output_path\")\"\n intel_input=\"/usr/local/lib/$name\"\n arm64_input=\"/opt/homebrew/lib/$name\"\n tmp_output=\"/tmp/$name.$$\"\n \n echo \"Creating $output_path\"\n lipo -output \"$tmp_output\" -create \"$intel_input\" \"$arm64_input\"\n if [ ! -d \"$output_dir\" ]; then\n mkdir -p \"$output_dir\"\n fi\n mv \"$tmp_output\" \"$output_path\"\ndone\n"; + shellScript = "set -e\n\nfor ((i=0; i<$SCRIPT_OUTPUT_FILE_COUNT; i++)); do\n output_var=\"SCRIPT_OUTPUT_FILE_$i\"\n output_path=\"${!output_var}\"\n output_dir=\"$(dirname \"$output_path\")\"\n name=\"$(basename \"$output_path\")\"\n intel_input=\"/usr/local/lib/$name\"\n arm64_input=\"/opt/homebrew/lib/$name\"\n tmp_output=\"/tmp/$name.$$\"\n \n echo \"Creating $output_path\"\n if [ -f \"$intel_input\" ] && [ -f \"$arm64_input\" ]; then\n lipo -output \"$tmp_output\" -create \"$intel_input\" \"$arm64_input\"\n elif [ -f \"$intel_input\" ]; then\n cp \"$intel_input\" \"$tmp_output\"\n elif [ -f \"$arm64_input\" ]; then\n cp \"$arm64_input\" \"$tmp_output\"\n else\n echo \"missing $name in /usr/local/lib and /opt/homebrew/lib\" >&2\n exit 1\n fi\n if [ ! -d \"$output_dir\" ]; then\n mkdir -p \"$output_dir\"\n fi\n mv \"$tmp_output\" \"$output_path\"\ndone\n"; showEnvVarsInLog = 0; }; CE54BD972CEA914E00FE3930 /* Build universal GLib */ = { @@ -439,7 +439,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -e\n\nfor ((i=0; i<$SCRIPT_OUTPUT_FILE_COUNT; i++)); do\n output_var=\"SCRIPT_OUTPUT_FILE_$i\"\n output_path=\"${!output_var}\"\n output_dir=\"$(dirname \"$output_path\")\"\n name=\"$(basename \"$output_path\")\"\n intel_input=\"/usr/local/lib/$name\"\n arm64_input=\"/opt/homebrew/lib/$name\"\n tmp_output=\"/tmp/$name.$$\"\n \n echo \"Creating $output_path\"\n lipo -output \"$tmp_output\" -create \"$intel_input\" \"$arm64_input\"\n if [ ! -d \"$output_dir\" ]; then\n mkdir -p \"$output_dir\"\n fi\n mv \"$tmp_output\" \"$output_path\"\ndone\n"; + shellScript = "set -e\n\nfor ((i=0; i<$SCRIPT_OUTPUT_FILE_COUNT; i++)); do\n output_var=\"SCRIPT_OUTPUT_FILE_$i\"\n output_path=\"${!output_var}\"\n output_dir=\"$(dirname \"$output_path\")\"\n name=\"$(basename \"$output_path\")\"\n intel_input=\"/usr/local/lib/$name\"\n arm64_input=\"/opt/homebrew/lib/$name\"\n tmp_output=\"/tmp/$name.$$\"\n \n echo \"Creating $output_path\"\n if [ -f \"$intel_input\" ] && [ -f \"$arm64_input\" ]; then\n lipo -output \"$tmp_output\" -create \"$intel_input\" \"$arm64_input\"\n elif [ -f \"$intel_input\" ]; then\n cp \"$intel_input\" \"$tmp_output\"\n elif [ -f \"$arm64_input\" ]; then\n cp \"$arm64_input\" \"$tmp_output\"\n else\n echo \"missing $name in /usr/local/lib and /opt/homebrew/lib\" >&2\n exit 1\n fi\n if [ ! -d \"$output_dir\" ]; then\n mkdir -p \"$output_dir\"\n fi\n mv \"$tmp_output\" \"$output_path\"\ndone\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -599,7 +599,12 @@ ENABLE_HARDENED_RUNTIME = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + ARCHS = ( + arm64, + x86_64, + ); + ONLY_ACTIVE_ARCH = NO; GCC_C_LANGUAGE_STANDARD = gnu17; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES;