Skip to content

Platform support

Russet runs on macOS, Linux, and Windows, but some recipe operations depend on tools that only one operating system provides. This page explains which operations work on each platform.

Every platform registers the same processors, so a recipe loads on any platform. When a processor needs a tool that the current platform doesn’t have, the processor fails with an error that names the limitation, such as Disk image operations are only supported on macOS and Linux. Russet doesn’t skip the step or substitute different behavior.

Recipes that only download software and read metadata usually run on every platform. Recipes that read disk images, verify macOS code signatures, or build packages run on macOS and Linux. Recipes that install software need macOS.

The following table shows how each kind of operation runs on each platform:

Operation macOS Linux and Windows
Downloads and web requests curl curl
Zip and tar archives ditto and tar On Linux, a built-in replacement for ditto that keeps file modes, symbolic links, and extended attributes. On both, a built-in extractor for tar archives that use gzip, bzip2, or xz compression. Zip archives extracted on Windows lose file modes and symbolic links.
Disk images hdiutil Linux: a built-in reader for read-only .dmg images in the UDZO, UDBZ, ULFO, ULMO, UDCO, and UDRO formats with HFS+ or APFS volumes. Creating images, encrypted images, and ISO images aren’t supported. Windows: not supported
Building and installing packages Helper services, pkgbuild, and installer Linux: a built-in package builder that doesn’t need root. Installing packages isn’t supported. Windows: not supported
Expanding and flattening packages pkgutil, xar, and ditto Linux: built-in replacements that expand and flatten flat packages and unpack gzip and pbzx payloads. Windows: not supported
macOS code signatures codesign and pkgutil Linux: built-in replacements that check app and installer package signatures against Apple’s root certificates. They don’t check notarization or revocation. Windows: not supported
Authenticode signatures Not supported Windows: SignToolVerifier with signtool.exe
Chocolatey packages Not supported Windows: ChocolateyPackager with choco.exe
StopProcessingIf predicates Foundation predicates A documented subset of predicate syntax
Munki metadata for packages and disk images Supported Linux: supported, except installer choices. Windows: not supported
Munki catalogs and pkginfo edits Supported Supported
Preferences com.github.russet domain config.plist or config.json file in the Russet folder

Linux can’t mount Apple disk images, so Russet reads the image itself and copies each volume’s contents into a scratch folder, where processors see the same files, permissions, symbolic links, hard links, and extended attributes that macOS shows for the mounted image. Transparently compressed files are decompressed. The copy is removed when the recipe finishes, and a recipe that opens the same image in several steps reads it once.

The scratch folder needs free space about the size of the image’s contents. By default it’s in the system temporary folder; set RUSSET_SCRATCH_DIR to use another location. Because Linux can’t hard-link folders, folder hard links become copies.

DmgCreator builds disk images on Linux too, but always with an HFS+ volume. APFS is DmgCreator’s default file system, and Russet has no APFS writer that macOS accepts, so an APFS request logs a warning and writes HFS+ instead. macOS opens these images the same way, and Munki only copies items out of them. Extended attributes in the source folder aren’t copied into the image.

StopProcessingIf evaluates a predicate to decide whether to stop a recipe. On macOS, Russet uses the same Foundation predicate engine as Python AutoPkg. On Linux and Windows, Russet evaluates a bounded subset of the predicate syntax and rejects predicates outside that subset instead of guessing.

Russet generates Munki metadata natively. On Linux, it reads packages and disk images with its built-in readers, including RestartAction, which it derives from the package’s PackageInfo or Distribution the way installer does. The installerChoices option needs macOS, because Distribution files can choose packages with JavaScript. Icon extraction works on Linux. Windows can’t import packages or disk images. Processors that only edit metadata, such as MunkiPkginfoMerger, and the MakeCatalogsProcessor catalog builder work on every platform.

On Linux and Windows, the _metadata dictionary in a generated pkginfo records the platform name instead of a macOS version.