MSYS2 に gnu screen をインストールする

MSYS2 は cygwin とほぼ同じみたいなので、ビルドパッケージを流用する。
※WSL2 の Debian10 環境でも apt でパッケージを入れると起動できませんが、新しい screen 4.8.0 を自前で入れると解決するようです。最後の #ifndef の追加は不要。

cygwin用のビルドパッケージをダウンロードしてビルド
※2020/05 現在、最新版は screen-4.8.0-1-src.tar.xz になります。

```shell:IIJさん、ミラーありがとうございます
[~]$ wget ftp://ftp.iij.ad.jp/pub/cygwin/x86_64/release/screen/screen-4.6.2-1-src.tar.xz
```
```shell:ダウンロードしたファイルを解凍
[~]$ tar xJvf screen-4.6.2-1-src.tar.xz
screen-4.6.2-1.src/
...snip
```
```shell:解凍したディレクトリへ移動し、オリジナルファイルも解凍する
[~]$ cd screen-4.6.2-1.src
[~/screen-4.6.2-1.src]$ tar xzvf screen-4.6.2.tar.gz
screen-4.6.2/
...snip
```
```shell:パッチファイルを確認
[~/screen-4.6.2-1.src]$ ls -l *patch*
-rw-r--r-- 1 123abc なし 12391 10月 23  2017 screen-4.6.2-1.cygwin.patch
-rw-r--r-- 1 123abc なし   287 10月 23  2017 screen-4.6.2-1.cygwin.patch.sig
-rw-r--r-- 1 123abc なし   783 10月 23  2017 screen-etcscreenrc.patch
-rw-r--r-- 1 123abc なし  1223 10月 23  2017 screen-install-exe.patch
-rw-r--r-- 1 123abc なし   604 10月 23  2017 screen-terminfo-autoconf.patch
```
おや？sig ファイルがありますねぇ。一応検証しておきますか。

```shell:PGP署名を確認
$ gpg --verify screen-4.6.2-1.cygwin.patch.sig
gpg: keybox'/home/123abc/.gnupg/pubring.kbx'が作成されました
gpg: 署名されたデータが'screen-4.6.2-1.cygwin.patch'にあると想定します
gpg: 2017年10月23日 23時09分02秒 JSTに施された署名
gpg:                RSA鍵49F39937BC7E1705を使用
gpg: 署名を検査できません: 公開鍵がありません
```
ありゃま、公開鍵が無くて検証できないって。そりゃそうか。

```shell:公開鍵やーい
$ gpg --keyserver pgp.mit.edu --recv-key 49F39937BC7E1705
gpg: key 49F39937BC7E1705: 鍵がないため57個の署名は検査しません
gpg: /home/123abc/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵49F39937BC7E1705: 公開鍵"Andrew E. Schulman <andrex@utexas.edu>"をインポートしました
gpg: 究極的に信用する鍵が見つかりません
gpg:           処理数の合計: 1
gpg:             インポート: 1
```
あった！

```shell:PGP署名を再度確認
$ gpg --verify screen-4.6.2-1.cygwin.patch.sig
gpg: 署名されたデータが'screen-4.6.2-1.cygwin.patch'にあると想定します
gpg: 2017年10月23日 23時09分02秒 JSTに施された署名
gpg:                RSA鍵49F39937BC7E1705を使用
gpg: "Andrew E. Schulman <andrex@utexas.edu>"からの正しい署名 [不明の]
gpg:                 別名"Andrew E. Schulman <andrex@tealtoes.org>" [不明の]
gpg:                 別名"Andrew E. Schulman <schulman.andrew@epa.gov>" [不明の]
gpg:                 別名"Andrew E. Schulman <andrex@5200-glenwood.net>" [不明の]
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
 主鍵フィンガープリント: 5162 0A97 54EB FEFC B702  AF0F 49F3 9937 BC7E 1705
```
**正しい署名**とあるので、screen-4.6.2-1.cygwin.patch は Andrew E. Schulman さんが署名をした時点から変更が加えられていないことが分かります。(*他のファイルは知らん*)
これでは Andrew E. Schulman さんが信用できる (変なものを仕込まない) 人か、また公開鍵が本当に本人の物かが分からないのですが、ここではそれ以上は追及しないことにして次へ。

<details><summary>ここから何か書いてあるんですがすっ飛ばして</summary><div>

```shell:パッチが改ざんされてなさそうなのでパッチを当てる
[~/screen-4.6.2-1.src]$ cd screen-4.6.2/
[~/screen-4.6.2-1.src/screen-4.6.2]$ for i in ../*.patch
> do
> patch < $i
> done
The next patch would create the file README,
which already exists!  Assume -R? [n]
Apply anyway? [n]
Skipping patch.
1 out of 1 hunk ignored
patching file 256colors.pl
can't find file to patch at input line 4
Perhaps you should have used the -p or --strip option?
The text leading up to this was:
--------------------------
|diff -ur screen-4.0.3.orig/etc/etcscreenrc screen-4.0.3/etc/etcscreenrc
|--- screen-4.0.3.orig/etc/etcscreenrc  2003-12-05 08:46:13.000000000 -0500
|+++ screen-4.0.3/etc/etcscreenrc       2007-07-06 16:17:38.140625000 -0400
--------------------------
File to patch: etc/etcscreenrc
patching file etc/etcscreenrc
patching file Makefile.in
patching file configure.ac
Hunk #1 succeeded at 663 (offset -26 lines).
```
README ファイルがエラーになったみたいですねぇ。ま、読まないからいいか。-p1 の弊害ですね。

```shell:ここからはお決まりの
[~/screen-4.6.2-1.src/screen-4.6.2]$ autoconf
[~/screen-4.6.2-1.src/screen-4.6.2]$ export CYGWIN ; export CFLAGS=-DNCURSES_STATIC
[~/screen-4.6.2-1.src/screen-4.6.2]$ ./configure --enable-colors256 --enable-rxvt_osc
......
configure: checking select with  -lnet -lnsl...
configure: error: !!! no select - no screen
[~/screen-4.6.2-1.src/screen-4.6.2]$ 
```
ん？えらー？
configure を読んでみるとどうやら select(2) が無いと文句を言っているらしい。
※あとで分かったけど、export は必要なかったよ。

```shell:パッケージにあるかなぁ？
$ pacman -Ss select
```
出てくるのは perl や python ばっかりorz
select(2) はどこー。

```shell:あ、MinGW&nbsp;の方で上げてたわ...
$ uname -smr
MINGW64_NT-10.0 2.11.1(0.329/5/3) x86_64
```
</div></details>
#MSYS2 MSYS を使わないと駄目🙅
```shell:「MSYS2&nbsp;MSYS」を起動
123abc@H97-PRO(~/screen-4.6.2-1.src/screen-4.6.2)[11]% uname -smr
MSYS_NT-10.0 2.11.1(0.329/5/3) x86_64
```
tcsh に乗り換えw
一度バッサリ消して、解凍し直してからの

```shell:パッチ当てして&nbsp;configure
123abc@H97-PRO(~/screen-4.6.2-1.src/screen-4.6.2)[19]% foreach i ( ../*.patch )
foreach? patch -p1 < $i
foreach? end
patching file screen-4.6.2/CYGWIN-PATCHES/README
patching file screen-4.6.2/CYGWIN-PATCHES/test/256colors.pl
patching file etc/etcscreenrc
patching file Makefile.in
patching file configure.ac
Hunk #1 succeeded at 663 (offset -26 lines).
123abc@H97-PRO(~/screen-4.6.2-1.src/screen-4.6.2)[22]% autoconf
123abc@H97-PRO(~/screen-4.6.2-1.src/screen-4.6.2)[23]% ./configure --enable-colors256 --enable-rxvt_osc
```
ありゃ？patch で文句言われなかったなぁ？ configure で色々足りないといわれるので

```shell:ちょいちょい足りないと言われるパッケージを追加
% pacboy -S ncurses-devel (for `missing tgetent')
% pacboy -S libcrypt-devel (for `missing lcrypt')
```
*-devel はヘッダとかが入ってるやつ。 devel が付いてないパッケージは ライブラリーだけなのでコンパイルできません。
※WSL2 環境の Debian GNU/Linux 10 (buster) では `sudo apt install libncursesw5-dev` しました。


```shell:再度&nbsp;configure
123abc@H97-PRO(~/screen-4.6.2-1.src/screen-4.6.2)[32]% ./configure --enable-colors256 --enable-rxvt_osc
...snip...
Now please check the pathnames in the Makefile and in the user
configuration section in config.h.
Then type 'make' to make screen. Good luck.

123abc@H97-PRO(~/screen-4.6.2-1.src/screen-4.6.2)[33]%
```
おーよ

```shell:make&nbsp;installl&nbsp;じゃー
123abc@H97-PRO(~/screen-4.6.2-1.src/screen-4.6.2)[33]% make -j6 install
...snip...
chmod: '/usr/lib/terminfo/s/screen*' にアクセスできません: No such file or directory
make: [Makefile:92: install] エラー 1 (無視されました)
termcap entry (./terminfo/screencap) should be installed manually.
You may also want to install ./etc/etcscreenrc in /usr/etc/screenrc
123abc@H97-PRO(~/screen-4.6.2-1.src/screen-4.6.2)[34]%
```
とりあえずインストール完了。

```shell:いよいよ実行！
123abc@H97-PRO(~)[37]% rehash 
123abc@H97-PRO(~)[38]% screen
Directory /tmp/uscreens/S-123abc must have mode 700.
```
あー、ディレクトリのパーミッションがおかしいやつか。Windows の acl と整合が取れないから無理なやつね。
パーミッションのチェックはコメントアウト！

```
% diff -u screen.orig screen.c
--- origsrc/screen-4.6.2/screen.c 2018-10-24 08:18:26.679971600 +0900
+++ src/screen-4.6.2/screen.c 2018-10-24 08:22:57.022879200 +0900
@@ -1108,8 +1108,10 @@
           Panic(0, "Directory '%s' must be owned by root.", SockDir);
         n = (eff_uid == 0 && (real_uid || (st.st_mode & 0775) != 0775)) ? 0755 :
             (eff_gid == (int)st.st_gid && eff_gid != real_gid) ? 0775 : 0777;
+#ifndef __MSYS__
         if (((int)st.st_mode & 0777) != n)
           Panic(0, "Directory '%s' must have mode %03o.", SockDir, n);
+#endif
       }
       sprintf(SockPath, "%s/S-%s", SockDir, LoginName);
       if (access(SockPath, F_OK)) {
@@ -1144,8 +1146,10 @@
 #endif
   }

+#ifndef __MSYS__
   if ((st.st_mode & 0777) != 0700)
     Panic(0, "Directory %s must have mode 700.", SockPath);
+#endif
   if (SockMatch && index(SockMatch, '/'))
     Panic(0, "Bad session name '%s'", SockMatch);
   SockName = SockPath + strlen(SockPath) + 1;
```
からの make install して完成！

```shell:インストールに失敗してたteminfoの下
123abc@H97-PRO(~/screen-4.6.2-1.src/screen-4.6.2)[76]% find /usr/lib/terminfo/ -name screen\*
/usr/lib/terminfo/73/screen
/usr/lib/terminfo/73/screen+fkeys
/usr/lib/terminfo/73/screen+italics
/usr/lib/terminfo/73/screen-16color
...snip...
```
ファイルはあるっぽいからインストールされてなくてもいいね。多分。
etcscreenrc は、ホームディレクトリに .screenrc としてコピーしておきましょう。

/いじょ

めも
Windows で、繋いでないけど登録されているドライバを見たい場合
C:\>set devmgr_show_nonpresent_devices=1
C:\>start devmgmt.msc
そして起動してきたデバイスマネージャのメニューから「表示」→「非表示のデバイスの表示」
かな？