feat: Build and publish macOS Universal Binary (Intel + Apple Silicon) release archive #27

Closed
opened 2026-08-31 23:54:12 +01:00 by gronod · 2 comments
Owner

Overview & Objective

Add a build and packaging step to the release pipeline to produce and publish a macOS Universal Binary archive (_macOS_universal_bin.tgz) containing dual-architecture (x86_64 Intel + arm64 Apple Silicon) fat Mach-O binaries for all ArgyllCMS utilities.


Motivation & Context

Downstream applications such as ICCery (ICCery#164) require a universal build of ArgyllCMS to bundle into native macOS Universal (universal-apple-darwin) packages. Rather than requiring downstream packaging to fetch and stitch single-architecture archives manually, the gronod/argyllcms build pipeline should publish a first-class universal archive.


Implementation Details

  1. Compilation / Aggregation:
    • Build ArgyllCMS for both x86_64 (using macos-15-intel runner or cross-compilation) and arm64 (using macos-15 runner).
    • For every binary in bin/ (instlist, targen, printtarg, chartread, average, colprof, profcheck, iccgamut, cctiff, dispcal, dispread, illumread, spec2cie, synthacc, etc.), create a universal binary using lipo:
      lipo -create \
        "bin/x86_64/${bin_name}" \
        "bin/arm64/${bin_name}" \
        -output "bin/universal/${bin_name}"
      chmod +x "bin/universal/${bin_name}"
      
  2. Packaging:
    • Create release tarball following the existing naming structure:
      Argyll_V<version>_macOS_universal_bin.tgz
    • Ensure bin/, License.txt, and standard documentation are included within the Argyll_V<version>/ root folder structure inside the archive.
  3. CI / Release Workflow:
    • Add a step in the release workflow (running on macos-15) to assemble and upload _macOS_universal_bin.tgz alongside _macOS_x86_64_bin.tgz and _macOS_arm64_bin.tgz.

Verification & Acceptance Criteria

  • Running file bin/<binary> on all generated binaries in the universal archive confirms:
    Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64:Mach-O 64-bit executable arm64]
  • Binaries execute natively on both Apple Silicon (native arm64) and Intel (native x86_64) macOS environments.
  • Release asset Argyll_V<tag>_macOS_universal_bin.tgz is published to repository releases.
### Overview & Objective Add a build and packaging step to the release pipeline to produce and publish a **macOS Universal Binary** archive (`_macOS_universal_bin.tgz`) containing dual-architecture (`x86_64` Intel + `arm64` Apple Silicon) fat Mach-O binaries for all ArgyllCMS utilities. --- ### Motivation & Context Downstream applications such as **ICCery** ([ICCery#164](https://git.i3omb.com/gronod/ICCery/issues/164)) require a universal build of ArgyllCMS to bundle into native macOS Universal (`universal-apple-darwin`) packages. Rather than requiring downstream packaging to fetch and stitch single-architecture archives manually, the `gronod/argyllcms` build pipeline should publish a first-class universal archive. --- ### Implementation Details 1. **Compilation / Aggregation**: - Build ArgyllCMS for both `x86_64` (using `macos-15-intel` runner or cross-compilation) and `arm64` (using `macos-15` runner). - For every binary in `bin/` (`instlist`, `targen`, `printtarg`, `chartread`, `average`, `colprof`, `profcheck`, `iccgamut`, `cctiff`, `dispcal`, `dispread`, `illumread`, `spec2cie`, `synthacc`, etc.), create a universal binary using `lipo`: ```bash lipo -create \ "bin/x86_64/${bin_name}" \ "bin/arm64/${bin_name}" \ -output "bin/universal/${bin_name}" chmod +x "bin/universal/${bin_name}" ``` 2. **Packaging**: - Create release tarball following the existing naming structure: `Argyll_V<version>_macOS_universal_bin.tgz` - Ensure `bin/`, `License.txt`, and standard documentation are included within the `Argyll_V<version>/` root folder structure inside the archive. 3. **CI / Release Workflow**: - Add a step in the release workflow (running on `macos-15`) to assemble and upload `_macOS_universal_bin.tgz` alongside `_macOS_x86_64_bin.tgz` and `_macOS_arm64_bin.tgz`. --- ### Verification & Acceptance Criteria - Running `file bin/<binary>` on all generated binaries in the universal archive confirms: `Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64:Mach-O 64-bit executable arm64]` - Binaries execute natively on both Apple Silicon (native arm64) and Intel (native x86_64) macOS environments. - Release asset `Argyll_V<tag>_macOS_universal_bin.tgz` is published to repository releases.
gronod added the Kind/FeatureKind/Enhancement
Priority
Medium
3
labels 2026-08-31 23:54:12 +01:00
Author
Owner

Referenced by downstream tracking issue gronod/ICCery#164 (feat: Add macOS Universal Binary build target).

The ICCery universal packaging pipeline will vendor Argyll_V<version>_macOS_universal_bin.tgz once published.

Referenced by downstream tracking issue **[gronod/ICCery#164](https://git.i3omb.com/gronod/ICCery/issues/164)** (*feat: Add macOS Universal Binary build target*). The ICCery universal packaging pipeline will vendor `Argyll_V<version>_macOS_universal_bin.tgz` once published.
Author
Owner

Resolved in PR #28 and released in v3.5.0-ICCery.1.3. Universal macOS binaries (Argyll_*_macOS_universal_bin.tgz) are now built and published as part of the release workflow.

Resolved in [PR #28](https://git.i3omb.com/gronod/argyllcms/pulls/28) and released in **[v3.5.0-ICCery.1.3](https://git.i3omb.com/gronod/argyllcms/releases/tag/v3.5.0-ICCery.1.3)**. Universal macOS binaries (`Argyll_*_macOS_universal_bin.tgz`) are now built and published as part of the release workflow.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gronod/argyllcms#27