【问题标题】:How to compile distributable Fortran binaries on Mac OS X Mountain Lion?如何在 Mac OS X Mountain Lion 上编译可分发的 Fortran 二进制文件?
【发布时间】:2012-09-01 06:13:06
【问题描述】:

由于 Apple 已停止使用 Xcode 分发 gfortran,我应该如何编译独立于架构的 Fortran 代码?我安装了 Mac OS X Mountain Lion (10.8) 和 XCode 4.4,并安装了 Command Line Tools 包。

Apple 的原生编译器

据我所知,Xcode C / C++ / ObjC 编译器使用GNU compiler collection 的一个分支,以llvm 作为后端;我认为后者可以为 Intel 和 PPC 架构编译和优化“通用”二进制文件。

第三方二进制 Fortran 编译器

高性能计算

我只找到了一个专门为 Mountain Lion 分发二进制版本的 gfortran 的网站:HPC 网站。但是,我没有得到这个来编译 SciPy,后来在 SciPy 的 README 中看到它是"known to generate buggy scipy binaries"

CRAN/R

SciPy 推荐的(免费)Fortran 编译器是 CRAN's R 服务器上的编译器,但尚未针对 Mountain Lion 进行更新。他们为 Building a Universal Compiler 提供了说明和脚本,但同样,这还没有为 Mountain Lion 更新..

G95

G95 project 自 2010 年以来一直没有更新,所以我没有尝试过。有人在 Mountain Lion 上尝试过吗?

Mac 端口

我想这将是安装 gfortran 的最简单方法,但 port search gfortran 什么也没有,而且我过去对 MacPorts 没有任何兴趣(没有冒犯 MacPorts;它看起来像一个非常活跃的项目,但我已经被 Linux 包管理器宠坏了,我最喜欢的管理器是 aptitude)所以在 Mac OS X 上,我过去从源代码编译软件和库。直到现在都不是问题......

构建 Fortran 编译器

在过去的几天里,我在网上搜索了很多,找到了其他 Fortran 编译器,但我没有找到任何可以交叉编译通用二进制文件或编译 SciPy。

GCC - Gnu 编译器集合

我编译了整个 GCC collection (v4.6.3),包括 autotools、automake、libtool 和 m4 - 就像 GCC wikithis blog 描述 - 但生成的编译器没有编译通用二进制文件,可能是因为 LLVM没有用作后端。

龙蛋

DragonEgg 是一个“用 LLVM 替换 GCC 的优化器和代码生成器的 gcc 插件”。这看起来很有趣,但我不知道如何使用它来编译“llvm-gfortran-4.x”。这个可以吗?

兼容性

Xcode 附带的编译器是(一个 fork 的?)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 flag,但这是否跨版本稳定?

编译标志

我从源代码构建的 GCC Fortran 编译器不支持使用 -arch 编译标志。我在早期 OSX 版本(Snow Leopard 到 Lion)的 CFLAGS 和 FFLAGS 环境变量中都包含了标志 -arch x86_64 -arch i386。 Python 的 distutils 以及可能的其他 OSX 编译器在配置为使用 Xcode 的通用 SDK 构建应用程序或框架时,希望这些标志能够工作。

如果您想知道我使用什么编译标志,我已经上传了the script I use to pastebin,我在编译任何东西之前source,使用:source ~/.bash_devenv

理想的 OSX Fortran 编译器

  • 创建 ppc 和 intel(32 位和 64 位)通用二进制文件,使用 -arch 标志指定。
  • 使二进制文件与 XCode 的链接器兼容。
  • 编译 SciPy,没有错误(与 numpy 的 distutils 和 f2py 兼容)。

我不怎么使用 Xcode,但与它集成肯定会让其他用户受益。甚至 Intel 仍在 having problems 将 ifort 集成到 Xcode 4.4 中,所以这不是我期望的工作..

如果您阅读了以上所有内容,那么谢谢您!您可能会说我并不反对从源代码构建自己的 Fortran 编译器,但它甚至可能吗?我错过了什么吗?一个配置标志可能吗?如果还没有这样的编译器,那为什么不呢?!

(更新:)Apple 的 GCC

Apple 在opensource.apple.com 上提供了其修补版 GCC 的源代码。这实际上包括 gfortran 的源代码,但是您知道什么 - 它不能(容易)编译。我正在编写构建脚本以使其正常工作。不幸的是,我不得不应用几个补丁,并了解"the Apple way" 构建 GNU 软件。这是我认为要走的路。有什么不应该的理由吗?如果我让它工作,我会更新答案......

【问题讨论】:

标签: scipy osx-mountain-lion gfortran xcode4.4


【解决方案1】:

我知道你说你不喜欢 MacPorts,但如果你安装了gcc48 端口,它实际上包括gfortran(虽然你还必须做sudo port select --set gcc mp-gcc48 来设置它名为gfortran 的符号链接)。

此外,FWIW,MacPorts 选项不一定是二进制文件 - MacPorts 实际上可以从源代码构建它,这就是为什么有时需要一段时间。另一方面,它有时似乎也会从某个地方获取存档的二进制文件,但我认为这取决于 portfile 的原始作者上传的内容。

【讨论】:

    【解决方案2】:

    您可以使用 brew(或 Homebrew)来安装 gfortran。

    $ brew install gfortran

    【讨论】:

      【解决方案3】:

      如果您还没有注意到这一点:在较新版本的 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 程序”)。

      【讨论】:

      • 那个 gfortran 目标 (darwin10) 是雪豹的。我没有那个 gfortran;我拥有的 Xcode (4.5) 仅随 OSX SDK 10.7 和 10.8 (Lion 和 Mountain Lion) 一起提供。 Xcode 附带的编译器是为 Lion 构建的——目标(来自gcc -v)是 i686-apple-darwin11。我确实安装了命令行工具(如第二行问题的链接中所述),但已经开始使用 MacPorts 的 GCC4.7,因为它编译的代码比 Apple 相当古老的 GCC4.2 和 clang 更快,根据我运行的一些 ATLAS 和 numpy 基准测试..
      【解决方案4】:

      我在从http://r.research.att.com/tools/gcc-42-5666.3-darwin11.pkg 安装 gfortran 后设法编译,正如here 解释的那样。不过,我不得不尝试打开包裹几次。第一次说只能安装 App Store 中的应用程序。安装 gfortran 后,python setup.py buildpython 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>
      

      【讨论】:

        【解决方案5】:

        我最终编译了苹果developer tools source code page 提供的源代码的 gfortran。现在这似乎工作正常 - 我已经成功编译了 x86-64 和 i386/i686 LAPACK、ATLAS 和 BLAS fortran 库 - 但是在构建目录中运行 make -k test 时,有一些 ranlib 测试失败。 (如果有人愿意,我可以提供有关该 pastebin 或其他地方的更多信息......)

        构建过程

        问完问题后,我下载了苹果的llvmgcc42 source code tar archive,里面包含了llvm/gcc C、C++、ObjC 和fortran 编译器的源代码,并花了一些时间尝试编译gfortran 的通用版本。在我的四核 2.8GHz Mac Pro 上构建大约需要 30 到 60 分钟,并且变得相当复杂,因此我为它编写了一组构建脚本,我已经在 github.com 上分享了这些脚本。

        ....

        如果有人想要一份副本,我会暂时保留我的构建 here 的 tar 存档。 (2012 年 9 月 26 日更新)它只有在安装前缀为 /usr/local/ 时才有效,除非您在可执行文件和 dylib 上运行 install_name_tool,将前缀从 /usr/local 更改为您的任何位置想放。您可以使用otool -L filename 测试install_name(有关原因的更多信息是here)。

        我现在使用的最终版本还包括对 gcc/fortran 和 libgfortran 目录的更新,这是我从 GNU GCC 4.2.4 获得的。我从我当地的GCC's mirror 获得这些资源。 4.2.1 和 4.2.4 之间只有微小的变化,构建脚本包含升级代码所需的补丁。

        我写的 build-gfortran.sh script 下载了缺少的依赖项(mpfrgmp),编译和交叉编译它们,使用依赖于架构的预处理器宏修补不同的头文件,并最终运行 lipo 来创建通用二进制文件和库支持 i386 和 x86_64 架构。 llvmCore 和 GCC 的过程类似。我主要从 Apple 的 llvmgcc42 提供的 build_llvmbuild_gcc bash 脚本中复制代码,但其中一些必须修改,包括一些 lipoinstall_name_tool 命令。

        使用 Xcode 的 gnumake 编译 Apple 的 gcc 的官方方法对我不起作用。我认为这应该可以通过在 build_gcc 中的 LANGUAGES 变量中添加“fortran”来实现。

        关于编译 Scipy,仍然无法完美地构建该建筑。我不得不使用 clang 和 clang++ 作为 C/C++ 编译器,否则我会收到 EXC_BAD_ACCESS malloc 错误。没有尝试过我构建的 gcc/g++ 编译器,只是使用了系统编译器。这是关于 Lion 的报道,在 Scipy install page 上。我有 11 个错误和 1 个失败,它们都是由相同的 3 个函数调用(_fitpack._bspleval、numeric.asarray、testing.utils.chk_same_position)引发的。觉得这很好,但我希望每个测试都能通过...

        【讨论】:

        • 这看起来非常棒。在 Linux 上,我经常只使用../gcc-4.7-20120714/configure --enable-languages=c,c++,fortran --with-cloog --with-ppl=/usr/local --prefix=/usr/local/gcc-4.7; make -j 16; sudo make install 和来自 gcc.gnu.org 的 svn 快照,它就可以工作。
        猜你喜欢
        • 2012-09-15
        • 1970-01-01
        • 1970-01-01
        • 2012-11-15
        • 2013-09-24
        • 1970-01-01
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多