ジェンツーペンギンに自由を！


**2018/01/01 追記**

現在、2017.0プロファイルではUSEフラグさえ弄ればopensslを切ってlibresslのみに可能なので、以下操作は不要となります。

```shell:/etc/portage/make.conf
USE="-openssl libressl"
```

---

いつの間にか Gentoo amd64 の `dev-libs/libressl` からマスクが取れていた。

https://packages.gentoo.org/packages/dev-libs/libressl

折角なのでフルLibreSSL化してみようと環境を作ることにした。

# 僕に /etc/portage を汚せというのか

まずは [Project:LibreSSL](https://wiki.gentoo.org/wiki/Project:LibreSSL) を開いて必要な修正を確認する。
まず、USEフラグのstableマスク（カッコ書きになっている奴）を外す。

```bash:/etc/portage/profile/use.stable.mask
-libressl
```

次に、`dev-libs/libressl` は未だ unstable なのでパッケージ自体のkeywordマスクを外す。
例では `=dev-libs/libressl-2.2*` となっている(SSLv3周りで色々あったらしい)が、執筆時点では最新が 2.6.0 だし既に 2.2 系はPortage Tree上に存在しないので普通にすべて外す。

```bash:/etc/portage/package.accept_keywords
dev-libs/libressl
```
一応執筆時点での本家の stable リリースは2.5.5なので、これを指定してもいい。

最後に、`dev-libs/openssl` をマスクする。

```bash:/etc/portage/package.mask/libressl
dev-libs/openssl
```

/etc/portage 以下の修正はこれで完了。

# 選択出来ないのが Gentoo なんて割り切りたくないから

この状態で一度うどんワールドする。

```shell-session
# emerge -uDNp @world

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N    ~] dev-libs/libressl-2.6.0  USE="asm -static-libs" ABI_X86="(64) -32 (-x32)"
[uninstall     ] dev-libs/openssl-1.0.2k
[blocks b      ] dev-libs/openssl:0 ("dev-libs/openssl:0" is blocking dev-libs/libressl-2.6.0)
[ebuild   R    ] net-misc/iputils-20151218  USE="libressl*"
[ebuild   R    ] net-misc/wget-1.19.1-r1  USE="libressl*"
[ebuild   R    ] dev-lang/python-3.4.5  USE="libressl*"
[ebuild   R    ] dev-lang/python-2.7.12  USE="libressl*"
[ebuild   R    ] net-misc/openssh-7.5_p1-r1  USE="libressl*"
...
```

この例だと特に問題ないようだが、一応 `dev-libs/openssl` 依存と `dev-libs/libressl` 依存を確認しておいたほうがいい。

```shell-session
# equery d openssl
 * These packages depend on openssl:
dev-lang/python-2.7.12 (!libressl ? dev-libs/openssl:0)
dev-lang/python-3.4.5 (!libressl ? dev-libs/openssl:0)
net-misc/iputils-20151218 (!libressl ? dev-libs/openssl:0)
                          (!libressl ? dev-libs/openssl:0[static-libs(+)])
net-misc/openssh-7.5_p1-r1 (!libressl ? >=dev-libs/openssl-1.0.1:0[bindist=])
                           (!libressl ? dev-libs/openssl:0)
                           (!libressl ? dev-libs/openssl:0[static-libs(+)])
net-misc/wget-1.19.1-r1 (!libressl ? dev-libs/openssl:0)
                        (!libressl ? dev-libs/openssl:0[static-libs(+)])
...
```

```shell-session
# equery d libressl
 * These packages depend on libressl:
dev-lang/python-2.7.12 (libressl ? dev-libs/libressl)
dev-lang/python-3.4.5 (libressl ? dev-libs/libressl)
net-misc/iputils-20151218 (libressl ? dev-libs/libressl)
                          (libressl ? dev-libs/libressl[static-libs(+)])
net-misc/openssh-7.5_p1-r1 (libressl ? dev-libs/libressl:0)
                           (libressl ? dev-libs/libressl:0[static-libs(+)])
net-misc/wget-1.19.1-r1 (libressl ? dev-libs/libressl)
                        (libressl ? dev-libs/libressl[static-libs(+)])
...
```

上の例だと特に問題なく対応している様子。
矛盾がある場合は [Packages not converted yet](https://github.com/gentoo/libressl/wiki/Transition-plan#packages-not-converted-yet) などを確認して対応状況を見つつ対応するしか無い。（そもそも移行の動きが無い可能性もあるが…）

# 駆り立てるのは Open と Libre 、横たわるのは Wget と SSH

あとは `dev-libs/openssl` を unmerge して `dev-libs/libressl` を oneshot で入れればいいように見えるが、残念ながら問題がある。
`net-misc/wget` が双方に依存しているため、このままだと emerge 中のファイルフェッチ中に「opensslとのリンクが壊れたwget」を叩いてしまうタイミングが生まれる。
なので、先に `dev-libs/libressl` をフェッチしてしまおう。

```shell-session
# emerge --fetchonly libressl
Calculating dependencies... done!

!!! The following installed packages are masked:
- dev-libs/openssl-1.0.2k::gentoo (masked by: package.mask)
For more information, see the MASKED PACKAGES section in the emerge
man page or refer to the Gentoo Handbook.


>>> Fetching (1 of 1) dev-libs/libressl-2.6.0::gentoo

<snip>

 * libressl-2.6.0.tar.gz SHA256 SHA512 WHIRLPOOL size ;-) ...
```

ちなみに、`net-misc/openssh` も依存があるので念のため注意しておこう。

# 手をとりあって

ここまで来たら問題ないので置き換えていく。

```shell-session
# emerge --unmerge openssl

<snip>

 * GNU info directory index is up-to-date.

!!! existing preserved libs:
>>> package: dev-libs/openssl-1.0.2k
 *  - /usr/lib64/libcrypto.so.1.0.0
 *      used by /bin/ping6 (net-misc/iputils-20151218)
 *      used by /usr/bin/ssh (net-misc/openssh-7.5_p1-r1)
 *      used by /usr/bin/ssh-add (net-misc/openssh-7.5_p1-r1)
 *      used by 11 other files
 *  - /usr/lib64/libssl.so.1.0.0
 *      used by /usr/bin/wget (net-misc/wget-1.19.1-r1)
 *      used by /usr/lib64/python2.7/lib-dynload/_ssl.so (dev-lang/python-2.7.12)
 *      used by /usr/lib64/python3.4/lib-dynload/_ssl.cpython-34m.so (dev-lang/python-3.4.5)
Use emerge @preserved-rebuild to rebuild packages using these libraries
```

と、とても怒られるが想定内なので続行。

```shell-session
# emerge --oneshot libressl

<snip>

>>> Installing (1 of 1) dev-libs/libressl-2.6.0::gentoo
>>> Auto-cleaning packages...

>>> No outdated packages were found on your system.

 * GNU info directory index is up-to-date.

!!! existing preserved libs:
>>> package: dev-libs/openssl-1.0.2k
 *  - /usr/lib64/libcrypto.so.1.0.0
 *      used by /bin/ping6 (net-misc/iputils-20151218)
 *      used by /usr/bin/ssh (net-misc/openssh-7.5_p1-r1)
 *      used by /usr/bin/ssh-add (net-misc/openssh-7.5_p1-r1)
 *      used by 11 other files
 *  - /usr/lib64/libssl.so.1.0.0
 *      used by /usr/bin/wget (net-misc/wget-1.19.1-r1)
 *      used by /usr/lib64/python2.7/lib-dynload/_ssl.so (dev-lang/python-2.7.12)
 *      used by /usr/lib64/python3.4/lib-dynload/_ssl.cpython-34m.so (dev-lang/python-3.4.5)
Use emerge @preserved-rebuild to rebuild packages using these libraries
```

終わり次第、うどんワールド。さすがに直前に `eclean-dist` とかしてないよね？まだ wget 死んでるよ？

```shell-session
# emerge -uDNp @world

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R    ] net-misc/iputils-20151218  USE="libressl*"
[ebuild   R    ] net-misc/wget-1.19.1-r1  USE="libressl*"
[ebuild   R    ] dev-lang/python-3.4.5  USE="libressl*"
[ebuild   R    ] dev-lang/python-2.7.12  USE="libressl*"
[ebuild   R    ] net-misc/openssh-7.5_p1-r1  USE="libressl*"
# emerge -uDN @world

<snip>
```

あとは任意に `emerge --depclean` なり `revdep-rebuild` なりを行って完了。お疲れ様でした。