Le processus de construction d'un binaire pour une architecture différente de celle que vous exécutez est appelé compilation croisée .
Comme l'ont souligné les autres réponses, il s'agit d'un phénomène relativement courant, notamment dans l'histoire d'Apple qui est passé des processeurs 68K aux Power PC, puis à Intel, et maintenant à ARM.
Il faut savoir que toute personne qui crée une application pour iPhone ou iPad sur son Mac a effectué une compilation croisée, car ces applications utilisent déjà l'architecture ARM alors que leur Mac utilise actuellement l'architecture Intel. Il est même courant de créer des applications iOS multi-architecture, car les différentes versions de CPU utilisent en fait différentes variantes de l'architecture ARM (armv7, armv8...).
De même, il est courant de construire des variantes i386 (Intel 32 bits) et amd64/x64 (Intel 64 bits), soit indépendamment, soit en tant que binaires grossiers/universels.
Le processus de compilation croisée et de construction de binaires lourds/universels dépend beaucoup de l'environnement et de la chaîne d'outils que vous utilisez. Si vous utilisez Xcode, il s'agira de modifier les paramètres du projet et d'utiliser les outils suivants voilà ! c'est fait.
Si vous utilisez des outils de type Unix (principalement en ligne de commande), y compris make ou variants, gcc ou clang, etc., alors il peut être nécessaire de modifier plus ou moins votre processus de construction pour réaliser tout cela, avec un certain nombre d'options à modifier (architecture, mais aussi emplacement des fichiers d'en-tête et des bibliothèques), ainsi que l'ajout de l'étape qui combine les multiples binaires dépendant de l'architecture en un seul binaire lourd/universel.
Tout dépend donc de votre processus de construction actuel et des outils que vous utilisez. Mais c'est tout à fait possible.
Bien sûr, tout ceci est basé sur le fait que le code à compiler est réellement portable, c'est-à-dire qu'il ne fait pas d'hypothèses sur des choses (comme les tailles des entiers ou des pointeurs) et ne nécessite pas de code assembleur. C'était un gros problème dans le passé (surtout avec du code C pur), mais aujourd'hui, avec le nombre d'architectures pour lesquelles les logiciels sont construits, il est beaucoup moins fréquent de rencontrer des problèmes de ce type.