diff options
author | Brad King <brad.king@kitware.com> | 2006-02-19 20:25:27 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2006-02-19 20:25:27 (GMT) |
commit | 96f0266228d8fdf7d420c4a562e6988830fa4996 (patch) | |
tree | 2525ae96a1752df9f6024ee4f08c84c480bbe0a6 /Source/cmInstallTargetGenerator.cxx | |
parent | 90c8ea1c03dea51c87fc75a38e018e5f9ce11546 (diff) | |
download | CMake-96f0266228d8fdf7d420c4a562e6988830fa4996.zip CMake-96f0266228d8fdf7d420c4a562e6988830fa4996.tar.gz CMake-96f0266228d8fdf7d420c4a562e6988830fa4996.tar.bz2 |
ENH: Created new install script generation framework. The INSTALL command creates the generators which are later used by cmLocalGenerator to create the cmake_install.cmake files. A new target installation interface is provided by the INSTALL command which fixes several problems with the INSTALL_TARGETS command. See bug#2691. Bugs 1481 and 1695 are addressed by these changes.
Diffstat (limited to 'Source/cmInstallTargetGenerator.cxx')
-rw-r--r-- | Source/cmInstallTargetGenerator.cxx | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/Source/cmInstallTargetGenerator.cxx b/Source/cmInstallTargetGenerator.cxx new file mode 100644 index 0000000..7e07597 --- /dev/null +++ b/Source/cmInstallTargetGenerator.cxx @@ -0,0 +1,191 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#include "cmInstallTargetGenerator.h" + +#include "cmGlobalGenerator.h" +#include "cmLocalGenerator.h" +#include "cmMakefile.h" +#include "cmTarget.h" + +//---------------------------------------------------------------------------- +cmInstallTargetGenerator +::cmInstallTargetGenerator(cmTarget& t, const char* dest, bool implib): + Target(&t), Destination(dest), ImportLibrary(implib) +{ +} + +//---------------------------------------------------------------------------- +cmInstallTargetGenerator +::~cmInstallTargetGenerator() +{ +} + +//---------------------------------------------------------------------------- +void cmInstallTargetGenerator::GenerateScript(std::ostream& os) +{ + // Compute the build tree directory from which to copy the target. + std::string fromDir; + if(this->Target->NeedRelinkBeforeInstall()) + { + fromDir = this->Target->GetMakefile()->GetStartOutputDirectory(); + fromDir += "/CMakeFiles/CMakeRelink.dir/"; + } + else + { + fromDir = this->Target->GetDirectory(); + fromDir += "/"; + } + + // Write variable settings to do per-configuration references. + this->PrepareInstallReference(os); + + // Create the per-configuration reference. + std::string fromName = this->GetInstallReference(); + std::string fromFile = fromDir; + fromFile += fromName; + + // Setup special properties for some target types. + std::string props; + const char* properties = 0; + cmTarget::TargetType type = this->Target->GetType(); + switch(type) + { + case cmTarget::SHARED_LIBRARY: + { + // Add shared library installation properties if this platform + // supports them. + const char* lib_version = this->Target->GetProperty("VERSION"); + const char* lib_soversion = this->Target->GetProperty("SOVERSION"); + if(!this->Target->GetMakefile() + ->GetDefinition("CMAKE_SHARED_LIBRARY_SONAME_C_FLAG")) + { + // Versioning is supported only for shared libraries and modules, + // and then only when the platform supports an soname flag. + lib_version = 0; + lib_soversion = 0; + } + if(lib_version) + { + props += " VERSION "; + props += lib_version; + } + if(lib_soversion) + { + props += " SOVERSION "; + props += lib_soversion; + } + properties = props.c_str(); + } + break; + case cmTarget::EXECUTABLE: + { + // Add executable installation properties if this platform + // supports them. +#if defined(_WIN32) && !defined(__CYGWIN__) + const char* exe_version = 0; +#else + const char* exe_version = this->Target->GetProperty("VERSION"); +#endif + if(exe_version) + { + props += " VERSION "; + props += exe_version; + properties = props.c_str(); + } + + // Handle OSX Bundles. + if(this->Target->GetPropertyAsBool("MACOSX_BUNDLE")) + { + // Compute the source locations of the bundle executable and + // Info.plist file. + std::string plist = fromFile; + plist += ".app/Contents/Info.plist"; + fromFile += ".app/Contents/MacOS/"; + fromFile += fromName; + + // Compute the destination locations of the bundle executable + // and Info.plist file. + std::string bdest = this->Destination; + bdest += "/"; + bdest += fromName; + std::string pdest = bdest; + pdest += ".app/Contents"; + bdest += ".app/Contents/MacOS"; + + // Install the Info.plist file. + this->AddInstallRule(os, pdest.c_str(), cmTarget::INSTALL_FILES, + plist.c_str()); + } + } + break; + case cmTarget::STATIC_LIBRARY: + case cmTarget::MODULE_LIBRARY: + // Nothing special for modules or static libraries. + break; + default: + break; + } + + // Write code to install the target file. + this->AddInstallRule(os, this->Destination.c_str(), type, fromFile.c_str(), + this->ImportLibrary, properties); +} + +//---------------------------------------------------------------------------- +void +cmInstallTargetGenerator +::PrepareInstallReference(std::ostream& os) +{ + // If the target name may vary with the configuration type then + // store all possible names ahead of time in variables. + std::string fname; + for(std::vector<std::string>::const_iterator i = + this->ConfigurationTypes->begin(); + i != this->ConfigurationTypes->end(); ++i) + { + // Set a variable with the target name for this configuration. + fname = this->Target->GetFullName(i->c_str(), this->ImportLibrary); + os << "SET(" << this->Target->GetName() + << (this->ImportLibrary? "_IMPNAME_" : "_NAME_") << *i + << " \"" << fname << "\")\n"; + } +} + +//---------------------------------------------------------------------------- +std::string cmInstallTargetGenerator::GetInstallReference() +{ + if(this->ConfigurationTypes->empty()) + { + return this->Target->GetFullName(this->ConfigurationName, + this->ImportLibrary); + } + else + { + std::string ref = "${"; + ref += this->Target->GetName(); + if(this->ImportLibrary) + { + ref += "_IMPNAME_"; + } + else + { + ref += "_NAME_"; + } + ref += "${CMAKE_INSTALL_CONFIG_NAME}}"; + return ref; + } +} |