Detektera Mac Intel/ARM och Rosetta 2 emulator 💻

Hur kan vi detektera vilken processortyp vi kör programmet på och hur kan vi detektera ifall vi befinner oss i emulatorn Rosetta 2.

När jag letade efter en lösning på att köra docker-sync med macOS M1 då såg jag det här GitHub ärendet och började leta efter en lösning.
Hittade ett script som kan detektera processortyp och om vi är i emulatorn Rosetta 2 eller ej.

#!/bin/zsh

arch_name="$(uname -m)"

if [ "${arch_name}" = "x86_64" ]; then
    if [ "$(sysctl -in sysctl.proc_translated)" = "1" ]; then
        echo "Running on Rosetta 2"
    else
        echo "Running on native Intel"
    fi
elif [ "${arch_name}" = "arm64" ]; then
    echo "Running on ARM"
else
    echo "Unknown architecture: ${arch_name}"
fi

Jag gjorde en PHP-version av scriptet.

touch cpu
nano cpu - Häll in koden nedan
chmod +x cpu

Nu kan du köra kommandot cpu.
Har inte kunnat testa i Rosetta 2 men kollat att den returnerar en sträng med ”0” eller ”1”.
När jag körde i Docker Ubuntu fick jag $archName = ’aarch64’.

#!php
<?php

/**
 * Return the machine type and if we are in an emulator
 * @see https://linuxconfig.org/how-to-read-and-change-the-value-of-kernel-parameters-using-sysctl
 * @see https://www.php.net/manual/en/function.php-uname.php
 * @return string
 */
function machineType() {
    $osFamilyName = strtolower(PHP_OS_FAMILY);
    if ($osFamilyName === 'darwin') {
        $inEmulator = shell_exec("sysctl -in sysctl.proc_translated");
        if ($inEmulator === '1') {
            return 'Running on macOS Rosetta 2 emulator emulating Intel';
        }
    }

    $archName = trim(shell_exec('uname -m'));
    if ($archName === 'x86_64') {
        return 'Running on Intel';
    }
    if ($archName === 'arm64') {
        return "Running on ARM";
    }
    return "Unknown: $archName";
}

echo machineType();