$OpenBSD: patch-Source_cmTarget_cxx,v 1.9 2011/09/20 11:32:36 dcoppa Exp $ --- Source/cmTarget.cxx.orig Fri Jul 8 14:21:47 2011 +++ Source/cmTarget.cxx Fri Sep 9 09:49:49 2011 @@ -3276,6 +3276,36 @@ void cmTarget::GetLibraryNames(std::string& name, std::string suffix; this->GetFullNameInternal(config, false, prefix, base, suffix); +#if defined(__OpenBSD__) + // Override shared library version using LIBxxx_VERSION + // environment variable. Needed for OpenBSD ports system. + if(this->GetType() == cmTarget::SHARED_LIBRARY || + this->GetType() == cmTarget::MODULE_LIBRARY) + { + std::string env_name = "LIB" + base + "_VERSION"; + char *env_vers_cstr = getenv(env_name.c_str()); + + if (env_vers_cstr != NULL) { + // This means an override is present. + std::string env_vers = std::string(env_vers_cstr); + + size_t first = env_vers.find_first_of("."); + size_t last = env_vers.find_first_of("."); + + if ((first != last) || (first == std::string::npos)) { + std::string msg = "Bad "; + msg += env_name; + msg += " specification: "; + msg += env_vers; + this->Makefile->IssueMessage(cmake::FATAL_ERROR, + msg.c_str()); + } else { + soversion = version = env_vers_cstr; + } + } + } +#endif + // The library name. name = prefix+base+suffix; @@ -3310,8 +3340,27 @@ void cmTarget::GetLibraryNames(std::string& name, if(version) { realName += "."; +#if defined(__OpenBSD__) + // OpenBSD-style versioning scheme for shared libraries. + // Convert libname.so.X.X.X to libname.so.X.X + int j = 0; + for (int i = 0; i < (int)strlen(version); i++) + { + if (version[i] == '.') + { + j++; + if (j == 2) + { + break; + } + } + realName += version[i]; + } + } +#else realName += version; } +#endif else if(soversion) { realName += ".";