<!-- vim:set ft=markdown: -->

ビルド(VisualStudio)
----------------------------------------
0. Visual Studio Express 2015/2017 for Desktop または2022までのVisual Studio Communityのどれかをインストールする

1. "Document/EDCB_ALL.VS2015.sln"を開き、ツールバーを"Release/Win32"(x64ビルド時は"Release/x64")にしてビルド→ソリューションのビルド

2. （EpgTimerNWが必要な場合のみ）生成された"EpgTimer.exe"を"EpgTimerNW.exe"というファイル名でコピー

3. （lua52.dllが必要な場合のみ） https://github.com/xtne6f/lua/tree/v5.2-luabinaries をzipでダウンロード→展開して"lua52.sln"をビルド

4. （zlib52.dllが必要な場合のみ） https://github.com/xtne6f/lua-zlib/tree/v0.5-lua52 をzipでダウンロード→展開して"zlib52.sln"をビルド

（注意）
- ツールバーのソリューション構成を"Debug"(デバッグモード)にしてビルドすると
  非常にパフォーマンスの悪い（高負荷な）バイナリができるので注意する
- Windows SDKのエラーが出る場合は、プロジェクト→ソリューションの再ターゲット
  で切り替える。ビルド可能なバージョンなら何でもいい
- WindowsXPで実行可能なファイルを作りたいときは、EpgTimerを除く全プロジェクトの
  構成プロパティ→プラットフォームツールセットを"v140_xp"などに切り替える必要がある
  （ソリューションエクスプローラ―上でCtrl+マウス選択を駆使すればまとめて切り替えられる）
- SSE2非対応CPUで実行可能なファイルを作りたいときは、拡張命令セットを"拡張命令なし(/arch:IA32)"に切り替える



ビルド(MSYS2/Mingw-w64)
----------------------------------------
※VisualStudioのインストールが面倒な場合お勧め

0. [MSYS2](https://www.msys2.org/) の `msys2-x86_64-日付.exe`(64bitOS用) をインストール  
   上記サイトに従って`pacman -Syu` →`pacman -Su`でパッケージをアップデート  
   スタートメニューの"MSYS2 MINGW64"(32bitビルド時はMINGW32)を開き、起動した黒窓で以下を実行してmakeとgccをインストール
   ```shell
   pacman -S make mingw-w64-x86_64-gcc
   pacman -S make mingw-w64-i686-gcc # 32bitビルド時
   ```

1. つづけて以下を実行（この文書が"C:/EDCB/Document"にあると仮定）
   ```shell
   cd /c/EDCB/Document/MinGW
   make
   ```

2. （lua52.dllが必要な場合のみ） https://github.com/xtne6f/lua/tree/v5.2-luabinaries をzipでダウンロード→展開して（"C:/lua-5.2-luabinaries"と仮定）
   ```shell
   cd /c/lua-5.2-luabinaries
   make lua52.dll
   ```

3. （zlib52.dllが必要な場合のみ） https://github.com/xtne6f/lua-zlib/tree/v0.5-lua52 をzipでダウンロード→展開して（"C:/lua-zlib-0.5-lua52"と仮定）
   ```shell
   cd /c/lua-zlib-0.5-lua52
   make zlib52.dll
   ```

（注意）
- lua52.dllは https://sourceforge.net/projects/luabinaries/ からダウンロードしたものでもよい
  - EpgTimerSrv/liblua52-mingw-lazy-{i686|x86_64}.a は lua-5.2.4_Win{32|64}_dllw6_lib.zip から以下を実行して作成したインポートライブラリ
    ```shell
    dlltool -t zz -D lua52.dll -d lua52.def -y liblua52.a
    ```
- EpgTimerAdminProxy.exe、asyncbuf.exe、relayread.exeを除く実行時はlibwinpthread-1.dllも必要（おそらくlibwinpthreadの仕様で
  スタティックリンクだとハンドルリークするため）。EDCBではEpgTimerSrv.exeのフォルダ、TVTestではTVTest.exeのフォルダに置く
- EpgDataCap_Bon.exeについては、使用するBonDriverに特別な対応がされていない限り、VC++でビルドされたIBonCast.dllが必要
- EpgTimer.exeについては[その他](#その他)を参照



ビルド(Mingw-w64)
----------------------------------------
※ビルド環境が最もコンパクト

0. https://github.com/niXman/mingw-builds-binaries/releases の「Release of 13.1.0-rt_v11-rev1」（上位バージョンがあればそれでもOK）
   のリストから i686-13.1.0-release-win32-dwarf-msvcrt-rt_v11-rev1.7z(x86ビルド用) または
   x86_64-13.1.0-release-win32-seh-msvcrt-rt_v11-rev1.7z(x64ビルド用) の7z圧縮ファイルをダウンロードしてどこかに展開  
   （以下、"C:/mingw32"または"C:/mingw64"に展開したと仮定）

1. RunMake.batを実行、"Specify make options :"のプロンプトで何も入力せずEnterキーを押す（クリーンしたいときはcleanと入力）

2. （lua52.dllが必要な場合のみ） https://github.com/xtne6f/lua/tree/v5.2-luabinaries をzipでダウンロード→展開してRunMake.batを実行  
   "Specify make options :"のプロンプトでlua52.dllと入力してEnterキーを押す

3. （zlib52.dllが必要な場合のみ） https://github.com/xtne6f/lua-zlib/tree/v0.5-lua52 をzipでダウンロード→展開してRunMake.batを実行  
   "Specify make options :"のプロンプトでzlib52.dllと入力してEnterキーを押す

（注意）
- libwinpthread-1.dllは不要。ほかの注意事項は「ビルド(MSYS2/Mingw-w64)」と同様
- 使用するMingw-w64は https://sourceforge.net/projects/mingw-w64/files/ でも可だが、更新が止まってバージョンが古いのでお勧めしない
- "Specify make options :"のプロンプトでプロジェクト名に.allを付けたもの(EpgTimerSrv.allなど)を入力すれば個別にビルドが可能



ビルド(Linux)
----------------------------------------
※動作確認環境はDebian(bookworm)

0. makeとgccをインストール。Debian系ディストリビューションはLua5.2のパッケージも用意されている
   ```shell
   sudo apt install make gcc g++
   sudo apt install liblua5.2-dev lua-zlib
   sudo apt install openssl  # 必須でない。WebUIでSSL/TLSを利用する場合
   sudo apt install curl  # 必須でない。後述で `make extra` する場合
   ```
   gccのバージョンは11以上を想定。RedHat系やあえて自ビルドする場合は後述「Luaモジュールのビルド」もやっておく

1. つづけて以下を実行（この文書が"~/EDCB/Document"にあると仮定）  
   ```shell
   cd ~/EDCB/Document/Unix
   make
   sudo make install  # ARIB8CHAR_USE_UNICODEを定義しないEpgDataCap3.soをインストールする場合
   sudo make install_u  # ARIB8CHAR_USE_UNICODEを定義したEpgDataCap3.soをインストールする場合
   make extra && sudo make install_extra  # 必須でない。tsreadexなどの関連コマンドのビルド
   ```
   インストール先は/usr/local/binと/usr/local/lib/edcb

   RedHat系は伝統的に/etc/ld.so.confに/usr/local/libを含まないので、EpgTimerSrv実行時に"liblua5.2.so: cannot open ～"みたいなのが出る場合は
   検索パスに/usr/local/libを加えるようにEpgTimerSrvをビルドし直す
   ```shell
   make EpgTimerSrv.clean
   LDFLAGS=-Wl,-rpath,/usr/local/lib make EpgTimerSrv.all
   sudo make EpgTimerSrv.install
   ```

2. 設定ファイルなどを配置
   ```shell
   sudo mkdir /var/local/edcb
   sudo chown {ユーザー}:{グループ} /var/local/edcb  # EpgTimerSrvを実行するユーザーがアクセスできるようにする
   make setup_ini
   ```
   必要に応じて/var/local/edcbのパーミッションを0770などに調整すること

   以上でEpgTimerSrvを実行すれば http://localhost:5510/ から各種操作が可能。Legacy WebUIについてはlynxなどテキストベースのブラウザでもひと通り操作可能。  
   ただし、既定ではlocalhostしかWebUIにアクセスできないので必要に応じて /var/local/edcb/EpgTimerSrv.ini のHttpAccessControlListを調整する。  
   また、既定では設定メニューからの設定の変更が不許可なので必要に応じて /var/local/edcb/HttpPublic/legacy/util.lua のALLOW_SETTINGをtrueにする。

3. サービス化  
   たとえば以下のようなsystemdのユニットファイルを作成する。{ユーザー}にはサービスを実行するユーザー名を指定する。rootでの実行は推奨しないし想定もしていない
   ```shell
   sudo tee /etc/systemd/system/edcb.service << 'EOS'
   [Unit]
   Description=EpgTimerSrv
   After=network.target

   [Service]
   ExecStart=/usr/local/bin/EpgTimerSrv
   Restart=always
   StandardError=journal
   StandardOutput=null
   TimeoutStopSec=50
   Type=simple
   User={ユーザー}

   [Install]
   WantedBy=default.target
   EOS

   sudo systemctl enable edcb
   ```



Luaモジュールのビルド(Linux)
----------------------------------------
   ```shell
   curl -L https://github.com/xtne6f/lua/archive/refs/heads/v5.2-luabinaries.tar.gz | tar xz
   cd lua-5.2-luabinaries
   make liblua5.2.so
   sudo cp liblua5.2.so /usr/local/lib/
   sudo ldconfig

   curl -L https://github.com/xtne6f/lua-zlib/archive/refs/heads/v0.5-lua52.tar.gz | tar xz
   cd lua-zlib-0.5-lua52
   make libzlib52.so
   sudo mkdir -p /usr/local/lib/lua/5.2
   sudo cp libzlib52.so /usr/local/lib/lua/5.2/
   ```



その他
----------------------------------------
- 一部のマクロを定義することでビルドをカスタマイズできる。以下主なもの
  - `EDCB_RC_DIALOG_NO_FONT` (Common/CommonResource.h)
  - `ARIB8CHAR_USE_UNICODE` (EpgDataCap3/ARIB8CharDecode.cpp)
  - `EPGDB_STD_WREGEX` (EpgTimerSrv/EpgDBManager.h)

  ソースコードを編集するかプロジェクトプロパティのプリプロセッサ定義に加える

- EpgTimer.exeをビルドするだけならVisualStudioは不要(参考:2ch_EDCB/52/224)。
  必要なら.NET Framework v4.0以降をインストールして、EpgTimerフォルダでコマンドプロンプトを開いて以下を実行（またはx86build.batを実行）
  ```batchfile
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe EpgTimer.sln /p:Configuration=Release /p:Platform=x86
  ```
  放置してもたぶん問題ないが、MSB3644の警告がでる場合は"EpgTimer/EpgTimer/EpgTimer.csproj"をメモ帳で開き
  ```
  <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
  ```
  となっている部分をインストールされている.NETのバージョンに変更するか、v4.5のTargeting Packをインストールする

- gitコマンドのある環境では、versionhashgen.batを実行すればバージョン情報にコミットハッシュを埋め込むことができる。
  versionhash.shはBashシェル環境用
