Merge topic 'cmake-E-copy-multiple-inputs'

bc35087d cmake: Teach -E copy_directory to support multiple input directories
98be140f cmake: Refine -E copy[_if_different] documentation
93cc80ae cmake: Refine -E copy_if_different implementation indentation
0903812b cmake: Refine -E chdir documentation
This commit is contained in:
Brad King 2015-12-09 08:36:56 -05:00 committed by CMake Topic Stage
commit dc873f6eef
13 changed files with 54 additions and 16 deletions

View File

@ -170,13 +170,19 @@ Available commands are:
Check if file1 is same as file2. Check if file1 is same as file2.
``copy <file>... <destination>`` ``copy <file>... <destination>``
Copy files to 'destination' (either file or directory). Copy files to ``<destination>`` (either file or directory).
If multiple files are specified, the ``<destination>`` must be
directory and it must exist.
``copy_directory <source> <destination>`` ``copy_directory <dir>... <destination>``
Copy directory 'source' content to directory 'destination'. Copy directories to ``<destination>`` directory.
If ``<destination>`` directory does not exist it will be created.
``copy_if_different <file>... <destination>`` ``copy_if_different <file>... <destination>``
Copy files if input has changed. Destination could be file or directory. Copy files to ``<destination>`` (either file or directory) if
they have changed.
If multiple files are specified, the ``<destination>`` must be
directory and it must exist.
``echo [<string>...]`` ``echo [<string>...]``
Displays arguments as text. Displays arguments as text.

View File

@ -3,3 +3,6 @@ cmake-E-copy-multiple-inputs
* The :manual:`cmake(1)` ``-E copy`` and ``-E copy_if_different`` command-line * The :manual:`cmake(1)` ``-E copy`` and ``-E copy_if_different`` command-line
tools learned to support copying multiple input files to a directory. tools learned to support copying multiple input files to a directory.
* The :manual:`cmake(1)` ``-E copy_directory`` command-line
tool learned to support copying multiple input directories to a directory.

View File

@ -54,12 +54,12 @@ void CMakeCommandUsage(const char* program)
errorStream errorStream
<< "Usage: " << program << " -E <command> [arguments...]\n" << "Usage: " << program << " -E <command> [arguments...]\n"
<< "Available commands: \n" << "Available commands: \n"
<< " chdir dir cmd [args]... - run command in a given directory\n" << " chdir dir cmd [args...] - run command in a given directory\n"
<< " compare_files file1 file2 - check if file1 is same as file2\n" << " compare_files file1 file2 - check if file1 is same as file2\n"
<< " copy <file>... destination - copy files to destination " << " copy <file>... destination - copy files to destination "
"(either file or directory)\n" "(either file or directory)\n"
<< " copy_directory source destination - copy directory 'source' " << " copy_directory <dir>... destination - copy content of <dir>... "
"content to directory 'destination'\n" "directories to 'destination' directory\n"
<< " copy_if_different <file>... destination - copy files if it has " << " copy_if_different <file>... destination - copy files if it has "
"changed\n" "changed\n"
<< " echo [<string>...] - displays arguments as text\n" << " echo [<string>...] - displays arguments as text\n"
@ -197,8 +197,8 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string>& args)
args[args.size() - 1].c_str())) args[args.size() - 1].c_str()))
{ {
std::cerr << "Error copying file (if different) from \"" std::cerr << "Error copying file (if different) from \""
<< args[cc] << "\" to \"" << args[args.size() - 1] << args[cc] << "\" to \"" << args[args.size() - 1]
<< "\".\n"; << "\".\n";
return_value = 1; return_value = 1;
} }
} }
@ -206,16 +206,22 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string>& args)
} }
// Copy directory content // Copy directory content
if (args[1] == "copy_directory" && args.size() == 4) if (args[1] == "copy_directory" && args.size() > 3)
{ {
if(!cmSystemTools::CopyADirectory(args[2], args[3])) // If error occurs we want to continue copying next files.
bool return_value = 0;
for (std::string::size_type cc = 2; cc < args.size() - 1; cc ++)
{ {
std::cerr << "Error copying directory from \"" if(!cmSystemTools::CopyADirectory(args[cc].c_str(),
<< args[2] << "\" to \"" << args[3] args[args.size() - 1].c_str()))
<< "\".\n"; {
return 1; std::cerr << "Error copying directory from \""
<< args[cc] << "\" to \"" << args[args.size() - 1]
<< "\".\n";
return_value = 1;
}
} }
return 0; return return_value;
} }
// Rename a file or directory // Rename a file or directory

View File

@ -0,0 +1,3 @@
^Error copying directory from .* to .*file_for_test.txt\".*
Error copying directory from .* to .*file_for_test.txt\".*
Error copying directory from .* to .*file_for_test.txt\".$

View File

@ -124,6 +124,23 @@ run_cmake_command(E_copy_if_different-three-source-files-target-is-file
unset(in) unset(in)
unset(out) unset(out)
set(in ${RunCMake_SOURCE_DIR}/copy_input)
set(out ${RunCMake_BINARY_DIR}/copy_directory_output)
set(outfile ${out}/file_for_test.txt)
file(REMOVE_RECURSE "${out}")
file(MAKE_DIRECTORY ${out})
file(WRITE ${outfile} "")
run_cmake_command(E_copy_directory-three-source-files-target-is-directory
${CMAKE_COMMAND} -E copy_directory ${in}/d1 ${in}/d2 ${in}/d3 ${out})
run_cmake_command(E_copy_directory-three-source-files-target-is-file
${CMAKE_COMMAND} -E copy_directory ${in}/d1 ${in}/d2 ${in}/d3 ${outfile})
run_cmake_command(E_copy_directory-three-source-files-target-is-not-exist
${CMAKE_COMMAND} -E copy_directory ${in}/d1 ${in}/d2 ${in}/d3 ${out}/not_existing_directory)
unset(in)
unset(out)
unset(outfile)
run_cmake_command(E_env-no-command0 ${CMAKE_COMMAND} -E env) run_cmake_command(E_env-no-command0 ${CMAKE_COMMAND} -E env)
run_cmake_command(E_env-no-command1 ${CMAKE_COMMAND} -E env TEST_ENV=1) run_cmake_command(E_env-no-command1 ${CMAKE_COMMAND} -E env TEST_ENV=1)
run_cmake_command(E_env-bad-arg1 ${CMAKE_COMMAND} -E env -bad-arg1) run_cmake_command(E_env-bad-arg1 ${CMAKE_COMMAND} -E env -bad-arg1)