static void* libicuuc = nullptr;
static void* libicui18n = nullptr;
-// .x.x.x, considering the max number of decimal digits for each component
-static const int MaxICUVersionStringLength = 33;
+#define VERSION_PREFIX_NONE ""
+#define VERSION_PREFIX_SUSE "suse"
+
+// .[suse]x.x.x, considering the max number of decimal digits for each component
+static const int MaxICUVersionStringLength = sizeof(VERSION_PREFIX_SUSE) + 33;
#ifdef __APPLE__
-bool FindICULibs(char* symbolName, char* symbolVersion)
+bool FindICULibs(const char* versionPrefix, char* symbolName, char* symbolVersion)
{
#ifndef OSX_ICU_LIBRARY_PATH
static_assert(false, "The ICU Library path is not defined");
// 1. Only majorVer is not equal to -1 => result is baseFileName.majorver
// 2. Only majorVer and minorVer are not equal to -1 => result is baseFileName.majorver.minorVer
// 3. All components are not equal to -1 => result is baseFileName.majorver.minorVer.subver
-void GetVersionedLibFileName(const char* baseFileName, int majorVer, int minorVer, int subVer, char* result)
+void GetVersionedLibFileName(const char* baseFileName, int majorVer, int minorVer, int subVer, const char* versionPrefix, char* result)
{
assert(majorVer != -1);
- int nameLen = sprintf(result, "%s.%d", baseFileName, majorVer);
+ int nameLen = sprintf(result, "%s.%s%d", baseFileName, versionPrefix, majorVer);
if (minorVer != -1)
{
}
// Try to open the necessary ICU libraries
-bool OpenICULibraries(int majorVer, int minorVer, int subVer, char* symbolName, char* symbolVersion)
+bool OpenICULibraries(int majorVer, int minorVer, int subVer, const char* versionPrefix, char* symbolName, char* symbolVersion)
{
char libicuucName[64];
char libicui18nName[64];
static_assert(sizeof("libicuuc.so") + MaxICUVersionStringLength <= sizeof(libicuucName), "The libicuucName is too small");
- GetVersionedLibFileName("libicuuc.so", majorVer, minorVer, subVer, libicuucName);
+ GetVersionedLibFileName("libicuuc.so", majorVer, minorVer, subVer, versionPrefix, libicuucName);
static_assert(sizeof("libicui18n.so") + MaxICUVersionStringLength <= sizeof(libicui18nName), "The libicui18nName is too small");
- GetVersionedLibFileName("libicui18n.so", majorVer, minorVer, subVer, libicui18nName);
+ GetVersionedLibFileName("libicui18n.so", majorVer, minorVer, subVer, versionPrefix, libicui18nName);
libicuuc = dlopen(libicuucName, RTLD_LAZY);
if (libicuuc != nullptr)
// environment variable.
// The format of the string in this variable is majorVer[.minorVer[.subVer]] (the brackets
// indicate optional parts).
-bool FindLibUsingOverride(char* symbolName, char* symbolVersion)
+bool FindLibUsingOverride(const char* versionPrefix, char* symbolName, char* symbolVersion)
{
char* versionOverride = getenv("CLR_ICU_VERSION_OVERRIDE");
if (versionOverride != nullptr)
int matches = sscanf(versionOverride, "%d.%d.%d", &first, &second, &third);
if (matches > 0)
{
- if (OpenICULibraries(first, second, third, symbolName, symbolVersion))
+ if (OpenICULibraries(first, second, third, versionPrefix, symbolName, symbolVersion))
{
return true;
}
}
// Search for library files with names including the major version.
-bool FindLibWithMajorVersion(char* symbolName, char* symbolVersion)
+bool FindLibWithMajorVersion(const char* versionPrefix, char* symbolName, char* symbolVersion)
{
// ICU packaging documentation (http://userguide.icu-project.org/packaging)
// describes applications link against the major (e.g. libicuuc.so.54).
// Select the version of ICU present at build time.
- if (OpenICULibraries(MinICUVersion, -1, -1, symbolName, symbolVersion))
+ if (OpenICULibraries(MinICUVersion, -1, -1, versionPrefix, symbolName, symbolVersion))
{
return true;
}
// Select the highest supported version of ICU present on the local machine
for (int i = MaxICUVersion; i > MinICUVersion; i--)
{
- if (OpenICULibraries(i, -1, -1, symbolName, symbolVersion))
+ if (OpenICULibraries(i, -1, -1, versionPrefix, symbolName, symbolVersion))
{
return true;
}
// Select the highest supported version of ICU present on the local machine
// Search for library files with names including the major and minor version.
-bool FindLibWithMajorMinorVersion(char* symbolName, char* symbolVersion)
+bool FindLibWithMajorMinorVersion(const char* versionPrefix, char* symbolName, char* symbolVersion)
{
for (int i = MaxICUVersion; i >= MinICUVersion; i--)
{
for (int j = MaxMinorICUVersion; j >= MinMinorICUVersion; j--)
{
- if (OpenICULibraries(i, j, -1, symbolName, symbolVersion))
+ if (OpenICULibraries(i, j, -1, versionPrefix, symbolName, symbolVersion))
{
return true;
}
// Select the highest supported version of ICU present on the local machine
// Search for library files with names including the major, minor and sub version.
-bool FindLibWithMajorMinorSubVersion(char* symbolName, char* symbolVersion)
+bool FindLibWithMajorMinorSubVersion(const char* versionPrefix, char* symbolName, char* symbolVersion)
{
for (int i = MaxICUVersion; i >= MinICUVersion; i--)
{
{
for (int k = MaxSubICUVersion; k >= MinSubICUVersion; k--)
{
- if (OpenICULibraries(i, j, k, symbolName, symbolVersion))
+ if (OpenICULibraries(i, j, k, versionPrefix, symbolName, symbolVersion))
{
return true;
}
return false;
}
-bool FindICULibs(char* symbolName, char* symbolVersion)
+
+bool FindICULibs(const char* versionPrefix, char* symbolName, char* symbolVersion)
{
- return FindLibUsingOverride(symbolName, symbolVersion) ||
- FindLibWithMajorVersion(symbolName, symbolVersion) ||
- FindLibWithMajorMinorVersion(symbolName, symbolVersion) ||
- FindLibWithMajorMinorSubVersion(symbolName, symbolVersion);
+ return FindLibUsingOverride(versionPrefix, symbolName, symbolVersion) ||
+ FindLibWithMajorVersion(versionPrefix, symbolName, symbolVersion) ||
+ FindLibWithMajorMinorVersion(versionPrefix, symbolName, symbolVersion) ||
+ FindLibWithMajorMinorSubVersion(versionPrefix, symbolName, symbolVersion);
}
#endif // __APPLE__
char symbolName[128];
char symbolVersion[MaxICUVersionStringLength + 1] = "";
- if (!FindICULibs(symbolName, symbolVersion))
- return 0;
+ if (!FindICULibs(VERSION_PREFIX_NONE, symbolName, symbolVersion))
+ {
+#ifndef __APPLE__
+ if (!FindICULibs(VERSION_PREFIX_SUSE, symbolName, symbolVersion))
+#endif
+ {
+ return 0;
+ }
+ }
// Get pointers to all the ICU functions that are needed
#define PER_FUNCTION_BLOCK(fn, lib) \
dlclose(libicui18n);
libicui18n = nullptr;
}
-}
\ No newline at end of file
+}