1

私は、アプリケーションで使用するためにサードパーティのオープン ソース ライブラリにパッチを適用する必要があるプロジェクトに取り組んでいます。簡単にするために、ここでは Makefile と単純な構成スクリプトのみを使用してアプリケーションを構築しています。適用する必要がある複数のパッチがあるため、Makefile の依存関係を使用してパッチを適用します。

all: patch1 patch2 patch3
    do-build-stuff-here
patch1:
    patch -p0 < patch1.patch && touch patch1
patch2:
    patch -p0 < patch2.patch && touch patch2
patch3:
    patch -p0 < patch3.patch && touch patch3

Debian パッケージング システムがメンテナ パッチに使用する Quilt については知っています。私はそれを使用しました、そしてそれは本当にうまくいきます。ただし、特に Debian を持っていない人にとっては、不要な依存関係が生じます。

場合によっては、私 (および他の開発者) が特定の条件下でビルドとアプリケーションを再テストできるように、すべてのパッチが適用されているわけではありません。「clean」または「distclean」を呼び出すときは、通常、パッチを逆にします。

clean: rmpatch1 rmpatch2 rmpatch3
    do-clean-stuff-here
rmpatch1:
    patch -p0 -R < patch1.patch
rmpatch2:
    patch -p0 -R < patch2.patch
rmpatch3:
    patch -p0 -R < patch3.patch

(元のソースを削除して、最初からやり直すことができるという事実は無視してください。)

ただし、パッチ #3 が適用されておらず、パッチ #1 と #2 が適用されている場合、パッチは失敗する可能性があります。したがって、私は各 rmpatch に対応するパッチに依存しています。

rmpatch1: patch1
    patch -p0 -R < patch1.patch
rmpatch2: patch2
    patch -p0 -R < patch2.patch
rmpatch3: patch3
    patch -p0 -R < patch3.patch

しかし、これでも私の問題は解決しません。「クリーンにする」とは、最初にソースにパッチを適用してから、再びパッチを解除することになります!

私の質問は次のようになると思います: パッチが適用されているかどうかを検出できる方法はありますか? patch を対話的に実行すると、以前に適用されたパッチが見つかったことがわかります。この動作は非対話的に再現できますか?

もう 1 つの質問 (やや関連) は、このパッチ適用方法が有効かどうかです。有効でない場合は、(Makefile のみを使用して) 順次パッチ適用する方法を使用できます。

4

1 に答える 1