WSL2上のUbuntuにLazarusを入れて、Linuxアプリを作ってみる

## はじめに
前回、[Lazarus（on Windows）でLinuxアプリをコンパイルしようとして諦めた](https://qiita.com/KG_/items/179719a2581cd67cd5b4)ので、Linux（WSL2のUbuntu）にLazarusを入れて、ObjectPascalで書いたLinuxアプリを作ってみようと思います。

## やったこと
### 本作業用のwsl環境を用意します
元々、開発用のUbuntu環境を入れているのですが、その環境にデスクトップ環境を入れたくなかったので、もう１つイメージを作りました。
（[こちらの記事](https://qiita.com/souyakuchan/items/9f95043cf9c4eda2e1cc)を参考に用意しました）。

### Ubuntuデスクトップ環境のセットアップ
Ubuntuにデスクトップ関係のパッケージを入れるのと、Windows側に表示用のX Serverアプリを入れます。
（[こちらの記事](https://qiita.com/fishmans0120/items/69b08fead235d9a0d3b1)を参考にセットアップをおこないました）。

### FPC・Lazarusのインストール
**FPC（Free Pascalコンパイラ）** と**Lazarus** をUbuntu環境にインストールします。


[Lazarusの公式ページ](https://www.lazarus-ide.org/index.php)から、debパッケージをダウンロードし、Ubuntu環境から見える場所にパッケージファイルを置きます。

次に、Ubuntu環境側で、debパッケージをインストールします。
（debパッケージのインストール方法は[こちらの記事](https://kaworu.jpn.org/kaworu/2018-06-06-1.php)を参考にしました）。

インストールが完了すると、デスクトップ上にLazarusのアイコンが確認できます。
（最下段の左から3つ目の、チーターのアイコン）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/b88eabc5-6cad-68c7-6ccb-d1208911f9bb.png)

アイコンをクリックすると、LazarusのIDEが立ち上がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/e6e3c1b7-7303-7ea6-db58-7b727c8593dc.png)

## サンプルのコンソールAppを実行してみる
新しいプロジェクトを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/485b8594-951e-ac08-5ddf-db23ff5c20ac.png)

`Console application`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/59d07aae-1a29-3cea-491c-3a08f1ebf683.png)

クラス名とかは適当に入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/016c9972-9257-4135-9fbb-b80a4dc6c831.png)

コンソールアプリ用のコードテンプレートが自動生成されます。
`DoRun`プロシージャ内に`Hello, World`と表示するコードを書きます。

```pascal
program SampleApp;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Classes, SysUtils, CustApp
  { you can add units after this };

type

  { TSampleApp }

  TSampleApp = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
    procedure WriteHelp; virtual;
  end;

{ TSampleApp }

procedure TSampleApp.DoRun;
var
  ErrorMsg: String;
begin
  // quick check parameters
  ErrorMsg:=CheckOptions('h', 'help');
  if ErrorMsg<>'' then begin
    ShowException(Exception.Create(ErrorMsg));
    Terminate;
    Exit;
  end;

  // parse parameters
  if HasOption('h', 'help') then begin
    WriteHelp;
    Terminate;
    Exit;
  end;

  { add your program here }
  writeln('Hello, World');  //■■■■■■■ここ追加したところ■■■■■■■

  // stop program loop
  Terminate;
end;

constructor TSampleApp.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
  StopOnException:=True;
end;

destructor TSampleApp.Destroy;
begin
  inherited Destroy;
end;

procedure TSampleApp.WriteHelp;
begin
  { add your help code here }
  writeln('Usage: ', ExeName, ' -h');
end;

var
  Application: TSampleApp;
begin
  Application:=TSampleApp.Create(nil);
  Application.Title:='SampleApp';
  Application.Run;
  Application.Free;
end.
```

IDE上で`Run`を実行すると、正常終了します。
とりあえず正常にビルドできていそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/792d4d1c-2f17-c626-626d-d6396a830ffa.png)

実行ファイルをコンソール上で実行してみると、`Hello, World`と表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/8797f57f-ada9-e62c-73c4-84e7ac5f24d4.png)

## さいごに
とりあえず、WSL2上のUbuntuにLazarusを入れて、Linuxアプリを作って動かしてみるところまではできました。
引き続き、`Object Pascalで作ったLinuxアプリをマネージドKubernetes上で動かす`ためのステップを踏んでいこうと思います。