ILLEGAL HARDWARE INSTRUCTION

Si tienes un Mac y te está saliendo este error, no te preocupes, te voy a explicar qué te está ocurriendo en este post.

Voy a sacar mi bola de cristal y voy a decirte que tienes un Mac con una versión de Mac OSX instalada que no es compatible con tu equipo. Esto te puede ocurrir desde la versión Mojave (10.14) hasta el último, a fecha de este post, Monterey (12.0). Lo que has hecho es parchear tu sistema operativo para que funcione en tu viejo ordenador. ¿A que he acertado de lleno?

Esto que te ha ocurrido, ¿tiene solución? Pues sí, sí que la tiene, siempre y cuando tengas los conocimientos adecuados y acceso al código fuente de tu software favorito. En caso contrario, estamos jodidos.

Laravel, PHP y Composer

Descubrí este error cuando trataba de instalar Laravel 8 en mi laptop de mediados del 2008. No hace años ni nada, pero se puede dar una segunda vida a estos equipos. Siempre se pueden dar segundas oportunidades, solo hay que quererlo. Guiño, guiño.

El error estaba ahí, pero no había saltado porque hice uso de la versión preinstalada de PHP que traía mi Catalina (10.15), concretamente, la versión 7.3. Opté por la modalidad de instalación del composer, ya que luego lo iba a necesitar para gestionar los paquetes que suelo utilizar.

Para instalar composer apliqué los pasos de mi otro post, «Instalar Composer en MacOSX«.

¿Qué ocurrió? que cuando fui a hacer un «composer update» me saltó el siguiente error:

Parse error: syntax error, unexpected T_STRING

Pues después de analizar el porqué de este error descubrí que el problema estaba en la versión de PHP 7.3. Este error surge por la versión, todo está perfecto, pero es un error que se ha solucionado en la versión 7.4 y posteriores.

Luego me encontré con la siguiente traba, ¿cómo instalo otra versión de PHP si ya tenía la 7.3? No hay manera de quitarla, parece el Internet Explorer en Windows.

Para esto hice uso de Homebrew, un potente gestor de paquetes para MacOS. La manera de instalarlo es, francamente, fácil.

# brew install php@7.4

Lo anterior instala la versión 7.4 de PHP. Si no pones nada instala la última. Para la fecha del post es la 8.1.1.

Ya estamos llegando al problema, tranquilidad.

Una vez se ha instalado, con brew, el php vemos que sigue operativa la versión que trae el sistema operativo y no esta nueva. Como yo tengo activo el zsh como línea de comandos, tengo que añadir a mi fichero .zshrc los siguientes comandos:

path += ('/usr/local/opt/php@7.4/bin')
export PATH

Con lo anterior, ya tendremos operativo el php 7.4 recien instalado con brew. Genial.

Ahora sí, si ejecutamos el composer, da igual el comando, composer a secas, nos devuelve el error que encabeza este post. El motivo es que el ejecutable que tenemos instalado contiene código incompatible con nuestra arquitectura. Veamos ahora la solución.

Solución

Por defecto, brew, se cree que tenemos una arquitectura compatible con el sistema operativo. Tenemos que hacerle ver al gestor que esto no es cierto. Que estamos dando una segunda oportunidad a nuestro hardware obsoleto. Para ello, debemos modificar el contenido del fichero hardware.rb. Esta es la ruta donde se encuentra: /usr/local/Homebrew/Library/Homebrew/extend/os/mac/hardware.rb

El contenido final del fichero debe ser el siguiente. Recomiendo hacer un backup del fichero original.

frozen_string_literal = true
module Hardware
    def self.oldest_cpu(version = MacOS.version)
        if version >= :mojave
           :core2
        else
           generic_oldest_cpu
        end
    end
end

Una vez modificado el fichero, solo nos queda decirle a brew que nos reinstale todo aquello que ya tengamos, en mi caso PHP, con este nuevo perfil hardware. Esto se puede extrapolar para Python, NPM, etc.

# brew reinstall -s php

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.