2017-03-29 13 views
0

Solaris上でlibidn2にパッチを適用する必要があります。 libidn2は、GNUのWebサイトからwgetで取得されました。 Sunによって提供されておらず、ソース管理でも提供されていません。ソース管理なしでフリースタンディングパッチを作成するにはどうすればいいですか?

ライブラリにはglibcが使用されておらず、機能はerror (int status, int errnum, const char *format, ...)ではありません。私は、元のソースファイルのコピーを作って、私は同様の機能とのdiffを持っている:

solaris:libidn2-0.16$ diff -u src/idn2.c.bu src/idn2.c 
--- src/idn2.c.bu  2017-03-29 00:20:08.621934160 -0400 
+++ src/idn2.c 2017-03-29 01:25:12.488402745 -0400 
@@ -31,7 +31,9 @@ 
#include <unistr.h> 

/* Gnulib headers. */ 
+#ifndef __sun__ 
#include "error.h" 
+#endif 
#include "gettext.h" 
#define _(String) dgettext (PACKAGE, String) 
#include "progname.h" 
@@ -48,6 +50,18 @@ 
     year. */ 
    "Copyright %s %d Simon Josefsson."; 

+#if defined(__sun__) 
+static void 
+error (int status, int errnum, const char *format, ...) 
+{ 
+ va_list args; 
+ va_start(args, format); 
+ vfprintf(stderr, format, args); 
+ va_end(args); 
+ exit(status); 
+} 
+#endif 
+ 
static void 
usage (int status) 
{ 

私はdiff(1)patch(1)のmanページを読んでいるが、私は非常にする必要があるもの届きません完了しました。私はその仕事についての議論を見つけたとは思わない(多分私は木々の中で森を見ていないだろう)。

私の質問は、これをフリースタンディングパッチにするにはどうすればいいですか?つまり、libidn2を新しくダウンロードして解凍した後、どのように適用するには?

答えて

3

これが正しい答えではないかもしれませんが、引用符はコメントに収まらないだろう、とpatchとの私の経験がdiffからの出力が「自立型のパッチ」であるということです。

あなたは、あなたのdiff出力がpatchに適用した場合何が起こるかを見るために拡張libidn2ソースtarballの最も可能性の高いベースディレクトリからpatch --dry-run < your.diff.outputを実行することができます。

インストールされているSolaris 11のコピーでは、patchはGNUパッチのように見えますが、これは--dry-runオプションです。 PATCHの送信者

NOTES

あなたがパッチを送信することが 予定されている場合は、あなたが心に留めなければならないいくつかのものがあります:The Solaris 11.2 patch man pageは、パッチを作成するためのこの抜粋を持っています。

パッチを体系的に作成します。良い方法はコマンドdiff -Naur old newです。ここで、oldnewは古い と新しいディレクトリを識別します。名前oldとnewにはスラッシュを含めないでください。 diffコマンドのヘッダーには、従来のUnix 形式を使用して、 日時の世界時があり、パッチ受信者は-Zまたは--set-utc オプションを使用できます。ここではBourneシェルシン 税を使用して、コマンド例です:

   LC_ALL=C TZ=UTC0 diff -Naur gcc-2.7 gcc-2.8 

は たディレクトリのCDにするためにそれらを伝えることで、パッチを適用する方法を受信者に知らせると、そのパッチのオプションを使用するには。 オプション文字列-Np1をお勧めします。手順 を受信者になり、元のファイルの コピーにパッチを適用してテストします。

...

-1

これはXY problemのように聞こえます。あなたの中核的な問題は「現在libidn2のソースにパッチを適用していますが、後でlibidn2のリリースでそれをやり直したいのですが」ということでしょうか? これはまさにソースコードコントロールを使用したいものです!上流のソースは、ソースコード管理リポジトリからフェッチではないという理由だけで、それはあなたが一つに自分を置くことができないという意味ではありません。

$ mkdir libidn2-source; cd libidn2-source 
$ git init 
$ git checkout -b upstream 
$ wget https://alpha.gnu.org/gnu/libidn/libidn2-0.16.tar.gz 
$ tar zxvf libidn2-0.16.tar.gz && rm libidn2-0.16.tar.gz 
$ git add . 
$ git commit -m "Upstream libidn2-0.16.tar.gz" 
$ git checkout -b downstream 
$ cp /the/file/in/the/question/src/idn2.c src/idn2.c 
$ git add src/idn2.c 
$ git commit -m "Added sun specific error fallback function" 

# In the future... 
$ git checkout upstream 
$ wget https://alpha.gnu.org/gnu/libidn/libidn2-latestgreatest.tar.gz 
$ tar zxvf libidn2-latestgreatest.tar.gz && rm libidn2-latestgreatest.tar.gz 
$ git add . 
$ git commit -m "Upstream libidn2-latestgreatest.tar.gz" 

# Now for the "apply after a fresh download and unpack of libidn2" part: 
$ git rebase upstream downstream 

お知らせいずれかの欠如はを追跡し、ここで自立パッチファイルを更新。


ソースはgit repoで利用可能であるように思わので、あなたはただその代わりに、ダウンロードしたtarファイルをチェックインのクローンかもしれませんが、リベースの部分はまったく同じになります。

+0

ありがとうございました。 Gitからチェックアウトするのはワークフローではありません。実際には、スクリプトはCentOS 5とFedora 10で実行されることを意図しています。このスクリプトはGitを持っていないマシンにGitをインストールします。最初のスクリプトが書かれると、Solarisに向けて指摘されました。 Oracleは非常に古いGit(Solaris 11)またはGit(Solaris 10)を提供していません。 Oracleは更新されたGitへのアクセスを許可します。 – jww

+0

しかし、gitはまだ "これをフリースタンディングパッチに変えることはできますか?"という答えです。 gitをSolarisマシンにインストールする必要はありません.Centos/Fedoraマシンのいずれかに格納しておき、 'git format-patch upstream downstream'を実行するSolarisマシンのパッチが必要な場合は、 patch(1)プログラムで適用可能な最新のフリースタンディングパッチを作成します。 – hlovdal

関連する問題