scipy - sierra - mac os x caracteristicas
¿Cómo compilar los binarios Fortran distribuibles en Mac OS X Mountain Lion? (5)
Dado que Apple ha dejado de distribuir gfortran con Xcode, ¿cómo debería compilar el código Fortran independiente de la arquitectura? Tengo instalado Mac OS X Mountain Lion (10.8) y XCode 4.4, con el paquete Command Line Tools instalado.
Compiladores nativos de Apple
Por lo que puedo decir, los compiladores Xcode C / C ++ / ObjC usan un tenedor de la colección del compilador GNU , con llvm como back-end; lo último que imagino permite compilar y optimizar binarios "universales", tanto para arquitecturas Intel como PPC.
Compiladores Fortran binarios de terceros
HPC
Solo he encontrado un único sitio web que distribuye una versión binaria de gfortran específicamente para Mountain Lion: el sitio web de HPC . Sin embargo, no pude obtener esto para compilar SciPy, y más tarde vi en SCIPy''s README que es "conocido generar buggy scipy binaries" .
CRAN / R
El compilador Fortran recomendado (gratuito) de SciPy es el que está en el servidor R de CRAN , pero aún no se ha actualizado para Mountain Lion. Proporcionan instrucciones y un script para Construir un compilador universal , pero, nuevamente, esto aún no se ha actualizado para Mountain Lion.
G95
El proyecto G95 no ha tenido una actualización desde 2010, así que no lo probé. ¿Alguien lo intentó en Mountain Lion?
MacPorts
Supongo que esta será la forma más fácil de instalar Gfortran, pero la port search gfortran
no tiene nada, y no he disfrutado con MacPorts en el pasado (sin ofender a MacPorts; parece un proyecto muy activo, pero Me han echado a perder los administradores de paquetes de Linux, mi administrador favorito es aptitude) así que en Mac OS X he compilado software y bibliotecas desde el código fuente en el pasado. Nunca ha sido un problema ''hasta ahora ...
Construyendo un compilador Fortran
Después de haber buscado mucho en Internet en los últimos días, encontré otros compiladores de Fortran, pero no conseguí ninguno para compilar binarios universales cruzados o compilar SciPy.
GCC - La colección del compilador Gnu
Recopilé toda la colección de GCC (v4.6.3), incluidas autotools, automake, libtool y m4, como la wiki de GCC y este blog describen, pero los compiladores resultantes no compilaron binarios universales, probablemente porque LLVM no se usó como backend.
DragonEgg
DragonEgg es un "complemento gcc que reemplaza los optimizadores y generadores de códigos de GCC ... con LLVM". Esto parece interesante, pero no sé cómo podría usarlo para compilar ''llvm-gfortran-4.x''. Se puede hacer esto?
Compatibilidad
Bibliotecas
El compilador que viene con Xcode es (¿un tenedor de?) GCC v4.2. Pero las ramas de desarrollo y lanzamiento actuales de GCC son las versiones 4.6 y 4.7, respectivamente. Aparentemente, un cambio de licencia de GNU, o algo así, impidió a Apple actualizar a versiones más modernas de GCC. Entonces, si tuviera que crear bibliotecas dinámicas hechas con gfortran v4.6 de GCC, ¿podrían entonces vincularse con el código C compilado por el compilador nativo de Xcode? Como mínimo, creo que los binarios Mach-O resultantes necesitan rutas de código x86_64 e i386. ¿GCC proporciona compatibilidad con versiones anteriores de Apple (tenedores de?) GCC? Sé que gfortran tiene la bandera -ff2c
, pero ¿es estable en todas las versiones?
Compilar banderas
El compilador Fortran de GCC que construí desde la fuente no -arch
el uso de la bandera de compilación -arch
. Había incluido las banderas -arch x86_64 -arch i386
en las variables de entorno de CFLAGS y FFLAGS en versiones anteriores de OSX (Snow Leopard to Lion). Los distutils de Python, y probablemente otros compiladores OSX, esperan que estos indicadores funcionen, cuando se configuran para crear aplicaciones o marcos, utilizando el SDK universal de Xcode.
En caso de que se esté preguntando qué indicadores de compilación utilizo, he cargado el script que uso para pegar , que source ~/.bash_devenv
antes de compilar cualquier cosa, usando: source ~/.bash_devenv
.
El compilador fortán OSX ideal
- Cree los binarios universales ppc e intel (32 y 64 bits), especificados mediante el uso de las banderas
-arch
. - Hace que los binarios sean compatibles con el enlazador de XCode.
- Compila SciPy, sin errores (compatible con distutils de numpy y f2py).
No uso tanto Xcode, pero la integración con él seguramente beneficiará a otros usuarios. Incluso Intel todavía tiene problemas para integrar ifort en Xcode 4.4, por lo que no espero que funcione.
Si lees todo lo anterior, ¡gracias! Probablemente puedas decir que no soy reacio a construir mi propio compilador Fortran desde la fuente, pero ¿es posible? ¿Me he perdido algo? Una bandera de configuración tal vez? Y si ese compilador aún no está disponible, ¿por qué no?
(Actualización :) Apple GCC
Apple proporciona el código fuente para su versión parcheada de GCC, en opensource.apple.com . Esto realmente incluye el código fuente de gfortran, pero ¿qué sabes? No compila (fácilmente). Estoy en el proceso de escribir un script de compilación para que esto funcione. Lamentablemente, he tenido que aplicar un par de parches y aprender sobre "la forma de Apple" de crear software de GNU. Este es el camino a seguir, creo. ¿Alguna razón por la que no debería ser? Actualizaré con una respuesta si la hago funcionar ...
Terminé recopilando compilaciones del código fuente proporcionado en la página de códigos fuente de las herramientas para desarrolladores de Apple. Esto parece estar funcionando bien ahora - He compilado con éxito las bibliotecas fortran x86-64 e i386 / i686 LAPACK, ATLAS y BLAS - pero hay algunas pruebas ranlib que fallan cuando se ejecuta make -k test
en los directorios de compilación. (Podría proporcionar más información sobre ese pastebin o en algún lugar, si alguien quiere ...)
Proceso de compilación
Después de hacer la pregunta, descargué el archivo tar de código fuente llvmgcc42 de Apple, que incluye el código fuente para compiladores llvm / gcc C, C ++, ObjC y fortran, y dediqué un tiempo a compilar una compilación universal de gfortran. La compilación demora entre 30 y 60 minutos en mi Mac Pro de cuatro núcleos y 2,8 GHz, y se convirtió en un proceso bastante complicado, así que escribí un conjunto de scripts de compilación, que compartí en github.com .
....
Por el momento, conservaré un archivo tar de mi compilación, si alguien quisiera una copia. (Actualizado 26-sep-2012) Solo funcionará si se instala con un prefijo / usr / local / though, a menos que ejecute install_name_tool
en los archivos ejecutables y dylibs, para cambiar el prefijo de / usr / local a donde desee Ponlo. Puede probar install_name con otool -L filename
(más información sobre las razones para esto está aquí ).
La versión final que ahora estoy usando también incluye actualizaciones para los directorios gcc / fortran y libgfortran, que obtuve de GNU GCC 4.2.4. Estas fuentes obtuve del espejo de mi GCC local. Solo hubo cambios menores entre 4.2.1 y 4.2.4, y los scripts de compilación incluyen los parches necesarios para actualizar el código.
La secuencia de comandos build-gfortran.sh que escribí descarga dependencias que faltan ( mpfr y gmp ), compila y compila, compila diferentes encabezados con macros de preprocesador dependientes de la arquitectura y ejecuta lipo para crear archivos binarios y bibliotecas universales, y finalmente admite tanto i386 como x86_64 arquitecturas. El proceso es similar para llvmCore y luego GCC. Copié principalmente el código de los scripts build_llvm y build_gcc bash provistos con el archivo llvmgcc42 de Apple, pero tuve que modificar algunos de ellos, incluidos algunos comandos lipo
e install_name_tool
.
La forma oficial de compilar gcc de Apple, utilizando gnumake
de Xcode, no funcionó para mí. Pensé que esto debería funcionar simplemente agregando "fortran" a la variable IDIOMAS en build_gcc.
Con respecto a la compilación de Scipy, todavía no se puede construir perfectamente. Tuve que usar clang y clang ++ como compiladores de C / C ++, o bien recibo EXC_BAD_ACCESS errores de malloc. No he probado los compiladores gcc / g ++ que construí, solo usé los del sistema. Esto es como se informó para Lion, en la página de instalación de Scipy. Tengo 11 errores y 1 falla, todos surgieron de las mismas 3 llamadas a funciones (_fitpack._bspleval, numérico.asarray, testing.utils.chk_same_position). Creo que es bastante bueno, pero me gustaría que todas las pruebas pasen ...
Pude compilar después de instalar gfortran desde http://r.research.att.com/tools/gcc-42-5666.3-darwin11.pkg , como se explica aquí . Aunque tuve que intentar abrir el paquete un par de veces. La primera vez dijo que solo se podían instalar aplicaciones de App Store. Después de instalar gfortran, la instalación de python setup.py build
y python setup.py install
funcionó bien. Las pruebas unitarias de scipy dan un número bastante alto de fallas, no estoy seguro de que sea normal.
Ran 5481 tests in 82.079s
FAILED (KNOWNFAIL=13, SKIP=42, errors=11, failures=72)
<nose.result.TextTestResult run=5481 errors=11 failures=72>
En caso de que no haya notado esto: en las versiones más nuevas de Xcode, debe instalar explícitamente las herramientas de línea de comandos de la siguiente manera:
Preferencias -> Descargas -> Componentes
Y luego haga clic en el botón "instalar" para herramientas de línea de comandos. Esto incluye gfortran:
> gfortran -v
Using built-in specs.
Target: i686-apple-darwin10
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5664)
Es cierto que esto no resuelve todas mis necesidades fortran (en algunos casos, las secuencias de comandos "./configure" se quejan de que no pueden "compilar un programa sencillo de fotran").
Puede usar brew (o Homebrew ) para instalar gfortran.
$ brew install gfortran
Sé que dijiste que no te gusta MacPorts, pero si instalas el puerto gcc48
, de hecho incluye gfortran
(aunque también tendrás que hacer sudo port select --set gcc mp-gcc48
para configurarlo el enlace simbólico llamado gfortran
).
Además, FWIW, la opción MacPorts no es necesariamente un binario: MacPorts puede construirlo desde el origen, por lo que a veces lleva un tiempo. Por otro lado, a veces también parece obtener archivos binarios archivados de alguna parte, pero creo que depende de lo que cargó el autor original del archivo de puerto.