Как скомпилировать дистрибутивные файлы Fortran для Mac OS X Mountain Lion?

Так как Apple прекратила распространять gfortran с Xcode, как мне скомпилировать независимый от архитектуры Fortran-код? У меня есть Mac OS X Mountain Lion (10.8) и XCode 4.4 с установленным пакетом Command Line Tools.

Ядровые компиляторы Apple

Насколько я могу судить, компиляторы Xcode C/С++/ObjC используют вилку сборник компилятора GNU, llvm в качестве бэкэнд; последнее, что я считаю, позволяет компилировать и оптимизировать "универсальные" двоичные файлы, как для архитектуры Intel, так и для PPC.

Сторонние бинарные компиляторы Fortran

ГПЦ

Я нашел только один веб-сайт, который распространяет двоичную версию gfortran специально для Mountain Lion: HPC. Тем не менее, мне не удалось это сделать, чтобы скомпилировать SciPy, а затем увидели в SciPy README, что "известно, что генерируют багги-скупые двоичные файлы" .

КРАН/Р

Рекомендованный SciPy (бесплатный) компилятор Fortran - это сервер CRAN R, но он еще не обновлен для Mountain Lion. Они предоставляют инструкции и script для Построение универсального компилятора, но, опять же, это еще не обновлено для Mountain Lion.

G95

проект G95 не обновлялся с 2010 года, поэтому я не пробовал его. Любой пробовал это на Mountain Lion

MacPorts

Я предполагаю, что это будет самый простой способ установить gfortran, но port search gfortran ничего не придумает, и в прошлом я не испытывал радости от MacPorts (без обид MacPorts, он выглядит очень активным проект, но я испорчен менеджерами пакетов Linux, мой любимый менеджер - aptitude), поэтому на Mac OS X я уже скомпилировал программное обеспечение и библиотеки из исходного кода. Никогда не было проблемой до сих пор...

Построение компилятора Fortran

Много раз за последние пару дней я много раз вырыл в Интернете, я нашел других компиляторов Fortran, но мне не удалось получить кросс-компиляцию универсальных двоичных файлов или компиляцию SciPy.

GCC - Сборник компиляторов Gnu

Я собрал всю коллекцию GCC (v4.6.3), включая autotools, automake, libtool и m4 - как GCC wiki и этот блог описывают - но результирующие компиляторы не компилировать универсальные двоичные файлы, возможно потому, что LLVM не использовался в качестве бэкэнд.

DragonEgg

DragonEgg является "gcc-плагином, который заменяет GCC-оптимизаторы и генераторы кода... с LLVM". Это выглядит интересно, но я не знаю, как использовать его для компиляции 'llvm-gfortran-4.x'. Это можно сделать?

Совместимость

Библиотеки

Компилятор, который поставляется с Xcode, является (fork of?) GCC v4.2. Но текущие выпуски релизов и развития GCC - версии 4.6 и 4.7 соответственно. Видимо, изменение лицензии GNU, или что-то, остановило Apple от обновления до более современных версий GCC. Итак, если бы я должен был создавать динамические библиотеки, созданные с GCC gfortran v4.6, могли бы они быть связаны с C-кодом, скомпилированным родным компилятором Xcode? Как минимум, я считаю, что получаемые бинарные файлы Mach-O нуждаются в кодах кода x86_64 и i386. GCC обеспечивает обратную совместимость с Apple (forks of?) GCC? Я знаю, что gfortran имеет -ff2c флаг, но является ли он стабильным в разных версиях?

Компилировать флаги

Компилятор GCC Fortran, который я создал из источника, не поддерживал использование флага компиляции -arch. Я включил флагов -arch x86_64 -arch i386 в обоих переменных CFLAGS и FFLAGS для более ранних версий OSX (Snow Leopard to Lion). Python distutils и, возможно, другие компиляторы OSX ожидают, что эти флаги будут работать при настройке для создания приложений или фреймворков, используя универсальный SDK Xcode.

В случае, если вам интересно, какие флаги компиляции я использую, я загрузил script, который я использую для pastebin, который я source, прежде чем компилировать что-нибудь, используя: source ~/.bash_devenv.

Идеальный компилятор OSX Fortran

  • Создайте универсальные двоичные файлы ppc и intel (32 и 64 бит), заданные с помощью флагов -arch.
  • Делает двоичные файлы совместимыми с компоновщиком XCode.
  • Скомпилирует SciPy, не давая ошибок (совместим с numpy distutils и f2py).

Я не использую Xcode так много, но интеграция с ним наверняка принесет пользу другим пользователям. Даже Intel по-прежнему имеет проблемы, интегрируя ifort в Xcode 4.4, так что это не то, что я ожидаю работать.

Если вы прочтете все вышеизложенное, тогда спасибо! Вы, вероятно, можете сказать, что я не прочь создать собственный компилятор Fortran из источника, но возможно ли это? Я что-то пропустил? Может быть, флаг настройки? И если такой компилятор пока недоступен, то почему бы и нет?!

(Обновление:) Apple GCC

Apple предоставляет исходный код для их исправленной версии GCC, opensource.apple.com. На самом деле это включает исходный код gfortran, но что вы знаете - он не компилируется (легко). Я собираюсь написать сборку script, чтобы заставить ее работать. К сожалению, мне пришлось применить пару патчей и узнать о "путь Apple" для создания программного обеспечения GNU. Думаю, это путь. Любые причины, почему этого не должно быть? Я обновлю ответ, если я его заработаю...

Ответ 1

Мне удалось скомпилировать после установки gfortran из http://r.research.att.com/tools/gcc-42-5666.3-darwin11.pkg, как объяснено . Я должен был попытаться открыть пакет пару раз. В первый раз он сказал, что могут быть установлены только приложения из App Store. После установки gfortran python setup.py build и python setup.py install работали нормально. Единичные тесты scipy, хотя и дают довольно большое количество сбоев, не уверены, что это нормально.

Ran 5481 tests in 82.079s

FAILED (KNOWNFAIL=13, SKIP=42, errors=11, failures=72)
<nose.result.TextTestResult run=5481 errors=11 failures=72>

Ответ 2

Если вы этого еще не заметили: в новых версиях Xcode вам необходимо явно установить инструменты командной строки следующим образом:

Настройки → Загрузки → Компоненты

И затем нажмите кнопку "установить" для инструментов командной строки. Это включает gfortran:

> gfortran -v
Using built-in specs.
Target: i686-apple-darwin10
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5664)

По общему признанию, это не решает всех моих потребностей fortran (в некоторых случаях сценарии "./configure" будут жаловаться, что они не могут "скомпилировать простую программу fotran" ).

Ответ 3

Вы можете использовать brew (или Homebrew) для установки gfortran.

$brew установить gfortran

Ответ 4

Я знаю, что вы сказали, что вам не нравятся MacPorts, но если вы устанавливаете порт gcc48, на самом деле он включает gfortran (хотя вам также нужно будет сделать sudo port select --set gcc mp-gcc48, чтобы настроить его символическая ссылка с именем gfortran).

Кроме того, параметр FWIW, MacPorts не обязательно является двоичным. MacPorts может фактически построить его из источника, поэтому иногда требуется некоторое время. С другой стороны, иногда также кажется, что откуда-то архивируются двоичные файлы, но я думаю, что это зависит от того, что загрузил оригинальный автор загружаемого файла.

Ответ 5

Я закончил компиляцию gfortran исходным кодом, представленным на странице страницы инструментов разработчика. Кажется, что сейчас все работает нормально - я успешно скомпилировал библиотеки x86-64 и i386/i686 LAPACK, ATLAS и BLAS fortran, но есть несколько тестов runlib, которые не выполняются при запуске make -k test в каталогах сборки. (Я мог бы предоставить дополнительную информацию об этом пастебине или где-нибудь, если кто-то захочет...)

Процесс сборки

После того, как задал вопрос, я загрузил Apple llvmgcc42 исходный код tar-архив, который включает в себя исходный код для llvm/gcc C, С++, ObjC и fortran компиляторы, и потратил некоторое время на попытку скомпилировать универсальную сборку gfortran. Сборка занимает около 30-60 минут на моем четырехъядерном процессоре 2,8 ГГц Mac Pro и стала довольно привлекательным процессом, поэтому я написал для нее набор сценариев сборки, которые я поделил на github.com.

....

Я пока сохраню архив tar моего сборника здесь, если кто-то захочет получить копию. (Обновлено 26 сентября 2012 г.) Он будет работать, только если установлен с префиксом/usr/local/хотя, если вы не запустите install_name_tool в исполняемых файлах и dylib, чтобы изменить префикс из /usr/local, где бы вы ни были хочу сказать. Вы можете протестировать install_name с помощью otool -L filename (подробнее об этом можно узнать здесь).

Последняя сборка, которую я сейчас использую, также включает в себя обновления в каталогах gcc/fortran и libgfortran, которые я получил от GNU GCC 4.2.4. Эти источники я получил из своего локального зеркала GCC. Были незначительные изменения между 4.2.1 и 4.2.4, а скрипты сборки включают исправления, необходимые для обновления кода.

build-gfortran.sh script Я написал загрузки отсутствующих зависимостей (mpfr и gmp), компилирует и перекрестно компилирует их, исправляет разные заголовки с помощью макросов макросов препроцессора, зависящих от архитектуры, и запускает lipo для создания универсальных двоичных файлов и библиотек, в конечном итоге поддерживающих архитектуры i386 и x86_64. Процесс аналогичен для llvmCore, а затем GCC. Я в основном копировал код из build_llvm и build_gcc bash, снабженные Apple llvmgcc42, но некоторые из них пришлось модифицировать, в том числе несколько команд lipo и install_name_tool.

Официальный способ скомпилировать Apple gcc, используя Xcode gnumake, просто не работал у меня. Я думал, что это должно работать, просто переместив "fortran" в переменную LANGUAGES в build_gcc.

Что касается компиляции Scipy, все равно невозможно получить это здание отлично. Мне пришлось использовать clang и clang++ в качестве компиляторов C/С++, иначе я получаю ошибки malloc EXC_BAD_ACCESS. Не пробовал компиляторы gcc/g++, которые я построил, просто использовал системные. Это указано для Lion, на странице установки Scipy . Я до 11 ошибок и 1 сбой, которые все связаны с теми же 3 вызовами функций (_fitpack._bspleval, numeric.asarray, testing.utils.chk_same_position). Подумайте, что это очень хорошо, но я бы хотел, чтобы каждый тест прошел...