LoginSignup
1
1

More than 3 years have passed since last update.

Gentoo:パッケージのソースコードを改変しインストールする(手動パッチ適用)

Last updated at Posted at 2019-04-17

はじめに

はじめまして。@kinoha_514k(きのは)と申します。
初めての記事投稿です。内容わかりにくいところあるかもしれませんが、どうぞよろしくお願いします。

本題

先日しばらくたまっていたemerge -uDN @worldを実行していたところ、どうしてもpppdのコンパイルエラーが発生しどう対処すればいいのか大変困っていました。
以下emerge、makeの出力です。

ppp-build.txt
(略)...
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ファイルの新たなサイズが登録され、解決します。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1