ヒットしていないものやオープンソースが動作しているものすべてにパッチを当てる

おそらく、多くの人が、ディストリビューションのプログラムまたはライブラリに、次のバージョンで追加された(必要な)機能が含まれていないという状況に遭遇した可能性があります。 次のバージョンで修正されたバグが含まれています(または、その修正がメインブランチに含まれていませんでした)が、ディストリビューションキットリポジトリには古いバージョンがまだ含まれています。



GNOME Linux環境を作業環境として使用しているJuffEdエディターのすべてのユーザー(先日新しいバージョンがリリースされました)と同様に、このバグでした。 このバグは、オートコンプリートを使用すると、ウィンドウが一瞬表示され、その後消えて、フォーカスを「取り去る」という事実にあります。 この例では、配布パッケージからプログラムに自分でパッチを適用する方法を示します。



記載されているバグは、このコンポーネントを使用するすべてのプログラムで発生するQScintillaライブラリのバグです(たとえば、Eric4でも同様の動作が見られます)。 これらのプログラムのいずれも使用せず、手がかゆい場合は、純粋に実験目的でそれらのいずれかをインストールしてみてください。 しかし、繰り返しますが、バグはGNOMEでのみ表示され、KDEではすべてが機能します。

開発者にパッチを送信し、いくつかのテストを行いましたが、このパッチが含まれている場合は、次のバージョンで。 そして、最新のディストリビューションを使用していない人はどうですか? この場合、ライブラリの新しいバージョン(2.4)は以前のバージョン(2.3、Ubuntu 9.04などに含まれています)とバイナリ互換性がないため、状況はさらに複雑になるため、この問題を解決した後にバージョン2.4を単に組み立ててインストールすることはできません-バージョン2.4を使用する場合、「ネイティブ」バージョン2.3を使用してビルドされたプログラムは、100%のケースに該当します。



怖い? :)そして今、より少ない言葉、より多くの仕事!



食材



「ネイティブ」バージョンを収集しますが、パッチが必要です。 ゼロから何かを編集する場合のプロセス全体について説明し、パッチが既に存在する場合の短い方法についても説明します。



そのため、実験用のディレクトリを作成して、そこに移動します。



$ mkdir -p experiments/qscintilla

$ cd experiments/qscintilla








まず、システムにインストールされているバージョンの正確なソースコードが必要です。 これは単に行われるのではなく、非常に簡単です:



$ apt-get source libqscintilla2-3







ただし、このためには、メインリポジトリとともに、ソースコードでリポジトリを接続する必要があります。





そのため、リポジトリが配置されているパッケージが作成されたソースを正確に受け取りました。 ほとんどの(すべてではないにしても)パッケージには、ディストリビューション固有のパッチがあります。Debianベースのディストリビューションの場合は、debian / patchサブディレクトリにあります。 これらのパッチは、アセンブリ自体の前に適用され、必要な修正を含むdebパッチをそこに置くことがタスクです。 このためには、dpatchユーティリティが必要です。 それをインストールし(また、アセンブリ中に必要な他のいくつかのユーティリティも)、プログラムと共にメインディレクトリに移動します。



$ sudo aptitude install dpatch cdbs fakeroot build-essential patch

$ cd qscintilla2-2.3.2/








メインのハイライトを追加



debian / patchディレクトリには、00listファイルと拡張子が.dpatchの2つのファイルの3つのファイルがあることがわかります。 ご想像のとおり、00listファイルにはパッチのリストが含まれており、残りのファイルはパッチです。 混乱を避けるため、dpatchプログラムdeb-patches用のdebian / patchディレクトリにあるパッチを呼び出します。パッチは、diffで作成でき、通常patchで使用される通常のパッチと呼ばれます。変更を加える。



結果に興味があるが、プロセス自体は特にない場合は、完成したデビューパッチをここからダウンロードし、debian / patchディレクトリに入れて、このセクションの最後の段落に移動できます。 .... "

プロセス自体に興味がある人は、このようなデバッグパッチを自分で作成する方法についての詳細な説明を読んでください。



メインプログラムディレクトリにある独自のデバッグパッチを作成するには、コマンドdpatch-edit-patch <patch_name>を実行します。ここで、<patch_name>は新しいdebパッチの名前です。 この場合、ソースカタログ全体の一時的なコピーが作成され、シェルは自動的にそれにリダイレクトされます。 ここで、必要に応じてソースコードを編集できます。その後、exitコマンドでこの「埋め込みシェル」を終了すると、これらすべてのアクションの結果が、必要なデバッグパッチになり、すべての変更が含まれます。 手動で編集するか、patchコマンド(dpatchではなく通常のパッチ)を使用して、他の人が作成したパッチを適用します。



だから、私は編集を舞台裏で手動で残します、なぜなら それはそれぞれ個別にできます(不要なものを削除するか、「Peace、Labor、May!」またはその他のものをAboutダイアログに追加するだけです)。問題の例として既製パッチの使用方法を示します。 QScintillaのオートコンプリートを修正します。 これが、QScintilla開発者に送ったパッチです。 ディスクに保存します。

--- Qt4/SciClasses.cpp 2009-10-16 10:09:48.000000000 -0400

+++ Qt4/SciClasses.cpp 2009-10-16 10:11:01.000000000 -0400

@@ -128,7 +128,7 @@

SciListBox::SciListBox(QWidget *parent, ListBoxQt *lbx_)

: QListWidget(parent), lbx(lbx_)

{

- setWindowFlags(Qt::Tool|Qt::FramelessWindowHint);

+ setWindowFlags(Qt::ToolTip|Qt::WindowStaysOnTopHint);

setAttribute(Qt::WA_StaticContents);



setFocusProxy(parent);







パッチをダウンロードする



それで、私が上記で多くの不可解な言葉で言ったすべてが、短くて理解可能なコマンドの助けを借りて行います:)私たちはqscintilla2-2.3.2のメインソースディレクトリにいます:



$ dpatch-edit-patch 03_autocomplete ( - )

$ patch -p0 < /path/to/our/qscintilla_autocomplete.patch ( )

$ exit ( " ")








debian / patchディレクトリを見ると、03_autocomplete.dpatchという別のファイルがあることがわかります。 必要なのは、その名前(拡張子.dpatchなし)を00listファイルに追加することだけです。 これを忘れると、パッケージは変更なしでコンパイルされ、リポジトリにあるものと何も変わりません。



$ echo "03_autocomplete" >> debian/patches/00list







クック! つまり、収集します



メインソースディレクトリにいる間に、実行します



$ dpkg-buildpackage -rfakeroot







彼は確かに、アセンブリのすべての依存関係が満たされているわけではないと誓います。 彼が尋ねるすべてをインストールします。 完全にクリーンなマシンでは、これを解凍するには46.7 MBのアーカイブをダウンロードする必要があります。これには、181 MBのディスクスペースが使用されます。 これらのいずれかが既にインストールされている場合は、ダウンロードする必要が少なくなります。 最大のシェアは開発ライブラリQt4(それぞれ30.6 MBと124 MB)です。



$ sudo aptitude install libqt4-dev python-all-dev sip4 python-sip4 python-sip4-dev python-qt4-dev python-qt4







以下のコメントで、arty habruiserは依存関係を設定できることを正しく指摘しました



apt-get build-dep [package name]







したがって、必要なパッケージをすべて手作業でリストする必要はありません。

必要なものをすべてインストールした後、アセンブリを再度実行します。



$ dpkg-buildpackage -rfakeroot







これですべてが問題なく進むはずです。

前の手順ですべてを正しく行った場合、しばらくするとアセンブリが終了し(デジタル署名がないために呪われますが、これは無視できます)、いくつかのdebパッケージが上記のディレクトリに表示されます。 そのうちの1つであるlibqscintilla2-3_2.3.2-0ubuntu2_i386.debに興味があります。 インストールする



$ sudo dpkg -i ../libqscintilla2-3_2.3.2-0ubuntu2_i386.deb







このライブラリを使用するプログラム(たとえば、JuffEd)を[再]実行します。



出来上がり! オートコンプリートが機能します!



追加またはコメントがある場合-コメントへようこそ。



最も怠Forな-Ubuntu 9.04(i386)用の既にアセンブルおよびパッチされたパッケージ



UPD1:申し訳ありませんが、間違ったパッケージを充填しました。 debをダウンロードし、インストールしてもまだ何も動作しない場合-もう一度ダウンロードします。

$ md5sum libqscintilla2-3_2.3.2-patched-1ubuntu2_i386.deb

e5047bb52011d80b06e82fafe5063a73 libqscintilla2-3_2.3.2-patched-1ubuntu2_i386.deb



UPD2: Ubuntu 9.10(i386)用のパッチが適用されたパッケージ



All Articles