[PATCH] Use file(COPY) to copy test data instead of spawning a process
Timofei Zhakov <[email protected]> Tue, 12 May 2026 18:36:42 +0200
| Newsgroups | gmane.comp.apache.apr.devel |
|---|---|
| Message-ID | <CAPD1kXRn+CRzx9gKjdKt3U0UkWt8irX0TErXqEJwczHUL7UbxA@mail.gmail.com> |
--000000000000fb47b10651a17950
Content-Type: text/plain; charset="UTF-8"
I think this syntax is much simpler, more convenient, and looks
prettier. According to the documentation [1] cmake will do its best at
avoiding copying the file twice if the same exists with matching
timestamps. Not using cmake executable to copy files will also slightly
improve configuration time because it removes invoking extra tools, if it's
even remotely close to being anywhere significant.
[[[
cmake: Use file(COPY) to copy test data instead of spawning a process.
* CMakeLists.txt
(tests): Use a better statement for configure time file manipulation.
Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt (revision 1934145)
+++ CMakeLists.txt (working copy)
@@ -617,25 +617,14 @@
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
# copy data files to build directory so that we can run programs from
there
- execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory
- ${PROJECT_BINARY_DIR}/data)
- execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
- ${PROJECT_SOURCE_DIR}/test/data/billion-laughs.xml
- ${PROJECT_BINARY_DIR}/data/billion-laughs.xml)
- execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
- ${PROJECT_SOURCE_DIR}/test/data/file_datafile.txt
- ${PROJECT_BINARY_DIR}/data/file_datafile.txt)
- execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
- ${PROJECT_SOURCE_DIR}/test/data/mmap_datafile.txt
- ${PROJECT_BINARY_DIR}/data/mmap_datafile.txt)
- execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
- ${PROJECT_SOURCE_DIR}/test/data/mmap_large_datafile.txt
- ${PROJECT_BINARY_DIR}/data/mmap_large_datafile.txt)
+ file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/data)
+ file(COPY ${PROJECT_SOURCE_DIR}/test/data/billion-laughs.xml
+ ${PROJECT_SOURCE_DIR}/test/data/file_datafile.txt
+ ${PROJECT_SOURCE_DIR}/test/data/mmap_datafile.txt
+ ${PROJECT_SOURCE_DIR}/test/data/mmap_large_datafile.txt
+ ${PROJECT_SOURCE_DIR}/test/echoargs.bat
+ DESTINATION ${PROJECT_BINARY_DIR}/data)
- execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
- ${PROJECT_SOURCE_DIR}/test/echoargs.bat
- ${PROJECT_BINARY_DIR}/echoargs.bat)
-
add_executable(testapp test/testapp.c)
target_link_libraries(testapp ${apr_libname} libaprapp-2)
set_target_properties(testapp PROPERTIES LINK_FLAGS
/entry:wmainCRTStartup)
]]]
[1] https://cmake.org/cmake/help/latest/command/file.html#copy
--
Timofei Zhakov
--000000000000fb47b10651a17950
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>I think this syntax is much simpler, more convenient,=
=C2=A0and looks prettier.=C2=A0According=C2=A0to the documentation=C2=A0[1]=
cmake will do its best at avoiding copying the file twice if the same exis=
ts with matching timestamps. Not using cmake executable to copy files will =
also slightly improve configuration time because it removes invoking extra =
tools, if it's even remotely close to being anywhere significant.</div>=
<div><br></div><div>[[[</div><div>cmake:=C2=A0Use file(COPY) to copy test d=
ata instead of spawning a process.</div><div><br></div><div>*=C2=A0CMakeLis=
ts.txt</div><div>=C2=A0 (tests): Use a better statement for configure time =
file manipulation.</div><div><br></div><div>Index: CMakeLists.txt<br>=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D<br>--- CMakeLists.txt (revisi=
on 1934145)<br>+++ CMakeLists.txt (working copy)<br>@@ -617,25 +617,14 @@<b=
r>=C2=A0 =C2=A0add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --ver=
bose)<br>=C2=A0<br>=C2=A0 =C2=A0# copy data files to build directory so tha=
t we can run programs from there<br>- =C2=A0execute_process(COMMAND ${CMAKE=
_COMMAND} -E make_directory <br>- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0 =C2=A0 =C2=A0${PROJECT_BINARY_DIR}/data)<br>- =C2=A0execute_process=
(COMMAND ${CMAKE_COMMAND} -E copy_if_different <br>- =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0${PROJECT_SOURCE_DIR}/test/data/bi=
llion-laughs.xml<br>- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0${PROJECT_BINARY_DIR}/data/billion-laughs.xml)<br>- =C2=A0execute=
_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different <br>- =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0${PROJECT_SOURCE_DIR}/test/=
data/file_datafile.txt<br>- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0${PROJECT_BINARY_DIR}/data/file_datafile.txt)<br>- =C2=A0e=
xecute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different<br>- =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0${PROJECT_SOURCE_DIR=
}/test/data/mmap_datafile.txt<br>- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0${PROJECT_BINARY_DIR}/data/mmap_datafile.txt)<br>- =
=C2=A0execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different<br>- =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0${PROJECT_SOU=
RCE_DIR}/test/data/mmap_large_datafile.txt<br>- =C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0${PROJECT_BINARY_DIR}/data/mmap_large_da=
tafile.txt)<br>+ =C2=A0file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/data)<br>+=
=C2=A0file(COPY ${PROJECT_SOURCE_DIR}/test/data/billion-laughs.xml<br>+ =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0${PROJECT_SOURCE_DIR}/test/data/fi=
le_datafile.txt<br>+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0${PROJECT_SOU=
RCE_DIR}/test/data/mmap_datafile.txt<br>+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0${PROJECT_SOURCE_DIR}/test/data/mmap_large_datafile.txt<br>+ =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0${PROJECT_SOURCE_DIR}/test/echoargs.b=
at<br>+ =C2=A0 =C2=A0 =C2=A0 DESTINATION ${PROJECT_BINARY_DIR}/data)<br>=C2=
=A0<br>- =C2=A0execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_differen=
t<br>- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0${PROJ=
ECT_SOURCE_DIR}/test/echoargs.bat<br>- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0${PROJECT_BINARY_DIR}/echoargs.bat)<br>-<br>=C2=
=A0 =C2=A0add_executable(testapp test/testapp.c)<br>=C2=A0 =C2=A0target_lin=
k_libraries(testapp ${apr_libname} libaprapp-2)<br>=C2=A0 =C2=A0set_target_=
properties(testapp PROPERTIES LINK_FLAGS /entry:wmainCRTStartup)<br>]]]</di=
v><div><br></div><div>[1]=C2=A0<a href=3D"https://cmake.org/cmake/help/late=
st/command/file.html#copy">https://cmake.org/cmake/help/latest/command/file=
.html#copy</a></div><br><span class=3D"gmail_signature_prefix">-- </span><b=
r><div dir=3D"ltr" class=3D"gmail_signature" data-smartmail=3D"gmail_signat=
ure"><div dir=3D"ltr"><div>Timofei Zhakov</div></div></div></div>
--000000000000fb47b10651a17950--