WindowsにFortranコンパイラをインストールするならQuickstart Fortran on Windowsを使おう

# 概要
[Quickstart Fortran on Windows](https://github.com/LKedward/quickstart-fortran)を使うと，

- gfortran
- Fortran Package Manager
- Git for Windows
- OpenBLAS (BLAS, LAPACK)

をまとめてインストールできます．また，付属のバッチファイルを使うことで，[Fortran Standard Library](https://github.com/fortran-lang/stdlib)をインストールできます．

# 環境
- Windows 11
- Quickstart Fortran on Windows v1.8

# 背景
Fortranには，多種のコンパイラが存在しています．その中でも，フリーのコンパイラとして，gfortranがよく利用されています．Linuxを利用している場合，OSが提供するパッケージマネージャを使えばgfortranを簡単にインストールできます．それ以外の方法は，ソースからビルドする以外は特に言及されません．一方で，Windowsの場合は，様々なインストール方法が存在します．
- Windows向けにビルドされたバイナリを使う方法．[equation.com](http://www.equation.com)，[TDM GCC](https://jmeubank.github.io/tdm-gcc/articles/2021-05/10.3.0-release)，[MinGW-w64](https://www.mingw-w64.org/downloads/#mingw-builds)等でインストーラが配布されています．
- Unix-Likeな環境をインストールして，その環境で提供されるパッケージマネージャを利用する方法．Cygwin, MSYS2, WSL等が存在します．
- Windows向けのパッケージマネージャを使う方法．選択肢は多くありませんが，例えば[Scoop](https://scoop.sh)があります．

選択肢が多いことは（一般的には）良い事ですが，これからFortranを勉強するぞ！と考えている人に，この選択肢を突きつけて選択を迫るのは酷でしょう．Windowsユーザにとってなじみのあるインストーラを使う方法でインストールしようにも，上で例示しているだけでインストーラが3通りもあります．

また，近年Fortranの利便性を高めるOSSの開発が盛んになっており，そのインストール方法なども調べるとなるとかなり大変です．

この状況に対して，Laurence Kedward氏はWindowsへのFortranインストールを簡略化するQuickstart Fortran on Windowsを作成しました．Laurence Kedward氏はFortran-langコミュニティの中心人物であり，論文[The State of Fortran](https://doi.org/10.1109/MCSE.2022.3159862)[^paper]の筆頭著者でもあります．

[^paper]: L. J. Kedward et al., "The State of Fortran," in Computing in Science & Engineering, vol. 24, no. 2, pp. 63-72, 1 March-April 2022, doi: 10.1109/MCSE.2022.3159862.

# Quickstart Fortran on Windows
## インストーラのダウンロード
Quickstart Fortranのインストーラは，［githubリポジトリ](https://github.com/LKedward/quickstart-fortran)からダウンロードします．

右カラムのReleasesからReleaseページに移動し，LatestのAssetsから`quickstart-fortran-installer.exe`をダウンロードします．現在の最新バージョンは，タグの記述によるとv1.8です．一部のブラウザでは，exeが検証されていない等の警告が出される場合があります．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/bf02e679-43fe-4e68-d78c-88ded95e5901.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/08be34bf-8a82-32d5-0504-e0e385adf7e3.png)

## インストール
ダウンロードしたインストーラをダブルクリックしてインストールします．このとき，WindowsによってPCが保護されましたというメッセージが表示され，インストーラの実行が妨げられる場合があります．作成者の身元は明らかですし，著者は1年以上使っていますが，危険にされされたことはありません．

インストールを続行する場合は，メッセージ下の詳細情報をクリックすると現れる実行ボタンを押します．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/c081510e-096c-4ae2-cb38-1ed786f23eb0.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/b2e85753-ca99-b5b7-ba2b-3dd7be3a3039.png)

インストールを続行すると，インストールするコンポーネントの選択画面が出てきます．ここでは，インストール済みのGitのチェックを外し，gfortranとfpmのインストールをするようにしました．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/85d45271-4617-fc2f-899a-7ae996ad867d.png)

[Next>]ボタンをクリックすると，インストールディレクトリの選択画面が出てきます．Quickstart Fortranは管理者権限を要求しないので，標準ではユーザディレクトリ以下の，`AppData\Local\`にインストールされます．この標準のディレクトリ（`%USERPROFILE%\AppData\Local\quickstart_fortran`）を，以降ではインストールディレクトリと呼びます．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/8ef7763f-8ed6-0a05-7bac-3812c45862a6.png)

[Install]ボタンをクリックするとインストールが開始されます．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/ef1bdc6c-37a4-09ac-c79f-785f15c31df0.png)

インストールが完了したら，[close]ボタンをクリックしてインストーラを終了します．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/0e793feb-1c99-c66d-7ca4-73330de9cab1.png)

設定次第では，環境変数が追加されたり，デスクトップにターミナルへのショートカットが作成されたりします．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/db4d4e3d-9fc9-d149-56d5-98977be82ba9.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/036f4e5d-fb35-04f3-cd3f-f98ae9f98fea.png)

試しに，デスクトップに作成されたショートカット`QuickStart Fortran Command Line`を実行してみると，コマンドプロンプト（あるいはWindows Terminal）が起動します．

例えば
```console
> gfortran --version
```
を実行してみると，コンパイラがインストールされていることを確認できます．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/38c2d96b-d667-831a-4f0a-aed308139ba4.png)

インストール時の設定でパスを通すようにしておけば，QuickStart Fortran Command Line以外の方法でコマンドプロンプトを開いても，gfortranを実行できるようになっているはずです．同様に，Fortran Package Manager (fpm)をインストールするようにしていれば，fpmも実行できるようになっています．

## その他インストールされる便利機能
gfortranやfpm以外に，役に立つバッチファイルがインストールディレクトリ以下の`utils`ディレクトリにインストールされます．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/572f1df2-4f68-1e67-a6b5-b102a227c6c8.png)

- `intel-setvars.bat`は，gfortranとは関係ありません．Intel Fortran (Intel oneAPI Base Toolkit + HPC Toolkit)をインストールしている際に，コマンドプロンプトからifortやifxを呼ぶための環境変数を設定します．Intel Fortranを使うときは，統合されたVisual StudioからGUI経由で呼び出すか，Intel Fortranをインストールした際に作られるショートカット`Intel oneAPI command prompt for Intel 64 for Visual Studio 20xx`を実行して環境変数が設定されたコマンドプロンプトを立ち上げる必要がありました．複数のコンパイラを一つのコマンドプロンプトで利用する場合は結構面倒なことをしていたのですが，このバッチファイルが用意されたおかげで，Intel Fortranの呼出しが簡単になりました[^setvars]．
- `make.bat`は，インストールされるGNU Make 4.3のエイリアスを提供します．インストールされるGNU Makeのファイル名が`mingw32-make.exe`となってしまっているため，コマンドプロンプトから`make`で呼び出すために用意されています．シンボリックリンクを張ればよいのですが，Windowsでシンボリックリンクを張るには管理者権限が必要であるため，管理者権限を要求しないQuickstart Fortran on Windowsではインストール時にシンボリックリンクを張ることはできません．
- `setup-stdlib.bat`は，Fortran Standard Library (stdlib)のソースをgithubから取得し，ビルドした後ローカルにstdlibをインストールします．

[^setvars]: Quickstart Fortran on Windowsで提供される機能のうち，これが一番有用だったかもしれません．

## fpmのアップデート
[fpm](https://github.com/fortran-lang/fpm)の最新バージョンは0.7.0ですが，Quickstart Fortran on Windowsでインストールされるfpmのバージョンは，一つ前の0.6.0です．これを最新バージョンに置き換えるには，githubの[Releaseページ](https://github.com/fortran-lang/fpm/releases)から最新版のバイナリ`fpm-0.7.0-windows-x86_64.exe`をダウンロードして名前を`fpm.exe`に変更し，インストールディレクトリ配下の`fpm`ディレクトリにあるfpm.exeを上書きするだけです．

## stdlibのインストールと参照
`setup-stdlib.bat`を利用した，stdlibのインストールと参照について説明をしておきます．

stdlibのインストールは，`setup-stdlib.bat`を実行するだけです．実行すると，githubからソースが取得され，ビルドされたモジュールファイルとライブラリがコピーされます．モジュールファイルは，gfortranの標準のincludeディレクトリ（インストールディレクトリ以下`\mingw64\lib\gcc\x86_64-w64-mingw32\バージョン\finclude`）にコピーされます．そのため，ビルドする際に，`-I`等でインクルードディレクトリを指定する必要はありません．ライブラリは標準のlibディレクトリ（インストールディレクトリ以下`\mingw64\lib`）に`libstdlib.a`という名前でコピーされます．リンクする際は，コンパイラに`-lstdlib`を渡すことでリンクできます．

参照の例として，fpmのプロジェクトの設定を示します．

fpmプロジェクトを作成するには，`fpm new`コマンドを用います．

```console
> fpm new qsf --app
```
`--app`オプションを指定すると，fpmで作成したプロジェクトディレクトリの下に，`app`ディレクトリとメインルーチンとなる`main.f90`を作成します．
```console
qsf
├─app
│  └─main.f90
├─fpm.toml
└─README.md
```

stdlibのバージョン番号を参照するコードを書いてビルドしてみると，`stdlib_version`が参照できないというエラーが現れます．

```Fortran:app\main.f90
program main
    use :: stdlib_version
    implicit none
    character(:), allocatable :: version

    call get_stdlib_version(string=version)
    print *, version
end program main
```

```console
qsf> fpm run
<ERROR>*cmd_run*:targets error:Unable to find source for module dependency: "stdlib_version" used by "app\main.f90"
STOP 1
```

このエラーを回避するには，プロジェクトルートにある`fpm.toml`の`[build]`の項目に設定を追記します．
```diff
[build]
auto-executables = true
auto-tests = true
auto-examples = true
+ 
+ external-modules = ["stdlib_version"]
+ link = ["stdlib"]
```

この2行を追加することで，外部（Fortranコンパイラ付属のintrinsicなモジュールではない）モジュール`stdlib_version`を参照すること，ライブラリ`libstdlib.a`をリンクすることをコンパイラに指示します．fpmの設定については，[fpm (Fortran Package Manager)の設定ファイルの解説](https://qiita.com/implicit_none/items/99c5d12f5c18733c66fd)で詳しく説明しています．

設定を追加して実行すると，stdlibのバージョンを参照できている（＝外部モジュールを参照し，ライブラリをリンクできている）ことを確認できます．
```console
qsf>fpm run
qsf.exe                                done.
[100%] Project compiled successfully.
 0.2.1
```

# まとめ
インストールするgfortranにこだわりがなければ，Quickstart Fortran on Windowsを検討してみてください．