File icu-versioning.diff of Package icu

From: Jan Engelhardt <jengelh@inai.de>
Date: 2013-06-11 03:36:48.480850779 +0200
References: http://bugzilla.novell.com/824262
Directions: drop patch if unable to forward-port

ICU sometimes changes their ABI without updating the SO numbers. They
did that before, and they did it again with 51.1->51.2. In part, this
is owed to how C++ is compiled on the contemporary implementations.

Thus, we will use the full version as the SO identifier in openSUSE.

Details:

U_ICU_VERSION_SHORT was (example) "51" before when there was a
libicui18n.so.51. Now, since there is a libicui18n.so.51.2, we need to
change U_ICU_VERSION_SHORT. But the define's documentation says
"without dots", and I do not know how much downstream code depends on
the non-dot feature, if at all. Anyhow, to bypass this question to
which we have no definite answer, U_ICU_VERSION_SHORT is instead simply
defined to "51_2" and we "fix" (read like: hack) it with symlinks.

However, the ICU source also uses U_ICU_VERSION_SHORT to construct the
path to its data files. However, as there is no "icudt51_2l.dat", but
only a "icudt51l.dat", U_ICU_VERSION_MAJOR_STR is introduced for
ICU-internal use, so that I do not have to edit more dirty Makefiles to
produce a "icudt51_2l.dat" instead. In fact, placing the version number
in "icudt51l" seems redundant, since that file is in a version-specific
directory anyway (/usr/share/icu/51.2/) — another point where ICU
development seems to not pay enough attention.

---
 source/common/icuplug.cpp               |    2 +-
 source/common/unicode/utypes.h          |    4 ++--
 source/common/unicode/uvernum.h         |    7 +++++--
 source/config/mh-linux                  |    2 +-
 source/config/pkgdataMakefile.in        |    1 +
 source/data/pkgdataMakefile.in          |    1 +
 source/extra/uconv/pkgdataMakefile.in   |    1 +
 source/icudefs.mk.in                    |    1 +
 source/test/testdata/pkgdataMakefile.in |    1 +
 source/tools/pkgdata/pkgdata.cpp        |    4 ++--
 10 files changed, 16 insertions(+), 8 deletions(-)

Index: icu/source/common/icuplug.cpp
===================================================================
--- icu.orig/source/common/icuplug.cpp
+++ icu/source/common/icuplug.cpp
@@ -760,7 +760,7 @@ uplug_init(UErrorCode *status) {
     pluginFile.append(plugin_dir, *status);
     pluginFile.append(U_FILE_SEP_STRING, -1, *status);
     pluginFile.append("icuplugins", -1, *status);
-    pluginFile.append(U_ICU_VERSION_SHORT, -1, *status);
+    pluginFile.append(U_ICU_VERSION_MAJOR_STR, -1, *status);
     pluginFile.append(".txt", -1, *status);
 #endif
 
Index: icu/source/common/unicode/utypes.h
===================================================================
--- icu.orig/source/common/unicode/utypes.h
+++ icu/source/common/unicode/utypes.h
@@ -136,9 +136,9 @@
  * ICU 1.8.x on EBCDIC, etc..
  * @stable ICU 2.0
  */
-#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
+#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_MAJOR_STR U_ICUDATA_TYPE_LETTER
 #ifndef U_HIDE_INTERNAL_API
-#define U_USRDATA_NAME    "usrdt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER  /**< @internal */
+#define U_USRDATA_NAME    "usrdt" U_ICU_VERSION_MAJOR_STR U_ICUDATA_TYPE_LETTER  /**< @internal */
 #define U_USE_USRDATA     0  /**< @internal */
 #endif  /* U_HIDE_INTERNAL_API */
 
Index: icu/source/common/unicode/uvernum.h
===================================================================
--- icu.orig/source/common/unicode/uvernum.h
+++ icu/source/common/unicode/uvernum.h
@@ -61,6 +61,7 @@
  *  @stable ICU 2.4
  */
 #define U_ICU_VERSION_MAJOR_NUM 64
+#define U_ICU_VERSION_MAJOR_STR "64"
 
 /** The current ICU minor version as an integer.
  *  This value will change in the subsequent releases of ICU
@@ -86,7 +87,9 @@
  *  This value will change in the subsequent releases of ICU
  *  @stable ICU 2.6
  */
-#define U_ICU_VERSION_SUFFIX _64
+#define ___icu_version_expand(major, minor) _ ## major ## _ ## minor
+#define ___icu_version_glue(major, minor) ___icu_version_expand(major, minor)
+#define U_ICU_VERSION_SUFFIX ___icu_version_glue(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM)
 
 /**
  * \def U_DEF2_ICU_ENTRY_POINT_RENAME
@@ -152,7 +155,7 @@
  *
  * @stable ICU 2.6
  */
-#define U_ICU_VERSION_SHORT "64"
+#define U_ICU_VERSION_SHORT "64_2"
 
 #ifndef U_HIDE_INTERNAL_API
 /** Data version in ICU4C.
Index: icu/source/config/mh-linux
===================================================================
--- icu.orig/source/config/mh-linux
+++ icu/source/config/mh-linux
@@ -27,7 +27,7 @@ LDFLAGSICUDT=-nodefaultlibs -nostdlib
 
 ## Compiler switch to embed a library name
 # The initial tab in the next line is to prevent icu-config from reading it.
-	LD_SONAME = -Wl,-soname -Wl,$(notdir $(MIDDLE_SO_TARGET))
+	LD_SONAME = -Wl,-soname -Wl,$(notdir $(FULL_SO_TARGET))
 #SH# # We can't depend on MIDDLE_SO_TARGET being set.
 #SH# LD_SONAME=
 
Index: icu/source/config/pkgdataMakefile.in
===================================================================
--- icu.orig/source/config/pkgdataMakefile.in
+++ icu/source/config/pkgdataMakefile.in
@@ -16,6 +16,7 @@ include $(top_builddir)/icudefs.mk
 
 OUTPUTFILE=pkgdata.inc
 MIDDLE_SO_TARGET=
+FULL_SO_TARGET=
 PKGDATA_TRAILING_SPACE=" "
 
 all : clean 
Index: icu/source/data/pkgdataMakefile.in
===================================================================
--- icu.orig/source/data/pkgdataMakefile.in
+++ icu/source/data/pkgdataMakefile.in
@@ -16,6 +16,7 @@ include $(top_builddir)/icudefs.mk
 
 OUTPUTFILE=icupkg.inc
 MIDDLE_SO_TARGET=
+FULL_SO_TARGET=
 PKGDATA_TRAILING_SPACE=" "
 
 all : clean 
Index: icu/source/extra/uconv/pkgdataMakefile.in
===================================================================
--- icu.orig/source/extra/uconv/pkgdataMakefile.in
+++ icu/source/extra/uconv/pkgdataMakefile.in
@@ -16,6 +16,7 @@ include $(top_builddir)/icudefs.mk
 
 OUTPUTFILE=pkgdata.inc
 MIDDLE_SO_TARGET=
+FULL_SO_TARGET=
 PKGDATA_TRAILING_SPACE=" "
 
 all : clean 
Index: icu/source/icudefs.mk.in
===================================================================
--- icu.orig/source/icudefs.mk.in
+++ icu/source/icudefs.mk.in
@@ -202,6 +202,7 @@ LDLIBRARYPATH_ENVVAR = LD_LIBRARY_PATH
 
 # Versioned target for a shared library.
 FINAL_SO_TARGET = $(SO_TARGET).$(SO_TARGET_VERSION)
+FULL_SO_TARGET = $(SO_TARGET).$(SO_TARGET_VERSION)
 MIDDLE_SO_TARGET = $(SO_TARGET).$(SO_TARGET_VERSION_MAJOR)
 SHARED_OBJECT = $(FINAL_SO_TARGET)
 
Index: icu/source/test/testdata/pkgdataMakefile.in
===================================================================
--- icu.orig/source/test/testdata/pkgdataMakefile.in
+++ icu/source/test/testdata/pkgdataMakefile.in
@@ -16,6 +16,7 @@ include $(top_builddir)/icudefs.mk
 
 OUTPUTFILE=pkgdata.inc
 MIDDLE_SO_TARGET=
+FULL_SO_TARGET=
 PKGDATA_TRAILING_SPACE=" "
 
 all : clean 
Index: icu/source/tools/pkgdata/pkgdata.cpp
===================================================================
--- icu.orig/source/tools/pkgdata/pkgdata.cpp
+++ icu/source/tools/pkgdata/pkgdata.cpp
@@ -1379,7 +1379,7 @@ static int32_t pkg_generateLibraryFile(c
             length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[GENLIB]) + uprv_strlen(pkgDataFlags[LDICUDTFLAGS]) +
                      ((uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_VERSION_TMP])) * 2) +
                      uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[LD_SONAME]) +
-                     uprv_strlen(pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR]) +
+                     uprv_strlen(pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION]) +
                      uprv_strlen(pkgDataFlags[RPATH_FLAGS]) + uprv_strlen(pkgDataFlags[BIR_FLAGS]) + BUFFER_PADDING_SIZE);
 #if U_PLATFORM == U_PF_CYGWIN
             length += static_cast<int32_t>(uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_CYGWIN_VERSION]));
@@ -1426,7 +1426,7 @@ static int32_t pkg_generateLibraryFile(c
 #endif
                 objectFile,
                 pkgDataFlags[LD_SONAME],
-                pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR],
+                pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION],
                 pkgDataFlags[RPATH_FLAGS],
                 pkgDataFlags[BIR_FLAGS]);