Mac (macOS Catalina, 10.15.2)にgfortranとPGI Fortran 19.10をインストールしたときの手順

# 概要
Mac Book Airを購入したので，無料で入手できる二つのFortranコンパイラをインストールした手順を，備忘録を兼ねてまとめます．

[PGI Community Edition](https://www.softek.co.jp/SPG/Pgi/pgi_community.html)は，インストールに成功したと見せかけて，正常に実行ファイルを作ることができません．その対処に試行錯誤した過程もまとめます．

著者はgfortran→PGI Fortranの順にインストールし，途中でCommand Line Tools for Xcodeを再インストールしたので，それ以外の順序では状況が異なる可能性があります．

# 使用環境

- Mac Book Air 2019年モデル (macOS Catalina, 10.15.2)
- GNU Fortran (gfortran) 9.2.0
- PGI Fortran 19.10 (PGI Community Edition)

# Homebrewのインストール
Macでパッケージ管理をする場合は，Homebrewを使うのが定石のようです．

HomebrewのWebページに行くと，インストールに必要なスクリプトの実行コマンドが書かれています．それをコピーし，ターミナルに貼り付けて実行します．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/a4f6c80f-d391-9847-55e9-b6f4475dc3db.png)

ターミナルは，DockにあるLaunchpadを開き，上部の検索枠でterminalを検索すれば見つかります．
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/454b482b-0c8d-8c96-af4d-d27a8db952fb.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/c7c86de8-913a-c4d3-ad32-9b7f3b9dcaa1.png)


ターミナルを起動し，スクリプトを貼り付けてEnterキーを叩いて実行してください．他のHomebrewのインストール方法を説明したページでは，Xcode等を先にインストールするよう書いてある場合もありますが，少なくとも現時点（2020年1月18日）では，Homebrewのインストールスクリプトを実行すると，必要なものをダウンロード・インストールしてくれます．

Command Line Tools for Xcodeは200 MBほどあるようで，ダウンロードが始まると少し時間がかかります．気長に待ちましょう．

# gfortranのインストール
Homebrewがインストールできたら，そのままgfortranをインストールします．gfortranは，gccをインストールすると，一緒にインストールされます．

homebrewでインストールするには，以下のようなコマンドを実行します．`%`はプロンプトなので，実際に実行する必要はありません．

```console
% brew install gcc
```

インストールが完了したら，そのままターミナルで`gfortran`コマンドを実行してください．以下のようなメッセージが表示されれば，インストールは成功しています．

```console
% gfortran
gfortran: fatal error: no input files
compilation terminated.
```

バージョンを確認したい場合は，`gfortran --version`を実行します．以下のようなメッセージが表示されます．

```console
% gfortran --version
GNU Fortran (Homebrew GCC 9.2.0_3) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

# PGI Fortranのインストール
PGI Fortranの**インストール自体は**さほど難しくありません．インストールで一番時間がかかるのは，ファイルのダウンロードだと思います．

## Xcode 11のインストール
PGI Community Editionを使うには，Xcodeの3.2以上が必要です．Xcodeは，Apple Developerのページからダウンロードします．[^1]

[^1]: 後で気づいたのですが，App Storeからもダウンロード，インストールできるようです．

[Apple Developerのページ](https://developer.apple.com/download/more)にアクセスし，Apple IDを使ってログインします．利用規約に同意するなどしてページを進んでいくと，More Downloads for Apple Developersのページにたどり着きます．左の検索窓でxcodeを検索すると，いくつかのバージョンが出てくるので，ここでは一番バージョンの新しい11.3を選択しました．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/5fcdd88a-535c-d0b9-1dc5-c5e227d0b6aa.png)

Xcodeの圧縮ファイル（Xcode_11.3.xip）のダウンロードが終了した後，Xcode_11.3.xipを解凍します．セキュリティの都合で展開できないと表示された場合は，Controlキーを押しながらXcode_11.3.xipをクリックして開くようです．セキュリティの警告が出てくるところまでは同じですが，開くボタンが現れます．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/604a0b0d-385d-e079-47b9-89870bfdc35d.png)


展開が終了すると，Xcode_11.3.xipと同じ場所にXcode.appが作られます．それを，Finderでアプリケーションに移動してから実行します．そうすると，インストールが始まります．インストール中にやることは，特にありません．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/11e28a86-60f3-5728-e816-ba2d5151ccdb.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/de9daf66-f39b-76e6-97b5-40622d80a07a.png)


## PGI Community Editionのインストール

PGI Community Editionをダウンロードします．検索エンジンで"PGI Fortran community edition"などと検索すると，[ダウンロードページ](https://www.pgroup.com/products/community.htm)が出てきます．

PlatformにあるmacOSのリンクをクリックすると，ダウンロードが始まります．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/9b3e27ad-e9d8-208e-25ea-ad6673580da1.png)


ダウンロード終了後，ダウンロードしたファイル（PGI-1910.dmg）を開くと，PGI-1910.dmgがマウントされ，フォルダが開きます．開いたフォルダの中にあるPGI 19.10.pkgを開くと，インストーラが立ち上がります．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/fb197deb-3e6d-f158-e89b-7ede9b131ca9.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/2d2c472b-e786-96e9-6d29-23a7528c2382.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/3fe86f97-dd01-4999-81b6-b29a365d8d89.png)

手順に従ってインストールを進めていきます．ここでも困ることはないでしょう．Xcodeをインストールしていないと，ここでXcodeが必要であるとのメッセージが表示され，先に進むことができません．

## PGI コンパイラをターミナルから実行するための設定
インストールが完了したからといって，ターミナルで`pgfortran`を実行しても，コマンドがないと言われてしまいます．

`pgfortran`の実行ファイルにパスが通っているかを確認するため，ターミナル上で`$PATH`を表示します．

```console
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

gfortranは`/usr/local/bin`にインストールされるので，実行ファイルにパスが通っています．しかし，PGI Fortranは`/opt/pgi`にインストールされるので，実行ファイルにパスが通っていません．

[NVIDIAの公式ドキュメント](https://www.pgroup.com/resources/docs/19.10/x86/pgi-install-guide/index.htm)を読むと，

> To initialize the PGI compilers and tools, import the PGI 2019 terminal settings file located in the PGI installation directory using Terminal's Shell | Import command. You can access the installation directory in the Open file dialog by typing Command-Shift-G and entering the path, for example /opt/pgi.

とあります．Finderを開き，Finder上で`Command+Shift+g`キーを押すと，フォルダの場所を直接指定して開けるので，`/opt/pgi`を入力して開きます．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/b8c27682-2653-a1a2-5f51-a09f3ddc37fa.png)

`/opt/pgi`にある`PGI.terminal`を開くと，ターミナルが立ち上がります．このターミナルでは，PGI Fortranの実行に必要なフォルダにパスが通っています．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/4a1d1ef4-3d6e-e079-3c34-fabf063f52c4.png)

```console
% echo $PATH
/opt/pgi/osx86-64/2019/bin:/opt/pgi/osx86-64/2019/mpi/mpich/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

% pgfortran
pgfortran-Warning-No files to process
```

gfortranと同様に，`pgfortran --version`でバージョンを確認できます．

```console
% pgfortran --version

pgfortran 19.10-0 64-bit target on macOS -tp haswell
PGI Compilers and Tools
Copyright (c) 2019, NVIDIA CORPORATION.  All rights reserved.
```

このような手順を踏まず，適当に開いたターミナルでもPGI Fortranを実行したい場合は，パスの設定をファイルに追加します．macOS Catalina 10.15.2では，標準のシェルがzshになっていました．zshは，ログイン時に実行するスクリプトを`.zshrc`に，`.zshrc`と共に読み込む環境変数を`.zshenv`に書くようです．

ホームディレクトリに移動して，`.zshenv`に以下の設定を追加します．

```sh
export PGI=/opt/pgi
export PATH=/opt/pgi/osx86-64/2019/bin:/opt/pgi/osx86-64/2019/mpi/mpic:$PATH
export MANPATH="$MANPATH":/opt/pgi/osx86-64/2019/man
export LM_LICENSE_FILE="$LM_LICENSE_FILE":/opt/pgi/license.dat
```

`source .zshenv`などを実行して`.zshenv`を再度読み込めば，Dockから開いたターミナルからでも実行できるようになっているはずです．

# PGI Fortranで実行ファイルをコンパイルできるようにする修正

コンパイラがインストールできたので，実際に下のようなプログラムを作成し，コンパイルしてみます．


```Fortran:main.f90
program main
    implicit none
    print *,"hello world"
end program main
```

gfortranでは，何の問題もなくコンパイルでき，実行ファイルa.outが作成されます．

```console
% gfortran main.f90

% ls
a.out		main.f90

% ./a.out
 hello world
```

一方，PGI Fortranでは，コンパイルが完了せずにエラーがでます．オブジェクトファイルは作られているので，リンク時のエラーのようです．

```console
% pgfortran main.f90
ld: file not found: /usr/lib/crt1.o

% ls
main.f90		main.o
```

この原因を調べるためにSoftek（PGIコンパイラの日本正規代理店）の[FAQ](https://www.softek.co.jp/SPG/Pgi/FAQ/faq2.html)を確認しても，解決策は見つかりませんでした．また，新しいmacOS（10.11以降）に起因した問題ということがわかりました．macOS 10.11以降で導入されたrootlessとよばれる仕組みにより，たとえrootであっても，[いくつかのシステムディレクトリ](https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/FileSystemProtections/FileSystemProtections.html#//apple_ref/doc/uid/TP40016462-CH2-SW1)にはアクセスできないようになったようです．rootlessを無効にする方法も見つかりましたが，コンパイラをインストールするためだけにそんな大仰なことはしたくありません．

Command Line Tools for Xcodeを別にダウンロードしてインストールし直しても，問題は解決されませんでした．[^2]

[^2]: これが後に問題を引き起こすことになります．

stackoverflowを調べていると，一つの[回答](https://stackoverflow.com/questions/44141166/ld-file-not-found-usr-lib-crt1-o)がみつかりました．2019年12月4日にdev-zeroという方が投稿した回答[^vote]で，時期も近く，かつ環境がPGI 19.10, macOS 10.15, XCode 11.2.1とほぼ同じです．その回答によると，インストール時に実行され，`localrc`を作るスクリプト`makelocalrc`が最新のXCodeに対応できておらず，手動でスクリプトを修正する必要があるということです．

[^vote]: This answer is usefulに1票も入っていませんが，今回の問題についてはこれが正解でした．

回答に従って，`/opt/pgi/osx86-64/19.10/bin/makelocalrc`の当該箇所

```sh
if test $xcodever -gt 10 ; then
     echo " Error: Unsupported XCode version "  $xcodever
     exit  -1
fi
```

を次のように修正します．

```sh
if test $xcodever -gt 11 ; then
     echo " Error: Unsupported XCode version "  $xcodever
     exit  -1
fi
```

修正の際は，`xcodever`で検索するとすぐに見つかります．修正したあと，`makelocalrc`を実行します．

```console
sudo /opt/pgi/osx86-64/19.10/bin/makelocalrc -x /opt/pgi/osx86-64/19.10
```

これで再度PGI Fortranでコンパイルを実行すると，リンクまで正しく行われ，実行ファイルが作成されるようになります．

```console
% pgfortran main.f90

% ls
a.out		main.f90		main.o

% ./a.out
 hello world
```

## `makelocalrc`の実行時にxcode-selectのエラーが出る場合

状況によっては，`makelocalrc`を実行した際にエラーが出る場合があります．

```console
% sudo /opt/pgi/osx86-64/19.10/bin/makelocalrc -x /opt/pgi/osx86-64/19.10
Password:
xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
/opt/pgi/osx86-64/19.10/bin/makelocalrc: line 446: test: -gt: unary operator expected
/opt/pgi/osx86-64/19.10/bin/makelocalrc: line 454: test: -ge: unary operator expected
/opt/pgi/osx86-64/19.10/bin/makelocalrc: line 489: test: -ge: unary operator expected
localrc has not changed
```

これは，試行錯誤の過程でCommand Line Tools for Xcodeを再度インストールしたことにより，パスが変わってしまったことが原因だと考えられます．

このようなエラーが出たときは，次の命令を実行して，Command Line Tools for Xcodeのパスをリセットします．

```console
% sudo xcode-select -r
```

その後，再度`makelocalrc`を実行すれば，`localrc`が作り直されます．

# まとめ

著者の実行手順を振り返る形で，Mac (macOS Catalina, 10.15.2)にgfortranとPGI Fortran 19.10のインストール手順を説明しました．

PGI Community Editionは，試用を目的としたライセンスで，1年に1,2回しかバージョンアップされません．そのため，今回出たインストール時の問題は，（Softek社のFAQに対策が載るとしても）しばらく解決されない可能性があります．

エディタにはVSCodeが利用できるので，過去の記事[^3][^4][^5]が参考になりそうです．

MacでもよいFortranライフを！

[^3]: https://qiita.com/implicit_none/items/d49c9fdf51c307d22819
[^4]: https://qiita.com/implicit_none/items/1e9314426edfd34d92f8
[^5]: https://qiita.com/implicit_none/items/6b5c3a65cddc6ecd8e52