- 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 (13-inch, M1, 2020) Big Sur 10.2 (x86) 7.5.1
Macbook Pro (13-inch, M1, 2020) Monterey 11.3 (ARM) 7.5.1
Macbook Pro (13-inch, M1, 2020) Ventura 11.5 (ARM) 7.5.1
Macbook Pro (14-inch, M3 Pro, 2023) Sonoma 11.3 (x86) 7.5.1
Macbook Pro (14-inch, M3 Pro, 2023) Sequoia 11.5 (ARM) 7.5.1

我们可以在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,输入以下命令:

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

软链接本质类似于创建快捷方式,我们可以给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

以上方法二选其一即可,至此NONMEM安装所需要的所有系统设置就都已经完成了。

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