はじめに
はじめまして。@kinoha_514k(きのは)と申します。
初めての記事投稿です。内容わかりにくいところあるかもしれませんが、どうぞよろしくお願いします。
本題
先日しばらくたまっていたemerge -uDN @worldを実行していたところ、どうしてもpppdのコンパイルエラーが発生しどう対処すればいいのか大変困っていました。
以下emerge、makeの出力です。
(略)...
pppcrypt.o: In function `DesSetkey':
pppcrypt.c:(.text+0x114): undefined reference to `setkey'
pppcrypt.o: In function `DesEncrypt':
pppcrypt.c:(.text+0x1b1): undefined reference to `encrypt'
pppcrypt.o: In function `DesDecrypt':
pppcrypt.c:(.text+0x294): undefined reference to `encrypt'
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:217: pppd] Error 1
make[1]: Leaving directory '/var/tmp/portage/net-dialup/ppp-2.4.7-r6/work/ppp-2.4.7/pppd'
make: *** [Makefile:15: all] Error 2
* ERROR: net-dialup/ppp-2.4.7-r6::gentoo failed (compile phase):
* emake failed
*
* If you need support, post the output of `emerge --info '=net-dialup/ppp-2.4.7-r6::gentoo'`,
* the complete build log and the output of `emerge -pqv '=net-dialup/ppp-2.4.7-r6::gentoo'`.
* The complete build log is located at '/var/tmp/portage/net-dialup/ppp-2.4.7-r6/temp/build.log'.
* The ebuild environment file is located at
'/var/tmp/portage/net-dialup/ppp-2.4.7-r6/temp/environment'.
* Working directory: '/var/tmp/portage/net-dialup/ppp-2.4.7-r6/work/ppp-2.4.7'
* S: '/var/tmp/portage/net-dialup/ppp-2.4.7-r6/work/ppp-2.4.7'
>>> Failed to emerge net-dialup/ppp-2.4.7-r6, Log file:
>>> '/var/tmp/portage/net-dialup/ppp-2.4.7-r6/temp/build.log'
Linuxのバージョン:
Linux gentoo 4.17.5-gentoo #1 SMP Tue Jul 17 22:50:01 JST 2018 x86_64 Intel(R)
Core(TM) i5-7500 CPU @ 3.40GHz GenuineIntel GNU/Linux
特にgccが古いなどはなかったのですが、pppdのGithubにこんな情報がありました。
https://github.com/paulusmack/ppp/commit/3c7b86229f7bd2600d74db14b1fe5b3896be3875
どうやらglibcが新しいとlibcryptが使えなくなっているようです。
確認してみるとglibcは2.28でした。このエラーを避けるため、opensslを代用する必要があり、そのためここに書いてあった手順通りにソースコードの改変が必要でした。
Gentooはご存知の通りパッケージ管理システムがPortageのためコンパイルが実行PCにて行われます。なのでソースコードの改変を行ってからインストールすることが容易です。
ですが、普段特に改変することもなく、ソースコードを改変してシステムにインストールする方法を知らなかったので書こうと思います。
Gentooのソースコード改変(手動パッチ適用)の流れ
1.まず、emerge --syncしたときにダウンロードされるebuildファイルは、/usr/portageにダウンロードされています。ソースコードを改変したいパッケージの場所までcdで移動します。(別に移動しなくてもパスの指定をしっかりしていれば大丈夫なのですが念のため)
ディレクトリは(カテゴリ)/(パッケージ)の分け方となっています。
あらかじめパッケージを検索(emerge -s <パッケージ名>)して目的のパッケージがどのカテゴリにあるのか調べておきます。
例)/usr/portage/net-dialup/ppp
配下におそらくebuildファイルがあると思います。
2.まずソースコードのダウンロード。
ebuild (ダウンロードするパッケージのebuildファイル名) fetch
を実行します。
3.ダウンロードが完了したら、
ebuild (ebuildファイル名) unpack
を実行します。
ソースコードは既定では/var/tmp/portage/(カテゴリ名)/(パッケージ名)/workに展開されます。
4.展開されたディレクトリに移動し、ソースコードを改変します。
5.完了したら、また/usr/portage/(カテゴリ名)/(パッケージ名)に移動し、
ebuild (ebuildファイル) compile
ebuild (ebuildファイル) install
ebuild (ebuildファイル) qmerge
の順に実行します。
注意しなければならないのは、3つ目の"ebuild (ebuildファイル) qmerge"を実行しなければ「実際のシステムに」インストールが行わない点です(installは一時的なディレクトリへのインストールを意味します、本番環境へのインストール準備のようなものと考えてください)。
qmergeを行えば実際のシステムにパッケージがインストールされ、インストールされたとマークされます。
最後に、改変したソースコードが不要であれば、ebuild (ebuildファイル名) clean
を実行します。
参考:ebuild man page
(万が一内容に間違いがありましたらお知らせください。)
追記:2021/04/19:まさか自分が自分の書いた記事のお世話になると思ってなかった...
2021/04/25:もし、ebuildファイルを修正した際は、そのままこの手順でやると
* Digest verification failed:
* (...).ebuild
* Reason: Filesize does not match recorded size
* Got: ....
* Expected: ....
というエラーが出ます。
これはfetch前に ebuild (ebuildファイル) digest を実行すればebuildファイルの新たなサイズが登録され、解決します。