2009-09-28 19:43:28 +04:00
|
|
|
/*============================================================================
|
|
|
|
CMake - Cross Platform Makefile Generator
|
|
|
|
Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
|
2006-02-19 23:25:27 +03:00
|
|
|
|
2009-09-28 19:43:28 +04:00
|
|
|
Distributed under the OSI-approved BSD License (the "License");
|
|
|
|
see accompanying file Copyright.txt for details.
|
2006-02-19 23:25:27 +03:00
|
|
|
|
2009-09-28 19:43:28 +04:00
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
|
|
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the License for more information.
|
|
|
|
============================================================================*/
|
2006-02-19 23:25:27 +03:00
|
|
|
#include "cmInstallTargetGenerator.h"
|
|
|
|
|
2008-01-29 23:07:33 +03:00
|
|
|
#include "cmComputeLinkInformation.h"
|
2006-02-20 03:29:30 +03:00
|
|
|
#include "cmGlobalGenerator.h"
|
|
|
|
#include "cmLocalGenerator.h"
|
2006-02-19 23:25:27 +03:00
|
|
|
#include "cmMakefile.h"
|
2006-06-14 20:28:32 +04:00
|
|
|
#include "cmake.h"
|
2006-02-19 23:25:27 +03:00
|
|
|
|
2008-02-05 03:00:33 +03:00
|
|
|
#include <assert.h>
|
|
|
|
|
2006-02-19 23:25:27 +03:00
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
cmInstallTargetGenerator
|
2006-03-04 03:29:35 +03:00
|
|
|
::cmInstallTargetGenerator(cmTarget& t, const char* dest, bool implib,
|
2006-08-17 22:48:54 +04:00
|
|
|
const char* file_permissions,
|
2006-05-05 22:57:19 +04:00
|
|
|
std::vector<std::string> const& configurations,
|
2014-06-24 18:45:07 +04:00
|
|
|
const char* component,
|
|
|
|
MessageLevel message,
|
|
|
|
bool optional):
|
|
|
|
cmInstallGenerator(dest, configurations, component, message), Target(&t),
|
2012-11-05 19:14:02 +04:00
|
|
|
ImportLibrary(implib), FilePermissions(file_permissions), Optional(optional)
|
2006-02-19 23:25:27 +03:00
|
|
|
{
|
2009-03-16 17:39:56 +03:00
|
|
|
this->ActionsPerConfig = true;
|
2008-02-05 01:03:48 +03:00
|
|
|
this->NamelinkMode = NamelinkModeNone;
|
2006-02-20 01:27:47 +03:00
|
|
|
this->Target->SetHaveInstallRule(true);
|
2006-02-19 23:25:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
cmInstallTargetGenerator
|
|
|
|
::~cmInstallTargetGenerator()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
void cmInstallTargetGenerator::GenerateScript(std::ostream& os)
|
|
|
|
{
|
2007-08-04 00:31:08 +04:00
|
|
|
// Warn if installing an exclude-from-all target.
|
|
|
|
if(this->Target->GetPropertyAsBool("EXCLUDE_FROM_ALL"))
|
|
|
|
{
|
|
|
|
cmOStringStream msg;
|
|
|
|
msg << "WARNING: Target \"" << this->Target->GetName()
|
|
|
|
<< "\" has EXCLUDE_FROM_ALL set and will not be built by default "
|
|
|
|
<< "but an install rule has been provided for it. CMake does "
|
|
|
|
<< "not define behavior for this case.";
|
|
|
|
cmSystemTools::Message(msg.str().c_str(), "Warning");
|
|
|
|
}
|
|
|
|
|
2008-10-03 18:11:47 +04:00
|
|
|
// Perform the main install script generation.
|
|
|
|
this->cmInstallGenerator::GenerateScript(os);
|
|
|
|
}
|
|
|
|
|
2007-06-29 00:11:18 +04:00
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
void cmInstallTargetGenerator::GenerateScriptForConfig(std::ostream& os,
|
2014-02-10 07:48:34 +04:00
|
|
|
const std::string& config,
|
|
|
|
Indent const& indent)
|
2007-06-29 00:11:18 +04:00
|
|
|
{
|
2009-07-03 16:40:28 +04:00
|
|
|
// Compute the build tree directory from which to copy the target.
|
|
|
|
std::string fromDirConfig;
|
2009-07-08 21:03:47 +04:00
|
|
|
if(this->Target->NeedRelinkBeforeInstall(config))
|
2009-07-03 16:40:28 +04:00
|
|
|
{
|
|
|
|
fromDirConfig = this->Target->GetMakefile()->GetStartOutputDirectory();
|
|
|
|
fromDirConfig += cmake::GetCMakeFilesDirectory();
|
|
|
|
fromDirConfig += "/CMakeRelink.dir/";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
fromDirConfig = this->Target->GetDirectory(config, this->ImportLibrary);
|
|
|
|
fromDirConfig += "/";
|
|
|
|
}
|
2009-10-21 21:10:51 +04:00
|
|
|
std::string toDir = this->GetInstallDestination();
|
|
|
|
toDir += "/";
|
2007-07-02 19:31:10 +04:00
|
|
|
|
2007-06-29 00:11:18 +04:00
|
|
|
// Compute the list of files to install for this target.
|
2009-10-21 21:10:51 +04:00
|
|
|
std::vector<std::string> filesFrom;
|
|
|
|
std::vector<std::string> filesTo;
|
2007-06-29 00:11:18 +04:00
|
|
|
std::string literal_args;
|
2012-02-27 20:26:38 +04:00
|
|
|
cmTarget::TargetType targetType = this->Target->GetType();
|
|
|
|
cmInstallType type = cmInstallType();
|
|
|
|
switch(targetType)
|
|
|
|
{
|
|
|
|
case cmTarget::EXECUTABLE: type = cmInstallType_EXECUTABLE; break;
|
|
|
|
case cmTarget::STATIC_LIBRARY: type = cmInstallType_STATIC_LIBRARY; break;
|
|
|
|
case cmTarget::SHARED_LIBRARY: type = cmInstallType_SHARED_LIBRARY; break;
|
|
|
|
case cmTarget::MODULE_LIBRARY: type = cmInstallType_MODULE_LIBRARY; break;
|
2012-11-02 18:47:40 +04:00
|
|
|
case cmTarget::INTERFACE_LIBRARY:
|
|
|
|
// Not reachable. We never create a cmInstallTargetGenerator for
|
|
|
|
// an INTERFACE_LIBRARY.
|
|
|
|
assert(!"INTERFACE_LIBRARY targets have no installable outputs.");
|
|
|
|
break;
|
2012-03-12 18:47:40 +04:00
|
|
|
case cmTarget::OBJECT_LIBRARY:
|
2012-02-27 20:26:38 +04:00
|
|
|
case cmTarget::UTILITY:
|
|
|
|
case cmTarget::GLOBAL_TARGET:
|
|
|
|
case cmTarget::UNKNOWN_LIBRARY:
|
|
|
|
this->Target->GetMakefile()->IssueMessage(cmake::INTERNAL_ERROR,
|
|
|
|
"cmInstallTargetGenerator created with non-installable target.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if(targetType == cmTarget::EXECUTABLE)
|
2007-06-29 00:11:18 +04:00
|
|
|
{
|
2008-02-05 01:03:48 +03:00
|
|
|
// There is a bug in cmInstallCommand if this fails.
|
|
|
|
assert(this->NamelinkMode == NamelinkModeNone);
|
|
|
|
|
2007-06-29 00:11:18 +04:00
|
|
|
std::string targetName;
|
|
|
|
std::string targetNameReal;
|
|
|
|
std::string targetNameImport;
|
|
|
|
std::string targetNamePDB;
|
|
|
|
this->Target->GetExecutableNames(targetName, targetNameReal,
|
|
|
|
targetNameImport, targetNamePDB,
|
|
|
|
config);
|
|
|
|
if(this->ImportLibrary)
|
|
|
|
{
|
2009-10-21 21:10:51 +04:00
|
|
|
std::string from1 = fromDirConfig + targetNameImport;
|
|
|
|
std::string to1 = toDir + targetNameImport;
|
|
|
|
filesFrom.push_back(from1);
|
|
|
|
filesTo.push_back(to1);
|
2011-12-06 01:39:07 +04:00
|
|
|
std::string targetNameImportLib;
|
|
|
|
if(this->Target->GetImplibGNUtoMS(targetNameImport,
|
|
|
|
targetNameImportLib))
|
|
|
|
{
|
|
|
|
filesFrom.push_back(fromDirConfig + targetNameImportLib);
|
|
|
|
filesTo.push_back(toDir + targetNameImportLib);
|
|
|
|
}
|
2007-06-29 00:11:18 +04:00
|
|
|
|
|
|
|
// An import library looks like a static library.
|
2012-02-27 20:26:38 +04:00
|
|
|
type = cmInstallType_STATIC_LIBRARY;
|
2007-06-29 00:11:18 +04:00
|
|
|
}
|
|
|
|
else
|
2006-02-19 23:25:27 +03:00
|
|
|
{
|
2009-10-21 21:10:51 +04:00
|
|
|
std::string from1 = fromDirConfig + targetName;
|
|
|
|
std::string to1 = toDir + targetName;
|
2006-02-19 23:25:27 +03:00
|
|
|
|
|
|
|
// Handle OSX Bundles.
|
2008-01-28 22:46:16 +03:00
|
|
|
if(this->Target->IsAppBundleOnApple())
|
2006-02-19 23:25:27 +03:00
|
|
|
{
|
2009-10-21 21:10:51 +04:00
|
|
|
// Install the whole app bundle directory.
|
2012-02-27 20:26:38 +04:00
|
|
|
type = cmInstallType_DIRECTORY;
|
2006-08-22 00:55:03 +04:00
|
|
|
literal_args += " USE_SOURCE_PERMISSIONS";
|
2009-10-21 21:10:51 +04:00
|
|
|
from1 += ".app";
|
|
|
|
|
|
|
|
// Tweaks apply to the binary inside the bundle.
|
|
|
|
to1 += ".app/Contents/MacOS/";
|
|
|
|
to1 += targetName;
|
2007-06-29 00:11:18 +04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2009-10-21 21:10:51 +04:00
|
|
|
// Tweaks apply to the real file, so list it first.
|
2007-06-29 00:11:18 +04:00
|
|
|
if(targetNameReal != targetName)
|
|
|
|
{
|
2009-10-21 21:10:51 +04:00
|
|
|
std::string from2 = fromDirConfig + targetNameReal;
|
|
|
|
std::string to2 = toDir += targetNameReal;
|
|
|
|
filesFrom.push_back(from2);
|
|
|
|
filesTo.push_back(to2);
|
2007-06-29 00:11:18 +04:00
|
|
|
}
|
2006-02-19 23:25:27 +03:00
|
|
|
}
|
2009-10-21 21:10:51 +04:00
|
|
|
|
|
|
|
filesFrom.push_back(from1);
|
|
|
|
filesTo.push_back(to1);
|
2006-02-19 23:25:27 +03:00
|
|
|
}
|
|
|
|
}
|
2007-06-29 00:11:18 +04:00
|
|
|
else
|
2006-02-20 00:10:23 +03:00
|
|
|
{
|
2007-06-29 00:11:18 +04:00
|
|
|
std::string targetName;
|
|
|
|
std::string targetNameSO;
|
|
|
|
std::string targetNameReal;
|
|
|
|
std::string targetNameImport;
|
|
|
|
std::string targetNamePDB;
|
|
|
|
this->Target->GetLibraryNames(targetName, targetNameSO, targetNameReal,
|
|
|
|
targetNameImport, targetNamePDB,
|
|
|
|
config);
|
|
|
|
if(this->ImportLibrary)
|
|
|
|
{
|
2008-02-05 01:03:48 +03:00
|
|
|
// There is a bug in cmInstallCommand if this fails.
|
|
|
|
assert(this->NamelinkMode == NamelinkModeNone);
|
|
|
|
|
2009-10-21 21:10:51 +04:00
|
|
|
std::string from1 = fromDirConfig + targetNameImport;
|
|
|
|
std::string to1 = toDir + targetNameImport;
|
|
|
|
filesFrom.push_back(from1);
|
|
|
|
filesTo.push_back(to1);
|
2011-12-06 01:39:07 +04:00
|
|
|
std::string targetNameImportLib;
|
|
|
|
if(this->Target->GetImplibGNUtoMS(targetNameImport,
|
|
|
|
targetNameImportLib))
|
|
|
|
{
|
|
|
|
filesFrom.push_back(fromDirConfig + targetNameImportLib);
|
|
|
|
filesTo.push_back(toDir + targetNameImportLib);
|
|
|
|
}
|
2007-06-29 00:11:18 +04:00
|
|
|
|
|
|
|
// An import library looks like a static library.
|
2012-02-27 20:26:38 +04:00
|
|
|
type = cmInstallType_STATIC_LIBRARY;
|
2007-06-29 00:11:18 +04:00
|
|
|
}
|
2008-01-28 21:05:58 +03:00
|
|
|
else if(this->Target->IsFrameworkOnApple())
|
2007-08-24 21:30:41 +04:00
|
|
|
{
|
2008-02-05 01:03:48 +03:00
|
|
|
// There is a bug in cmInstallCommand if this fails.
|
|
|
|
assert(this->NamelinkMode == NamelinkModeNone);
|
|
|
|
|
2009-10-21 21:10:51 +04:00
|
|
|
// Install the whole framework directory.
|
2012-02-27 20:26:38 +04:00
|
|
|
type = cmInstallType_DIRECTORY;
|
2009-10-21 21:10:51 +04:00
|
|
|
literal_args += " USE_SOURCE_PERMISSIONS";
|
2013-05-06 06:19:05 +04:00
|
|
|
|
|
|
|
std::string from1 = fromDirConfig + targetName;
|
|
|
|
from1 = cmSystemTools::GetFilenamePath(from1);
|
2007-08-24 21:30:41 +04:00
|
|
|
|
2009-10-21 21:10:51 +04:00
|
|
|
// Tweaks apply to the binary inside the bundle.
|
2013-05-06 06:19:05 +04:00
|
|
|
std::string to1 = toDir + targetNameReal;
|
2007-08-24 21:30:41 +04:00
|
|
|
|
2009-10-21 21:10:51 +04:00
|
|
|
filesFrom.push_back(from1);
|
|
|
|
filesTo.push_back(to1);
|
2007-08-24 21:30:41 +04:00
|
|
|
}
|
2007-06-29 00:11:18 +04:00
|
|
|
else
|
|
|
|
{
|
2008-02-05 01:03:48 +03:00
|
|
|
bool haveNamelink = false;
|
2009-10-21 21:10:51 +04:00
|
|
|
|
|
|
|
// Library link name.
|
|
|
|
std::string fromName = fromDirConfig + targetName;
|
|
|
|
std::string toName = toDir + targetName;
|
|
|
|
|
|
|
|
// Library interface name.
|
2008-02-05 01:03:48 +03:00
|
|
|
std::string fromSOName;
|
2009-10-21 21:10:51 +04:00
|
|
|
std::string toSOName;
|
2007-06-29 00:11:18 +04:00
|
|
|
if(targetNameSO != targetName)
|
|
|
|
{
|
2008-02-05 01:03:48 +03:00
|
|
|
haveNamelink = true;
|
2009-10-21 21:10:51 +04:00
|
|
|
fromSOName = fromDirConfig + targetNameSO;
|
|
|
|
toSOName = toDir + targetNameSO;
|
2007-06-29 00:11:18 +04:00
|
|
|
}
|
2009-10-21 21:10:51 +04:00
|
|
|
|
|
|
|
// Library implementation name.
|
|
|
|
std::string fromRealName;
|
|
|
|
std::string toRealName;
|
2007-06-29 00:11:18 +04:00
|
|
|
if(targetNameReal != targetName &&
|
|
|
|
targetNameReal != targetNameSO)
|
|
|
|
{
|
2008-02-05 01:03:48 +03:00
|
|
|
haveNamelink = true;
|
2009-10-21 21:10:51 +04:00
|
|
|
fromRealName = fromDirConfig + targetNameReal;
|
|
|
|
toRealName = toDir + targetNameReal;
|
2008-02-05 01:03:48 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Add the names based on the current namelink mode.
|
|
|
|
if(haveNamelink)
|
|
|
|
{
|
|
|
|
// With a namelink we need to check the mode.
|
|
|
|
if(this->NamelinkMode == NamelinkModeOnly)
|
|
|
|
{
|
|
|
|
// Install the namelink only.
|
2009-10-21 21:10:51 +04:00
|
|
|
filesFrom.push_back(fromName);
|
|
|
|
filesTo.push_back(toName);
|
2008-02-05 01:03:48 +03:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Install the real file if it has its own name.
|
|
|
|
if(!fromRealName.empty())
|
|
|
|
{
|
2009-10-21 21:10:51 +04:00
|
|
|
filesFrom.push_back(fromRealName);
|
|
|
|
filesTo.push_back(toRealName);
|
2008-02-05 01:03:48 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Install the soname link if it has its own name.
|
|
|
|
if(!fromSOName.empty())
|
|
|
|
{
|
2009-10-21 21:10:51 +04:00
|
|
|
filesFrom.push_back(fromSOName);
|
|
|
|
filesTo.push_back(toSOName);
|
2008-02-05 01:03:48 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Install the namelink if it is not to be skipped.
|
|
|
|
if(this->NamelinkMode != NamelinkModeSkip)
|
|
|
|
{
|
2009-10-21 21:10:51 +04:00
|
|
|
filesFrom.push_back(fromName);
|
|
|
|
filesTo.push_back(toName);
|
2008-02-05 01:03:48 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Without a namelink there will be only one file. Install it
|
|
|
|
// if this is not a namelink-only rule.
|
|
|
|
if(this->NamelinkMode != NamelinkModeOnly)
|
|
|
|
{
|
2009-10-21 21:10:51 +04:00
|
|
|
filesFrom.push_back(fromName);
|
|
|
|
filesTo.push_back(toName);
|
2008-02-05 01:03:48 +03:00
|
|
|
}
|
2007-06-29 00:11:18 +04:00
|
|
|
}
|
|
|
|
}
|
2006-02-20 00:10:23 +03:00
|
|
|
}
|
|
|
|
|
2009-10-21 21:10:51 +04:00
|
|
|
// If this fails the above code is buggy.
|
|
|
|
assert(filesFrom.size() == filesTo.size());
|
|
|
|
|
2008-02-05 01:03:48 +03:00
|
|
|
// Skip this rule if no files are to be installed for the target.
|
2009-10-21 21:10:51 +04:00
|
|
|
if(filesFrom.empty())
|
2008-02-05 01:03:48 +03:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2008-04-14 23:02:44 +04:00
|
|
|
// Add pre-installation tweaks.
|
2009-10-21 21:11:42 +04:00
|
|
|
this->AddTweak(os, indent, config, filesTo,
|
|
|
|
&cmInstallTargetGenerator::PreReplacementTweaks);
|
2008-04-14 23:02:44 +04:00
|
|
|
|
2006-02-19 23:25:27 +03:00
|
|
|
// Write code to install the target file.
|
2006-08-17 22:48:54 +04:00
|
|
|
const char* no_dir_permissions = 0;
|
2006-08-22 00:55:03 +04:00
|
|
|
const char* no_rename = 0;
|
2007-06-29 00:11:18 +04:00
|
|
|
bool optional = this->Optional || this->ImportLibrary;
|
2009-10-21 21:10:51 +04:00
|
|
|
this->AddInstallRule(os, type, filesFrom,
|
2009-04-27 21:20:57 +04:00
|
|
|
optional,
|
2006-08-17 22:48:54 +04:00
|
|
|
this->FilePermissions.c_str(), no_dir_permissions,
|
2007-07-02 19:02:52 +04:00
|
|
|
no_rename, literal_args.c_str(),
|
|
|
|
indent);
|
2006-02-24 21:13:14 +03:00
|
|
|
|
2008-04-14 23:02:44 +04:00
|
|
|
// Add post-installation tweaks.
|
2009-10-21 21:11:42 +04:00
|
|
|
this->AddTweak(os, indent, config, filesTo,
|
|
|
|
&cmInstallTargetGenerator::PostReplacementTweaks);
|
2006-02-19 23:25:27 +03:00
|
|
|
}
|
|
|
|
|
2007-06-29 00:11:18 +04:00
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
std::string
|
2014-02-10 07:48:34 +04:00
|
|
|
cmInstallTargetGenerator::GetInstallFilename(const std::string& config) const
|
2007-06-19 19:11:06 +04:00
|
|
|
{
|
2008-02-06 22:20:36 +03:00
|
|
|
NameType nameType = this->ImportLibrary? NameImplib : NameNormal;
|
2007-06-29 00:11:18 +04:00
|
|
|
return
|
|
|
|
cmInstallTargetGenerator::GetInstallFilename(this->Target, config,
|
2008-02-06 22:20:36 +03:00
|
|
|
nameType);
|
2007-06-19 19:11:06 +04:00
|
|
|
}
|
|
|
|
|
2007-06-15 22:27:33 +04:00
|
|
|
//----------------------------------------------------------------------------
|
2013-12-10 18:30:41 +04:00
|
|
|
std::string
|
|
|
|
cmInstallTargetGenerator::GetInstallFilename(cmTarget const* target,
|
2014-02-10 07:48:34 +04:00
|
|
|
const std::string& config,
|
2013-12-10 18:30:41 +04:00
|
|
|
NameType nameType)
|
2007-06-15 22:27:33 +04:00
|
|
|
{
|
|
|
|
std::string fname;
|
|
|
|
// Compute the name of the library.
|
|
|
|
if(target->GetType() == cmTarget::EXECUTABLE)
|
|
|
|
{
|
|
|
|
std::string targetName;
|
|
|
|
std::string targetNameReal;
|
|
|
|
std::string targetNameImport;
|
|
|
|
std::string targetNamePDB;
|
|
|
|
target->GetExecutableNames(targetName, targetNameReal,
|
|
|
|
targetNameImport, targetNamePDB,
|
|
|
|
config);
|
2008-02-06 22:20:36 +03:00
|
|
|
if(nameType == NameImplib)
|
2007-06-15 22:27:33 +04:00
|
|
|
{
|
|
|
|
// Use the import library name.
|
2011-12-06 01:39:07 +04:00
|
|
|
if(!target->GetImplibGNUtoMS(targetNameImport, fname,
|
|
|
|
"${CMAKE_IMPORT_LIBRARY_SUFFIX}"))
|
|
|
|
{
|
|
|
|
fname = targetNameImport;
|
|
|
|
}
|
2007-06-15 22:27:33 +04:00
|
|
|
}
|
2008-02-06 22:20:36 +03:00
|
|
|
else if(nameType == NameReal)
|
|
|
|
{
|
|
|
|
// Use the canonical name.
|
|
|
|
fname = targetNameReal;
|
|
|
|
}
|
2007-06-15 22:27:33 +04:00
|
|
|
else
|
|
|
|
{
|
|
|
|
// Use the canonical name.
|
|
|
|
fname = targetName;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
std::string targetName;
|
|
|
|
std::string targetNameSO;
|
|
|
|
std::string targetNameReal;
|
|
|
|
std::string targetNameImport;
|
|
|
|
std::string targetNamePDB;
|
|
|
|
target->GetLibraryNames(targetName, targetNameSO, targetNameReal,
|
|
|
|
targetNameImport, targetNamePDB, config);
|
2008-02-06 22:20:36 +03:00
|
|
|
if(nameType == NameImplib)
|
2007-06-15 22:27:33 +04:00
|
|
|
{
|
|
|
|
// Use the import library name.
|
2011-12-06 01:39:07 +04:00
|
|
|
if(!target->GetImplibGNUtoMS(targetNameImport, fname,
|
|
|
|
"${CMAKE_IMPORT_LIBRARY_SUFFIX}"))
|
|
|
|
{
|
|
|
|
fname = targetNameImport;
|
|
|
|
}
|
2007-06-15 22:27:33 +04:00
|
|
|
}
|
2008-02-06 22:20:36 +03:00
|
|
|
else if(nameType == NameSO)
|
2007-06-15 22:27:33 +04:00
|
|
|
{
|
|
|
|
// Use the soname.
|
|
|
|
fname = targetNameSO;
|
|
|
|
}
|
2008-02-06 22:20:36 +03:00
|
|
|
else if(nameType == NameReal)
|
|
|
|
{
|
|
|
|
// Use the real name.
|
|
|
|
fname = targetNameReal;
|
|
|
|
}
|
2007-06-15 22:27:33 +04:00
|
|
|
else
|
|
|
|
{
|
|
|
|
// Use the canonical name.
|
|
|
|
fname = targetName;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return fname;
|
|
|
|
}
|
|
|
|
|
2009-10-21 21:11:42 +04:00
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
void
|
|
|
|
cmInstallTargetGenerator
|
2014-02-10 07:48:34 +04:00
|
|
|
::AddTweak(std::ostream& os, Indent const& indent, const std::string& config,
|
2009-10-21 21:11:42 +04:00
|
|
|
std::string const& file, TweakMethod tweak)
|
|
|
|
{
|
|
|
|
cmOStringStream tw;
|
|
|
|
(this->*tweak)(tw, indent.Next(), config, file);
|
|
|
|
std::string tws = tw.str();
|
|
|
|
if(!tws.empty())
|
|
|
|
{
|
2013-08-22 13:30:19 +04:00
|
|
|
os << indent << "if(EXISTS \"" << file << "\" AND\n"
|
2009-10-21 21:11:42 +04:00
|
|
|
<< indent << " NOT IS_SYMLINK \"" << file << "\")\n";
|
|
|
|
os << tws;
|
2013-08-22 13:30:19 +04:00
|
|
|
os << indent << "endif()\n";
|
2009-10-21 21:11:42 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
void
|
|
|
|
cmInstallTargetGenerator
|
2014-02-10 07:48:34 +04:00
|
|
|
::AddTweak(std::ostream& os, Indent const& indent, const std::string& config,
|
2009-10-21 21:11:42 +04:00
|
|
|
std::vector<std::string> const& files, TweakMethod tweak)
|
|
|
|
{
|
|
|
|
if(files.size() == 1)
|
|
|
|
{
|
|
|
|
// Tweak a single file.
|
|
|
|
this->AddTweak(os, indent, config, this->GetDestDirPath(files[0]), tweak);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Generate a foreach loop to tweak multiple files.
|
|
|
|
cmOStringStream tw;
|
|
|
|
this->AddTweak(tw, indent.Next(), config, "${file}", tweak);
|
|
|
|
std::string tws = tw.str();
|
|
|
|
if(!tws.empty())
|
|
|
|
{
|
|
|
|
Indent indent2 = indent.Next().Next();
|
2013-08-22 13:30:19 +04:00
|
|
|
os << indent << "foreach(file\n";
|
2009-10-21 21:11:42 +04:00
|
|
|
for(std::vector<std::string>::const_iterator i = files.begin();
|
|
|
|
i != files.end(); ++i)
|
|
|
|
{
|
|
|
|
os << indent2 << "\"" << this->GetDestDirPath(*i) << "\"\n";
|
|
|
|
}
|
|
|
|
os << indent2 << ")\n";
|
|
|
|
os << tws;
|
2013-08-22 13:30:19 +04:00
|
|
|
os << indent << "endforeach()\n";
|
2009-10-21 21:11:42 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
std::string cmInstallTargetGenerator::GetDestDirPath(std::string const& file)
|
|
|
|
{
|
|
|
|
// Construct the path of the file on disk after installation on
|
|
|
|
// which tweaks may be performed.
|
|
|
|
std::string toDestDirPath = "$ENV{DESTDIR}";
|
|
|
|
if(file[0] != '/' && file[0] != '$')
|
|
|
|
{
|
|
|
|
toDestDirPath += "/";
|
|
|
|
}
|
|
|
|
toDestDirPath += file;
|
|
|
|
return toDestDirPath;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
void cmInstallTargetGenerator::PreReplacementTweaks(std::ostream& os,
|
|
|
|
Indent const& indent,
|
2014-02-10 07:48:34 +04:00
|
|
|
const std::string& config,
|
2009-10-21 21:11:42 +04:00
|
|
|
std::string const& file)
|
|
|
|
{
|
|
|
|
this->AddRPathCheckRule(os, indent, config, file);
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
void cmInstallTargetGenerator::PostReplacementTweaks(std::ostream& os,
|
2014-02-10 07:48:34 +04:00
|
|
|
Indent const& indent,
|
|
|
|
const std::string& config,
|
|
|
|
std::string const& file)
|
2009-10-21 21:11:42 +04:00
|
|
|
{
|
|
|
|
this->AddInstallNamePatchRule(os, indent, config, file);
|
|
|
|
this->AddChrpathPatchRule(os, indent, config, file);
|
|
|
|
this->AddRanlibRule(os, indent, file);
|
|
|
|
this->AddStripRule(os, indent, file);
|
|
|
|
}
|
|
|
|
|
2006-02-19 23:25:27 +03:00
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
void
|
|
|
|
cmInstallTargetGenerator
|
2007-07-02 19:02:52 +04:00
|
|
|
::AddInstallNamePatchRule(std::ostream& os, Indent const& indent,
|
2014-02-10 07:48:34 +04:00
|
|
|
const std::string& config,
|
|
|
|
std::string const& toDestDirPath)
|
2006-02-19 23:25:27 +03:00
|
|
|
{
|
2007-06-29 00:11:18 +04:00
|
|
|
if(this->ImportLibrary ||
|
|
|
|
!(this->Target->GetType() == cmTarget::SHARED_LIBRARY ||
|
|
|
|
this->Target->GetType() == cmTarget::MODULE_LIBRARY ||
|
|
|
|
this->Target->GetType() == cmTarget::EXECUTABLE))
|
2006-02-19 23:25:27 +03:00
|
|
|
{
|
2007-06-29 00:11:18 +04:00
|
|
|
return;
|
2006-02-19 23:25:27 +03:00
|
|
|
}
|
2006-02-24 21:13:14 +03:00
|
|
|
|
2007-06-29 00:11:18 +04:00
|
|
|
// Fix the install_name settings in installed binaries.
|
2007-08-24 21:30:41 +04:00
|
|
|
std::string installNameTool =
|
2007-05-18 01:43:32 +04:00
|
|
|
this->Target->GetMakefile()->GetSafeDefinition("CMAKE_INSTALL_NAME_TOOL");
|
2007-08-24 21:30:41 +04:00
|
|
|
|
2007-05-18 01:21:52 +04:00
|
|
|
if(!installNameTool.size())
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2006-02-24 21:13:14 +03:00
|
|
|
// Build a map of build-tree install_name to install-tree install_name for
|
|
|
|
// shared libraries linked to this target.
|
2014-02-10 09:21:34 +04:00
|
|
|
std::map<std::string, std::string> install_name_remap;
|
2012-11-05 19:14:02 +04:00
|
|
|
if(cmComputeLinkInformation* cli = this->Target->GetLinkInformation(config))
|
2006-02-24 21:13:14 +03:00
|
|
|
{
|
2013-12-10 18:30:41 +04:00
|
|
|
std::set<cmTarget const*> const& sharedLibs
|
|
|
|
= cli->GetSharedLibrariesLinked();
|
|
|
|
for(std::set<cmTarget const*>::const_iterator j = sharedLibs.begin();
|
2008-01-29 23:47:18 +03:00
|
|
|
j != sharedLibs.end(); ++j)
|
2006-02-24 21:13:14 +03:00
|
|
|
{
|
2013-12-10 18:30:41 +04:00
|
|
|
cmTarget const* tgt = *j;
|
2008-11-26 00:50:48 +03:00
|
|
|
|
|
|
|
// The install_name of an imported target does not change.
|
|
|
|
if(tgt->IsImported())
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2008-01-29 23:47:18 +03:00
|
|
|
// If the build tree and install tree use different path
|
|
|
|
// components of the install_name field then we need to create a
|
|
|
|
// mapping to be applied after installation.
|
|
|
|
std::string for_build = tgt->GetInstallNameDirForBuildTree(config);
|
2013-05-06 06:19:05 +04:00
|
|
|
std::string for_install = tgt->GetInstallNameDirForInstallTree();
|
2008-02-01 21:08:12 +03:00
|
|
|
if(for_build != for_install)
|
|
|
|
{
|
|
|
|
// The directory portions differ. Append the filename to
|
|
|
|
// create the mapping.
|
|
|
|
std::string fname =
|
2008-02-06 22:20:36 +03:00
|
|
|
this->GetInstallFilename(tgt, config, NameSO);
|
2008-01-29 23:47:18 +03:00
|
|
|
|
2008-02-01 21:08:12 +03:00
|
|
|
// Map from the build-tree install_name.
|
|
|
|
for_build += fname;
|
2008-01-29 23:47:18 +03:00
|
|
|
|
2008-02-01 21:08:12 +03:00
|
|
|
// Map to the install-tree install_name.
|
2008-01-29 23:47:18 +03:00
|
|
|
for_install += fname;
|
|
|
|
|
|
|
|
// Store the mapping entry.
|
|
|
|
install_name_remap[for_build] = for_install;
|
2006-02-24 21:13:14 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Edit the install_name of the target itself if necessary.
|
|
|
|
std::string new_id;
|
|
|
|
if(this->Target->GetType() == cmTarget::SHARED_LIBRARY)
|
|
|
|
{
|
2008-02-01 21:08:12 +03:00
|
|
|
std::string for_build =
|
2006-05-11 23:50:11 +04:00
|
|
|
this->Target->GetInstallNameDirForBuildTree(config);
|
2008-02-01 21:08:12 +03:00
|
|
|
std::string for_install =
|
2013-05-06 06:19:05 +04:00
|
|
|
this->Target->GetInstallNameDirForInstallTree();
|
2008-02-01 21:08:12 +03:00
|
|
|
|
|
|
|
if(this->Target->IsFrameworkOnApple() && for_install.empty())
|
2007-08-24 21:30:41 +04:00
|
|
|
{
|
2008-02-01 21:08:12 +03:00
|
|
|
// Frameworks seem to have an id corresponding to their own full
|
|
|
|
// path.
|
|
|
|
// ...
|
|
|
|
// for_install = fullDestPath_without_DESTDIR_or_name;
|
2007-08-24 21:30:41 +04:00
|
|
|
}
|
2008-02-01 21:08:12 +03:00
|
|
|
|
|
|
|
// If the install name will change on installation set the new id
|
|
|
|
// on the installed file.
|
2006-02-24 21:13:14 +03:00
|
|
|
if(for_build != for_install)
|
|
|
|
{
|
|
|
|
// Prepare to refer to the install-tree install_name.
|
|
|
|
new_id = for_install;
|
2008-02-06 22:20:36 +03:00
|
|
|
new_id += this->GetInstallFilename(this->Target, config, NameSO);
|
2006-02-24 21:13:14 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write a rule to run install_name_tool to set the install-tree
|
|
|
|
// install_name value and references.
|
|
|
|
if(!new_id.empty() || !install_name_remap.empty())
|
|
|
|
{
|
2013-08-22 13:30:19 +04:00
|
|
|
os << indent << "execute_process(COMMAND \"" << installNameTool;
|
ENH: merge CMake-CrossCompileBasic to HEAD
-add a RESULT_VARIABLE to INCLUDE()
-add CMAKE_TOOLCHAIN_FILE for specifiying your (potentially crosscompiling) toolchain
-have TRY_RUN() complain if you try to use it in crosscompiling mode (which were compiled but cannot run on this system)
-use CMAKE_EXECUTABLE_SUFFIX in TRY_RUN(), probably TRY_RUN won't be able to
run the executables if they have a different suffix because they are
probably crosscompiled, but nevertheless it should be able to find them
-make several cmake variables presettable by the user: CMAKE_C/CXX_COMPILER, CMAKE_C/CXX_OUTPUT_EXTENSION, CMAKE_SYSTEM_NAME, CMAKE_SYSTEM_INFO_FILE
-support prefix for GNU toolchains (arm-elf-gcc, arm-elf-ar, arm-elf-strip etc.)
-move ranlib on OSX from the file command to a command in executed in cmake_install.cmake
-add support for stripping during install in cmake_install.cmake
-split out cl.cmake from Windows-cl.cmake, first (very incomplete) step to support MS crosscompiling tools
-remove stdio.h from the simple C program which checks if the compiler works, since this may not exist for some embedded platforms
-create a new CMakeFindBinUtils.cmake which collects the search fro ar, ranlib, strip, ld, link, install_name_tool and other tools like these
-add support for CMAKE_FIND_ROOT_PATH for all FIND_XXX commands, which is a
list of directories which will be prepended to all search directories, right
now as a cmake variable, turning it into a global cmake property may need
some more work
-remove cmTestTestHandler::TryExecutable(), it's unused
-split cmFileCommand::HandleInstall() into slightly smaller functions
Alex
2007-05-17 21:20:44 +04:00
|
|
|
os << "\"";
|
2006-02-24 21:13:14 +03:00
|
|
|
if(!new_id.empty())
|
|
|
|
{
|
2007-07-02 19:02:52 +04:00
|
|
|
os << "\n" << indent << " -id \"" << new_id << "\"";
|
2006-02-24 21:13:14 +03:00
|
|
|
}
|
2014-02-10 09:21:34 +04:00
|
|
|
for(std::map<std::string, std::string>::const_iterator
|
2006-02-24 21:13:14 +03:00
|
|
|
i = install_name_remap.begin();
|
|
|
|
i != install_name_remap.end(); ++i)
|
|
|
|
{
|
2007-07-02 19:02:52 +04:00
|
|
|
os << "\n" << indent << " -change \""
|
|
|
|
<< i->first << "\" \"" << i->second << "\"";
|
2006-02-24 21:13:14 +03:00
|
|
|
}
|
2007-08-24 21:30:41 +04:00
|
|
|
os << "\n" << indent << " \"" << toDestDirPath << "\")\n";
|
2006-02-24 21:13:14 +03:00
|
|
|
}
|
|
|
|
}
|
ENH: merge CMake-CrossCompileBasic to HEAD
-add a RESULT_VARIABLE to INCLUDE()
-add CMAKE_TOOLCHAIN_FILE for specifiying your (potentially crosscompiling) toolchain
-have TRY_RUN() complain if you try to use it in crosscompiling mode (which were compiled but cannot run on this system)
-use CMAKE_EXECUTABLE_SUFFIX in TRY_RUN(), probably TRY_RUN won't be able to
run the executables if they have a different suffix because they are
probably crosscompiled, but nevertheless it should be able to find them
-make several cmake variables presettable by the user: CMAKE_C/CXX_COMPILER, CMAKE_C/CXX_OUTPUT_EXTENSION, CMAKE_SYSTEM_NAME, CMAKE_SYSTEM_INFO_FILE
-support prefix for GNU toolchains (arm-elf-gcc, arm-elf-ar, arm-elf-strip etc.)
-move ranlib on OSX from the file command to a command in executed in cmake_install.cmake
-add support for stripping during install in cmake_install.cmake
-split out cl.cmake from Windows-cl.cmake, first (very incomplete) step to support MS crosscompiling tools
-remove stdio.h from the simple C program which checks if the compiler works, since this may not exist for some embedded platforms
-create a new CMakeFindBinUtils.cmake which collects the search fro ar, ranlib, strip, ld, link, install_name_tool and other tools like these
-add support for CMAKE_FIND_ROOT_PATH for all FIND_XXX commands, which is a
list of directories which will be prepended to all search directories, right
now as a cmake variable, turning it into a global cmake property may need
some more work
-remove cmTestTestHandler::TryExecutable(), it's unused
-split cmFileCommand::HandleInstall() into slightly smaller functions
Alex
2007-05-17 21:20:44 +04:00
|
|
|
|
2008-04-14 23:02:44 +04:00
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
void
|
|
|
|
cmInstallTargetGenerator
|
|
|
|
::AddRPathCheckRule(std::ostream& os, Indent const& indent,
|
2014-02-10 07:48:34 +04:00
|
|
|
const std::string& config,
|
|
|
|
std::string const& toDestDirPath)
|
2008-04-14 23:02:44 +04:00
|
|
|
{
|
|
|
|
// Skip the chrpath if the target does not need it.
|
2009-07-08 21:03:47 +04:00
|
|
|
if(this->ImportLibrary || !this->Target->IsChrpathUsed(config))
|
2008-04-14 23:02:44 +04:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-04-27 08:04:44 +04:00
|
|
|
// Skip if on Apple
|
|
|
|
if(this->Target->GetMakefile()->IsOn("CMAKE_PLATFORM_HAS_INSTALLNAME"))
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2008-04-14 23:02:44 +04:00
|
|
|
// Get the link information for this target.
|
|
|
|
// It can provide the RPATH.
|
2012-11-05 19:14:02 +04:00
|
|
|
cmComputeLinkInformation* cli = this->Target->GetLinkInformation(config);
|
2008-04-14 23:02:44 +04:00
|
|
|
if(!cli)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the install RPATH from the link information.
|
|
|
|
std::string newRpath = cli->GetChrpathString();
|
|
|
|
|
|
|
|
// Write a rule to remove the installed file if its rpath is not the
|
|
|
|
// new rpath. This is needed for existing build/install trees when
|
|
|
|
// the installed rpath changes but the file is not rebuilt.
|
2013-08-22 13:30:19 +04:00
|
|
|
os << indent << "file(RPATH_CHECK\n"
|
2008-04-14 23:02:44 +04:00
|
|
|
<< indent << " FILE \"" << toDestDirPath << "\"\n"
|
|
|
|
<< indent << " RPATH \"" << newRpath << "\")\n";
|
|
|
|
}
|
|
|
|
|
2007-12-19 01:50:27 +03:00
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
void
|
|
|
|
cmInstallTargetGenerator
|
|
|
|
::AddChrpathPatchRule(std::ostream& os, Indent const& indent,
|
2014-02-10 07:48:34 +04:00
|
|
|
const std::string& config,
|
|
|
|
std::string const& toDestDirPath)
|
2007-12-19 01:50:27 +03:00
|
|
|
{
|
2008-03-02 22:35:23 +03:00
|
|
|
// Skip the chrpath if the target does not need it.
|
2009-07-08 21:03:47 +04:00
|
|
|
if(this->ImportLibrary || !this->Target->IsChrpathUsed(config))
|
2007-12-19 01:50:27 +03:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2008-01-29 23:07:33 +03:00
|
|
|
// Get the link information for this target.
|
|
|
|
// It can provide the RPATH.
|
2012-11-05 19:14:02 +04:00
|
|
|
cmComputeLinkInformation* cli = this->Target->GetLinkInformation(config);
|
2008-01-29 23:07:33 +03:00
|
|
|
if(!cli)
|
2007-12-19 01:50:27 +03:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-04-27 08:04:44 +04:00
|
|
|
if(this->Target->GetMakefile()->IsOn("CMAKE_PLATFORM_HAS_INSTALLNAME"))
|
2008-03-03 00:48:50 +03:00
|
|
|
{
|
2013-04-27 08:04:44 +04:00
|
|
|
// If using install_name_tool, set up the rules to modify the rpaths.
|
|
|
|
std::string installNameTool =
|
|
|
|
this->Target->GetMakefile()->
|
|
|
|
GetSafeDefinition("CMAKE_INSTALL_NAME_TOOL");
|
|
|
|
|
|
|
|
std::vector<std::string> oldRuntimeDirs, newRuntimeDirs;
|
|
|
|
cli->GetRPath(oldRuntimeDirs, false);
|
|
|
|
cli->GetRPath(newRuntimeDirs, true);
|
|
|
|
|
2014-02-02 08:18:04 +04:00
|
|
|
// Note: These paths are kept unique to avoid install_name_tool corruption.
|
|
|
|
std::set<std::string> runpaths;
|
2013-04-27 08:04:44 +04:00
|
|
|
for(std::vector<std::string>::const_iterator i = oldRuntimeDirs.begin();
|
|
|
|
i != oldRuntimeDirs.end(); ++i)
|
|
|
|
{
|
2014-02-02 08:18:04 +04:00
|
|
|
std::string runpath = this->Target->GetMakefile()->GetLocalGenerator()->
|
|
|
|
GetGlobalGenerator()->ExpandCFGIntDir(*i, config);
|
|
|
|
|
|
|
|
if(runpaths.find(runpath) == runpaths.end())
|
|
|
|
{
|
|
|
|
runpaths.insert(runpath);
|
|
|
|
os << indent << "execute_process(COMMAND " << installNameTool << "\n";
|
|
|
|
os << indent << " -delete_rpath \"" << runpath << "\"\n";
|
|
|
|
os << indent << " \"" << toDestDirPath << "\")\n";
|
|
|
|
}
|
2013-04-27 08:04:44 +04:00
|
|
|
}
|
2008-03-03 00:48:50 +03:00
|
|
|
|
2014-02-02 08:18:04 +04:00
|
|
|
runpaths.clear();
|
2013-04-27 08:04:44 +04:00
|
|
|
for(std::vector<std::string>::const_iterator i = newRuntimeDirs.begin();
|
|
|
|
i != newRuntimeDirs.end(); ++i)
|
|
|
|
{
|
2014-02-02 08:18:04 +04:00
|
|
|
std::string runpath = this->Target->GetMakefile()->GetLocalGenerator()->
|
|
|
|
GetGlobalGenerator()->ExpandCFGIntDir(*i, config);
|
|
|
|
|
|
|
|
if(runpaths.find(runpath) == runpaths.end())
|
|
|
|
{
|
|
|
|
os << indent << "execute_process(COMMAND " << installNameTool << "\n";
|
|
|
|
os << indent << " -add_rpath \"" << runpath << "\"\n";
|
|
|
|
os << indent << " \"" << toDestDirPath << "\")\n";
|
|
|
|
}
|
2013-04-27 08:04:44 +04:00
|
|
|
}
|
2008-04-14 23:02:44 +04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-04-27 08:04:44 +04:00
|
|
|
// Construct the original rpath string to be replaced.
|
|
|
|
std::string oldRpath = cli->GetRPathString(false);
|
|
|
|
|
|
|
|
// Get the install RPATH from the link information.
|
|
|
|
std::string newRpath = cli->GetChrpathString();
|
|
|
|
|
|
|
|
// Skip the rule if the paths are identical
|
|
|
|
if(oldRpath == newRpath)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write a rule to run chrpath to set the install-tree RPATH
|
|
|
|
if(newRpath.empty())
|
|
|
|
{
|
2013-08-22 13:30:19 +04:00
|
|
|
os << indent << "file(RPATH_REMOVE\n"
|
2013-04-27 08:04:44 +04:00
|
|
|
<< indent << " FILE \"" << toDestDirPath << "\")\n";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-08-22 13:30:19 +04:00
|
|
|
os << indent << "file(RPATH_CHANGE\n"
|
2013-04-27 08:04:44 +04:00
|
|
|
<< indent << " FILE \"" << toDestDirPath << "\"\n"
|
|
|
|
<< indent << " OLD_RPATH \"" << oldRpath << "\"\n"
|
|
|
|
<< indent << " NEW_RPATH \"" << newRpath << "\")\n";
|
|
|
|
}
|
2008-04-14 23:02:44 +04:00
|
|
|
}
|
2007-12-19 01:50:27 +03:00
|
|
|
}
|
|
|
|
|
2007-06-29 00:11:18 +04:00
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
void
|
|
|
|
cmInstallTargetGenerator::AddStripRule(std::ostream& os,
|
2007-07-02 19:02:52 +04:00
|
|
|
Indent const& indent,
|
2007-08-24 21:30:41 +04:00
|
|
|
const std::string& toDestDirPath)
|
ENH: merge CMake-CrossCompileBasic to HEAD
-add a RESULT_VARIABLE to INCLUDE()
-add CMAKE_TOOLCHAIN_FILE for specifiying your (potentially crosscompiling) toolchain
-have TRY_RUN() complain if you try to use it in crosscompiling mode (which were compiled but cannot run on this system)
-use CMAKE_EXECUTABLE_SUFFIX in TRY_RUN(), probably TRY_RUN won't be able to
run the executables if they have a different suffix because they are
probably crosscompiled, but nevertheless it should be able to find them
-make several cmake variables presettable by the user: CMAKE_C/CXX_COMPILER, CMAKE_C/CXX_OUTPUT_EXTENSION, CMAKE_SYSTEM_NAME, CMAKE_SYSTEM_INFO_FILE
-support prefix for GNU toolchains (arm-elf-gcc, arm-elf-ar, arm-elf-strip etc.)
-move ranlib on OSX from the file command to a command in executed in cmake_install.cmake
-add support for stripping during install in cmake_install.cmake
-split out cl.cmake from Windows-cl.cmake, first (very incomplete) step to support MS crosscompiling tools
-remove stdio.h from the simple C program which checks if the compiler works, since this may not exist for some embedded platforms
-create a new CMakeFindBinUtils.cmake which collects the search fro ar, ranlib, strip, ld, link, install_name_tool and other tools like these
-add support for CMAKE_FIND_ROOT_PATH for all FIND_XXX commands, which is a
list of directories which will be prepended to all search directories, right
now as a cmake variable, turning it into a global cmake property may need
some more work
-remove cmTestTestHandler::TryExecutable(), it's unused
-split cmFileCommand::HandleInstall() into slightly smaller functions
Alex
2007-05-17 21:20:44 +04:00
|
|
|
{
|
|
|
|
|
2013-06-28 23:06:57 +04:00
|
|
|
// don't strip static and import libraries, because it removes the only
|
|
|
|
// symbol table they have so you can't link to them anymore
|
|
|
|
if(this->Target->GetType()==cmTarget::STATIC_LIBRARY || this->ImportLibrary)
|
2007-06-15 21:00:54 +04:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
ENH: merge CMake-CrossCompileBasic to HEAD
-add a RESULT_VARIABLE to INCLUDE()
-add CMAKE_TOOLCHAIN_FILE for specifiying your (potentially crosscompiling) toolchain
-have TRY_RUN() complain if you try to use it in crosscompiling mode (which were compiled but cannot run on this system)
-use CMAKE_EXECUTABLE_SUFFIX in TRY_RUN(), probably TRY_RUN won't be able to
run the executables if they have a different suffix because they are
probably crosscompiled, but nevertheless it should be able to find them
-make several cmake variables presettable by the user: CMAKE_C/CXX_COMPILER, CMAKE_C/CXX_OUTPUT_EXTENSION, CMAKE_SYSTEM_NAME, CMAKE_SYSTEM_INFO_FILE
-support prefix for GNU toolchains (arm-elf-gcc, arm-elf-ar, arm-elf-strip etc.)
-move ranlib on OSX from the file command to a command in executed in cmake_install.cmake
-add support for stripping during install in cmake_install.cmake
-split out cl.cmake from Windows-cl.cmake, first (very incomplete) step to support MS crosscompiling tools
-remove stdio.h from the simple C program which checks if the compiler works, since this may not exist for some embedded platforms
-create a new CMakeFindBinUtils.cmake which collects the search fro ar, ranlib, strip, ld, link, install_name_tool and other tools like these
-add support for CMAKE_FIND_ROOT_PATH for all FIND_XXX commands, which is a
list of directories which will be prepended to all search directories, right
now as a cmake variable, turning it into a global cmake property may need
some more work
-remove cmTestTestHandler::TryExecutable(), it's unused
-split cmFileCommand::HandleInstall() into slightly smaller functions
Alex
2007-05-17 21:20:44 +04:00
|
|
|
// Don't handle OSX Bundles.
|
|
|
|
if(this->Target->GetMakefile()->IsOn("APPLE") &&
|
|
|
|
this->Target->GetPropertyAsBool("MACOSX_BUNDLE"))
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(! this->Target->GetMakefile()->IsSet("CMAKE_STRIP"))
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-08-22 13:30:19 +04:00
|
|
|
os << indent << "if(CMAKE_INSTALL_DO_STRIP)\n";
|
|
|
|
os << indent << " execute_process(COMMAND \""
|
2007-06-15 19:12:07 +04:00
|
|
|
<< this->Target->GetMakefile()->GetDefinition("CMAKE_STRIP")
|
2007-08-24 21:30:41 +04:00
|
|
|
<< "\" \"" << toDestDirPath << "\")\n";
|
2013-08-22 13:30:19 +04:00
|
|
|
os << indent << "endif()\n";
|
ENH: merge CMake-CrossCompileBasic to HEAD
-add a RESULT_VARIABLE to INCLUDE()
-add CMAKE_TOOLCHAIN_FILE for specifiying your (potentially crosscompiling) toolchain
-have TRY_RUN() complain if you try to use it in crosscompiling mode (which were compiled but cannot run on this system)
-use CMAKE_EXECUTABLE_SUFFIX in TRY_RUN(), probably TRY_RUN won't be able to
run the executables if they have a different suffix because they are
probably crosscompiled, but nevertheless it should be able to find them
-make several cmake variables presettable by the user: CMAKE_C/CXX_COMPILER, CMAKE_C/CXX_OUTPUT_EXTENSION, CMAKE_SYSTEM_NAME, CMAKE_SYSTEM_INFO_FILE
-support prefix for GNU toolchains (arm-elf-gcc, arm-elf-ar, arm-elf-strip etc.)
-move ranlib on OSX from the file command to a command in executed in cmake_install.cmake
-add support for stripping during install in cmake_install.cmake
-split out cl.cmake from Windows-cl.cmake, first (very incomplete) step to support MS crosscompiling tools
-remove stdio.h from the simple C program which checks if the compiler works, since this may not exist for some embedded platforms
-create a new CMakeFindBinUtils.cmake which collects the search fro ar, ranlib, strip, ld, link, install_name_tool and other tools like these
-add support for CMAKE_FIND_ROOT_PATH for all FIND_XXX commands, which is a
list of directories which will be prepended to all search directories, right
now as a cmake variable, turning it into a global cmake property may need
some more work
-remove cmTestTestHandler::TryExecutable(), it's unused
-split cmFileCommand::HandleInstall() into slightly smaller functions
Alex
2007-05-17 21:20:44 +04:00
|
|
|
}
|
|
|
|
|
2007-06-29 00:11:18 +04:00
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
void
|
|
|
|
cmInstallTargetGenerator::AddRanlibRule(std::ostream& os,
|
2007-07-02 19:02:52 +04:00
|
|
|
Indent const& indent,
|
2007-08-24 21:30:41 +04:00
|
|
|
const std::string& toDestDirPath)
|
ENH: merge CMake-CrossCompileBasic to HEAD
-add a RESULT_VARIABLE to INCLUDE()
-add CMAKE_TOOLCHAIN_FILE for specifiying your (potentially crosscompiling) toolchain
-have TRY_RUN() complain if you try to use it in crosscompiling mode (which were compiled but cannot run on this system)
-use CMAKE_EXECUTABLE_SUFFIX in TRY_RUN(), probably TRY_RUN won't be able to
run the executables if they have a different suffix because they are
probably crosscompiled, but nevertheless it should be able to find them
-make several cmake variables presettable by the user: CMAKE_C/CXX_COMPILER, CMAKE_C/CXX_OUTPUT_EXTENSION, CMAKE_SYSTEM_NAME, CMAKE_SYSTEM_INFO_FILE
-support prefix for GNU toolchains (arm-elf-gcc, arm-elf-ar, arm-elf-strip etc.)
-move ranlib on OSX from the file command to a command in executed in cmake_install.cmake
-add support for stripping during install in cmake_install.cmake
-split out cl.cmake from Windows-cl.cmake, first (very incomplete) step to support MS crosscompiling tools
-remove stdio.h from the simple C program which checks if the compiler works, since this may not exist for some embedded platforms
-create a new CMakeFindBinUtils.cmake which collects the search fro ar, ranlib, strip, ld, link, install_name_tool and other tools like these
-add support for CMAKE_FIND_ROOT_PATH for all FIND_XXX commands, which is a
list of directories which will be prepended to all search directories, right
now as a cmake variable, turning it into a global cmake property may need
some more work
-remove cmTestTestHandler::TryExecutable(), it's unused
-split cmFileCommand::HandleInstall() into slightly smaller functions
Alex
2007-05-17 21:20:44 +04:00
|
|
|
{
|
|
|
|
// Static libraries need ranlib on this platform.
|
2009-10-21 21:09:55 +04:00
|
|
|
if(this->Target->GetType() != cmTarget::STATIC_LIBRARY)
|
ENH: merge CMake-CrossCompileBasic to HEAD
-add a RESULT_VARIABLE to INCLUDE()
-add CMAKE_TOOLCHAIN_FILE for specifiying your (potentially crosscompiling) toolchain
-have TRY_RUN() complain if you try to use it in crosscompiling mode (which were compiled but cannot run on this system)
-use CMAKE_EXECUTABLE_SUFFIX in TRY_RUN(), probably TRY_RUN won't be able to
run the executables if they have a different suffix because they are
probably crosscompiled, but nevertheless it should be able to find them
-make several cmake variables presettable by the user: CMAKE_C/CXX_COMPILER, CMAKE_C/CXX_OUTPUT_EXTENSION, CMAKE_SYSTEM_NAME, CMAKE_SYSTEM_INFO_FILE
-support prefix for GNU toolchains (arm-elf-gcc, arm-elf-ar, arm-elf-strip etc.)
-move ranlib on OSX from the file command to a command in executed in cmake_install.cmake
-add support for stripping during install in cmake_install.cmake
-split out cl.cmake from Windows-cl.cmake, first (very incomplete) step to support MS crosscompiling tools
-remove stdio.h from the simple C program which checks if the compiler works, since this may not exist for some embedded platforms
-create a new CMakeFindBinUtils.cmake which collects the search fro ar, ranlib, strip, ld, link, install_name_tool and other tools like these
-add support for CMAKE_FIND_ROOT_PATH for all FIND_XXX commands, which is a
list of directories which will be prepended to all search directories, right
now as a cmake variable, turning it into a global cmake property may need
some more work
-remove cmTestTestHandler::TryExecutable(), it's unused
-split cmFileCommand::HandleInstall() into slightly smaller functions
Alex
2007-05-17 21:20:44 +04:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Perform post-installation processing on the file depending
|
|
|
|
// on its type.
|
|
|
|
if(!this->Target->GetMakefile()->IsOn("APPLE"))
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2007-06-29 00:11:18 +04:00
|
|
|
std::string ranlib =
|
|
|
|
this->Target->GetMakefile()->GetRequiredDefinition("CMAKE_RANLIB");
|
|
|
|
if(ranlib.empty())
|
ENH: merge CMake-CrossCompileBasic to HEAD
-add a RESULT_VARIABLE to INCLUDE()
-add CMAKE_TOOLCHAIN_FILE for specifiying your (potentially crosscompiling) toolchain
-have TRY_RUN() complain if you try to use it in crosscompiling mode (which were compiled but cannot run on this system)
-use CMAKE_EXECUTABLE_SUFFIX in TRY_RUN(), probably TRY_RUN won't be able to
run the executables if they have a different suffix because they are
probably crosscompiled, but nevertheless it should be able to find them
-make several cmake variables presettable by the user: CMAKE_C/CXX_COMPILER, CMAKE_C/CXX_OUTPUT_EXTENSION, CMAKE_SYSTEM_NAME, CMAKE_SYSTEM_INFO_FILE
-support prefix for GNU toolchains (arm-elf-gcc, arm-elf-ar, arm-elf-strip etc.)
-move ranlib on OSX from the file command to a command in executed in cmake_install.cmake
-add support for stripping during install in cmake_install.cmake
-split out cl.cmake from Windows-cl.cmake, first (very incomplete) step to support MS crosscompiling tools
-remove stdio.h from the simple C program which checks if the compiler works, since this may not exist for some embedded platforms
-create a new CMakeFindBinUtils.cmake which collects the search fro ar, ranlib, strip, ld, link, install_name_tool and other tools like these
-add support for CMAKE_FIND_ROOT_PATH for all FIND_XXX commands, which is a
list of directories which will be prepended to all search directories, right
now as a cmake variable, turning it into a global cmake property may need
some more work
-remove cmTestTestHandler::TryExecutable(), it's unused
-split cmFileCommand::HandleInstall() into slightly smaller functions
Alex
2007-05-17 21:20:44 +04:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-08-22 13:30:19 +04:00
|
|
|
os << indent << "execute_process(COMMAND \""
|
2007-08-24 21:30:41 +04:00
|
|
|
<< ranlib << "\" \"" << toDestDirPath << "\")\n";
|
ENH: merge CMake-CrossCompileBasic to HEAD
-add a RESULT_VARIABLE to INCLUDE()
-add CMAKE_TOOLCHAIN_FILE for specifiying your (potentially crosscompiling) toolchain
-have TRY_RUN() complain if you try to use it in crosscompiling mode (which were compiled but cannot run on this system)
-use CMAKE_EXECUTABLE_SUFFIX in TRY_RUN(), probably TRY_RUN won't be able to
run the executables if they have a different suffix because they are
probably crosscompiled, but nevertheless it should be able to find them
-make several cmake variables presettable by the user: CMAKE_C/CXX_COMPILER, CMAKE_C/CXX_OUTPUT_EXTENSION, CMAKE_SYSTEM_NAME, CMAKE_SYSTEM_INFO_FILE
-support prefix for GNU toolchains (arm-elf-gcc, arm-elf-ar, arm-elf-strip etc.)
-move ranlib on OSX from the file command to a command in executed in cmake_install.cmake
-add support for stripping during install in cmake_install.cmake
-split out cl.cmake from Windows-cl.cmake, first (very incomplete) step to support MS crosscompiling tools
-remove stdio.h from the simple C program which checks if the compiler works, since this may not exist for some embedded platforms
-create a new CMakeFindBinUtils.cmake which collects the search fro ar, ranlib, strip, ld, link, install_name_tool and other tools like these
-add support for CMAKE_FIND_ROOT_PATH for all FIND_XXX commands, which is a
list of directories which will be prepended to all search directories, right
now as a cmake variable, turning it into a global cmake property may need
some more work
-remove cmTestTestHandler::TryExecutable(), it's unused
-split cmFileCommand::HandleInstall() into slightly smaller functions
Alex
2007-05-17 21:20:44 +04:00
|
|
|
}
|