@@ -19,12 +19,15 @@ FOR_ALL_ICU_FUNCTIONS
19
19
static void * libicuuc = nullptr ;
20
20
static void * libicui18n = nullptr ;
21
21
22
- // .x.x.x, considering the max number of decimal digits for each component
23
- static const int MaxICUVersionStringLength = 33 ;
22
+ #define VERSION_PREFIX_NONE " "
23
+ #define VERSION_PREFIX_SUSE " suse"
24
+
25
+ // .[suse]x.x.x, considering the max number of decimal digits for each component
26
+ static const int MaxICUVersionStringLength = sizeof (VERSION_PREFIX_SUSE) + 33 ;
24
27
25
28
#ifdef __APPLE__
26
29
27
- bool FindICULibs (char * symbolName, char * symbolVersion)
30
+ bool FindICULibs (const char * versionPrefix, char * symbolName, char * symbolVersion)
28
31
{
29
32
#ifndef OSX_ICU_LIBRARY_PATH
30
33
static_assert (false , " The ICU Library path is not defined" );
@@ -63,11 +66,11 @@ static const int MaxSubICUVersion = 5;
63
66
// 1. Only majorVer is not equal to -1 => result is baseFileName.majorver
64
67
// 2. Only majorVer and minorVer are not equal to -1 => result is baseFileName.majorver.minorVer
65
68
// 3. All components are not equal to -1 => result is baseFileName.majorver.minorVer.subver
66
- void GetVersionedLibFileName (const char * baseFileName, int majorVer, int minorVer, int subVer, char * result)
69
+ void GetVersionedLibFileName (const char * baseFileName, int majorVer, int minorVer, int subVer, const char * versionPrefix, char * result)
67
70
{
68
71
assert (majorVer != -1 );
69
72
70
- int nameLen = sprintf (result, " %s.%d" , baseFileName, majorVer);
73
+ int nameLen = sprintf (result, " %s.%s% d" , baseFileName, versionPrefix , majorVer);
71
74
72
75
if (minorVer != -1 )
73
76
{
@@ -110,16 +113,16 @@ bool FindSymbolVersion(int majorVer, int minorVer, int subVer, char* symbolName,
110
113
}
111
114
112
115
// Try to open the necessary ICU libraries
113
- bool OpenICULibraries (int majorVer, int minorVer, int subVer, char * symbolName, char * symbolVersion)
116
+ bool OpenICULibraries (int majorVer, int minorVer, int subVer, const char * versionPrefix, char * symbolName, char * symbolVersion)
114
117
{
115
118
char libicuucName[64 ];
116
119
char libicui18nName[64 ];
117
120
118
121
static_assert (sizeof (" libicuuc.so" ) + MaxICUVersionStringLength <= sizeof (libicuucName), " The libicuucName is too small" );
119
- GetVersionedLibFileName (" libicuuc.so" , majorVer, minorVer, subVer, libicuucName);
122
+ GetVersionedLibFileName (" libicuuc.so" , majorVer, minorVer, subVer, versionPrefix, libicuucName);
120
123
121
124
static_assert (sizeof (" libicui18n.so" ) + MaxICUVersionStringLength <= sizeof (libicui18nName), " The libicui18nName is too small" );
122
- GetVersionedLibFileName (" libicui18n.so" , majorVer, minorVer, subVer, libicui18nName);
125
+ GetVersionedLibFileName (" libicui18n.so" , majorVer, minorVer, subVer, versionPrefix, libicui18nName);
123
126
124
127
libicuuc = dlopen (libicuucName, RTLD_LAZY);
125
128
if (libicuuc != nullptr )
@@ -142,7 +145,7 @@ bool OpenICULibraries(int majorVer, int minorVer, int subVer, char* symbolName,
142
145
// environment variable.
143
146
// The format of the string in this variable is majorVer[.minorVer[.subVer]] (the brackets
144
147
// indicate optional parts).
145
- bool FindLibUsingOverride (char * symbolName, char * symbolVersion)
148
+ bool FindLibUsingOverride (const char * versionPrefix, char * symbolName, char * symbolVersion)
146
149
{
147
150
char * versionOverride = getenv (" CLR_ICU_VERSION_OVERRIDE" );
148
151
if (versionOverride != nullptr )
@@ -154,7 +157,7 @@ bool FindLibUsingOverride(char* symbolName, char* symbolVersion)
154
157
int matches = sscanf (versionOverride, " %d.%d.%d" , &first, &second, &third);
155
158
if (matches > 0 )
156
159
{
157
- if (OpenICULibraries (first, second, third, symbolName, symbolVersion))
160
+ if (OpenICULibraries (first, second, third, versionPrefix, symbolName, symbolVersion))
158
161
{
159
162
return true ;
160
163
}
@@ -165,21 +168,21 @@ bool FindLibUsingOverride(char* symbolName, char* symbolVersion)
165
168
}
166
169
167
170
// Search for library files with names including the major version.
168
- bool FindLibWithMajorVersion (char * symbolName, char * symbolVersion)
171
+ bool FindLibWithMajorVersion (const char * versionPrefix, char * symbolName, char * symbolVersion)
169
172
{
170
173
// ICU packaging documentation (http://userguide.icu-project.org/packaging)
171
174
// describes applications link against the major (e.g. libicuuc.so.54).
172
175
173
176
// Select the version of ICU present at build time.
174
- if (OpenICULibraries (MinICUVersion, -1 , -1 , symbolName, symbolVersion))
177
+ if (OpenICULibraries (MinICUVersion, -1 , -1 , versionPrefix, symbolName, symbolVersion))
175
178
{
176
179
return true ;
177
180
}
178
181
179
182
// Select the highest supported version of ICU present on the local machine
180
183
for (int i = MaxICUVersion; i > MinICUVersion; i--)
181
184
{
182
- if (OpenICULibraries (i, -1 , -1 , symbolName, symbolVersion))
185
+ if (OpenICULibraries (i, -1 , -1 , versionPrefix, symbolName, symbolVersion))
183
186
{
184
187
return true ;
185
188
}
@@ -190,13 +193,13 @@ bool FindLibWithMajorVersion(char* symbolName, char* symbolVersion)
190
193
191
194
// Select the highest supported version of ICU present on the local machine
192
195
// Search for library files with names including the major and minor version.
193
- bool FindLibWithMajorMinorVersion (char * symbolName, char * symbolVersion)
196
+ bool FindLibWithMajorMinorVersion (const char * versionPrefix, char * symbolName, char * symbolVersion)
194
197
{
195
198
for (int i = MaxICUVersion; i >= MinICUVersion; i--)
196
199
{
197
200
for (int j = MaxMinorICUVersion; j >= MinMinorICUVersion; j--)
198
201
{
199
- if (OpenICULibraries (i, j, -1 , symbolName, symbolVersion))
202
+ if (OpenICULibraries (i, j, -1 , versionPrefix, symbolName, symbolVersion))
200
203
{
201
204
return true ;
202
205
}
@@ -208,15 +211,15 @@ bool FindLibWithMajorMinorVersion(char* symbolName, char* symbolVersion)
208
211
209
212
// Select the highest supported version of ICU present on the local machine
210
213
// Search for library files with names including the major, minor and sub version.
211
- bool FindLibWithMajorMinorSubVersion (char * symbolName, char * symbolVersion)
214
+ bool FindLibWithMajorMinorSubVersion (const char * versionPrefix, char * symbolName, char * symbolVersion)
212
215
{
213
216
for (int i = MaxICUVersion; i >= MinICUVersion; i--)
214
217
{
215
218
for (int j = MaxMinorICUVersion; j >= MinMinorICUVersion; j--)
216
219
{
217
220
for (int k = MaxSubICUVersion; k >= MinSubICUVersion; k--)
218
221
{
219
- if (OpenICULibraries (i, j, k, symbolName, symbolVersion))
222
+ if (OpenICULibraries (i, j, k, versionPrefix, symbolName, symbolVersion))
220
223
{
221
224
return true ;
222
225
}
@@ -227,12 +230,13 @@ bool FindLibWithMajorMinorSubVersion(char* symbolName, char* symbolVersion)
227
230
return false ;
228
231
}
229
232
230
- bool FindICULibs (char * symbolName, char * symbolVersion)
233
+
234
+ bool FindICULibs (const char * versionPrefix, char * symbolName, char * symbolVersion)
231
235
{
232
- return FindLibUsingOverride (symbolName, symbolVersion) ||
233
- FindLibWithMajorVersion (symbolName, symbolVersion) ||
234
- FindLibWithMajorMinorVersion (symbolName, symbolVersion) ||
235
- FindLibWithMajorMinorSubVersion (symbolName, symbolVersion);
236
+ return FindLibUsingOverride (versionPrefix, symbolName, symbolVersion) ||
237
+ FindLibWithMajorVersion (versionPrefix, symbolName, symbolVersion) ||
238
+ FindLibWithMajorMinorVersion (versionPrefix, symbolName, symbolVersion) ||
239
+ FindLibWithMajorMinorSubVersion (versionPrefix, symbolName, symbolVersion);
236
240
}
237
241
238
242
#endif // __APPLE__
@@ -246,8 +250,15 @@ extern "C" int32_t GlobalizationNative_LoadICU()
246
250
char symbolName[128 ];
247
251
char symbolVersion[MaxICUVersionStringLength + 1 ] = " " ;
248
252
249
- if (!FindICULibs (symbolName, symbolVersion))
250
- return 0 ;
253
+ if (!FindICULibs (VERSION_PREFIX_NONE, symbolName, symbolVersion))
254
+ {
255
+ #ifndef __APPLE__
256
+ if (!FindICULibs (VERSION_PREFIX_SUSE, symbolName, symbolVersion))
257
+ #endif
258
+ {
259
+ return 0 ;
260
+ }
261
+ }
251
262
252
263
// Get pointers to all the ICU functions that are needed
253
264
#define PER_FUNCTION_BLOCK (fn, lib ) \
@@ -290,4 +301,4 @@ void ShutdownICUShim()
290
301
dlclose (libicui18n);
291
302
libicui18n = nullptr ;
292
303
}
293
- }
304
+ }
0 commit comments