Développeur logiciel passant de Linux à OS X, quels sont les pièges?

50

J'ai utilisé Ubuntu / Fedora / Red Hat / Suse mais je n'ai pas utilisé OS X du tout. Si je dois commencer à utiliser OS X régulièrement, quelles sont les choses à surveiller?

Les outils que j'utilise sont la chaîne d'outils GNU, C ++ / Boost, etc.

grokus
la source
Allez-vous développer des applications Unix / Linux plus conventionnelles ou des applications Mac OSX?
David Thornley
1
Au moins au début, au moins avec les applications Unix / Linux plus classiques, j’utilise simplement le PC OS X comme poste de travail.
Grokus

Réponses:

52

J'ai fait le même mouvement il y a des années. Voici les choses que j'ai rencontrées:

  • Votre ordinateur de bureau moyen Linux a un environnement utilisateur plus riche que celui d’OS X.

    Vous allez probablement manquer d'outils différents des miens, il est donc inutile de préciser les recommandations de remplacement.

    Au lieu de cela, installez simplement Fink , MacPorts ou Homebrew en premier lieu. Ces systèmes fournissent un système de gestion de paquets typique de Linux ou des BSD. Chacune a sa propre saveur et son propre emballage. Le bon choix sera donc basé sur vos goûts et vos besoins.

    Vous constaterez peut-être qu’un système de paquet unique n’aura pas tous les programmes dont vous avez besoin. Certains programmes n’ayant pas encore été portés sur OS X, ils ne figureront donc dans aucun système de paquet. Néanmoins, ces systèmes étendent considérablement ce qui est livré avec OS X, et faciliteront votre transition de Linux.

  • Les compilateurs de ligne de commande OS X créent désormais des exécutables 64 bits par défaut.

    Dans Leopard et les versions antérieures, les compilateurs construisaient à la place des exécutables 32 bits. Cela peut poser des problèmes de plusieurs manières: vous avez peut-être d'anciennes bibliothèques 32 bits que vous ne pouvez pas reconstruire mais où vous devez établir une liaison, vous exécutez peut-être votre système en mode 32 bits, etc.

    Une façon de forcer une construction 32 bits consiste à remplacer les gccvaleurs par défaut dans les systèmes de construction gcc-4.0, à savoir l'ancien compilateur Leopard 32 bits par défaut. ( gccest un lien symbolique vers 64 bits par défaut gcc-4.2sous Snow Leopard.) Avec les systèmes de construction basés sur autoconf, cela fonctionne:

    $ ./configure CC=gcc-4.0 CXX=g++-4.0
    

    (Vous n'avez besoin du CXXbit que si le programme contient des composants C ++.)

    Un autre moyen est de passer -m32au compilateur et à l'éditeur de liens:

    $ ./configure CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32
    

    C'est plus typé, mais cela vous permet d'obtenir des versions 32 bits du nouveau GCC.

  • Le couplage dynamique est très différent.

    Si vous êtes du genre à écrire vos ldcommandes à la main, il est temps de rompre avec cette habitude. Vous devriez plutôt lier des programmes et des bibliothèques via le compilateur, ou utiliser un intermédiaire tel que libtool. Ceux-ci traitent les différences de schémas de liens spécifiques à la plate-forme, de sorte que vous puissiez économiser le cerveau pour des programmes d'apprentissage que vous ne pouvez pas résumer avec des mécanismes portables.

    Par exemple, vous devrez mettre à jour votre mémoire musculaire pour pouvoir taper à la otool -L someprogramplace des ldd someprogrambibliothèques someprogramliées.

    Une autre différence en termes de liaison dynamique qui tordra votre cerveau au début est que sous OS X, l’emplacement d’installation d’une bibliothèque est enregistré dans la bibliothèque elle - même , et l’éditeur de liens la copie dans l’exécutable au moment de la liaison. Cela signifie que si vous vous connectez à une bibliothèque installée /usr/local/libmais que vous souhaitez l'envoyer à vos utilisateurs dans le même répertoire que l'exécutable, vous devez indiquer quelque chose comme ceci dans le cadre de votre processus d'installation:

    $ cp /usr/local/lib/libfoo.dylib .
    $ install_name_tool -id @loader_path/libfoo.dylib libfoo.dylib
    $ make LDFLAGS=-L. relink
    

    Maintenant, une grande partie de ce qui précède est susceptible de varier en fonction de votre système de génération. Prenez-le donc comme exemple plutôt que comme une recette. Cela crée une copie privée d'une bibliothèque à laquelle nous sommes liés, change son identifiant de bibliothèque partagée d'un chemin absolu à un nom relatif "dans le même répertoire que l'exécutable", puis force la reconstruction de l'exécutable par rapport à cette copie modifiée. de la bibliothèque.

    install_name_toolest la commande de base ici. Si vous souhaitez plutôt installer la bibliothèque dans un ../librépertoire relatif à l'exécutable, l' -idargument doit être à la @loader_path/../lib/libfoo.dylibplace.

    Joe Di Pol a écrit un bon article à ce sujet , avec beaucoup plus de détails.

  • Le couplage dynamique + les packages tiers peuvent causer des maux de tête dès le début.

    Vous rencontrerez probablement des problèmes de liaison dynamique dès le début, dès que vous commencerez à essayer d’utiliser des bibliothèques de packages tiers qui n’installent pas les bibliothèques dans des emplacements standard. MacPorts fait cela, par exemple, en installant des bibliothèques dans /opt/local/lib, plutôt que /usr/libou /usr/local/lib. Lorsque vous rencontrez ce problème, une bonne solution au problème consiste à ajouter à votre ligne les lignes suivantes .bash_profile:

    # Tell the dynamic linker (dyld) where to find MacPorts package libs
    export DYLD_LIBRARY_PATH=/opt/local/lib:$DYLD_LIBRARY_PATH
    
    # Add MacPorts header file install dirs to your gcc and g++ include paths
    export C_INCLUDE_PATH=/opt/local/include:$C_INCLUDE_PATH
    export CPLUS_INCLUDE_PATH=/opt/local/include:$CPLUS_INCLUDE_PATH
    
  • OS X traite le problème de compatibilité du processeur différemment de Linux.

    Sur un Linux 64 bits où vous devez également prendre en charge 32 bits pour une raison quelconque, vous vous retrouvez avec deux copies d'éléments tels que des bibliothèques qui doivent être dans les deux formats, les versions 64 bits étant désactivées dans un lib64répertoire parallèle au répertoire. librépertoire traditionnel .

    OS X résout ce problème différemment, avec le concept de binaire universel, qui permet de placer plusieurs fichiers binaires dans un seul fichier. Vous pouvez actuellement utiliser des exécutables prenant en charge jusqu'à 4 types de processeurs: PowerPC 32 et 64 bits, plus Intel 32 et 64 bits.

    Il est facile de créer des fichiers binaires Universal avec Xcode, mais un peu pénible avec les outils de ligne de commande. Cela vous donne une construction Universal Intel uniquement avec des systèmes de construction basés sur Autoconf:

    $ ./configure --disable-dependency-tracking CFLAGS='-arch i386 -arch x86_64' \
      LDFLAGS='-arch i386 -arch x86_64'
    

    Ajoutez -arch ppc -arch ppc64à la CFLAGSet LDFLAGSsi vous avez besoin du support PowerPC.

    Si vous ne désactivez pas le suivi des dépendances, vous ne construisez que pour une plate-forme, car la présence de .ofichiers nouvellement générés pour la première plate-forme convainc make(1)qu'il n'est pas nécessaire de créer pour la deuxième plate-forme également. Tout doit être construit deux fois dans l'exemple ci-dessus; quatre fois pour un binaire entièrement universel, si vous avez toujours besoin de la prise en charge de PowerPC.

    (Plus d'informations dans la note technique TN2137 de Apple .)

  • Les outils de développement ne sont pas installés sur OS X par défaut.

    Avant Lion, les disques du système d'exploitation étaient l'endroit le plus fiable pour obtenir les bons outils de développement pour votre système. Ils sont une installation facultative.

    La bonne chose à propos de l'installation des outils de développement à partir des disques du système d'exploitation est que vous savez que ces outils fonctionneront avec le système d'exploitation. Apple étant Apple, vous devez disposer d’une version récente du système d’exploitation pour pouvoir utiliser les derniers compilateurs. Ils n’ont pas toujours téléchargé les anciens outils. Les disques du système d’exploitation constituent donc souvent le moyen le plus simple de trouver les bons outils pour dev ou test box.

    Avec Lion, ils essaient d’éliminer le support d’installation. À moins d’acheter la version coûteuse de la clé USB, vous devrez donc télécharger Xcode sur l’App Store .

    Je vous recommande de conserver au moins quelques versions de tout XGG DMG que vous téléchargez. Lorsque le successeur de Lion sort dans un an ou trois, vous risquez donc de ne pas avoir le moyen d'installer une version contemporaine de Xcode sur une machine virtuelle de test Lion. Planifiez à l'avance au cas où les problèmes de disponibilité et le manque de support du système d'exploitation rendaient les anciennes versions de Xcode autrement introuvables.

Warren Young
la source
2
+1: spécifiquement pour mentionner le lien dynamique. Je me suis fait avoir en pensant que ce serait très similaire. La joie de install_name et comment l’éditeur de liens dynamiques OSX dyld, résout les dépendances!
Troubadour
À propos de la conservation des anciennes versions de MacOS: J'utilise Parallel pour conserver des machines virtuelles séparées avec une version donnée d'OS X si je veux tester la compatibilité en amont. Je recommande ceci ou un outil similaire pour les tests d'applications.
ogerard
Pour les anciennes versions des outils de développement, consultez connect.apple.com . Je viens de vérifier, et le premier téléchargement répertorié dans la section Outils de développement est Xcode 1.0 du 27 octobre 2004 pour OS X 10.3+. Pas de ProjectBuilder, mais les projets SOP for Mac ne prennent en charge que les versions majeures actuelles et précédentes. 10.3+ est donc largement suffisant.
Jeremy W. Sherman
@ Jeremy: Mise à jour. Je ne veux pas assurer les gens qu'ils seront toujours téléchargeables, car ils ne l'ont pas toujours été.
Warren Young
29

ÉNORME GOTCHA - Le système de fichiers Mac OS n'est PAS sensible à la casse.

gabe.
la source
9
Soyons clairs: ils préservent la casse et ne sont pas sensibles à la casse par défaut. Ainsi, la casse de votre nom de fichier sera préservée, mais vous pouvez y accéder via n'importe quelle variante de casse. Cela peut être modifié pour tenir compte de la casse lors de la création du système de fichiers.
KeithB
9
@KeithB: Cependant, de nombreuses applications Mac classiques ne s'exécutent pas sur un système de fichiers sensible à la casse. Adobe CS refuse même l'installation et World of Warcraft ne s'exécute pas. Cela m'a brûlé et le seul moyen de récupérer consistait à sauvegarder et à restaurer mon système sur un disque reformaté.
Neil Mayhew
1
Ceci est principalement un piège lorsqu'il s'agit de contrôler la version et de travailler sur un projet dans une équipe multiplateforme.
Arafangion
J'ai créé un sparsebundle sensible à la casse pour résoudre ce problème. Heureusement, j'ai une partition inutilisée sur ce disque SSD.
dhchdhd
9

Bien que Fink et MacPorts soient le moyen traditionnel d’obtenir des packages Unix sur OS X, je vous conseillerais de vous procurer un outil plus récent, appelé brewqui fonctionne mieux pour moi, qui gêne moins mon système et qui est beaucoup plus simple à utiliser. En gros, il ne fait que télécharger les archives et les installer dans / usr / local, mais il automatise le processus dans son ensemble.

http://mxcl.github.com/homebrew/

Sablonneux
la source
1
D'accord; Homebrew a beaucoup mieux fonctionné pour moi que MacPorts.
Jonik
4

ÉNORME GOTCHA - Le système de fichiers Mac OS n'est PAS sensible à la casse.

Vous pouvez créer une image de disque sensible à la casse sur Mac OS X, qui peut être montée en tant que volume de disque dur normal.

# cf. http://codesnippets.joyent.com/posts/show/8617
IMAGE="${HOME}/Desktop/Case Sensitive Test.dmg"
VOLNAME="Case Sensitive Test"

hdiutil create "${IMAGE}" -size 10m -fs HFSX -volname "${VOLNAME}" -layout NONE

hdiutil attach "${IMAGE}"

cd "/Volumes/${VOLNAME}"
touch foo.txt Foo.txt
open .
ls -l [Ff]oo.txt
stat -f "inode: %i  --  name: %N" [Ff]oo.txt

cd ~
hdiutil detach "/Volumes/${VOLNAME}"
taco
la source
3

Lorsque vous portez une pile réseau de Solaris, BSD, Linux et Windows sur OSX, le seul point qui retient l'attention est celui de FreeBSD, la chaîne d'outils dans son ensemble est plutôt ancienne.

Apple accélère avec OSX Lion, mais Leopard, Snow Leopard sont assez en retard sur les distributions Linux modernes et de nombreuses normes ne sont pas prises en charge. Dans mon cas, l’absence de RFC 3678 (extensions d’interface de socket pour les filtres sources multidiffusion) me pose problème .

Sur le serveur OSX, j'ai installé un système de fichiers sensible à la casse, comme il est recommandé de le faire pour la diffusion HTTP.

  • Vieux GCC
  • Ancien Autoconf, Automake, libtool
  • Pas de spinlocks Pthread, OSX fournit des alternatives natives.
  • Pas beaucoup d’API NSS rentrantes.
  • /procSystème de fichiers pas trop utile .
  • Non /dev/rtc, /dev/hpetet RDTSCsemble être guimé. OSX fournit des alternatives natives.
  • Non epoll, mais vous avez pollet kqueue
Steve-o
la source
1

OS X prend en charge pthread_cond_timedwaitmais utilise un calendrier absolu et il n’est pas possible d’utiliser un temps qui augmente de façon monotone.

Andrewrk
la source