Commit 8cc5e2cb authored by Brad King's avatar Brad King Committed by Kitware Robot

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

384ae551 cmake: Teach -E copy[_if_different] to support multiple files (#15703)
0be5020b cmake: Improve '-E' help message formatting
parents 939792fd 384ae551
......@@ -169,14 +169,14 @@ Available commands are:
``compare_files <file1> <file2>``
Check if file1 is same as file2.
``copy <file> <destination>``
Copy file to destination (either file or directory).
``copy <file>... <destination>``
Copy files to 'destination' (either file or directory).
``copy_directory <source> <destination>``
Copy directory 'source' content to directory 'destination'.
``copy_if_different <in-file> <out-file>``
Copy file if input has changed.
``copy_if_different <file>... <destination>``
Copy files if input has changed. Destination could be file or directory.
``echo [<string>...]``
Displays arguments as text.
......@@ -193,10 +193,10 @@ Available commands are:
``make_directory <dir>``
Create a directory.
``md5sum [<file>...]``
``md5sum <file>...``
Compute md5sum of files.
``remove [-f] [<file>...]``
``remove [-f] <file>...``
Remove the file(s), use ``-f`` to force it.
``remove_directory <dir>``
......
cmake-E-copy-multiple-inputs
----------------------------
* The :manual:`cmake(1)` ``-E copy`` and ``-E copy_if_different`` command-line
tools learned to support copying multiple input files to a directory.
......@@ -52,25 +52,25 @@ void CMakeCommandUsage(const char* program)
// If you add new commands, change here,
// and in cmakemain.cxx in the options table
errorStream
<< "Usage: " << program << " -E [command] [arguments ...]\n"
<< "Usage: " << program << " -E <command> [arguments...]\n"
<< "Available commands: \n"
<< " chdir dir cmd [args]... - run command in a given directory\n"
<< " compare_files file1 file2 - check if file1 is same as file2\n"
<< " copy file destination - copy file to destination (either file "
"or directory)\n"
<< " copy <file>... destination - copy files to destination "
"(either file or directory)\n"
<< " copy_directory source destination - copy directory 'source' "
"content to directory 'destination'\n"
<< " copy_if_different in-file out-file - copy file if input has "
<< " copy_if_different <file>... destination - copy files if it has "
"changed\n"
<< " echo [string]... - displays arguments as text\n"
<< " echo_append [string]... - displays arguments as text but no new "
<< " echo [<string>...] - displays arguments as text\n"
<< " echo_append [<string>...] - displays arguments as text but no new "
"line\n"
<< " env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]...\n"
<< " - run command in a modified environment\n"
<< " environment - display the current environment\n"
<< " make_directory dir - create a directory\n"
<< " md5sum file1 [...] - compute md5sum of files\n"
<< " remove [-f] file1 file2 ... - remove the file(s), use -f to force "
<< " md5sum <file>... - compute md5sum of files\n"
<< " remove [-f] <file>... - remove the file(s), use -f to force "
"it\n"
<< " remove_directory dir - remove a directory and its contents\n"
<< " rename oldname newname - rename a file or directory "
......@@ -78,7 +78,7 @@ void CMakeCommandUsage(const char* program)
<< " tar [cxt][vf][zjJ] file.tar [file/dir1 file/dir2 ...]\n"
<< " - create or extract a tar or zip archive\n"
<< " sleep <number>... - sleep for given number of seconds\n"
<< " time command [args] ... - run command and return elapsed time\n"
<< " time command [args...] - run command and return elapsed time\n"
<< " touch file - touch a file.\n"
<< " touch_nocreate file - touch a file but do not create it.\n"
#if defined(_WIN32) && !defined(__CYGWIN__)
......@@ -149,29 +149,60 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string>& args)
if (args.size() > 1)
{
// Copy file
if (args[1] == "copy" && args.size() == 4)
if (args[1] == "copy" && args.size() > 3)
{
if(!cmSystemTools::cmCopyFile(args[2].c_str(), args[3].c_str()))
// If multiple source files specified,
// then destination must be directory
if ((args.size() > 4) &&
(!cmSystemTools::FileIsDirectory(args[args.size() - 1])))
{
std::cerr << "Error copying file \"" << args[2]
<< "\" to \"" << args[3] << "\".\n";
std::cerr << "Error: Target (for copy command) \""
<< args[args.size() - 1]
<< "\" is not a directory.\n";
return 1;
}
return 0;
// 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 ++)
{
if(!cmSystemTools::cmCopyFile(args[cc].c_str(),
args[args.size() - 1].c_str()))
{
std::cerr << "Error copying file \"" << args[cc]
<< "\" to \"" << args[args.size() - 1] << "\".\n";
return_value = 1;
}
}
return return_value;
}
// Copy file if different.
if (args[1] == "copy_if_different" && args.size() == 4)
if (args[1] == "copy_if_different" && args.size() > 3)
{
if(!cmSystemTools::CopyFileIfDifferent(args[2].c_str(),
args[3].c_str()))
// If multiple source files specified,
// then destination must be directory
if ((args.size() > 4) &&
(!cmSystemTools::FileIsDirectory(args[args.size() - 1])))
{
std::cerr << "Error copying file (if different) from \""
<< args[2] << "\" to \"" << args[3]
<< "\".\n";
std::cerr << "Error: Target (for copy_if_different command) \""
<< args[args.size() - 1]
<< "\" is not a directory.\n";
return 1;
}
return 0;
// 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 ++)
{
if(!cmSystemTools::CopyFileIfDifferent(args[cc].c_str(),
args[args.size() - 1].c_str()))
{
std::cerr << "Error copying file (if different) from \""
<< args[cc] << "\" to \"" << args[args.size() - 1]
<< "\".\n";
return_value = 1;
}
}
return return_value;
}
// Copy directory content
......
^CMake Error: cmake version .*
Usage: .* -E \[command\] \[arguments ...\]
Usage: .* -E <command> \[arguments\.\.\.\]
Available commands:
^Error: Target \(for copy command\).* is not a directory.$
^Error: Target \(for copy_if_different command\).* is not a directory.$
^CMake Error: cmake version .*
Usage: .* -E \[command\] \[arguments ...\]
Usage: .* -E <command> \[arguments\.\.\.\]
Available commands:
^CMake Error: cmake version .*
Usage: .* -E \[command\] \[arguments ...\]
Usage: .* -E <command> \[arguments\.\.\.\]
Available commands:
^CMake Error: cmake version .*
Usage: .* -E \[command\] \[arguments ...\]
Usage: .* -E <command> \[arguments\.\.\.\]
Available commands:
......@@ -101,6 +101,29 @@ if(UNIX)
)
endif()
set(in ${RunCMake_SOURCE_DIR}/copy_input)
set(out ${RunCMake_BINARY_DIR}/copy_output)
file(REMOVE_RECURSE "${out}")
file(MAKE_DIRECTORY ${out})
run_cmake_command(E_copy-one-source-file
${CMAKE_COMMAND} -E copy ${out}/f1.txt)
run_cmake_command(E_copy-one-source-directory-target-is-directory
${CMAKE_COMMAND} -E copy ${in}/f1.txt ${out})
run_cmake_command(E_copy-three-source-files-target-is-directory
${CMAKE_COMMAND} -E copy ${in}/f1.txt ${in}/f2.txt ${in}/f3.txt ${out})
run_cmake_command(E_copy-three-source-files-target-is-file
${CMAKE_COMMAND} -E copy ${in}/f1.txt ${in}/f2.txt ${in}/f3.txt ${out}/f1.txt)
run_cmake_command(E_copy-two-good-and-one-bad-source-files-target-is-directory
${CMAKE_COMMAND} -E copy ${in}/f1.txt ${in}/not_existing_file.bad ${in}/f3.txt ${out})
run_cmake_command(E_copy_if_different-one-source-directory-target-is-directory
${CMAKE_COMMAND} -E copy_if_different ${in}/f1.txt ${out})
run_cmake_command(E_copy_if_different-three-source-files-target-is-directory
${CMAKE_COMMAND} -E copy_if_different ${in}/f1.txt ${in}/f2.txt ${in}/f3.txt ${out})
run_cmake_command(E_copy_if_different-three-source-files-target-is-file
${CMAKE_COMMAND} -E copy_if_different ${in}/f1.txt ${in}/f2.txt ${in}/f3.txt ${out}/f1.txt)
unset(in)
unset(out)
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-bad-arg1 ${CMAKE_COMMAND} -E env -bad-arg1)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment