如何在Mac OS X Mountain Lion上编译可分发的Fortran二进制文件?

时间:2012-09-07 11:00:37

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

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

Apple的Native编译器

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

第三方二进制Fortran编译器

HPC

我只发现了一个专门为Mountain Lion发布gfortran二进制版本的网站:HPC网站。但是,我没有把它编译成SciPy,后来在SciPy的自述文件中看到它是"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年以来没有更新过,所以我没有尝试过..有人在山狮上试过吗?

MacPorts的

我想这将是安装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

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

兼容性

Xcode附带的编译器是(C的分支)GCC v4.2。但GCC目前的发布和开发分支机构分别是版本4.6和4.7。显然,GNU许可证的更改或某些东西阻止了Apple更新到更现代版本的GCC。那么,如果我要构建使用GCC的gfortran v4.6制作的动态库,那么它们是否可以与Xcode的本机编译器编译的C代码链接?至少,我认为产生的Mach-O二进制文件需要x86_64和i386代码路径。 GCC是否向后兼容Apple的(forks of?)GCC?我知道gfortran有-ff2c flag,但这版本是否稳定?

编译标志

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

如果您想知道我使用的是哪个编译标记,我在使用:source编译任何内容之前已经上传了the script I use to pastebin source ~/.bash_devenv

理想的OSX Fortran编译器

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

我没有那么多使用Xcode,但与它集成肯定会让其他用户受益。甚至英特尔仍然having problems将ifort集成到Xcode 4.4中,所以这不是我期望的工作......

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

(更新:) Apple的GCC

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

5 个答案:

答案 0 :(得分: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>

答案 1 :(得分:4)

如果您还没有注意到这一点:在较新版本的Xcode中,您必须以下列方式显式安装命令行工具:

偏好设置 - &gt;下载 - &gt;部件

然后单击命令行工具的“安装”按钮。这包括gfortran:

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

不可否认,这并没有解决我所有的需求(在某些情况下,“./ configure”脚本会抱怨他们无法“编译一个简单的fotran程序”)。

答案 2 :(得分:2)

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

$ brew install gfortran

答案 3 :(得分:2)

我知道你说你不喜欢MacPorts,但是如果你安装gcc48端口,它确实包含gfortran(尽管你还必须sudo port select --set gcc mp-gcc48让它来设置名为gfortran的符号链接。

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

答案 4 :(得分:1)

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

构建流程

在提出问题后,我下载了Apple的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的官方方法对我来说不起作用。我认为只需将“fortran”添加到build_gcc中的LANGUAGES变量即可。

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