Depuis maintenant plus d'un an je travaille avec Ray Donnelly sur l'ajout dans l'outil crosstool-ng du support de Darwin(OSX) comme système cible.
Nous avons depuis maintenant un moment une solution fonctionnelle et somme en train de faire les demandes de patch pour que notre fork, ceci est plus une sandbox qu'un fork à proprement parlé, soit directement intégré dans la version officielle de crosstool-ng
De base, crosstool-ng est un outil permettant de générer des chaînes de cross-compilation depuis un GNU/Linux (voir OSX) pour du GNU/Linux (différentes architectures) ainsi que Windows 32.
Nous avons dans notre fork ajouté le support de Darwin(x86_64, x86, arm (ios)) comme système cible. Cela permet depuis un système GNU/Linux de compiler des projets destinés à tourner sur OSX sans en avoir un.
Pour ce faire, il faut bien sûr télécharger le SDK sur le site de la pomme et le rendre accessible à crosstool-ng.
Légal?
D'un point de vue légal, comme des personnes peuvent nous le faire remarquer, il est tout à fait possible d'utiliser le SDK de Apple sur un système GNU/Linux ou même Windows. En effet le SLA précise que cela doit être sur un "Apple-branded computer". Donc pour que vous soyez dans la légalité il faut que vous utilisiez crosstool-ng et la chaîne de compilation sur du matériel Apple et pas forcement sur son système d'exploitation.
De base on n'embarque pas le sysroot(mais on peut configurer ct-ng pour le faire) dans la chaîne de compilation générée. En effet si vous voulez distribuer ("légalement") votre chaîne de compilation il faut garder la configuration par défaut. Il faudra donc ajouter --sysroot/-isysroot à vos flags.
Avantages
- Vous n'avez pas à vous coltiner OSX pour compiler vos projets
- Une seule machine de compilation pour tout les binaires de vos projets
- Bien sûr, vous pouvez utiliser tout les frameworks de OSX
- Tout les avantages de la cross-compilation
Todo
- Le GCC de Apple utilise un wrapper de GCC (appelé driver) qui effectue des opérations supplémentaires, comme par exemple le fat binary qui permet d'embarquer dans un seul fichier éxecutable plusieurs architectures en utilisant par exemple "-m32 -m64" au moment de la compilation. Ceci n'est pas (encore) le cas avec le GCC compilé avec crosstool-ng
- Vous ne pourrez pas générer directement des applications pour iOS; du moins la partie packaging et signing (mais rien ne vous empeche de contribuer pour que cela soit possible)
- On ne supporte pas DSYM: ce sont les fichiers contenant les symboles de débogage utilisés par Apple. C'est l'une des seules briques logicielles que Apple n'a pas publiée les sources pour construire une chaîne de compilation complète. En faisant un peu de reverse et en regardant le fork de GDB par Apple qui lui lit ce format, il n'est pas impossible de refaire cette brique
- Oubliez les projets xcode
- Un peu de documentation sur l'extraction et la préparation du SDK d'Apple
Dommages colaterales
- Tout ce travail nous a permis d'ajouter le support de plusieurs compilateurs dans crosstool-ng pour que l'on puisse générer, par exemple, un CLANG en plus du GCC. (CLANG qui est maintenant le compilateur "officiel" de Apple)
- Windows 64 bits ainsi que le WDK (Windows Driver Kit)
- Ray travaille aussi sur l'ajout du support de Windows comme platforme de compilation. Donc de pouvoir lancer depuis Windows la compilation de projet pour OSX ou GNU/Linux. (Ray est la personne en charge des chaînes de cross compilation pour le projet Necesitas)
- Le but final est de pouvoir faire des chaînes de cross-compilation(voir même canadian) de Darwin,Windows,GNU/Linux -> Darwin,Windows,GNU/Linux
Qui l'utilise?
Il y a déjà quelques projets qui utilisent (veulent, ou devrait) notre projet pour créer les chaînes de cross-compilation afin de compiler leurs versions OSX:
- Tor
- Firefox
- Moi, je fais pas mal de test et je l'ai utilisé avec une version modifiée de oe-lite pour générer un projet complet (linphone) et toutes ses dépendances (openssl, ffmpeg, gtk, …) depuis ma Debian pour GNU/Linux, Windows, Darwin en 32 et 64 bits. Et bien sûr au final, ça marche!
N'hésitez pas à nous faire des retours, des pull requests, …
# bravo
Posté par Troy McClure (site web personnel) . Évalué à 5.
Wow impressionnant, je pensais pas que c'était possible de cross-compiler pour macos. Quelles versions de SDK sont supportées ? Est-ce que les archis ppc / ppc64 sont supportées ?
[^] # Re: bravo
Posté par diorcety . Évalué à 8.
Pour l'instant on travail principalement sur la version 10.6, mais normalement il y a aussi un exemple pour 10.7 qui fonctionne (il y a pas beaucoup de changement entre ces deux versions). Par contre on a pas encore travaillé sur les versions plus récentes.
Pour ce qu'il y en ai du support ppc/ppc64: c'est pas testé mais cela devrait marcher ou sinon avec très peu de modification.
[^] # Re: bravo
Posté par diorcety . Évalué à 10.
Je viens de pousser un commit pour permettre la compilation pour ppc (sur le 10.6, il n'y a pas de support de ppc64), ainsi qu'un exemple (powerpc-apple-darwin10)
$ ~/x-tools/powerpc-apple-darwin10/bin/powerpc-apple-darwin10-gcc -o helloworld helloworld.c
$ file helloworld
helloworld: Mach-O executable ppc
$ ~/x-tools/powerpc-apple-darwin10/bin/powerpc-apple-darwin10-g++ -o hellocpp hellocpp.cpp
$ file hellocpp
hellocpp: Mach-O executable ppc
$ ~/x-tools/powerpc-apple-darwin10/bin/powerpc-apple-darwin10-clang -o helloworld helloworld.c
$ file helloworld
helloworld: Mach-O executable ppc
$ ~/x-tools/powerpc-apple-darwin10/bin/powerpc-apple-darwin10-clang++ -o hellocpp hellocpp.cpp
$ file hellocpp
hellocpp: Mach-O executable ppc
Cela devrait fonctionner (je n'ai pas de mac ppc pour tester)
[^] # Re: bravo
Posté par BoboTiG (site web personnel) . Évalué à 0.
Félicitations, c'est du beau boulot ! Ne possédant pas de machines Apple, ça me servira grandement.
Je ne suis pas sûr d'avoir compris : Windows 64 bits est-il pris en compte ?
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.