mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-20 21:40:15 +08:00
@@ -96,7 +96,7 @@ _cmake()
|
|||||||
_filedir
|
_filedir
|
||||||
return
|
return
|
||||||
;;
|
;;
|
||||||
--build|--open)
|
--build|--install|--open)
|
||||||
_filedir -d
|
_filedir -d
|
||||||
return
|
return
|
||||||
;;
|
;;
|
||||||
|
@@ -16,6 +16,9 @@ Synopsis
|
|||||||
`Build a Project`_
|
`Build a Project`_
|
||||||
cmake --build <dir> [<options>] [-- <build-tool-options>]
|
cmake --build <dir> [<options>] [-- <build-tool-options>]
|
||||||
|
|
||||||
|
`Install a Project`_
|
||||||
|
cmake --install <dir> [<options>]
|
||||||
|
|
||||||
`Open a Project`_
|
`Open a Project`_
|
||||||
cmake --open <dir>
|
cmake --open <dir>
|
||||||
|
|
||||||
@@ -39,8 +42,8 @@ buildsystem generator CMake. The above `Synopsis`_ lists various actions
|
|||||||
the tool can perform as described in sections below.
|
the tool can perform as described in sections below.
|
||||||
|
|
||||||
To build a software project with CMake, `Generate a Project Buildsystem`_.
|
To build a software project with CMake, `Generate a Project Buildsystem`_.
|
||||||
Optionally use **cmake** to `Build a Project`_ or just run the
|
Optionally use **cmake** to `Build a Project`_, `Install a Project`_ or just
|
||||||
corresponding build tool (e.g. ``make``) directly. **cmake** can also
|
run the corresponding build tool (e.g. ``make``) directly. **cmake** can also
|
||||||
be used to `View Help`_.
|
be used to `View Help`_.
|
||||||
|
|
||||||
The other actions are meant for use by software developers writing
|
The other actions are meant for use by software developers writing
|
||||||
@@ -302,6 +305,41 @@ following options:
|
|||||||
|
|
||||||
Run ``cmake --build`` with no options for quick help.
|
Run ``cmake --build`` with no options for quick help.
|
||||||
|
|
||||||
|
Install a Project
|
||||||
|
=================
|
||||||
|
|
||||||
|
CMake provides a command-line signature to install an already-generated
|
||||||
|
project binary tree:
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
cmake --install <dir> [<options>]
|
||||||
|
|
||||||
|
This may be used after building a project to run installation without
|
||||||
|
using the generated build system or the native build tool.
|
||||||
|
The options are:
|
||||||
|
|
||||||
|
``--install <dir>``
|
||||||
|
Project binary directory to install. This is required and must be first.
|
||||||
|
|
||||||
|
``--config <cfg>``
|
||||||
|
For multi-configuration tools, choose configuration ``<cfg>``.
|
||||||
|
|
||||||
|
``--component <comp>``
|
||||||
|
Component-based install. Only install component ``<comp>``.
|
||||||
|
|
||||||
|
``--prefix <prefix>``
|
||||||
|
The installation prefix CMAKE_INSTALL_PREFIX.
|
||||||
|
|
||||||
|
``--strip``
|
||||||
|
Strip before installing by setting CMAKE_INSTALL_DO_STRIP.
|
||||||
|
|
||||||
|
``-v, --verbose``
|
||||||
|
Enable verbose output.
|
||||||
|
|
||||||
|
This option can be omitted if :envvar:`VERBOSE` environment variable is set.
|
||||||
|
|
||||||
|
Run ``cmake --install`` with no options for quick help.
|
||||||
|
|
||||||
Open a Project
|
Open a Project
|
||||||
==============
|
==============
|
||||||
|
6
Help/release/dev/cmake--install_option.rst
Normal file
6
Help/release/dev/cmake--install_option.rst
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
cmake--install-option
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
* A new ``--install`` option was added to :manual:`cmake(1)`.
|
||||||
|
This may be used after building a project to run installation without
|
||||||
|
using the generated build system or the native build tool.
|
@@ -23,6 +23,7 @@
|
|||||||
# include "cmsys/ConsoleBuf.hxx"
|
# include "cmsys/ConsoleBuf.hxx"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -71,11 +72,20 @@ static const char* cmDocumentationUsageNote[][2] = {
|
|||||||
" the build commands to be executed. \n" \
|
" the build commands to be executed. \n" \
|
||||||
" -- = Pass remaining options to the native tool.\n"
|
" -- = Pass remaining options to the native tool.\n"
|
||||||
|
|
||||||
|
# define CMAKE_INSTALL_OPTIONS \
|
||||||
|
" <dir> = Project binary directory to install.\n" \
|
||||||
|
" --config <cfg> = For multi-configuration tools, choose <cfg>.\n" \
|
||||||
|
" --component <comp> = Component-based install. Only install <comp>.\n" \
|
||||||
|
" --prefix <prefix> = The installation prefix CMAKE_INSTALL_PREFIX.\n" \
|
||||||
|
" --strip = Performing install/strip.\n" \
|
||||||
|
" -v --verbose = Enable verbose output.\n"
|
||||||
|
|
||||||
static const char* cmDocumentationOptions[][2] = {
|
static const char* cmDocumentationOptions[][2] = {
|
||||||
CMAKE_STANDARD_OPTIONS_TABLE,
|
CMAKE_STANDARD_OPTIONS_TABLE,
|
||||||
{ "-E", "CMake command mode." },
|
{ "-E", "CMake command mode." },
|
||||||
{ "-L[A][H]", "List non-advanced cached variables." },
|
{ "-L[A][H]", "List non-advanced cached variables." },
|
||||||
{ "--build <dir>", "Build a CMake-generated project binary tree." },
|
{ "--build <dir>", "Build a CMake-generated project binary tree." },
|
||||||
|
{ "--install <dir>", "Install a CMake-generated project binary tree." },
|
||||||
{ "--open <dir>", "Open generated project in the associated application." },
|
{ "--open <dir>", "Open generated project in the associated application." },
|
||||||
{ "-N", "View mode only." },
|
{ "-N", "View mode only." },
|
||||||
{ "-P <file>", "Process script mode." },
|
{ "-P <file>", "Process script mode." },
|
||||||
@@ -114,6 +124,7 @@ static int do_command(int ac, char const* const* av)
|
|||||||
|
|
||||||
int do_cmake(int ac, char const* const* av);
|
int do_cmake(int ac, char const* const* av);
|
||||||
static int do_build(int ac, char const* const* av);
|
static int do_build(int ac, char const* const* av);
|
||||||
|
static int do_install(int ac, char const* const* av);
|
||||||
static int do_open(int ac, char const* const* av);
|
static int do_open(int ac, char const* const* av);
|
||||||
|
|
||||||
static cmMakefile* cmakemainGetMakefile(cmake* cm)
|
static cmMakefile* cmakemainGetMakefile(cmake* cm)
|
||||||
@@ -188,6 +199,9 @@ int main(int ac, char const* const* av)
|
|||||||
if (strcmp(av[1], "--build") == 0) {
|
if (strcmp(av[1], "--build") == 0) {
|
||||||
return do_build(ac, av);
|
return do_build(ac, av);
|
||||||
}
|
}
|
||||||
|
if (strcmp(av[1], "--install") == 0) {
|
||||||
|
return do_install(ac, av);
|
||||||
|
}
|
||||||
if (strcmp(av[1], "--open") == 0) {
|
if (strcmp(av[1], "--open") == 0) {
|
||||||
return do_open(ac, av);
|
return do_open(ac, av);
|
||||||
}
|
}
|
||||||
@@ -523,6 +537,117 @@ static int do_build(int ac, char const* const* av)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int do_install(int ac, char const* const* av)
|
||||||
|
{
|
||||||
|
#ifndef CMAKE_BUILD_WITH_CMAKE
|
||||||
|
std::cerr << "This cmake does not support --install\n";
|
||||||
|
return -1;
|
||||||
|
#else
|
||||||
|
assert(1 < ac);
|
||||||
|
|
||||||
|
std::string config;
|
||||||
|
std::string component;
|
||||||
|
std::string prefix;
|
||||||
|
std::string dir;
|
||||||
|
bool strip = false;
|
||||||
|
bool verbose = cmSystemTools::HasEnv("VERBOSE");
|
||||||
|
|
||||||
|
enum Doing
|
||||||
|
{
|
||||||
|
DoingNone,
|
||||||
|
DoingDir,
|
||||||
|
DoingConfig,
|
||||||
|
DoingComponent,
|
||||||
|
DoingPrefix,
|
||||||
|
};
|
||||||
|
|
||||||
|
Doing doing = DoingDir;
|
||||||
|
|
||||||
|
for (int i = 2; i < ac; ++i) {
|
||||||
|
if (strcmp(av[i], "--config") == 0) {
|
||||||
|
doing = DoingConfig;
|
||||||
|
} else if (strcmp(av[i], "--component") == 0) {
|
||||||
|
doing = DoingComponent;
|
||||||
|
} else if (strcmp(av[i], "--prefix") == 0) {
|
||||||
|
doing = DoingPrefix;
|
||||||
|
} else if (strcmp(av[i], "--strip") == 0) {
|
||||||
|
strip = true;
|
||||||
|
doing = DoingNone;
|
||||||
|
} else if ((strcmp(av[i], "--verbose") == 0) ||
|
||||||
|
(strcmp(av[i], "-v") == 0)) {
|
||||||
|
verbose = true;
|
||||||
|
doing = DoingNone;
|
||||||
|
} else {
|
||||||
|
switch (doing) {
|
||||||
|
case DoingDir:
|
||||||
|
dir = cmSystemTools::CollapseFullPath(av[i]);
|
||||||
|
doing = DoingNone;
|
||||||
|
break;
|
||||||
|
case DoingConfig:
|
||||||
|
config = av[i];
|
||||||
|
doing = DoingNone;
|
||||||
|
break;
|
||||||
|
case DoingComponent:
|
||||||
|
component = av[i];
|
||||||
|
doing = DoingNone;
|
||||||
|
break;
|
||||||
|
case DoingPrefix:
|
||||||
|
prefix = av[i];
|
||||||
|
doing = DoingNone;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
std::cerr << "Unknown argument " << av[i] << std::endl;
|
||||||
|
dir.clear();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dir.empty()) {
|
||||||
|
std::cerr << "Usage: cmake --install <dir> "
|
||||||
|
"[options]\nOptions:\n" CMAKE_INSTALL_OPTIONS;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmake cm(cmake::RoleScript, cmState::Script);
|
||||||
|
|
||||||
|
cmSystemTools::SetMessageCallback(
|
||||||
|
[&cm](const std::string& msg, const char* title) {
|
||||||
|
cmakemainMessageCallback(msg, title, &cm);
|
||||||
|
});
|
||||||
|
cm.SetProgressCallback([&cm](const std::string& msg, float prog) {
|
||||||
|
cmakemainProgressCallback(msg, prog, &cm);
|
||||||
|
});
|
||||||
|
cm.SetHomeDirectory("");
|
||||||
|
cm.SetHomeOutputDirectory("");
|
||||||
|
cm.SetDebugOutputOn(verbose);
|
||||||
|
cm.SetWorkingMode(cmake::SCRIPT_MODE);
|
||||||
|
|
||||||
|
std::vector<std::string> args{ av[0] };
|
||||||
|
|
||||||
|
if (!prefix.empty()) {
|
||||||
|
args.emplace_back("-DCMAKE_INSTALL_PREFIX=" + prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!component.empty()) {
|
||||||
|
args.emplace_back("-DCMAKE_INSTALL_COMPONENT=" + component);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strip) {
|
||||||
|
args.emplace_back("-DCMAKE_INSTALL_DO_STRIP=1");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!config.empty()) {
|
||||||
|
args.emplace_back("-DCMAKE_INSTALL_CONFIG_NAME=" + config);
|
||||||
|
}
|
||||||
|
|
||||||
|
args.emplace_back("-P");
|
||||||
|
args.emplace_back(dir + "/cmake_install.cmake");
|
||||||
|
|
||||||
|
return cm.Run(args) ? 1 : 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static int do_open(int ac, char const* const* av)
|
static int do_open(int ac, char const* const* av)
|
||||||
{
|
{
|
||||||
#ifndef CMAKE_BUILD_WITH_CMAKE
|
#ifndef CMAKE_BUILD_WITH_CMAKE
|
||||||
|
@@ -54,6 +54,14 @@ run_cmake_command(build-bad-dir
|
|||||||
run_cmake_command(build-bad-generator
|
run_cmake_command(build-bad-generator
|
||||||
${CMAKE_COMMAND} --build ${RunCMake_SOURCE_DIR}/cache-bad-generator)
|
${CMAKE_COMMAND} --build ${RunCMake_SOURCE_DIR}/cache-bad-generator)
|
||||||
|
|
||||||
|
run_cmake_command(install-no-dir
|
||||||
|
${CMAKE_COMMAND} --install)
|
||||||
|
run_cmake_command(install-bad-dir
|
||||||
|
${CMAKE_COMMAND} --install dir-does-not-exist)
|
||||||
|
run_cmake_command(install-options-to-vars
|
||||||
|
${CMAKE_COMMAND} --install ${RunCMake_SOURCE_DIR}/dir-install-options-to-vars
|
||||||
|
--strip --prefix /var/test --config sample --component pack)
|
||||||
|
|
||||||
run_cmake_command(cache-bad-entry
|
run_cmake_command(cache-bad-entry
|
||||||
${CMAKE_COMMAND} --build ${RunCMake_SOURCE_DIR}/cache-bad-entry/)
|
${CMAKE_COMMAND} --build ${RunCMake_SOURCE_DIR}/cache-bad-entry/)
|
||||||
run_cmake_command(cache-empty-entry
|
run_cmake_command(cache-empty-entry
|
||||||
|
@@ -0,0 +1,15 @@
|
|||||||
|
if(CMAKE_INSTALL_PREFIX)
|
||||||
|
message("CMAKE_INSTALL_PREFIX is ${CMAKE_INSTALL_PREFIX}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_INSTALL_COMPONENT)
|
||||||
|
message("CMAKE_INSTALL_COMPONENT is ${CMAKE_INSTALL_COMPONENT}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_INSTALL_CONFIG_NAME)
|
||||||
|
message("CMAKE_INSTALL_CONFIG_NAME is ${CMAKE_INSTALL_CONFIG_NAME}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_INSTALL_DO_STRIP)
|
||||||
|
message("CMAKE_INSTALL_DO_STRIP is ${CMAKE_INSTALL_DO_STRIP}")
|
||||||
|
endif()
|
1
Tests/RunCMake/CommandLine/install-bad-dir-result.txt
Normal file
1
Tests/RunCMake/CommandLine/install-bad-dir-result.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
1
|
1
Tests/RunCMake/CommandLine/install-bad-dir-stderr.txt
Normal file
1
Tests/RunCMake/CommandLine/install-bad-dir-stderr.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
^CMake Error: Error processing file:
|
1
Tests/RunCMake/CommandLine/install-no-dir-result.txt
Normal file
1
Tests/RunCMake/CommandLine/install-no-dir-result.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
1
|
1
Tests/RunCMake/CommandLine/install-no-dir-stderr.txt
Normal file
1
Tests/RunCMake/CommandLine/install-no-dir-stderr.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
^Usage: cmake --install <dir> \[options\]
|
@@ -0,0 +1 @@
|
|||||||
|
0
|
@@ -0,0 +1,4 @@
|
|||||||
|
CMAKE_INSTALL_PREFIX is /var/test
|
||||||
|
CMAKE_INSTALL_COMPONENT is pack
|
||||||
|
CMAKE_INSTALL_CONFIG_NAME is sample
|
||||||
|
CMAKE_INSTALL_DO_STRIP is 1
|
Reference in New Issue
Block a user