Sviluppatore di software che passa da Linux a OS X, quali sono i trucchi?


50

Ho usato Ubuntu / Fedora / Red Hat / Suse ma non ho mai usato OS X. Se devo iniziare a utilizzare OS X regolarmente, quali sono le cose che dovrei cercare?

Gli strumenti che utilizzo sono la catena di strumenti GNU, C ++ / Boost, ecc.


Svilupperai app Unix / Linux più convenzionali o app Mac OSX?
David Thornley,

1
Almeno nelle prime app Unix / Linux più convenzionali, utilizzo semplicemente il PC OS X come workstation.
grokus,

Risposte:


52

Ho fatto la stessa mossa anni fa. Ecco le cose che ho incontrato:

  • Il tuo desktop Linux medio ha un'area utente più ricca di quella di OS X.

    Probabilmente ti mancheranno strumenti diversi rispetto a me, quindi non ha senso ottenere specifici consigli per le sostituzioni.

    Invece, installa Fink , MacPorts o Homebrew per prima cosa. Questi sistemi forniscono un sistema di gestione dei pacchetti tipico di Linux o dei BSD. Ognuno ha il suo sapore e il suo set di pacchetti, quindi la scelta giusta si baserà sui tuoi gusti e bisogni.

    Potresti scoprire che nessun sistema di pacchetti avrà tutti i programmi di cui hai bisogno. Alcuni programmi devono ancora essere trasferiti su OS X, quindi non verranno visualizzati in nessun sistema di pacchetti. Tuttavia, questi sistemi estendono notevolmente ciò che viene fornito con OS X e faciliteranno la transizione da Linux.

  • I compilatori della riga di comando di OS X ora creano eseguibili a 64 bit per impostazione predefinita.

    In Leopard e versioni precedenti, i compilatori hanno invece creato eseguibili a 32 bit per impostazione predefinita. Ciò può causare problemi in diversi modi: forse hai vecchie librerie a 32 bit che non puoi ricostruire ma a cui devi collegarti, forse stai ancora eseguendo il tuo sistema in modalità 32 bit, ecc.

    Un modo per forzare una build a 32 bit è quello di sostituire le gccimpostazioni predefinite nei sistemi di build gcc-4.0, ovvero il vecchio compilatore Leopard a 32 bit per impostazione predefinita. ( gccè un collegamento simbolico ai 64 bit di default gcc-4.2su Snow Leopard.) Con i sistemi di build basati su autoconf, funziona:

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

    (È necessario il CXXbit solo se il programma contiene componenti C ++.)

    Un altro modo è passare -m32al compilatore e al linker:

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

    È più digitazione, ma ti consente di ottenere build a 32 bit dal più recente GCC.

  • Il collegamento dinamico è molto diverso.

    Se sei il tipo di scrivere i tuoi ldcomandi a mano, è tempo di rompere quell'abitudine. Dovresti invece collegare programmi e librerie tramite il compilatore o utilizzare un intermediario come libtool. Questi si occupano delle differenze dello schema di collegamento specifiche della piattaforma, quindi puoi risparmiare il potere del cervello per i programmi di apprendimento che non puoi sottrarre ai meccanismi portatili.

    Ad esempio, dovrai aggiornare la memoria muscolare in modo da digitare otool -L someprograminvece di ldd someprogramcapire a cosa someprogramsono collegate le librerie .

    Un'altra differenza nel collegamento dinamico che inizialmente ti tormenterà il cervello è che su OS X, il percorso di installazione di una libreria è registrato nella libreria stessa e il linker lo copia nell'eseguibile al momento del collegamento. Ciò significa che se si collega a una libreria che è stata installata /usr/local/libma si desidera spedirla ai propri utenti nella stessa directory dell'eseguibile, è necessario dire qualcosa del genere come parte del processo di installazione:

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

    Ora, molto di quanto sopra probabilmente varierà per il tuo sistema di compilazione, quindi prendilo come esempio, piuttosto che come ricetta. Ciò che fa è creare una copia privata di una libreria a cui ci colleghiamo, cambia l'identificatore della libreria condivisa da un percorso assoluto in uno relativo che significa "nella stessa directory dell'eseguibile", quindi forza una ricostruzione dell'eseguibile rispetto a questa copia modificata della biblioteca.

    install_name_toolè il comando principale qui. Se invece si desidera installare la libreria in una ../libdirectory relativa all'eseguibile, l' -idargomento dovrebbe essere @loader_path/../lib/libfoo.dylibinvece.

    Joe Di Pol ha scritto un buon articolo su questo , con molti più dettagli.

  • Collegamento dinamico + pacchetti di terze parti possono causare mal di testa all'inizio.

    È probabile che si verifichino problemi di collegamento dinamico all'inizio, non appena si inizia a provare a utilizzare librerie da pacchetti di terze parti che non installano le librerie in percorsi standard. MacPorts fa questo, ad esempio, l'installazione di librerie in /opt/local/lib, invece di /usr/libo /usr/local/lib. Quando ti imbatti in questo, una buona soluzione per il problema è quella di aggiungere linee come la seguente al tuo .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 gestisce il problema di compatibilità della CPU in modo diverso rispetto a Linux.

    Su un Linux a 64 bit in cui è necessario supportare anche a 32 bit per qualsiasi motivo, si ottengono due copie di cose come librerie che devono essere in entrambi i formati, con le versioni a 64 bit disattivate in una lib64directory parallela alla libdirectory tradizionale .

    OS X risolve questo problema in modo diverso, con il concetto binario Universal, che consente di inserire più file binari in un singolo file. Attualmente è possibile avere file eseguibili che supportano fino a 4 tipi di CPU: PowerPC a 32 e 64 bit, oltre a Intel a 32 e 64 bit.

    È facile costruire binari universali con Xcode, ma è un po 'una seccatura con gli strumenti da riga di comando. Questo ti dà una build solo Intel universale con sistemi di build basati su Autoconf:

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

    Aggiungi -arch ppc -arch ppc64a CFLAGSe LDFLAGSse hai bisogno del supporto PowerPC.

    Se non disabiliti il ​​rilevamento delle dipendenze, finisci per costruire solo per una piattaforma, poiché la presenza di .ofile di nuova make(1)creazione per la prima piattaforma convince che non è necessario costruire anche per la seconda piattaforma. Tutto deve essere costruito due volte nell'esempio sopra; quattro volte per un binario completamente universale, se hai ancora bisogno del supporto PowerPC.

    (Maggiori informazioni nella nota tecnica Apple TN2137 .)

  • Gli strumenti per sviluppatori non sono installati su OS X per impostazione predefinita.

    Prima di Lion, il posto più affidabile per ottenere gli strumenti di sviluppo giusti per il tuo sistema era sui dischi del sistema operativo. Sono un'installazione opzionale.

    La cosa bella dell'installazione degli strumenti di sviluppo dai dischi del sistema operativo è che sai che gli strumenti funzioneranno con il sistema operativo. Essendo Apple, devi disporre di una versione recente del sistema operativo per eseguire gli ultimi compilatori e non hanno sempre reso disponibili download di vecchi strumenti, quindi i dischi del sistema operativo sono spesso il modo più semplice per trovare gli strumenti giusti per un determinato dev o box di prova.

    Con Lion, stanno cercando di eliminare i supporti di installazione, quindi a meno che non acquisti la costosa versione della chiave USB, dovrai scaricare Xcode dall'App Store .

    Ti consiglio di conservare almeno alcune versioni di qualsiasi DMG Xcode scaricato. Quando il successore di Lion uscirà tra un anno o tre, potresti ritrovarti senza un modo per installare una versione contemporanea di Xcode su una VM di prova Lion. Pianificare in anticipo nel caso in cui i problemi di disponibilità e la mancanza di supporti del sistema operativo rendano altrimenti introvabili le vecchie versioni di Xcode.


2
+1: specificamente per menzionare il collegamento dinamico. Mi hanno sorpreso pensando che sarebbe stato molto simile. La gioia di install_name e di come l'editor di collegamenti dinamici OSX dyldrisolve le dipendenze!
Troubadour,

Informazioni sul mantenimento delle versioni precedenti di MacOS: utilizzo Parallel per mantenere VM separate con una determinata versione di OS X se voglio testare la compatibilità con le versioni precedenti. Consiglio questo o uno strumento simile per i test delle app.
ogerard,

Per le vecchie versioni degli strumenti per sviluppatori, controlla connect.apple.com . Ho appena controllato e il primo download elencato nella sezione Strumenti per gli sviluppatori è Xcode 1.0 dal 27 ottobre 2004 per OS X 10.3+. No ProjectBuilder, ma i progetti SOP per Mac devono supportare solo le versioni principali attuali e precedenti, quindi 10.3+ è più che sufficiente.
Jeremy W. Sherman,

@Jeremy: aggiornato. Non voglio assicurare alle persone che saranno sempre scaricabili, dal momento che non sono sempre state in passato.
Warren Young,

29

ENORME GOTCHA - Il filesystem di Mac OS NON distingue tra maiuscole e minuscole.


9
Per essere chiari, per impostazione predefinita sono case preservanti e non fanno distinzione tra maiuscole e minuscole. Quindi il caso del tuo nome file verrà conservato, ma puoi accedervi attraverso qualsiasi variante del caso. Questo può essere modificato per fare distinzione tra maiuscole e minuscole quando viene creato il filesystem.
KeithB,

9
@KeithB: Tuttavia, molte app Mac tradizionali non funzioneranno su un filesystem con distinzione tra maiuscole e minuscole, ad esempio Adobe CS rifiuta di installarsi e World of Warcraft non funzionerà. Mi sono bruciato per questo e l'unico modo per recuperare era il backup e il ripristino del mio sistema su un disco riformattato.
Neil Mayhew,

1
Questo è principalmente un problema quando si ha a che fare con il controllo della versione e si lavora su un progetto in un team multipiattaforma.
Arafangion,

Ho creato uno sparsebundle con distinzione tra maiuscole e minuscole per risolvere il problema. Per fortuna, ho una partizione inutilizzata su questo SSD.
dhchdhd,

9

Sebbene Fink e MacPorts siano i mezzi tradizionali per ottenere pacchetti unix su OS X, consiglierei di provare uno strumento più recente chiamato brewche ha funzionato meglio per me e ha incasinato meno il mio sistema, ed è molto più facile da usare. Fondamentalmente scarica solo tarball e si installa in / usr / local, ma automatizza molto bene l'intero processo.

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


1
Concordato; Homebrew ha funzionato molto più agevolmente per me rispetto a MacPorts.
Jonik,

4

ENORME GOTCHA - Il filesystem di Mac OS NON distingue tra maiuscole e minuscole.

È possibile creare un'immagine del disco con distinzione tra maiuscole e minuscole su Mac OS X che può essere montata come un normale volume del disco rigido.

# 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}"


3

Quando si effettua il porting di uno stack di rete da Solaris, BSD, Linux e Windows su OSX, l'unico punto principale che attira l'attenzione è che, proprio come FreeBSD, l'intera catena di strumenti è piuttosto vecchia.

Apple sta accelerando con OSX Lion ma Leopard, Snow Leopard è piuttosto dietro le moderne distribuzioni Linux e molti standard non sono supportati. Nel mio caso sono colpito dalla mancanza di RFC 3678 (Socket Interface Extensions for Multicast Source Filters) che è abbastanza scomodo.

Sul server OSX ho installato un file system con distinzione tra maiuscole e minuscole poiché mi consiglia di farlo per la pubblicazione HTTP.

  • Vecchio CCG
  • Vecchio autoconf, automake, libtool
  • Nessun spinlock Pthread, OSX offre alternative native.
  • Non molte API NSS rientranti.
  • /procFile system non eccessivamente utile .
  • No /dev/rtc, /dev/hpete RDTSCsembra essere sconvolto. OSX offre alternative native.
  • No epoll, ma hai polle kqueue

1

OS X supporta pthread_cond_timedwaitma utilizza il tempo di calendario assoluto e non è possibile utilizzare un tempo di aumento monotonico.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.