11

Apple が Xcode での gfortran の配布を停止したため、アーキテクチャに依存しない Fortran コードをどのようにコンパイルすればよいですか? Mac OS X Mountain Lion (10.8) と XCode 4.4 がインストールされており、コマンド ライン ツールパッケージがインストールされています。

Apple のネイティブ コンパイラ

私が知る限り、Xcode C / C++ / ObjC コンパイラはGNU コンパイラ コレクションのフォークを使用し、llvmをバックエンドとして使用します。後者は、Intel アーキテクチャと PPC アーキテクチャの両方で、「ユニバーサル」バイナリのコンパイルと最適化を可能にします。

サードパーティのバイナリ Fortran コンパイラ

HPC

Mountain Lion 専用の gfortran のバイナリ バージョンを配布している Web サイトは 1 つしか見つかりませんでした: HPC Web サイトです。ただし、これを SciPy にコンパイルするのに失敗し、後で SciPy の README で「バグのある scipy バイナリを生成することが知られている」ことを確認しました。

クラン/R

SciPy が推奨する (無料の) Fortran コンパイラはCRAN の Rサーバーのものですが、これはまだ Mountain Lion 用に更新されていません。Building a Universal Compilerの手順とスクリプトが提供されていますが、これも Mountain Lion 用にまだ更新されていません。

G95

G95 プロジェクトは2010 年から更新されていないので、試していません。Mountain Lion でこれを試した人はいますか?

Mac ポート

これが gfortran をインストールする最も簡単な方法だと思いますが、port search gfortran何も思いつきません。また、過去に MacPorts を楽しんだことはありません (MacPorts に害はありません。非常に活発なプロジェクトのように見えますが、私は私のお気に入りのマネージャーは aptitude です) ので、Mac OS X では、過去にソース コードからソフトウェアとライブラリをコンパイルしました。今まで問題になったことはありません...

Fortran コンパイラの構築

ここ数日でインターネットをいろいろと調べてみたところ、他の Fortran コンパイラを見つけましたが、ユニバーサル バイナリをクロスコンパイルしたり、SciPy をコンパイルしたりするものは見つかりませんでした。

GCC - Gnu コンパイラ コレクション

autotools、automake、libtool、m4 を含むGCC コレクション全体(v4.6.3)をコンパイルしました( GCC wikiこのブログの説明のように) が、結果のコンパイラはユニバーサル バイナリをコンパイルしませんでした。バックエンド。

ドラゴンエッグ

DragonEggは、「GCC のオプティマイザーとコード ジェネレーターを LLVM に置き換える gcc プラグイン」です。これは興味深いようですが、「llvm-gfortran-4.x」をコンパイルするためにどのように使用できるかわかりません。これはできますか?

互換性

ライブラリ

Xcode に付属するコンパイラは (のフォーク?) GCC v4.2 です。しかし、GCC の現在のリリース ブランチと開発ブランチは、それぞれバージョン 4.6 と 4.7 です。どうやら、GNU ライセンスの変更か何かで、Apple がより新しいバージョンの GCC に更新できなくなったようです。では、GCC の gfortran v4.6 で作成された動的ライブラリを構築する場合、Xcode のネイティブ コンパイラによってコンパイルされた C コードとリンクできますか? 少なくとも、結果の Mach-O バイナリには x86_64 と i386 の両方のコード パスが必要だと思います。GCC は Apple の (フォーク?) GCC との下位互換性を提供しますか? gfortran に-ff2cフラグがあることは知っていますが、これはバージョン間で安定していますか?

コンパイル フラグ

ソースからビルドした GCC Fortran コンパイラは、-archコンパイル フラグの使用をサポートしていませんでした。-arch x86_64 -arch i386以前の OSX バージョン (Snow Leopard から Lion) では、CFLAGS と FFLAGS の両方の環境変数にフラグを含めていました。Python の distutils およびおそらく他の OSX コンパイラは、Xcode のユニバーサル SDK を使用してアプリまたはフレームワークをビルドするように構成されている場合、これらのフラグが機能することを期待しています。

私がどのコンパイル フラグを使用しているか疑問に思っている場合のために、私が使用するスクリプトを pastebin にsourceアップロードしましたsource ~/.bash_devenv

理想的な OSX Fortran コンパイラ

  • -archフラグを使用して指定された ppc および intel (32 および 64 ビット) ユニバーサル バイナリを作成します。
  • XCode のリンカーと互換性のあるバイナリを作成します。
  • エラーなしで SciPy をコンパイルします (numpy の distutils および f2py と互換性があります)。

私は Xcode をあまり使用しませんが、Xcode との統合は他のユーザーにとって確実にメリットがあります。Intel でさえ、ifort を Xcode 4.4 に統合する際にまだ問題を抱えているため、これは私が期待するものではありません..

上記のすべてを読んだら、ありがとう!ソースから独自の Fortran コンパイラを構築することを私が嫌っているわけではないことはおそらくお分かりいただけると思いますが、それは可能でしょうか? 私は何かを逃しましたか?多分設定フラグ?そして、そのようなコンパイラがまだ利用できないのであれば、なぜ利用できないのでしょうか?!

(更新:) Apple の GCC

Apple は、 opensource.apple.comで、パッチを適用したバージョンの GCC のソース コードを提供しています。これには実際に gfortran のソース コードが含まれていますが、(簡単に) コンパイルされません。これを機能させるためのビルドスクリプトを作成中です。残念ながら、いくつかのパッチを適用し、GNU ソフトウェアを構築する「Apple のやり方」について学ばなければなりませんでした。これが私が考える道です。そうであってはならない理由はありますか?動作するようになったら、答えを更新します...

4

5 に答える 5

4

here で説明されているように、 http://r.research.att.com/tools/gcc-42-5666.3-darwin11.pkgから gfortran をインストールした後、なんとかコンパイルできました。ただし、パッケージを数回開けようとする必要がありました。初めて、App Store からのアプリのみをインストールできると言われました。gfortranをインストールした後、うまくいきました。scipy の単体テストでは、かなりの数の失敗が見られますが、それが正常かどうかはわかりません。python setup.py buildpython setup.py install

Ran 5481 tests in 82.079s

FAILED (KNOWNFAIL=13, SKIP=42, errors=11, failures=72)
<nose.result.TextTestResult run=5481 errors=11 failures=72>
于 2012-10-03T14:01:29.213 に答える
4

これに気付いていない場合: 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 プログラムをコンパイルできない" と文句を言うことがあります)。

于 2012-10-16T10:02:18.857 に答える
2

あなたが MacPorts が嫌いだと言ったことは知っていますが、gcc48ポートをインストールすると、実際には含まれます(ただし、 という名前のシンボリックリンクをセットアップするためにそれを取得するgfortran必要もあります)。sudo port select --set gcc mp-gcc48gfortran

また、FWIW、MacPorts オプションは必ずしもバイナリではありません。MacPorts は実際にソースからビルドできるため、時間がかかることがあります。一方で、アーカイブされたバイナリをどこかから取得しているように見えることもありますが、portfile の元の作成者が何をアップロードしたかによると思います。

于 2013-11-01T14:32:02.450 に答える
1

Appleの開発者ツールのソースコードページで提供されているソースコードをgfortranでコンパイルすることになりました。これで問題なく動作しているようです - x86-64 と i386/i686 の LAPACK、ATLAS および BLAS fortran ライブラリを正常にコンパイルしましたがmake -k test、ビルド ディレクトリで実行するといくつかの ranlib テストが失敗します。(誰かが望むなら、そのペーストビンまたはどこかでより多くの情報を提供できます...)

ビルドプロセス

質問をした後、llvm/gcc C、C++、ObjC、および fortran コンパイラのソース コードを含む Apple のllvmgcc42 ソース コード tar アーカイブをダウンロードし、gfortran のユニバーサル ビルドのコンパイルに時間を費やしました。私のクアッドコア 2.8GHz Mac Pro でのビルドには約 30 ~ 60 分かかり、非常に複雑なプロセスになったので、ビルド スクリプトのセットを作成し、github.comで共有しました。

....

コピーが必要な場合は、しばらくの間、ビルドの tar アーカイブをここに保持します。(2012 年 9 月 26 日更新) /usr/local/ のプレフィックスを付けてインストールした場合にのみ機能しますがinstall_name_tool、実行可能ファイルと dylib で実行しない限り、プレフィックスを /usr/local から配置したい場所に変更する必要があります。それ。install_nameをテストできますotool -L filename(この理由の詳細については、こちらを参照してください)。

私が現在使用している最終ビルドには、GNU GCC 4.2.4 から取得した gcc/fortran および libgfortran ディレクトリへの更新も含まれています。これらのソースは、ローカルGCC の mirrorから取得しました。4.2.1 と 4.2.4 の間の変更はわずかで、ビルド スクリプトにはコードのアップグレードに必要なパッチが含まれています。

私が書いたbuild-gfortran.sh スクリプトは、不足している依存関係 ( mpfrgmp ) をダウンロードし、それらをコンパイルおよびクロスコンパイルし、アーキテクチャに依存するプリプロセッサ マクロで異なるヘッダーにパッチを適用し、lipo を実行してユニバーサル バイナリとライブラリを作成し、最終的に i386 と i386 の両方をサポートします。 x86_64 アーキテクチャ。このプロセスは、llvmCore、GCC の場合と同様です。ほとんどのコードは、 Apple の llvmgcc42 で提供されているbuild_llvmおよびbuild_gcc bash スクリプトからコピーしましたが、いくつかのコマンドを含め、一部を変更する必要がありましlipoinstall_name_tool

Xcodeを使用してAppleのgccをコンパイルする公式の方法は、私にとってはうまくいきgnumakeませんでした。これは、build_gcc の LANGUAGES 変数に「fortran」を追加するだけで機能すると思いました。

Scipy のコンパイルに関しては、まだそのビルドを完全に取得できません。C/C++ コンパイラとして clang と clang++ を使用する必要がありました。そうしないと、EXC_BAD_ACCESS malloc エラーが発生します。私が構築した gcc/g++ コンパイラは試していません。システムのコンパイラを使用しただけです。これは、Scipyインストール ページで Lion について報告されているとおりです。私は 11 個のエラーと 1 個の失敗にまで落ち込んでいます。これらはすべて、同じ 3 つの関数呼び出し (_fitpack._bspleval、numeric.asarray、testing.utils.chk_same_position) から発生しています。それはかなり良いと思いますが、すべてのテストに合格したいのですが...

于 2012-09-17T13:22:28.810 に答える