VSCodeでのFortran開発環境2021年版
この記事はFortranアドベントカレンダー2021 8日目の記事です。
ネタがないので、今年に構築したFortranの開発環境の記事をまとめてみます。
GitHub
Remote用の設定ファイルを置きました。
ローカル (Ubuntu, WSL2)
手前味噌ですが下記の記事を見てください。。。
Ubuntu + VSCodeでFortran開発環境を構築する(WSL2対応)
SSHサーバ
ここが本題かも、というところです。Fortranの開発環境は「スパコンのログインノードにSSH」というケースが多いと思います。VSCodeにはRemoteプラグインというSSHサーバ上での開発に使えるプラグインがあるのでそれを使ってみます。なおSSHサーバはラズパイで作ります。
(このために久しぶりにRaspberry Pi 3を引っ張り出してきてOS最新にしました。Raspberry Pi Zero 2は争奪戦になりそうなので買えなさそうです。。。)
Remoteプラグインのインストール
VSCodeにRemote-SSHプラグインをインストールします。昔はRemoteというプラグインしかありませんでしたが、最近はSSH用、WSL用、Dockerコンテナ用に分かれたようです。
初回
Remoteをインストールすると左下にリモートのアイコンが表示されるのでクリックします。
クリックするとコマンドパレットが開くので、「Connect to Host...」を選択します。パスワードの入力を求められるので、それに従ってログインします。
公開鍵がある場合やログインユーザーを変更したい場合などは「Open SSH Configration File」を選択してSSHのconfigファイルを編集します。
.vscodeの設定
.vscodeのlaunch.jsonとtasks.jsonを記述します。ローカルの場合とおおむね同じです。
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 起動",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}",
"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"タグの値を書く
}
]
}
{
// 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",
"${workspaceFolder}/${fileBasenameNoExtension}",
"${fileBasename}"
],
"group": {
"kind": "build",
"isDefault": true,
},
"presentation": {
"echo": true,
"reveal": "always",
"focus": true,
"panel": "shared",
"showReuseMessage": true,
"clear": false
}
}
]
}
うまくいくとローカルの場合と同じように開発することができます。デバッグ実行やブレークポイントの設定もできます。
SSH接続がうまくいかない場合
WSL2のSSHだとうまくいくのにVSCodeだとうまくいかないというケースがあります。自分の場合Remote-SSHプラグインを再インストールすることで解消しました。
ちなみに
同じネットワークにつないだ「myhost」というホストネームのデバイスは、「myhost.local」というアドレスで名前解決できます。LLMNRという仕組みを使っているようです(よくわかりません)。
Discussion