| /*============================================================================ |
| CMake - Cross Platform Makefile Generator |
| Copyright 2000-2009 Kitware, Inc., Insight Software Consortium |
| |
| Distributed under the OSI-approved BSD License (the "License"); |
| see accompanying file Copyright.txt for details. |
| |
| 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. |
| ============================================================================*/ |
| #ifndef cmInstallCommand_h |
| #define cmInstallCommand_h |
| |
| #include "cmCommand.h" |
| |
| /** \class cmInstallCommand |
| * \brief Specifies where to install some files |
| * |
| * cmInstallCommand is a general-purpose interface command for |
| * specifying install rules. |
| */ |
| class cmInstallCommand : public cmCommand |
| { |
| public: |
| /** |
| * This is a virtual constructor for the command. |
| */ |
| virtual cmCommand* Clone() |
| { |
| return new cmInstallCommand; |
| } |
| |
| /** |
| * This is called when the command is first encountered in |
| * the CMakeLists.txt file. |
| */ |
| virtual bool InitialPass(std::vector<std::string> const& args, |
| cmExecutionStatus &status); |
| |
| /** |
| * The name of the command as specified in CMakeList.txt. |
| */ |
| virtual const char* GetName() const { return "install";} |
| |
| /** |
| * Succinct documentation. |
| */ |
| virtual const char* GetTerseDocumentation() const |
| { |
| return "Specify rules to run at install time."; |
| } |
| |
| /** |
| * More documentation. |
| */ |
| virtual const char* GetFullDocumentation() const |
| { |
| return |
| "This command generates installation rules for a project. " |
| "Rules specified by calls to this command within a source directory " |
| "are executed in order during installation. " |
| "The order across directories is not defined." |
| "\n" |
| "There are multiple signatures for this command. Some of them define " |
| "installation properties for files and targets. Properties common to " |
| "multiple signatures are covered here but they are valid only for " |
| "signatures that specify them.\n" |
| "DESTINATION arguments specify " |
| "the directory on disk to which a file will be installed. " |
| "If a full path (with a leading slash or drive letter) is given it " |
| "is used directly. If a relative path is given it is interpreted " |
| "relative to the value of CMAKE_INSTALL_PREFIX. The prefix can " |
| "be relocated at install time using DESTDIR mechanism explained in the " |
| "CMAKE_INSTALL_PREFIX variable documentation.\n" |
| "PERMISSIONS arguments specify permissions for installed files. " |
| "Valid permissions are " |
| "OWNER_READ, OWNER_WRITE, OWNER_EXECUTE, " |
| "GROUP_READ, GROUP_WRITE, GROUP_EXECUTE, " |
| "WORLD_READ, WORLD_WRITE, WORLD_EXECUTE, " |
| "SETUID, and SETGID. " |
| "Permissions that do not make sense on certain platforms are ignored " |
| "on those platforms.\n" |
| "The CONFIGURATIONS argument specifies a list of build configurations " |
| "for which the install rule applies (Debug, Release, etc.).\n" |
| "The COMPONENT argument specifies an installation component name " |
| "with which the install rule is associated, such as \"runtime\" or " |
| "\"development\". During component-specific installation only " |
| "install rules associated with the given component name will be " |
| "executed. During a full installation all components are installed." |
| " If COMPONENT is not provided a default component \"Unspecified\" is" |
| " created. The default component name may be controlled with the " |
| "CMAKE_INSTALL_DEFAULT_COMPONENT_NAME variable.\n" |
| "The RENAME argument specifies a name for an installed file that " |
| "may be different from the original file. Renaming is allowed only " |
| "when a single file is installed by the command.\n" |
| "The OPTIONAL argument specifies that it is not an error if the " |
| "file to be installed does not exist. " |
| "\n" |
| "The TARGETS signature:\n" |
| " install(TARGETS targets... [EXPORT <export-name>]\n" |
| " [[ARCHIVE|LIBRARY|RUNTIME|FRAMEWORK|BUNDLE|\n" |
| " PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]\n" |
| " [DESTINATION <dir>]\n" |
| " [INCLUDES DESTINATION [<dir> ...]]\n" |
| " [PERMISSIONS permissions...]\n" |
| " [CONFIGURATIONS [Debug|Release|...]]\n" |
| " [COMPONENT <component>]\n" |
| " [OPTIONAL] [NAMELINK_ONLY|NAMELINK_SKIP]\n" |
| " ] [...])\n" |
| "The TARGETS form specifies rules for installing targets from a " |
| "project. There are five kinds of target files that may be " |
| "installed: ARCHIVE, LIBRARY, RUNTIME, FRAMEWORK, and BUNDLE. " |
| |
| "Executables are treated as RUNTIME targets, except that those " |
| "marked with the MACOSX_BUNDLE property are treated as BUNDLE " |
| "targets on OS X. " |
| "Static libraries are always treated as ARCHIVE targets. " |
| "Module libraries are always treated as LIBRARY targets. " |
| "For non-DLL platforms shared libraries are treated as LIBRARY " |
| "targets, except that those marked with the FRAMEWORK property " |
| "are treated as FRAMEWORK targets on OS X. " |
| "For DLL platforms the DLL part of a shared library is treated as " |
| "a RUNTIME target and the corresponding import library is treated as " |
| "an ARCHIVE target. " |
| "All Windows-based systems including Cygwin are DLL platforms. " |
| "The ARCHIVE, LIBRARY, RUNTIME, and FRAMEWORK " |
| "arguments change the type of target to which the subsequent " |
| "properties " |
| "apply. If none is given the installation properties apply to " |
| "all target types. If only one is given then only targets of that " |
| "type will be installed (which can be used to install just a DLL or " |
| "just an import library)." |
| "The INCLUDES DESTINATION specifies a list of directories which will " |
| "be added to the INTERFACE_INCLUDE_DIRECTORIES of the <targets> when " |
| "exported by install(EXPORT). If a relative path is specified, it is " |
| "treated as relative to the $<INSTALL_PREFIX>." |
| "\n" |
| "The PRIVATE_HEADER, PUBLIC_HEADER, and RESOURCE arguments cause " |
| "subsequent properties to be applied to installing a FRAMEWORK " |
| "shared library target's associated files on non-Apple platforms. " |
| "Rules defined by these arguments are ignored on Apple platforms " |
| "because the associated files are installed into the appropriate " |
| "locations inside the framework folder. " |
| "See documentation of the PRIVATE_HEADER, PUBLIC_HEADER, and RESOURCE " |
| "target properties for details." |
| "\n" |
| "Either NAMELINK_ONLY or NAMELINK_SKIP may be specified as a LIBRARY " |
| "option. " |
| "On some platforms a versioned shared library has a symbolic link " |
| "such as\n" |
| " lib<name>.so -> lib<name>.so.1\n" |
| "where \"lib<name>.so.1\" is the soname of the library and " |
| "\"lib<name>.so\" is a \"namelink\" allowing linkers to find the " |
| "library when given \"-l<name>\". " |
| "The NAMELINK_ONLY option causes installation of only the namelink " |
| "when a library target is installed. " |
| "The NAMELINK_SKIP option causes installation of library files other " |
| "than the namelink when a library target is installed. " |
| "When neither option is given both portions are installed. " |
| "On platforms where versioned shared libraries do not have namelinks " |
| "or when a library is not versioned the NAMELINK_SKIP option installs " |
| "the library and the NAMELINK_ONLY option installs nothing. " |
| "See the VERSION and SOVERSION target properties for details on " |
| "creating versioned shared libraries." |
| "\n" |
| "One or more groups of properties may be specified in a single call " |
| "to the TARGETS form of this command. A target may be installed more " |
| "than once to different locations. Consider hypothetical " |
| "targets \"myExe\", \"mySharedLib\", and \"myStaticLib\". The code\n" |
| " install(TARGETS myExe mySharedLib myStaticLib\n" |
| " RUNTIME DESTINATION bin\n" |
| " LIBRARY DESTINATION lib\n" |
| " ARCHIVE DESTINATION lib/static)\n" |
| " install(TARGETS mySharedLib DESTINATION /some/full/path)\n" |
| "will install myExe to <prefix>/bin and myStaticLib to " |
| "<prefix>/lib/static. " |
| "On non-DLL platforms mySharedLib will be installed to <prefix>/lib " |
| "and /some/full/path. On DLL platforms the mySharedLib DLL will be " |
| "installed to <prefix>/bin and /some/full/path and its import library " |
| "will be installed to <prefix>/lib/static and /some/full/path." |
| "\n" |
| "The EXPORT option associates the installed target files with an " |
| "export called <export-name>. " |
| "It must appear before any RUNTIME, LIBRARY, or ARCHIVE options. " |
| "To actually install the export file itself, call install(EXPORT). " |
| "See documentation of the install(EXPORT ...) signature below for " |
| "details." |
| "\n" |
| "Installing a target with EXCLUDE_FROM_ALL set to true has " |
| "undefined behavior." |
| "\n" |
| "The FILES signature:\n" |
| " install(FILES files... DESTINATION <dir>\n" |
| " [PERMISSIONS permissions...]\n" |
| " [CONFIGURATIONS [Debug|Release|...]]\n" |
| " [COMPONENT <component>]\n" |
| " [RENAME <name>] [OPTIONAL])\n" |
| "The FILES form specifies rules for installing files for a " |
| "project. File names given as relative paths are interpreted with " |
| "respect to the current source directory. Files installed by this " |
| "form are by default given permissions OWNER_WRITE, OWNER_READ, " |
| "GROUP_READ, and WORLD_READ if no PERMISSIONS argument is given." |
| "\n" |
| "The PROGRAMS signature:\n" |
| " install(PROGRAMS files... DESTINATION <dir>\n" |
| " [PERMISSIONS permissions...]\n" |
| " [CONFIGURATIONS [Debug|Release|...]]\n" |
| " [COMPONENT <component>]\n" |
| " [RENAME <name>] [OPTIONAL])\n" |
| "The PROGRAMS form is identical to the FILES form except that the " |
| "default permissions for the installed file also include " |
| "OWNER_EXECUTE, GROUP_EXECUTE, and WORLD_EXECUTE. " |
| "This form is intended to install programs that are not targets, " |
| "such as shell scripts. Use the TARGETS form to install targets " |
| "built within the project." |
| "\n" |
| "The DIRECTORY signature:\n" |
| " install(DIRECTORY dirs... DESTINATION <dir>\n" |
| " [FILE_PERMISSIONS permissions...]\n" |
| " [DIRECTORY_PERMISSIONS permissions...]\n" |
| " [USE_SOURCE_PERMISSIONS] [OPTIONAL]\n" |
| " [CONFIGURATIONS [Debug|Release|...]]\n" |
| " [COMPONENT <component>] [FILES_MATCHING]\n" |
| " [[PATTERN <pattern> | REGEX <regex>]\n" |
| " [EXCLUDE] [PERMISSIONS permissions...]] [...])\n" |
| "The DIRECTORY form installs contents of one or more directories " |
| "to a given destination. " |
| "The directory structure is copied verbatim to the destination. " |
| "The last component of each directory name is appended to the " |
| "destination directory but a trailing slash may be used to " |
| "avoid this because it leaves the last component empty. " |
| "Directory names given as relative paths are interpreted with " |
| "respect to the current source directory. " |
| "If no input directory names are given the destination directory " |
| "will be created but nothing will be installed into it. " |
| "The FILE_PERMISSIONS and DIRECTORY_PERMISSIONS options specify " |
| "permissions given to files and directories in the destination. " |
| "If USE_SOURCE_PERMISSIONS is specified and FILE_PERMISSIONS is not, " |
| "file permissions will be copied from the source directory structure. " |
| "If no permissions are specified files will be given the default " |
| "permissions specified in the FILES form of the command, and the " |
| "directories will be given the default permissions specified in the " |
| "PROGRAMS form of the command.\n" |
| |
| "Installation of directories may be controlled with fine granularity " |
| "using the PATTERN or REGEX options. These \"match\" options specify a " |
| "globbing pattern or regular expression to match directories or files " |
| "encountered within input directories. They may be used to apply " |
| "certain options (see below) to a subset of the files and directories " |
| "encountered. " |
| "The full path to each input file or directory " |
| "(with forward slashes) is matched against the expression. " |
| "A PATTERN will match only complete file names: the portion of the " |
| "full path matching the pattern must occur at the end of the file name " |
| "and be preceded by a slash. " |
| "A REGEX will match any portion of the full path but it may use " |
| "'/' and '$' to simulate the PATTERN behavior. " |
| "By default all files and directories are installed whether " |
| "or not they are matched. " |
| "The FILES_MATCHING option may be given before the first match option " |
| "to disable installation of files (but not directories) not matched by " |
| "any expression. For example, the code\n" |
| " install(DIRECTORY src/ DESTINATION include/myproj\n" |
| " FILES_MATCHING PATTERN \"*.h\")\n" |
| "will extract and install header files from a source tree.\n" |
| "Some options may follow a PATTERN or REGEX expression and are " |
| "applied only to files or directories matching them. " |
| "The EXCLUDE option will skip the matched file or directory. " |
| "The PERMISSIONS option overrides the permissions setting for the " |
| "matched file or directory. " |
| "For example the code\n" |
| " install(DIRECTORY icons scripts/ DESTINATION share/myproj\n" |
| " PATTERN \"CVS\" EXCLUDE\n" |
| " PATTERN \"scripts/*\"\n" |
| " PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ\n" |
| " GROUP_EXECUTE GROUP_READ)\n" |
| "will install the icons directory to share/myproj/icons and the " |
| "scripts directory to share/myproj. The icons will get default file " |
| "permissions, the scripts will be given specific permissions, and " |
| "any CVS directories will be excluded." |
| "\n" |
| "The SCRIPT and CODE signature:\n" |
| " install([[SCRIPT <file>] [CODE <code>]] [...])\n" |
| "The SCRIPT form will invoke the given CMake script files during " |
| "installation. If the script file name is a relative path " |
| "it will be interpreted with respect to the current source directory. " |
| "The CODE form will invoke the given CMake code during installation. " |
| "Code is specified as a single argument inside a double-quoted string. " |
| "For example, the code\n" |
| " install(CODE \"MESSAGE(\\\"Sample install message.\\\")\")\n" |
| "will print a message during installation.\n" |
| "" |
| "The EXPORT signature:\n" |
| " install(EXPORT <export-name> DESTINATION <dir>\n" |
| " [NAMESPACE <namespace>] [FILE <name>.cmake]\n" |
| " [PERMISSIONS permissions...]\n" |
| " [CONFIGURATIONS [Debug|Release|...]]\n" |
| " [EXPORT_LINK_INTERFACE_LIBRARIES]\n" |
| " [COMPONENT <component>])\n" |
| "The EXPORT form generates and installs a CMake file containing code " |
| "to import targets from the installation tree into another project. " |
| "Target installations are associated with the export <export-name> " |
| "using the EXPORT option of the install(TARGETS ...) signature " |
| "documented above. The NAMESPACE option will prepend <namespace> to " |
| "the target names as they are written to the import file. " |
| "By default the generated file will be called <export-name>.cmake but " |
| "the FILE option may be used to specify a different name. The value " |
| "given to the FILE option must be a file name with the \".cmake\" " |
| "extension. " |
| "If a CONFIGURATIONS option is given then the file will only be " |
| "installed when one of the named configurations is installed. " |
| "Additionally, the generated import file will reference only the " |
| "matching target configurations. " |
| "The EXPORT_LINK_INTERFACE_LIBRARIES keyword, if present, causes the " |
| "contents of the properties matching " |
| "(IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)? to be exported, when " |
| "policy CMP0022 is NEW. " |
| "If a COMPONENT option is specified that does not match that given " |
| "to the targets associated with <export-name> the behavior is " |
| "undefined. " |
| "If a library target is included in the export but " |
| "a target to which it links is not included the behavior is " |
| "unspecified." |
| "\n" |
| "The EXPORT form is useful to help outside projects use targets built " |
| "and installed by the current project. For example, the code\n" |
| " install(TARGETS myexe EXPORT myproj DESTINATION bin)\n" |
| " install(EXPORT myproj NAMESPACE mp_ DESTINATION lib/myproj)\n" |
| "will install the executable myexe to <prefix>/bin and code to import " |
| "it in the file \"<prefix>/lib/myproj/myproj.cmake\". " |
| "An outside project may load this file with the include command " |
| "and reference the myexe executable from the installation tree using " |
| "the imported target name mp_myexe as if the target were built " |
| "in its own tree." |
| "\n" |
| "NOTE: This command supercedes the INSTALL_TARGETS command and the " |
| "target properties PRE_INSTALL_SCRIPT and POST_INSTALL_SCRIPT. " |
| "It also replaces the FILES forms of the INSTALL_FILES and " |
| "INSTALL_PROGRAMS commands. " |
| "The processing order of these install rules relative to those " |
| "generated by INSTALL_TARGETS, INSTALL_FILES, and INSTALL_PROGRAMS " |
| "commands is not defined.\n" |
| ; |
| } |
| |
| cmTypeMacro(cmInstallCommand, cmCommand); |
| |
| private: |
| bool HandleScriptMode(std::vector<std::string> const& args); |
| bool HandleTargetsMode(std::vector<std::string> const& args); |
| bool HandleFilesMode(std::vector<std::string> const& args); |
| bool HandleDirectoryMode(std::vector<std::string> const& args); |
| bool HandleExportMode(std::vector<std::string> const& args); |
| bool MakeFilesFullPath(const char* modeName, |
| const std::vector<std::string>& relFiles, |
| std::vector<std::string>& absFiles); |
| bool CheckCMP0006(bool& failure); |
| |
| std::string DefaultComponentName; |
| }; |
| |
| |
| #endif |