Ale*_*ach 11 gfortran scipy xcode4.4 osx-mountain-lion
由于Apple已停止使用Xcode分发gfortran,我应该如何编译独立于架构的Fortran代码?我安装了Mac OS X Mountain Lion(10.8)和XCode 4.4,并安装了Command Line Tools软件包.
据我所知,Xcode C/C++/ObjC编译器使用GNU编译器集合的fork ,llvm作为后端; 后者我认为可以为英特尔和PPC架构编译和优化"通用"二进制文件.
我只找到一个网站,专门为Mountain Lion分发一个二进制版本的gfortran:HPC网站.但是,我没有把它编译成SciPy,后来在SciPy的自述文件中看到它"已知会产生错误的scipy二进制文件".
SciPy推荐的(免费)Fortran编译器是CRAN R服务器上的编译器,但尚未针对Mountain Lion进行更新.它们提供了构建通用编译器的说明和脚本,但同样,尚未针对Mountain Lion更新它.
在G95项目一直没有自2010年以来的更新,所以我没有尝试..任何人试图在此山狮?
我想这将是安装gfortran的最简单的方法,但是port search gfortran没有任何结果,而且我过去对MacPorts没有任何喜悦(对MacPorts没有任何冒犯;它看起来像一个非常活跃的项目,但我已经被Linux软件包管理员宠坏了,我最喜欢的经理是aptitude)所以在Mac OS X上,我从过去的源代码编译了软件和库.从来没有一个问题'直到现在......
在过去的几天里,我在互联网上挖了很多东西,我找到了其他的Fortran编译器,但我没有得到任何交叉编译通用二进制文件,或编译SciPy.
我编译了整个GCC集合(v4.6.3),包括autotools,automake,libtool和m4 - 就像GCC wiki和这个博客描述的那样 - 但是由此产生的编译器没有编译通用二进制文件,可能是因为LLVM没有被用作后端.
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旗帜,但这两个版本是否稳定?
我从源代码构建的GCC Fortran编译器不支持使用-arch编译标志.-arch x86_64 -arch i386在早期的OSX版本(Snow Leopard到Lion)中,我一直在CFLAGS和FFLAGS环境变量中包含标志.Python的distutils,可能还有其他OSX编译器,在配置为使用Xcode的通用SDK配置构建应用程序或框架时,希望这些标志能够正常工作.
如果你想知道我使用的是什么编译标志,我已经将我使用的脚本上传到了pastebin,source在我编译之前我使用:source ~/.bash_devenv.
-arch标志指定的ppc和intel(32和64位)通用二进制文件.我没有那么多使用Xcode,但与它的集成肯定会让其他用户受益.甚至英特尔仍然在将ifort集成到Xcode 4.4 中时遇到问题,所以这不是我期望的工作.
如果您阅读了以上所有内容,那么谢谢!您可以说我不反对从源代码构建我自己的Fortran编译器,但它是否可能?我错过了什么吗?配置标志可能吗?如果这样的编译器还没有,那为什么不呢?!
Apple在opensource.apple.com上提供了其修补版GCC的源代码.这实际上包含了gfortran的源代码,但你知道什么 - 它不能编译(很容易).我正在编写构建脚本以使其工作.不幸的是,我不得不应用几个补丁,并了解构建GNU软件的"Apple方式".这是我想的方式.有什么原因不应该吗?如果我让它工作,我会更新答案...
我最终编译了 Apple开发人员工具源代码页上提供的源代码 gfortran 。现在似乎工作正常 - 我已经成功编译了 x86-64 和 i386/i686 LAPACK、ATLAS 和 BLAS fortran 库 - 但有一些 ranlib 测试在make -k test构建目录中运行时失败。(如果有人想要的话,我可以提供有关pastebin或其他地方的更多信息......)
构建过程
问完问题后,我下载了 Apple 的llvmgcc42 源代码 tar 存档,其中包括 llvm/gcc C、C++、ObjC 和 fortran 编译器的源代码,并花了一些时间尝试编译 gfortran 的通用版本。在我的四核 2.8GHz Mac Pro 上,构建大约需要 30-60 分钟,并且成为一个相当复杂的过程,因此我为其编写了一组构建脚本,并在github.com上分享了这些脚本。
....
如果有人想要一份副本,我将暂时在这里保留我的构建的 tar 存档。(更新于 2012 年 9 月 26 日)只有使用 /usr/local/ 前缀安装时它才有效,除非您install_name_tool在可执行文件和 dylib 上运行,将前缀从 /usr/local 更改为您想要放置的任何位置它。您可以使用以下命令测试install_nameotool -L filename(有关其原因的更多信息请参见此处)。
我现在使用的最终版本还包括对 gcc/fortran 和 libgfortran 目录的更新,这些目录是我从 GNU GCC 4.2.4 获得的。这些来源是我从当地GCC 的镜像中获得的。4.2.1 和 4.2.4 之间只有微小的变化,构建脚本包括升级代码所需的补丁。
我编写的build-gfortran.sh 脚本下载缺少的依赖项(mpfr和gmp),编译和交叉编译它们,使用依赖于体系结构的预处理器宏修补不同的标头,并运行 lipo 来创建通用二进制文件和库,最终支持 i386 和x86_64 架构。对于 llvmCore,然后是 GCC,该过程类似。我主要从Apple 的 llvmgcc42 提供的build_llvm和build_gcc bash 脚本中复制代码,但其中一些必须修改,包括一些lipo命令 install_name_tool。
使用 Xcode 编译 Apple gcc 的官方方法gnumake对我来说不起作用。我认为只需将“fortran”添加到 build_gcc 中的 LANGUAGES 变量中就可以了。
关于编译Scipy,仍然无法完美地构建该构建。我必须使用 clang 和 clang++ 作为 C/C++ 编译器,否则我会收到 EXC_BAD_ACCESS malloc 错误。还没有尝试过我构建的 gcc/g++ 编译器,只是使用了系统编译器。这是 Scipy安装页面上有关 Lion 的报告。我减少到 11 个错误和 1 个失败,这些错误都是由相同的 3 个函数调用(_fitpack._bspleval、numeric.asarray、testing.utils.chk_same_position)引起的。认为这很好,但我希望每项测试都能通过......