- macOS环境配置

此教程不适用macOS 10.14(Mojave)及之前的版本。

如果你只想能用NONMEM,不在乎原理,这里有一个精简版的安装步骤How to install NONMEM on macOS

macOS系统环境配置 #

1. 安装macOS开发者工具 #

1.1 Xcode Command Line Tools #

Xcode Command Line Tools(简称CLT)是macOS的开发工具集,这其中的大部分工具我们都不会使用到,但却是成功配置NONMEM所必需的。macOS通常并不会预装CLT,因此我们需要手动安装它。你可以从Apple开发者网站上下载CLT的安装包然后再进行本地安装,但我更推荐下面这种使用命令行的方式。

在应用列表中打开终端程序Terminal.app,输入下列命令:

xcode-select --install

此时系统应该会如图提示安装CLT, 选择Install安装即可。

安装过程结束之后,建议使用以下命令来确认CLT的是否成功安装:

xcode-select -p

如果CLT安装成功的话,终端返回内容应该与下面相同或类似:

/Library/Developer/CommandLineTools

1.2 Homebrew #

CLT虽然已经包含了很多开发工具,但我们的核心需求Fortran编译器并不在CLT工具集中,因此我们我们还需要单独安装Fortran编译器,这里我非常推荐使用Homebrew。Homebrew是为macOS及Linux系统开发的工具包管理程序,它里面包含了开源社区维护的各类工具,而且是已经编译好的可执行程序,大大降低了我们安装和维护各类工具的门槛。后面我们会使用到Homebrew安装GFortran和Perl。

同样地,我们在Terminal.app中执行以下命令,Homebrew就会自动安装好:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

2. 安装Fortran编译器 #

NONMEM兼容的Fortran编译器只有GNU Fortran(GFortran)和Intel Fortran,前者开源。因此我们这里将使用Homebrew安装GFortran。GFortran有多个版本,但并非所有版本都能成功运行NONMEM,特别是在ARM架构的Mac电脑上,GFortran的最高版本不能超过11。截至2024年10月,以下配置已测试成功。

设备 macOS 版本 GFortran 版本 NONMEM 版本
Macbook Pro (M1, 2020) Big Sur 10.2 (x86) 7.5.1
Macbook Pro (M1, 2020) Monterey 11.3 (ARM) 7.5.1
Macbook Pro (M1, 2020) Ventura 11.5 (ARM) 7.5.1
Macbook Pro (M3 Pro, 2023) Sonoma 11.3 (x86) 7.5.1
Macbook Pro (M3 Pro, 2023) Sequoia 11.5 (ARM) 7.5.1
Macbook Pro (M4 Pro, 2024) Sequoia 11.5 (ARM) 7.6.0

我们可以在Terminal.app中执行以下命令,指定Homebrew安装GFortran 11:

brew install gcc@11

Homebrew会自动下载与当前macOS版本所对应的GCC工具包,其中包含我们需要的GFortran。

安装后GCC的命令集会自动添加到系统的环境变量里,包括我们需要的gcc-11gfortran-11。为了确认安装成功,我们可以在Terminal.app中使用如下命令:

gfortran-11 -v

这里你也可以使用gcc-11 -v。如果一切正常的话你应该会看到类似下面的返回信息:

Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/opt/homebrew/Cellar/gcc@11/11.5.0/bin/../libexec/gcc/aarch64-apple-darwin22/11/lto-wrapper
Target: aarch64-apple-darwin22
Configured with: ../configure --prefix=/opt/homebrew/opt/gcc@11 --libdir=/opt/homebrew/opt/gcc@11/lib/gcc/11 --disable-nls --enable-checking=release --with-gcc-major-version-only --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-11 --with-gmp=/opt/homebrew/opt/gmp --with-mpfr=/opt/homebrew/opt/mpfr --with-mpc=/opt/homebrew/opt/libmpc --with-isl=/opt/homebrew/opt/isl --with-zstd=/opt/homebrew/opt/zstd --with-pkgversion='Homebrew GCC 11.5.0' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues --build=aarch64-apple-darwin22 --with-system-zlib --with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk --with-ld=/Library/Developer/CommandLineTools/usr/bin/ld-classic
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.5.0 (Homebrew GCC 11.5.0)

安装NONMEM需要gcc-11gfortran-11这两个工具对代码进行编译,但NONMEM只能接受名为gccgfortran的命令(理论上可以改,但不太容易),所以我们仍然需要设置环境变量,手动将gccgfortran这两个命令指向gcc-11gfortran-11。这里提供两种方法:

软链接本质类似于创建快捷方式,我们可以给gcc-11gfortran-11这两个命令创建名为gccgfortran软链接从而实现执行后二者命令时执行gcc-11gfortran-11

打开Terminal.app,输入以下命令:

sudo ln -s $(which gcc-11) /usr/local/bin/gcc
sudo ln -s $(which gfortran-11) /usr/local/bin/gfortran

sudo命令会将其后面所接的命令以管理员的身份运行,此时系统会提示输入你的账户密码(即当前用户登录密码),注意此时屏幕上不会显示你所输入的内容,正常输入后按enter确认即可。

接下来输入以下命令来确认设置是否成功:

which gcc
which gfortran

返回内容应与下面一致:

/usr/local/bin/gcc
/usr/local/bin/gfortran

此方法并不总是有效,建议使用软链接。

顾名思义,这个方法的原理是给gcc-11gfortran-11添加别名,让我们在使用gccgfortran命令时其实是在调用gcc-11gfortran-11

打开Terminal.app,输入以下命令:

echo 'alias gcc="gcc-11"' >> ~/.zprofile
echo 'alias gfortran="gfortran-11"' >> ~/.zprofile

然后重启Terminal.app,输入以下命令来确认设置是否成功:

which gcc
which gfortran

如果成功的话,返回内容应与下面类似:

gcc: aliased to gcc-11
gfortran: aliased to gfortran-11

3. 关闭macOS“门禁” #

macOS有一套叫作“门禁”(Gatekeeper)的安全系统,用来检查用户想要运行的程序是否属于Apple认证的开发者。由于NONMEM安装程序未经过Apple认证,“门禁”系统会在NONMEM安装过程中触发,导致安装失败。我们接下来可以临时关闭这套系统。

打开Terminal.app,输入以下命令:

sudo spctl --global-disable

然后打开macOS的系统设置菜单,找到隐私与安全选项,其中“安全”选项下面有一项“Allow applications downloaded from”的设置,如下图所示:

最后一项“Anywhere”在关闭“门禁”后才会显示

最后一项“Anywhere”在关闭“门禁”后才会显示

在执行过上面的命令后,此时应该会看到系统已经选择了“Anywhere”,这样后面安装NONMEM就不会出现问题了。完成NONMEM安装之后,我们可以回到这里,选择“App Store and identified developers”,或者可以使用以下命令再开启“门禁”系统:

sudo spctl --global-enable