Desarrollador de software que cambia de Linux a OS X, ¿cuáles son las trampas?

50

He usado Ubuntu / Fedora / Red Hat / Suse pero no he usado OS X en absoluto. Si tengo que comenzar a usar OS X regularmente, ¿cuáles son las cosas que debo tener en cuenta?

Las herramientas que uso son la cadena de herramientas GNU, C ++ / Boost, etc.

grokus
fuente
¿Va a desarrollar aplicaciones Unix / Linux más convencionales o aplicaciones Mac OSX?
David Thornley
1
Al menos en las aplicaciones Unix / Linux más convencionales, solo uso la PC OS X como estación de trabajo.
grokus

Respuestas:

52

Hice el mismo movimiento hace años. Aquí están las cosas con las que me he encontrado:

  • Su escritorio promedio Linux tiene una tierra de usuario más rica que la de OS X.

    Probablemente extrañará diferentes herramientas que yo, así que no tiene sentido ser específico acerca de las recomendaciones para los reemplazos.

    En su lugar, solo instale Fink , MacPorts o Homebrew lo primero. Estos sistemas proporcionan un sistema de gestión de paquetes típico de Linux o los BSD. Cada uno tiene su propio sabor y conjunto de paquetes, por lo que la elección correcta se basará en sus gustos y necesidades.

    Puede encontrar que ningún sistema de paquetes tendrá todos los programas que necesita. Algunos programas aún no se han portado a OS X, por lo que no aparecerán en ningún sistema de paquetes. Sin embargo, estos sistemas amplían en gran medida lo que se incluye con OS X y facilitarán su transición de Linux.

  • Los compiladores de línea de comandos de OS X ahora crean ejecutables de 64 bits por defecto.

    En Leopard y versiones anteriores, los compiladores construyeron ejecutables de 32 bits de forma predeterminada. Esto puede causar problemas de varias maneras: tal vez tenga bibliotecas antiguas de 32 bits que no pueda reconstruir pero tenga que vincular, tal vez todavía esté ejecutando su sistema en modo de 32 bits, etc.

    Una forma de forzar una compilación de 32 bits es anular los gccvalores predeterminados en los sistemas de compilación gcc-4.0, que es el antiguo compilador Leopard de 32 bits por defecto. ( gcces un enlace simbólico a los 64 bits por defecto gcc-4.2en Snow Leopard). Con los sistemas de compilación basados ​​en autoconf, esto funciona:

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

    (Solo necesita el CXXbit si el programa contiene componentes de C ++).

    Otra forma es pasar -m32al compilador y al enlazador:

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

    Es más mecanografía, pero le permite obtener compilaciones de 32 bits del nuevo GCC.

  • La vinculación dinámica es muy diferente.

    Si eres del tipo que escribe tus ldcomandos a mano, es hora de romper ese hábito. En su lugar, debería vincular programas y bibliotecas a través del compilador, o utilizar un intermediario como libtool. Estos se ocupan de las diferencias de esquemas de enlaces específicos de la plataforma, para que pueda ahorrar el poder del cerebro para los programas de aprendizaje que no puede abstraer con mecanismos portátiles.

    Por ejemplo, necesitará actualizar su memoria muscular para escribir en otool -L someprogramlugar de ldd someprogramaveriguar a qué bibliotecas someprogramestá vinculada.

    Otra diferencia en el enlace dinámico que al principio torcerá tu cerebro es que en OS X, la ubicación de instalación de una biblioteca se registra en la biblioteca misma , y el enlazador copia eso en el ejecutable en el momento del enlace. Esto significa que si vincula a una biblioteca que se instaló /usr/local/libpero desea enviarla a sus usuarios en el mismo directorio que el ejecutable, debe decir algo como esto como parte de su proceso de instalación:

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

    Ahora, es probable que gran parte de lo anterior varíe para su sistema de compilación, así que solo tómelo como un ejemplo, en lugar de una receta. Lo que esto hace es hacer una copia privada de una biblioteca a la que enlazamos, cambia su identificador de biblioteca compartida de una ruta absoluta a una relativa que significa "en el mismo directorio que el ejecutable", luego obliga a reconstruir el ejecutable contra esta copia modificada de la biblioteca

    install_name_tooles el comando central aquí. Si, en cambio, desea instalar la biblioteca en un ../libdirectorio relativo al ejecutable, el -idargumento debería ser @loader_path/../lib/libfoo.dyliben su lugar.

    Joe Di Pol escribió un buen artículo sobre esto , con muchos más detalles.

  • El enlace dinámico + los paquetes de terceros pueden causar dolores de cabeza desde el principio.

    Es probable que se encuentre con problemas de vinculación dinámica desde el principio, tan pronto como comience a intentar usar bibliotecas de paquetes de terceros que no instalen las bibliotecas en ubicaciones estándar. MacPorts hace esto, por ejemplo, instalando bibliotecas en /opt/local/liblugar de /usr/libo /usr/local/lib. Cuando te encuentres con esto, una buena solución para el problema es agregar líneas como las siguientes a tu .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 maneja el problema de compatibilidad de la CPU de manera diferente a Linux.

    En un Linux de 64 bits donde también debe admitir 32 bits por cualquier razón, termina con dos copias de cosas como bibliotecas que deben estar en ambos formatos, con las versiones de 64 bits desactivadas en un lib64directorio paralelo al libdirectorio tradicional

    OS X resuelve este problema de manera diferente, con el concepto binario Universal, que le permite poner múltiples archivos binarios en un solo archivo. Actualmente puede tener ejecutables que admitan hasta 4 tipos de CPU: PowerPC de 32 y 64 bits, más Intel de 32 y 64 bits.

    Es fácil construir binarios universales con Xcode, pero un poco complicado con las herramientas de línea de comandos. Esto le proporciona una compilación universal solo para Intel con sistemas de compilación basados ​​en Autoconf:

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

    Agregue -arch ppc -arch ppc64al CFLAGSy LDFLAGSsi necesita soporte de PowerPC.

    Si no deshabilita el seguimiento de dependencias, termina compilando solo para una plataforma, ya que la presencia de .oarchivos recién creados para la primera plataforma convence de make(1)que no es necesario construir también para la segunda plataforma. Todo tiene que ser construido dos veces en el ejemplo anterior; cuatro veces para un binario completamente universal, si aún necesita soporte de PowerPC.

    (Más información en la Nota técnica de Apple TN2137 .)

  • Las herramientas de desarrollador no están instaladas en OS X de forma predeterminada.

    Antes de Lion, el lugar más confiable para obtener las herramientas de desarrollo adecuadas para su sistema era en los discos del sistema operativo. Son una instalación opcional.

    Lo bueno de instalar las herramientas de desarrollo desde los discos del sistema operativo es que sabe que las herramientas funcionarán con el sistema operativo. Apple, siendo Apple, debe tener una versión reciente del sistema operativo para ejecutar los últimos compiladores, y no siempre han hecho descargas de herramientas antiguas disponibles, por lo que los discos del sistema operativo son a menudo la forma más fácil de encontrar las herramientas adecuadas para un determinado caja de desarrollo o prueba.

    Con Lion, intentan eliminar los medios de instalación, por lo que, a menos que compre la costosa versión de la llave USB, tendrá que descargar Xcode de la App Store .

    Le recomiendo que mantenga al menos algunas versiones de cualquier DMG de Xcode que descargue. Cuando el sucesor de Lion salga dentro de un año o tres, es posible que se encuentre sin una forma de instalar una versión contemporánea de Xcode en una máquina virtual de prueba de Lion. Planifique con anticipación en caso de que los problemas de disponibilidad y la falta de medios del sistema operativo hagan que las versiones antiguas de Xcode de otra manera no se puedan obtener.

Warren Young
fuente
2
+1: específicamente por mencionar la vinculación dinámica. Quedé atrapado pensando que sería muy similar. ¡La alegría de install_name y cómo el editor de enlaces dinámicos OSX dyldresuelve las dependencias!
Trovador
Acerca de mantener versiones antiguas de MacOS: uso Parallel para mantener máquinas virtuales separadas con una versión de OS X dada si quiero probar la compatibilidad con versiones anteriores. Recomiendo esta o una herramienta similar para probar aplicaciones.
ogerard
Para versiones anteriores de las herramientas de desarrollador, consulte connect.apple.com . Acabo de comprobar y la primera descarga que aparece en la sección Herramientas para desarrolladores es Xcode 1.0 del 27 de octubre de 2004 para OS X 10.3+. No ProjectBuilder, pero los proyectos SOP para Mac son compatibles solo con las versiones principales actuales y anteriores, por lo que 10.3+ es más que suficiente.
Jeremy W. Sherman
@ Jeremy: actualizado. No quiero asegurarle a la gente que siempre serán descargables, ya que no siempre lo han sido en el pasado.
Warren Young
29

ENORME GOTCHA: el sistema de archivos de Mac OS NO distingue entre mayúsculas y minúsculas.

gabe
fuente
99
Para ser claros, conservan mayúsculas y minúsculas por defecto. Por lo tanto, se conservará el caso de su nombre de archivo, pero puede acceder a él a través de cualquier variación de mayúsculas y minúsculas. Esto se puede cambiar para que distinga entre mayúsculas y minúsculas cuando se crea el sistema de archivos.
KeithB
99
@KeithB: Sin embargo, muchas aplicaciones Mac convencionales no se ejecutarán en un sistema de archivos sensible a mayúsculas y minúsculas, por ejemplo, Adobe CS se niega incluso a instalar, y World of Warcraft no se ejecutará. Me quemé por esto y la única forma de recuperarme fue hacer una copia de seguridad y restaurar mi sistema en un disco reformateado.
Neil Mayhew
1
Esto es principalmente un problema cuando se trata del control de versiones y se trabaja en un proyecto en un equipo multiplataforma.
Arafangion
Creé un sparsebundle sensible a mayúsculas y minúsculas para solucionar esto. Afortunadamente, tengo una partición no utilizada en este SSD.
dhchdhd
9

Aunque Fink y MacPorts son los medios tradicionales para obtener paquetes de Unix en OS X, recomendaría consultar una herramienta más nueva llamada brewque me ha funcionado mejor y ha estropeado menos mi sistema, y ​​es mucho más fácil de usar. Básicamente solo descarga tarballs e instala a / usr / local, pero automatiza todo el proceso muy bien.

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

Arenoso
fuente
1
Convenido; Homebrew ha estado trabajando mucho mejor para mí que MacPorts.
Jonik
4

ENORME GOTCHA: el sistema de archivos de Mac OS NO distingue entre mayúsculas y minúsculas.

Puede crear una imagen de disco sensible a mayúsculas y minúsculas en Mac OS X que se puede montar como un volumen de disco duro 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
fuente
3

Aquí hay una buena fuente de artículos de desarrollo seleccionados, la Lista de literatura de cacao:

http://osx.hyperjeff.net/Reference/CocoaArticles

(Esto puede ser especialmente útil si algún día desea utilizar las ventajas específicas de Mac OS X).

franco
fuente
3

Al portar una pila de red de Solaris, BSD, Linux y Windows a OSX, el único punto principal que llama la atención es que, al igual que FreeBSD, toda la cadena de herramientas es bastante antigua.

Apple está acelerando con OSX Lion pero Leopard, Snow Leopard está bastante por detrás de las distribuciones modernas de Linux y muchos estándares no son compatibles. En mi caso, la falta de RFC 3678 (Extensiones de interfaz de socket para filtros de origen de multidifusión) es bastante inconveniente.

En el servidor OSX instalé un sistema de archivos que distingue entre mayúsculas y minúsculas, ya que recomienda hacerlo para el servicio HTTP.

  • Viejo GCC
  • Old Autoconf, Automake, libtool
  • Sin spinlocks de Pthread, OSX ofrece alternativas nativas.
  • No hay muchas API NSS re-rentrant.
  • /procSistema de archivos no demasiado útil .
  • No /dev/rtc, /dev/hpety RDTSCparece ser engañado. OSX ofrece alternativas nativas.
  • No epoll, pero tienes polly kqueue
Steve-o
fuente
1

OS X es compatible, pthread_cond_timedwaitpero utiliza el tiempo de calendario absoluto y no hay forma de utilizar un tiempo monotónicamente creciente.

andrewrk
fuente