diff options
author | Andy Cedilnik <andy.cedilnik@kitware.com> | 2004-06-28 18:40:17 (GMT) |
---|---|---|
committer | Andy Cedilnik <andy.cedilnik@kitware.com> | 2004-06-28 18:40:17 (GMT) |
commit | f9b43b9212b1ae2ba4dd9c4f609f8d5093421398 (patch) | |
tree | 3d0d7dc4ceb4f927efa927a568adc2594a58d355 /Source/cmFileCommand.cxx | |
parent | d392ccaee563a7f757eae72d9b32ea258e846a7c (diff) | |
download | CMake-f9b43b9212b1ae2ba4dd9c4f609f8d5093421398.zip CMake-f9b43b9212b1ae2ba4dd9c4f609f8d5093421398.tar.gz CMake-f9b43b9212b1ae2ba4dd9c4f609f8d5093421398.tar.bz2 |
BUG: Implement installing of shared library versioning and add test for the whole thing
Diffstat (limited to 'Source/cmFileCommand.cxx')
-rw-r--r-- | Source/cmFileCommand.cxx | 83 |
1 files changed, 78 insertions, 5 deletions
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 4f578c2..1b49ff7 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -249,8 +249,6 @@ bool cmFileCommand::HandleInstallCommand( std::string destination = ""; std::string stype = "FILES"; const char* build_type = m_Makefile->GetDefinition("BUILD_TYPE"); - const char* debug_postfix - = m_Makefile->GetDefinition("CMAKE_DEBUG_POSTFIX"); const char* destdir = cmSystemTools::GetEnv("DESTDIR"); std::string extra_dir = ""; @@ -271,7 +269,10 @@ bool cmFileCommand::HandleInstallCommand( std::vector<std::string>::size_type i = 0; i++; // Get rid of subcommand + std::map<cmStdString, const char*> properties; + bool in_files = false; + bool in_properties = false; bool optional = false; for ( ; i != args.size(); ++i ) { @@ -281,6 +282,7 @@ bool cmFileCommand::HandleInstallCommand( i++; destination = args[i]; in_files = false; + in_properties = false; } else if ( *cstr == "TYPE" && i < args.size()-1 ) { @@ -291,11 +293,23 @@ bool cmFileCommand::HandleInstallCommand( i++; optional = true; } + in_properties = false; + in_files = false; + } + else if ( *cstr == "PROPERTIES" ) + { + in_properties = true; in_files = false; } else if ( *cstr == "FILES" && !in_files) { in_files = true; + in_properties = false; + } + else if ( in_properties && i < args.size()-1 ) + { + properties[args[i]] = args[i+1].c_str(); + i++; } else if ( in_files ) { @@ -437,9 +451,65 @@ bool cmFileCommand::HandleInstallCommand( case cmTarget::MODULE_LIBRARY: case cmTarget::STATIC_LIBRARY: case cmTarget::SHARED_LIBRARY: - if ( debug ) { - fname = fnamewe + debug_postfix + ext; + // Handle shared library versioning + const char* lib_version = 0; + const char* lib_soversion = 0; + if ( properties.find("VERSION") != properties.end() ) + { + lib_version = properties["VERSION"]; + } + if ( properties.find("SOVERSION") != properties.end() ) + { + lib_soversion = properties["SOVERSION"]; + } + if ( !lib_version && lib_soversion ) + { + lib_version = lib_soversion; + } + if ( !lib_soversion && lib_version ) + { + lib_soversion = lib_version; + } + if ( lib_version && lib_soversion ) + { + std::string libname = destfile; + std::string soname = destfile; + std::string soname_nopath = fname; + soname += "."; + soname += lib_soversion; + soname_nopath += "."; + soname_nopath += lib_soversion; + + fname += "."; + fname += lib_version; + destfile += "."; + destfile += lib_version; + + cmSystemTools::RemoveFile(soname.c_str()); + cmSystemTools::RemoveFile(libname.c_str()); + + if (!cmSystemTools::CreateSymlink(soname_nopath.c_str(), libname.c_str()) ) + { + std::string errstring = "error when creating symlink from: " + libname + " to " + soname_nopath; + this->SetError(errstring.c_str()); + return false; + } + if ( destfile != soname ) + { + if ( !cmSystemTools::CreateSymlink(fname.c_str(), soname.c_str()) ) + { + std::string errstring = "error when creating symlink from: " + soname + " to " + fname; + this->SetError(errstring.c_str()); + return false; + } + } + } + cmOStringStream str; + str << cmSystemTools::GetFilenamePath(ctarget) + << "/" << extra_dir << "/" + << fname; + ctarget = str.str(); } case cmTarget::EXECUTABLE: if ( extra_dir.size() > 0 ) @@ -455,6 +525,7 @@ bool cmFileCommand::HandleInstallCommand( if ( cmSystemTools::FileExists(ctarget.c_str()) ) { + cmSystemTools::RemoveFile(destfile.c_str()); if ( !cmSystemTools::CopyFileAlways(ctarget.c_str(), destination.c_str()) ) { @@ -482,7 +553,9 @@ bool cmFileCommand::HandleInstallCommand( #endif ) ) { - perror("problem doing chmod."); + cmOStringStream err; + err << "Program setting permissions on file: " << destfile.c_str(); + perror(err.str().c_str()); } } smanifest_files += ";" + destfile; |