Windows10のWSLでVSCodeによるFortran環境を作る

Windows10のWSLでVscodeによるFortranの環境を作る方法を以下にメモしておきます。
2022年1月時点の最近の情報がまとまったサイトが見つからなかったので、参考になれば幸いです。

---
# Windows10へのWSLの導入
まずは、Windows10のバージョンを最新版にして、以下のサイトを参考にWSLをインストールする。
このとき、Windowsコマンドプロンプトは管理者権限で立ち上げる必要あり。
[Microsoftの公式サイト/WSL のインストール](https://docs.microsoft.com/ja-jp/windows/wsl/install)

# VS Codeのインストール
以下のサイトを参考に、まずは、Windows上でVSCodeとRemote WSL拡張機能をインストールしたあと、Linuxディストリビューションを更新する。今回は、Ubuntuを使用。
[Microsoftの公式サイト/Linux 用 Windows サブシステムで Visual Studio Code の使用を開始する](https://docs.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode)
それができたら、Ubuntuのコマンドラインで「code .」と入力し、VSCodeを立ち上げる。

```
$ code .
```

# gfortranのインストール
この辺からあっているかどうかが不安。Ubuntu上で、以下のコマンドを実行し、gfortranをインストールする。

```
$ sudo apt install gfortran
```

# VS Codeの基本設定
今回のVS Codeの基本設定を以下に示します。

## Modern Fortranのインストール
VScodeの拡張機能から、[Modern Fortran](https://marketplace.visualstudio.com/items?itemName=krvajalm.linter-gfortran)
をインストールする。下記の画像はインストール後の画面。インストール前は、右側の窓の中にインストールボタンがあるので、それをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201444/f1ecfe29-4676-2b18-0fbe-867e9c9fe344.png)

## VSCodeの拡張機能の設定
下記のサイトを参考に、フォートラン関係の拡張機能をインストールする。
[Visual Studio Code の拡張機能と設定](https://home.hirosaki-u.ac.jp/heroic-2020/visual-studio-code-%e3%81%ae%e6%8b%a1%e5%bc%b5%e6%a9%9f%e8%83%bd%e3%81%a8%e8%a8%ad%e5%ae%9a/)

多分、とりあえずは下記の機能だけで大丈夫だと思います。

```
$ code --install-extension krvajalm.linter-gfortran --force
```

## gfortranのPathの設定
VSCode上でgfortranのPathを追加。Pathの設定がいつもよく分からないのだが、今回は、settings.jsonに下記の一文を追加。

```
{
    "fortran.includePaths": ["/usr/local/include", "/usr/local"]
}
```

下記の解説を参考にした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201444/2f74489b-29f0-e0e1-5d3b-6be7c8b51139.png)



settings.jsonについては、下記のサイトを参考にした。
[2021/4 Visual Studio Code のおすすめ設定 (settings.json)](https://www.cview.co.jp/osakatech/2021.04.20.dYMmFSxAihNBwoEkCys_X)
[【VSCode】settings.jsonについて理解する](https://amateur-engineer-blog.com/vscode-settingsjson/)

# テストファイルの実行
試しに、VSCodeで以下のファイルを作って実行。ファイル名は"test.f90"とした。
テストファイルのコードは、以下のサイトを参考にした。
[はじめての Fortran プログラミング vscode 版](https://home.hirosaki-u.ac.jp/heroic-2020/vscode-de-fortran/)

```
program test
    boku = 2.5
    kanojo = 0
    love = boku * kanojo
    print *, love
  end program
```

画面右上の実行ボタン（さんかくボタン）を押すと、test.f90をコンパイルして、実行ファイルを作成し、そのファイルの実行まで行ってくれる。
0と表示されたので、とりあえず流れたっぽい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201444/0d52447e-5dcb-a07c-c8a3-7596097aa294.png)

## 実行ファイルの拡張子の設定
さて、プログラムはとりあえず動くようになったが、デフォルトだと、実行ファイルの拡張子がない状態である。そこで、settings.jsonの設定を行って、実行ファイルに、*.outという拡張子が付くように設定する。Windowsの場合は、*.exeがよいと思う。
今回は、「[VSCodeのCode Runnerで実行のオプションをつける(実行ファイル名をa.out、a.exeに変更したい)](https://qiita.com/haru8601/items/d4010b3a58e2dace49b4)」を参考に、以下のようにした。
settings.jsonに"code-runner.executorMap"を追加、fortranに関係する部分を変更している。

```
{
　　　　　(中略)
    "code-runner.executorMap": {
        "javascript": "node",
　　　　　
　　　　　(中略)
　　　　　
        "less": "cd $dir && lessc $fileName $fileNameWithoutExt.css",
        "FortranFreeForm": "cd $dir && gfortran $fileName -o $fileNameWithoutExt.out && $dir$fileNameWithoutExt.out",
        "fortran-modern": "cd $dir && gfortran $fileName -o $fileNameWithoutExt.out && $dir$fileNameWithoutExt.out",
        "fortran_fixed-form": "cd $dir && gfortran $fileName -o $fileNameWithoutExt.out && $dir$fileNameWithoutExt.out",
        "fortran": "cd $dir && gfortran $fileName -o $fileNameWithoutExt.out && $dir$fileNameWithoutExt.out"
    }
}
```


# デバッグ機能などの追加
デバッグ機能を追加する方法を以下に示します。
結構はまりましたが、いろいろやっているうちに、なんとなく仕組みが分かってきたところ。
FORTRAN IntelliSense(fortran-language-server)のインストールと、tasks.jsonとlaunch.jsonの設定が必要です。
以下のサイトを参考にさせていただきました。


[VSCodeでFortranのプログラムをコンパイル・デバッグするための設定](https://qiita.com/implicit_none/items/d49c9fdf51c307d22819)
[VSCode【fortranの設定】](https://matsuo-san.hatenablog.com/entry/2020/03/20/160907)
[tasks.jsonの使い方の基礎【VS Code使い方②】](https://qiita.com/ShortArrow/items/0bacd3a4bcbcbac50e60)
[【VSCode】launch.jsonについて理解する](https://amateur-engineer-blog.com/vscode-launchjson/)
[Modern Fortranのサイト](https://marketplace.visualstudio.com/items?itemName=krvajalm.linter-gfortran)

## FORTRAN IntelliSense(fortran-language-server)のインストール
ubuntu上で、pipを使って、[FORTRAN IntelliSense(fortran-language-server)](https://github.com/hansec/fortran-language-server)をインストールする。

```
pip install fortran-language-server
```
pipが入っていない場合は、pipを先にインストールする必要がある。

それから、VS CodeでfortlsのPathを設定する。VS Codeの左下の設定ボタンを押して設定画面を表示し、検索窓でfortlsと打って、下記の場所にPathを入力する。Pathの中身は適宜設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201444/e5c73eae-1567-0b8d-edd3-3437faeb5f3d.png)




## tasks.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",
            "type": "shell",
            "command": "gfortran",
            "args": [
                "-g",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.out",
                "${fileDirname}/${fileBasename}"
            ],
            "group": "build",
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": true,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": false
            },
            "problemMatcher": []
        },
        {
            "type": "npm",
            "script": "addExtensionPackDependencies",
            "path": ".vscode-server/extensions/ms-python.python-2022.0.1786462952/",
            "problemMatcher": [],
            "label": "npm: addExtensionPackDependencies - .vscode-server/extensions/ms-python.python-2022.0.1786462952",
            "detail": "gulp addExtensionPackDependencies",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
```
ポイントは、"args"の部分の設定かと。この場合は、ubuntu上で、以下のコマンドを実行したのと同じ。コンパイルするファイルと作成する実行ファイルは適宜設定する必要がある。
gfortran -g -o /home/yatakun/fortran/fileout/file.out /home/yatakun/fortran/fileout/file.f90


## launch.jsonの設定
launch.jsonを設定する。launch.jsonを表示するには、[[【VSCode】launch.jsonについて理解する](https://amateur-engineer-blog.com/vscode-launchjson/)]の解説が参考になる。
そのほか、下図の左端の[実行とデバッグ]の画面で、(gbd)fortranの横の設定ボタンを押すと、launch.jsonが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201444/bd25bd7f-c0fd-1e9a-5970-f434db93467f.png)

今回のlaunch.jsonの設定は下記のとおり。なお、事前にgdbをインストールする必要がある。インストールの方法は[こちら](http://www.gdbtutorial.com/tutorial/how-install-gdb)。

```
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 起動",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}.out", 
            "args": [],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb", 
            "miDebuggerPath": "/usr/bin/gdb", //確認して書き込む 
            "setupCommands": [
                {
                    "description": "gdb の再フォーマットを有効にする",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "build" // tasks.jsonの"label"タグの値を書く
        }
    ]
  }
```

## デバッグのテスト
ここまでがうまく設定できると、デバッグが動くはず。
デバッグは、メニューの[実行]-[デバッグの開始]をクリックする。今回は、下記のコードで、ブレイクポイントを設定してみた。左のウィンドウに変数の値などが表示されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201444/d513cf9e-06ab-ed7e-01dc-c3c1b6f99d3d.png)


今回はここまで。

# 参考にしたサイト
全般を通して、下記のサイトなどを参考にさせていただきました。みなさまありがとうございます。
[WSLでFortran (gfortran&Intel Parallel Studio)(Intel oneAPI Base Toolkit + HPC ToolkitでもOK)](https://qiita.com/Nick_utuiuc/items/022a9283043aec70e2ee)
[はじめての Fortran プログラミング vscode 版](https://home.hirosaki-u.ac.jp/heroic-2020/vscode-de-fortran/)
[WSLを利用したLinux環境の構築](https://amorphous.tf.chiba-u.jp/memo.files/wsl/wsl_linux.html)
[Ubuntu + VSCodeでFortran開発環境を構築する（WSL2対応）](https://zenn.dev/bluepost/articles/bf6e1ac19b7a40)