我需要在Solaris上修补libidn2。 libidn2是从GNU的网站上用wget获取的。它不是Sun提供的,也不是源代码控制。
该库不使用glibc
,并且它没有函数error (int status, int errnum, const char *format, ...)
。我制作了原始源文件的副本,我有一个类似功能的差异:
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)
手册页,但我还没有完全了解需要做的事情。我不相信我已经找到了对任务的讨论(也许我没有看到树林中的森林)。
我的问题是,如何将其变成一个独立的补丁?也就是说,如何在重新下载并解压缩libidn2后将其转换成适用的东西?
答案 0 :(得分:3)
这可能不是正确的答案,但引用不符合评论,我对patch
的体验是diff
的输出是&#34;独立补丁&#34;。
您可以从扩展的libidn2源代码tarball的基本目录中运行patch --dry-run < your.diff.output
,以便在使用patch
应用diff输出时查看会发生什么。
在我安装的Solaris 11副本中,patch
似乎是GNU补丁,因为它具有--dry-run
选项。 The Solaris 11.2 patch
man page有这个用于创建补丁的摘录:
补丁发送者说明
如果你有,你应该记住几件事 将发送补丁。
系统地创建补丁。一个好的方法是命令
diff -Naur old new
,其中old
和new
标识旧的 和新目录。旧名称和新名称不应包含任何斜杠。 diff命令的标题应该有 使用传统Unix在Universal Time中的日期和时间 格式,以便修补程序收件人可以使用-Z或--set-utc 选项。这是一个示例命令,使用Bourne shell syn- 税:LC_ALL=C TZ=UTC0 diff -Naur gcc-2.7 gcc-2.8
告诉收件人如何通过告诉他们来应用补丁 cd到哪个目录,以及要使用的补丁选项。 建议使用选项字符串
-Np1
。测试你的程序 通过伪装成收件人并将您的补丁应用于 原始文件的副本。...
答案 1 :(得分:-2)
这听起来像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文件,但是rebase部分将完全相同。