VSCodeでFortranのプログラムをコンパイル・デバッグするための設定

# 概要
VSCodeからFortranを利用するための設定のまとめと課題です．
環境はWindowsで，Windows上にインストールしたVSCodeから，下記2通りのコンパイラを使う設定をまとめます．

- WindowsにインストールしたFortranコンパイラ
- WSL上にインストールしたFortranコンパイラ

WSL上にインストールしたコンパイラをWindowsから使うために試行錯誤していたのですが，幸か不幸かその翌日に[Remote Development with VS Code](https://code.visualstudio.com/blogs/2019/05/02/remote-development)のアナウンスがあったので，知識の供養も兼ねています．

## まとめ

|コンパイラ|コンパイル|デバッグ|
|:--|:--:|:--|
|gfortran (windows)|成功|失敗<br>（インストール環境の問題．mainルーチン内へステップインできない．）|
|gfortran (Ubuntu for WSL)|成功|成功|
|Intel (windows)|成功|失敗（デバッガの互換性の問題．デバッグウィンドウに情報を表示できない．）|
|PGI Fortran (windows)|成功|不可|
|PGI Fortran (Ubuntu for WSL)|成功|不可|

# 使用環境
|コンパイラ|バージョン|
|:--|:--|
|Intel Fortran for Windows|17.0.4.210|
|PGI Fortran for Windows|18.7|
|gfortran for Windows|4.10.0|
|PGI Fortran for Linux|19.4 (Ubuntu on WSL)|
|gfortran for Linux|7.3.0 (Ubuntu on WSL)|

# VSCode拡張のインストール
VSCodeは軽量で優秀なエディタです．拡張機能で言語サポートをインストールすることにより，さらに利便性が向上します．Fortran向けの言語拡張は多くはありませんが，非常に有用です．個人的な感想ですが，Visual Studioに統合された環境と比較しても，プロジェクトのプロパティ（コンパイルオプションの選択）を除いて，VSCodeの方が支援が優秀です．
Fortran用の拡張機能としては，下記2件をインストールしておけばとりあえずはOKでしょう．

- [Modern Fortran](https://marketplace.visualstudio.com/items?itemName=krvajalm.linter-gfortran)
- [FORTRAN IntelliSense](https://marketplace.visualstudio.com/items?itemName=hansec.fortran-ls)

Modern FortranはSyntax Highlightと変数・関数・モジュール定義への移動，FORTRAN IntelliSenseは変数の入力補完と関数・サブルーチン引数の入力支援やホバーによる関数の引数定義の確認などが利用できます．





![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/0cc0737e-64e5-37c0-25fc-a64d28ed7fd9.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/3bb0da14-4689-832b-3dba-6535a3e2f4ee.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/c9f15234-05e9-b068-ff43-b83d09d242c1.png)

Modern Fortranでは変数の入力支援はできませんが，組込関数・サブルーチンの支援機能があります．FORTRAN IntelliSenseには，組込関数・サブルーチンに加えて，変数およびモジュールの支援機能があります．そのため，拡張機能を二つインストールすると，組込関数の入力候補が2重に現れます．
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/ecde31db-dff1-2be3-e669-ac11698b931d.png)

インストールは，VSCodeの拡張機能ウィンドウで"Modern Fortran"を検索すれば簡単に見つけられます．ただし，バージョン違いの複数のModern Fortranが見つかるので，一番新しいバージョンをインストールしましょう．

Modern Fortranはlintingにgfortranを使うので，Modern Fortranインストール後，VSCodeの設定からgfortranの実行ファイルのパスを追加します．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/96151cf8-af67-fee7-3674-bf853aef9a08.png)

## FORTRAN IntelliSenseのインストールと設定
Modern Fortranと同様，VSCodeの拡張機能ウィンドウからインストールします．FORTRAN IntelliSenseは[Fortran Language Server](https://github.com/hansec/fortran-language-server)を利用するので，インストールしてパスを設定します．著者はAnacondaを使っていますが，Anacondaのチャンネルでは見つからなかったので，`conda`ではなく`pip3`を使ってインストールします．

```console
pip3 install fortran-language-server
```

インストール後は，これもVSCodeの設定からfortran-language-serverの実行ファイルのパスを追加します．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/3b1cac99-434e-884f-986b-41cafba64750.png)

# VSCodeのビルド，デバッグの設定（一般的な話）
VSCodeでは色々な単位でソースを管理できます（ファイル，フォルダ単位，ワークスペース単位）．VSCodeのメニューからフォルダーを開くか，フォルダーをVSCodeにドラッグアンドドロップすると，フォルダ単位で管理されるようになります．
このようにすると，ビルドやデバッグの設定はフォルダ単位で管理されるようになります．開いたフォルダの配下に`.vscode`フォルダが作られ，そこに`tasks.json`と`launch.json`が作られます．ビルドの設定は`tasks.json`，デバッグの設定は`launch.json`に書きます．

# gfortran (on Windows)
gfortranはUnofficialなバイナリ[^unoffbin]を`C:\Program Files (x86)\gfortran`に置き，パスを通してあります．

[^unoffbin]: 現在はリンクが切れているのでダウンロードできません．

配列の値を2倍して表示するプログラムをサンプルとして用いました．

## サンプルプログラム
```Fortran:main.f90
program main
    implicit none

    integer :: i(4) = [4, 1, 2, 3]
    integer :: n

    do n = 1, size(i)
        i(n) = i(n)*2
    end do
        
    do n = 1, size(i)
        print *,i(n)
    end do

end program main
```

## ビルド（コンパイル）の設定
メニューバーの**ターミナル**→**ビルドタスクの実行**を選択するか，ショートカットキー`Ctrl+Shift+B`を入力すると，コマンドパレットに**実行するビルドタスクはありません．ビルドタスクを構成する**というメッセージが現れるので，それを選択→**テンプレートからtasks.jsonを生成**→**Others**と選んでいくと，`tasks.json`が作られます．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/70343fa7-d7c5-a214-0b9d-bc39a5d23a83.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/2ed86ed2-f900-5e43-d009-8c574d778aed.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/07d99d78-35b7-73a7-7432-957b0187ab8b.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/a074f4f2-4db4-271c-0dc1-423c24572f3d.png)

色々と編集し，最終的にtasks.jsonは以下のようになりました．

```JSON:tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build using gfortran",
            "type": "shell",
            "command": "gfortran",
            "args":[
                "-g",
                "-O0",
                "-o",
                "${workspaceFolder}\\${fileBasenameNoExtension}.exe",
                "${fileBasename}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": true,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": false
            }
        }
    ]
}
```

`"command"`がコンパイラの実行コマンド，`"args"`がコンパイルオプションです．`"-o"`で出力ファイルのパスまで指定しているのは，WSLを使うときの設定と統一するためです．変数を使うことで，一般的な設定を書くことができます．
`"presentation"`は必須の設定ではありませんが，`"focus": true`を設定しておくと，ビルド時に統合ターミナルにフォーカスが移るので，ビルドタスクが終了後，Enterキーを押せばターミナルを閉じつつエディタに戻れます．

tasks.json内で使っている変数の意味は以下の通りです[^variableref]．下記表には，後で使う変数も挙げてあります．

|変数名|意味|
|:--|:--|
|`${fileBasename}`|現在開いているファイル名|
|`${fileBasenameNoExtension}`|現在開いているファイル名（拡張子を除く）|
|`${workspaceFolder}`|VSCodeで開いているフォルダ名（フォルダまでのパスを含む）|
|`${workspaceFolderBasename}`|VSCodeで開いているフォルダ名（フォルダまでのパスを含まない）|
|`${env:windir}`|Windowsのディレクトリ|

[^variableref]: [Variables Reference](https://code.visualstudio.com/docs/editor/variables-reference)

## デバッグの設定
メニューバーの**デバッグ**→**デバッグの開始**を選択するか，F5キーを入力することでデバッグが開始されます．`launch.json`を設定していない場合には，**環境の選択**というメニューが出てくるので，**C++(GDB/LLBD)**を選択します．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/7beb71ef-d04a-14b0-b08e-ea1a7cc46ae4.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/4f9c46ac-be47-7ae8-320b-96a05958de5d.png)

設定する箇所は，`"program"`と`"miDebuggerPath"`です．デバッグする実行ファイルのパスとデバッガのパスを入力します．`"stopAtEntry"`が`false`だと，デバッグ時にプログラムが途中で止まることなく実行され，プログラムが終了します．ここは`true`に変更しておきます．


```JSON:launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}\\${fileBasenameNoExtension}.exe",
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "miDebuggerPath": "C:\\Program Files (x86)\\gfortran\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}
```

`launch.json`を設定するとデバッグができるようになります．しかし，gfortranのunofficial Binaryを置いただけだと，デバッグを正しく実行できないようです．
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/364a8553-468c-34c7-acdd-180104a1ad22.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/a2572b7a-95ff-6666-692d-eecf99ceda3a.png)

惜しいところまでいきました．MinGWでインストールした人はデバッグまで成功していると思われます．

# gfortran (on Ubuntu for WSL)
この記事の本命です．Windows上のVSCodeでプログラムを書き，Ubuntu on WSLにインストールしたgfortranでプログラムをコンパイルします．

## ビルド（コンパイル）の設定
gfortran (on Windows)のときと同じ手順で，`tasks.json`の設定を行います．

```JSON:tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build using gfortran on wsl",
            "type": "shell",
            "options": {
                "shell": {
                    "executable": "${env:windir}\\sysnative\\wsl.exe",
                    "args": [],
                }
            },
            "command": "gfortran",
            "args": [
                "-g",
                "-O0",
                "-o",
                "/home/<Ubuntuのユーザ名>/projects/${workspaceFolderBasename}/${fileBasenameNoExtension}.out",
                "${fileBasename}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": true,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": false
            }
        }
    ]
}
```

このように書いたタスクでは，以下のコマンドを実行したのと同じ結果が得られます．

```shell
C:\windows\system32\wsl.exe gfortran -g -O0 -o /home/<Ubuntuのユーザ名>/projects/sample_g_wsl/main.out main.f90
```

`wsl.exe`は`bash.exe`に置き換えることもできます．その際は，`"-c"`オプションが必要です．

```JSON
"executable": "${env:windir}\\sysnative\\bash.exe",
"args": ["-c"],
```

コンパイルするには，Ubuntu上にディレクトリを作っておく必要があります．コンパイルすると，当該ディレクトリ内に`main.out`が作成されます．

## デバッグの設定
デバッグもgfortran (on Windows)のときと同じ手順で`launch.json`を設定します．

```JSON:launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "/home/<Ubuntuのユーザ名>/projects/${workspaceFolderBasename}/${fileBasenameNoExtension}.out",
            "stopAtEntry": true,
            "cwd": "/home/<Ubuntuのユーザ名>/projects/${workspaceFolderBasename}/",
            "environment": [],
            "externalConsole": true,
            "windows": {
                "MIMode": "gdb",
                "miDebuggerPath": "/usr/bin/gdb",
                "setupCommands": [
                    {
                        "description": "Enable pretty-printing for gdb",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    }
                ]
            },
            "pipeTransport": {
                "pipeCwd": "",
                "pipeProgram": "${env:windir}\\sysnative\\bash.exe",
                "pipeArgs": ["-c"],
                "debuggerPath": "/usr/bin/gdb"
            },
            "sourceFileMap": {
                "/mnt/c": "C:/",
                "/mnt/d": "D:/",
                "/usr": "C:/Users/<Windowsのユーザ名>/AppData/Local/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/"
            }
        }
    ]
}
```

Windows版と比較すると，`"pipeTransport"`と`"sourceFileMap"`の設定が追加されています．`tasks.json`とは異なり，`"pipeProgram"`が`wsl.exe`だと実行できません．`"sourceFileMap"`でWindowsのフォルダ構造とUbuntuのディレクトリ構造を対応付けます．ここの設定では，フォルダのパスの区切りに`\\`ではなく`/`を用います．Ubuntuのインストール先は各自で調べてください．

`"stopAtEntry": true`としてデバッグを実行すると，mainルーチンの末尾で停止します．ステップインをクリックすると，メインルーチン内のデバッグを行うことができます．デバッグウィンドウでは，変数の値の表示や値の変更ができます．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/bbc542ae-659b-88b4-9f49-93cf2af75209.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/a4fff599-921c-6af4-ea1b-0012007f9efc.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/f86e0c00-af4a-4ccc-6029-331aac3bab8c.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/a9e067aa-eb26-bb16-388f-c389111051e3.png)


# Intel Fortran for Windows
## コンパイルの設定
VSCodeの設定だけでIntel Fortranを使えるようにするのは，結構手間です．
色々な方法を試すと，できそうなのにあと一歩のところでうまくいきません．~~忌々しい存在Xめ~~．これは，Intel Fortranのパス設定に起因しています．Intel Fortranは，使用する前に`ipsxe-comp-vars.bat`というバッチファイルを実行してパスを設定します．バッチファイルはアーキテクチャやVisual Studioのバージョンを引数にとるうえ，引数で分岐していくつものバッチファイルを呼び出しているので，どのフォルダのパスを通せばよいのかがわかりません．

何通りかの方法を試したので，その試行錯誤を記載しておきます．結局は，**Intel Fortranのパスの設定とVSCodeの起動を行うバッチファイルを作る**のが簡単でした．

とりあえず`tasks.json`を作り，共通で使う設定を書いておきます．

```JSON:tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build using intel fortran for intel64",
            "type": "shell",
            "options": {
                "shell": {
                    "executable": "${env:windir}\\sysnative\\cmd.exe",
                    "args": ["/c"]
                }
            },
            "command": "ifort",
            "args":[
                "/debug:full",
                "${fileBasename}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": true,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": false
            }
        }
    ]
}
```

Windowsなので，shellには`cmd.exe`を用います．コンパイラの実行ファイルの名前は`ifort`です．

### options.envに必要なパスを書き出す方法
上の`tasks.json`でビルドタスクを実行しても，ifortへのパスが通っていないため，コンパイルできません．

```console
'ifort' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

そこで，`task.options`に環境変数の設定を追加します．

```JSON
            "options": {
                "env": {
                    "PATH": "ここにパスを必要なだけ追加する"
                },
                "shell": {
                    "executable": "${env:windir}\\sysnative\\cmd.exe",
                    "args": ["/c"]
                }
            },
```

`PATH`に登録するフォルダは，コマンドプロンプトで`ipsxe-comp-vars.bat`を実行した後，パスを出力してコピー＆ペースとします．このとき，明らかに不要なフォルダ（ドキュメントのフォルダやシステムフォルダ）へのパスを削除し，パスの区切りを`\\`に変更します．

そうすると，目論見どおり`ifort`は実行でき，オブジェクトファイルが作られているところまでは確認できますが，リンク時にエラーが出ます．

```console
Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 19.0.0.117 Build 20180804
Copyright (C) 1985-2018 Intel Corporation.  All rights reserved.

Microsoft (R) Incremental Linker Version 14.15.26726.0
Copyright (C) Microsoft Corporation.  All rights reserved.

-out:main.exe
-debug
-pdb:main.pdb
-subsystem:console
main.obj
LINK : fatal error LNK1104: ファイル 'ifconsol.lib' を開くことができません。
ターミナルの処理が終了しました (終了コード: 1104)
```

`ifconsol.lib`の場所を上述の`PATH`に追加しても，このエラーは消えません．
そのため，`options.env`で`PATH`を設定するのは諦めました．設定がうまくリンカに渡っていないのでしょうか？

### 先に環境変数を設定するタスクを実行し，その後コンパイラを呼ぶ方法
`tasks.json`では，複数のタスクを設定して，依存するタスクを指定できます[^dependson]．コンパイルを実行する前に，環境変数を設定するタスクを実行すればよいと考えるのは自然でしょう．

```JSON
    "tasks": [
        {
            "label": "build using intel fortran for intel64",
            "dependsOn": ["environment for intel64 VS2017"],
            //...中略
            "command": "ifort",
            "args":[
                "/debug:full",
                "${fileBasename}"
            ],
            //...中略
        },
        {
            "label": "environment for intel64 VS2017",
            "type": "shell",
            "options": {
                "shell": {
                    "executable": "${env:windir}\\sysnative\\cmd.exe",
                    "args": [
                        "/c",
                    ]
                }
            },
            "command": "\"C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_<バージョン>\\windows\\bin\\ipsxe-comp-vars.bat\"",
            "args":[
                "intel64",
                "vs2017"
            ]
        }
    ]
```

残念ながら，この方法ではタスク毎にコマンドプロンプトが終了し，環境変数は引き継がれないようです．そのため，`ifort`が見つからないというエラーが出てコンパイルできません．
[^dependson]: [Integrate with External Tools via Tasks](https://code.visualstudio.com/docs/editor/tasks)

### 環境設定用のバッチを実行し，&で区切ってコンパイルを連続実行する方法
ビルドタスクで実行するコマンドには，いくつかの引数を渡すことができます．そこで，ビルドタスクで実行するコマンドをパス設定用のバッチファイル`ipsxe-comp-vars.bat`とし，その引数を渡すついでに，`&`で区切って`ifort`を連続実行します．

```JSON
            "command": "\"C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_<バージョン>\\windows\\bin\\ipsxe-comp-vars.bat\"",
            "args":[
                "intel64",
                "vs2017",
                "&",
                "ifort",
                "/debug:full",
                "${fileBasename}"
            ],
```

このように`"command"`と`"arg"`を書くと，以下のようにコマンドが実行されます．

```console
C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_<バージョン>\windows\bin\ipsxe-comp-vars.bat" intel64 vs2017 & ifort /debug:full main.f90
```

この方法は無事にコンパイルできますが，ちょっと強引すぎます．

### 環境変数用設定とVSCodeの起動を行うバッチファイルを作る方法
ここまでの試行錯誤の中で，Intel Fortranの環境変数を設定したコマンドプロンプトからVSCodeを起動すると，どうやらすべての環境変数が引き継がれることがわかりました．そのため，VSCodeを起動するためのバッチファイルを作ることにしました．

```bat
@echo off
call "C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_<バージョン>\windows\bin\ipsxe-comp-vars.bat" intel64 vs2017
code .
```

上記のバッチファイルをソースファイル（.f90）があるフォルダにコピーし，ダブルクリックで起動すれば，起動したVSCode内で環境変数が有効になります．本節冒頭に示した`tasks.json`で問題なくビルドを実行できました．

```console
Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 19.0.0.117 Build 20180804
Copyright (C) 1985-2018 Intel Corporation.  All rights reserved.

Microsoft (R) Incremental Linker Version 14.15.26726.0
Copyright (C) Microsoft Corporation.  All rights reserved.

-out:main.exe
-debug
-pdb:main.pdb
-subsystem:console
main.obj
```

この方法を用いれば，デバッガも利用できます．

ただし，メニューから新しくフォルダを開いた場合などは，環境変数が初期化されるようです．

## デバッグの設定
デバッグの設定は，今のところうまくいっていません．
Intel Fortranには，`gdb`を拡張した`gdb-ia`が付属します．`ipsxe-comp-vars.bat`を実行すると`gdb-ia.exe`へのパスが通ります．gfotranと同じように設定すればデバッグ実行は可能になりますが，ステップ実行も，デバッグウィンドウに変数を表示することもできていません．

```JSON
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "miDebuggerPath": "gdb-ia.exe",
        }
    ]
}
```

Intel FortranのWindows版では，Visual Studioと統合してデバッグができるので，デバッグの環境は**C++(GDB/LLBD)**ではなく**C++(Windows)**とした方がよいのかもしれません．これについては継続調査していきます．

# PGI Fortran for Windows

## コンパイルの設定
PGI Fortranも，Intel Fortranと同じく，バッチファイルを実行してパスを設定します．したがって，Intel Fortranと同じやり方で設定できます．
とりあえず`tasks.json`を作ります．

```JSON:tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build using pgi fortran",
            "type": "shell",
            "options": {
                "shell": {
                    "executable": "${env:windir}\\sysnative\\cmd.exe",
                    "args": ["/c"]
                }
            },
            "command": "pgfortran",
            "args":[
                "-g",
                "-O0",
                "${fileBasename}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": true,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": false
            }
        }
    ]
}
```

### envにすべてを書き出す
PGI Fortranでは，設定するパスの数が7件だけとIntel Fortranよりも圧倒的に少ないので，コンパイルするだけなら`options.env`にPATHを列挙するのがおすすめです．

```JSON
            "options": {
                "env": {
                    "PATH": "ここにパスを必要なだけ追加する"
                },
                "shell": {
                    "executable": "${env:windir}\\sysnative\\cmd.exe",
                    "args": ["/c"]
                }
            },
```

追記するパスは，`"C:\Program Files\PGI\win64\<バージョン>\pgi_env.bat"`に書かれています．リンク時にエラーが出ることもありません．ですが，この方法ではVSCodeからデバッガを呼ぶことはできません．

### 環境変数用設定とVSCodeの起動を行うバッチファイルを作る方法
Intel Fortranと同様に，環境変数を設定したコマンドプロンプトからVSCodeを起動することで，すべての環境変数を引き継いでVSCodeが起動できます．

```bat
@echo off
call "C:\Program Files\PGI\win64\<バージョン>\pgi_env.bat"
code .
```

上記のバッチファイルをソースファイルがあるフォルダにコピーし，ダブルクリックで起動すれば，起動したVSCode内では環境変数が有効です．本節冒頭で作った`tasks.json`を用いて，問題なくビルドを実行できました．

## デバッグの設定
デバッグはおそらく不可能です．
PGI Fortranには，デバッガとして`pgdbg`コマンドが付属します．これはGUIが標準で，`-text`オプションを付けるとコマンドラインモードで起動できます．VSCodeの`launch.json`では，デバッガの起動時のオプションが設定できなさそうです．

# PGI Fortran (on Ubuntu for WSL)
上の章で，Ubuntu on WSLにインストールしたgfortranでプログラムをコンパイル，デバッグしました．PGI FortranにもLinux版があり，無償のCommunity版も提供されています．サンキューNVIDIA（次は機能の実装をしっかりと･･･）

Windows側で書いたプログラムを，Ubuntu on WSLにインストールしたpgfortranでコンパイルしてみます．PGI Fortranは，[公式サイト](https://www.pgroup.com/products/community.htm)からダウンロードし，すべて推奨の設定でインストールしました．つまり，コンパイラは`/opt/pgi`配下にインストールされています．

## ビルド（コンパイル）の設定
gfortranと同じように`tasks.json`の設定を行います．

```JSON:tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build using pgi fortran on wsl",
            "type": "shell",
            "options": {
                "shell": {
                    "executable": "${env:windir}\\sysnative\\wsl.exe",
                    "args": []
                }
            },
            "command": "/opt/pgi/linux86-64/2019/bin/pgfortran",
            "args":[
                "-g",
                "-O0",
                "-o",
                "/home/<Ubuntuのユーザ名>/projects/${workspaceFolderBasename}/${fileBasenameNoExtension}.out",
                "${fileBasename}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": true,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": false
            }
        }
    ]
}
```

gfortranとは異なり，コマンド名（pgfortran）のみを書くと，コマンドが見つからないというエラーが出ます．

```console
>wsl pgfortran
/bin/bash: pgfortran: コマンドが見つかりません
```

試行錯誤の結果，コマンドプロンプトから`wsl.exe`経由でコマンドを実行するとき，`PATH`は`/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games`にしか通らないようです．`PATH`の設定を`~/.bashrc`や`/etc/bash.bashrc`，`/etc/profile`に追記しても，`/etc/profile/profile.d`にスクリプトを置いても，パスが通りませんでした．解決策を知っている方がいらっしゃれば，ぜひご教示ください．

今回はフルパスを書くことでコンパイルまではできましたが，ライブラリのリンクなど，少し複雑な状況になるとうまくいかないような気がします．

## デバッグの設定
デバッグは，Windows版と同様の理由でうまくいきません．

# まとめ
いずれのコンパイラを利用しても，VSCode上からショートカットキー1発でコンパイルできるようにはなりました．
コンパイルはできたとしても，デバッグ環境は十分ではありません．また，コンパイルオプションを選べるようなGUIがほしいところです．