ENH: class for parsing the arguments for INSTALL()

Alex
This commit is contained in:
Alexander Neundorf 2007-08-23 16:14:18 -04:00
parent 2120ce4fcd
commit be2705deaa
3 changed files with 255 additions and 0 deletions

View File

@ -32,6 +32,7 @@
#include "cmGetTestPropertyCommand.cxx" #include "cmGetTestPropertyCommand.cxx"
#include "cmIncludeExternalMSProjectCommand.cxx" #include "cmIncludeExternalMSProjectCommand.cxx"
#include "cmInstallCommand.cxx" #include "cmInstallCommand.cxx"
#include "cmInstallCommandArguments.cxx"
#include "cmInstallProgramsCommand.cxx" #include "cmInstallProgramsCommand.cxx"
#include "cmLinkLibrariesCommand.cxx" #include "cmLinkLibrariesCommand.cxx"
#include "cmListCommand.cxx" #include "cmListCommand.cxx"

View File

@ -0,0 +1,189 @@
/*=========================================================================
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 "cmInstallCommandArguments.h"
#include "cmSystemTools.h"
// Table of valid permissions.
const char* cmInstallCommandArguments::PermissionsTable[] =
{
"OWNER_READ", "OWNER_WRITE", "OWNER_EXECUTE",
"GROUP_READ", "GROUP_WRITE", "GROUP_EXECUTE",
"WORLD_READ", "WORLD_WRITE", "WORLD_EXECUTE",
"SETUID", "SETGID", 0
};
const std::string cmInstallCommandArguments::EmptyString;
cmInstallCommandArguments::cmInstallCommandArguments()
:cmCommandArgumentsHelper()
,ArgumentGroup()
,Destination (this, "DESTINATION" , &ArgumentGroup)
,Component (this, "COMPONENT" , &ArgumentGroup)
,Rename (this, "RENAME" , &ArgumentGroup)
,Permissions (this, "PERMISSIONS" , &ArgumentGroup)
,Configurations(this, "CONFIGURATIONS", &ArgumentGroup)
,Optional (this, "OPTIONAL" , &ArgumentGroup)
,GenericArguments(0)
{
this->Component.SetDefaultString("Unspecified");
}
const std::string& cmInstallCommandArguments::GetDestination() const
{
if (!this->AbsDestination.empty())
{
return this->AbsDestination;
}
if (this->GenericArguments!=0)
{
return this->GenericArguments->GetDestination();
}
return this->EmptyString;
}
const std::string& cmInstallCommandArguments::GetComponent() const
{
if (!this->Component.GetString().empty())
{
return this->Component.GetString();
}
if (this->GenericArguments!=0)
{
return this->GenericArguments->GetComponent();
}
return this->EmptyString;
}
const std::string& cmInstallCommandArguments::GetRename() const
{
if (!this->Rename.GetString().empty())
{
return this->Rename.GetString();
}
if (this->GenericArguments!=0)
{
return this->GenericArguments->GetRename();
}
return this->EmptyString;
}
const std::string& cmInstallCommandArguments::GetPermissions() const
{
if (!this->PermissionsString.empty())
{
return this->PermissionsString;
}
if (this->GenericArguments!=0)
{
return this->GenericArguments->GetPermissions();
}
return this->EmptyString;
}
bool cmInstallCommandArguments::GetOptional() const
{
if (this->Optional.IsEnabled())
{
return true;
}
if (this->GenericArguments!=0)
{
return this->GenericArguments->GetOptional();
}
return false;
}
const std::vector<std::string>&
cmInstallCommandArguments::GetConfigurations() const
{
if (!this->Configurations.GetVector().empty())
{
return this->Configurations.GetVector();
}
if (this->GenericArguments!=0)
{
return this->GenericArguments->GetConfigurations();
}
return this->Configurations.GetVector();
}
bool cmInstallCommandArguments::Finalize()
{
if (!this->CheckPermissions())
{
return false;
}
this->ComputeDestination(this->Destination.GetString(),this->AbsDestination);
return true;
}
bool cmInstallCommandArguments::CheckPermissions()
{
this->PermissionsString = "";
for(std::vector<std::string>::const_iterator
permIt = this->Permissions.GetVector().begin();
permIt != this->Permissions.GetVector().end();
++permIt)
{
if (!this->CheckPermissions(*permIt, this->PermissionsString))
{
return false;
}
}
return true;
}
bool cmInstallCommandArguments::CheckPermissions(
const std::string& onePermission, std::string& permissions)
{
// Check the permission against the table.
for(const char** valid = cmInstallCommandArguments::PermissionsTable;
*valid; ++valid)
{
if(onePermission == *valid)
{
// This is a valid permission.
permissions += " ";
permissions += onePermission;
return true;
}
}
// This is not a valid permission.
return false;
}
//----------------------------------------------------------------------------
void cmInstallCommandArguments::ComputeDestination(const std::string& inDest,
std::string& absDest)
{
if((inDest.size()>0) && !(cmSystemTools::FileIsFullPath(inDest.c_str())))
{
// Relative paths are treated with respect to the installation prefix.
absDest = "${CMAKE_INSTALL_PREFIX}/";
absDest += inDest;
}
else
{
// Full paths are absolute.
absDest = inDest;
}
// Format the path nicely. Note this also removes trailing slashes.
cmSystemTools::ConvertToUnixSlashes(absDest);
}

View File

@ -0,0 +1,65 @@
/*=========================================================================
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.
=========================================================================*/
#ifndef cmInstallCommandArguments_h
#define cmInstallCommandArguments_h
#include "cmStandardIncludes.h"
#include "cmCommandArgumentsHelper.h"
class cmInstallCommandArguments : public cmCommandArgumentsHelper
{
public:
cmInstallCommandArguments();
void SetGenericArguments(cmInstallCommandArguments* args)
{this->GenericArguments = args;}
// Compute destination path.
bool Finalize();
cmCommandArgumentGroup ArgumentGroup;
const std::string& GetDestination() const;
const std::string& GetComponent() const;
const std::string& GetRename() const;
const std::string& GetPermissions() const;
const std::vector<std::string>& GetConfigurations() const;
bool GetOptional() const;
// once HandleDirectoryMode() is also switched to using cmInstallCommandArguments
// then these two functions can become non-static private member functions
// without arguments
static void ComputeDestination(const std::string& inDest,
std::string& absDest);
static bool CheckPermissions(const std::string& onePerm,
std::string& perm);
private:
cmCAString Destination;
cmCAString Component;
cmCAString Rename;
cmCAStringVector Permissions;
cmCAStringVector Configurations;
cmCAEnabler Optional;
std::string AbsDestination;
std::string PermissionsString;
cmInstallCommandArguments* GenericArguments;
static const char* PermissionsTable[];
static const std::string EmptyString;
bool CheckPermissions();
};
#endif