cmake: Teach -E copy[_if_different] to support multiple files (#15703)
If multiple input files are provided then the destination must be a directory. If only one input file is provided then destination may be either a file or directory.
This commit is contained in:
parent
0be5020bf8
commit
384ae5514e
|
@ -169,14 +169,14 @@ Available commands are:
|
||||||
``compare_files <file1> <file2>``
|
``compare_files <file1> <file2>``
|
||||||
Check if file1 is same as file2.
|
Check if file1 is same as file2.
|
||||||
|
|
||||||
``copy <file> <destination>``
|
``copy <file>... <destination>``
|
||||||
Copy file to destination (either file or directory).
|
Copy files to 'destination' (either file or directory).
|
||||||
|
|
||||||
``copy_directory <source> <destination>``
|
``copy_directory <source> <destination>``
|
||||||
Copy directory 'source' content to directory 'destination'.
|
Copy directory 'source' content to directory 'destination'.
|
||||||
|
|
||||||
``copy_if_different <in-file> <out-file>``
|
``copy_if_different <file>... <destination>``
|
||||||
Copy file if input has changed.
|
Copy files if input has changed. Destination could be file or directory.
|
||||||
|
|
||||||
``echo [<string>...]``
|
``echo [<string>...]``
|
||||||
Displays arguments as text.
|
Displays arguments as text.
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
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.
|
|
@ -56,11 +56,11 @@ void CMakeCommandUsage(const char* program)
|
||||||
<< "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 file to destination (either file "
|
<< " copy <file>... destination - copy files to destination "
|
||||||
"or directory)\n"
|
"(either file or directory)\n"
|
||||||
<< " copy_directory source destination - copy directory 'source' "
|
<< " copy_directory source destination - copy directory 'source' "
|
||||||
"content to directory 'destination'\n"
|
"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"
|
"changed\n"
|
||||||
<< " echo [<string>...] - displays arguments as text\n"
|
<< " echo [<string>...] - displays arguments as text\n"
|
||||||
<< " echo_append [<string>...] - displays arguments as text but no new "
|
<< " echo_append [<string>...] - displays arguments as text but no new "
|
||||||
|
@ -149,29 +149,60 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string>& args)
|
||||||
if (args.size() > 1)
|
if (args.size() > 1)
|
||||||
{
|
{
|
||||||
// Copy file
|
// 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]
|
std::cerr << "Error: Target (for copy command) \""
|
||||||
<< "\" to \"" << args[3] << "\".\n";
|
<< args[args.size() - 1]
|
||||||
|
<< "\" is not a directory.\n";
|
||||||
return 1;
|
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.
|
// 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(),
|
// If multiple source files specified,
|
||||||
args[3].c_str()))
|
// then destination must be directory
|
||||||
|
if ((args.size() > 4) &&
|
||||||
|
(!cmSystemTools::FileIsDirectory(args[args.size() - 1])))
|
||||||
{
|
{
|
||||||
std::cerr << "Error copying file (if different) from \""
|
std::cerr << "Error: Target (for copy_if_different command) \""
|
||||||
<< args[2] << "\" to \"" << args[3]
|
<< args[args.size() - 1]
|
||||||
<< "\".\n";
|
<< "\" is not a directory.\n";
|
||||||
return 1;
|
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
|
// Copy directory content
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
0
|
|
@ -0,0 +1 @@
|
||||||
|
1
|
|
@ -0,0 +1 @@
|
||||||
|
^CMake Error: .*
|
|
@ -0,0 +1 @@
|
||||||
|
0
|
|
@ -0,0 +1 @@
|
||||||
|
1
|
|
@ -0,0 +1 @@
|
||||||
|
^Error: Target \(for copy command\).* is not a directory.$
|
|
@ -0,0 +1 @@
|
||||||
|
1
|
|
@ -0,0 +1 @@
|
||||||
|
^Error copying file .*not_existing_file.bad\" to .*
|
|
@ -0,0 +1 @@
|
||||||
|
0
|
|
@ -0,0 +1 @@
|
||||||
|
0
|
|
@ -0,0 +1 @@
|
||||||
|
1
|
|
@ -0,0 +1 @@
|
||||||
|
^Error: Target \(for copy_if_different command\).* is not a directory.$
|
|
@ -101,6 +101,29 @@ if(UNIX)
|
||||||
)
|
)
|
||||||
endif()
|
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-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)
|
||||||
|
|
Loading…
Reference in New Issue