in tools/common/file_system.cc [58:92]
bool CopyFile(const std::string &src, const std::string &dest) {
#ifdef __APPLE__
// The `copyfile` function with `COPYFILE_ALL` mode preserves permissions and
// modification time.
return copyfile(src.c_str(), dest.c_str(), nullptr,
COPYFILE_ALL | COPYFILE_CLONE) == 0;
#elif __unix__
// On Linux, we can use `sendfile` to copy it more easily than calling
// `read`/`write` in a loop.
struct stat stat_buf;
bool success = false;
int src_fd = open(src.c_str(), O_RDONLY);
if (src_fd) {
fstat(src_fd, &stat_buf);
int dest_fd = open(dest.c_str(), O_WRONLY | O_CREAT, stat_buf.st_mode);
if (dest_fd) {
off_t offset = 0;
if (sendfile(dest_fd, src_fd, &offset, stat_buf.st_size) != -1) {
struct timespec timespecs[2] = {stat_buf.st_atim, stat_buf.st_mtim};
futimens(dest_fd, timespecs);
success = true;
}
close(dest_fd);
}
close(src_fd);
}
return success;
#else
// TODO(allevato): If we want to support Windows in the future, we'll need to
// use something like `CopyFileA`.
#error Only macOS and Unix are supported at this time.
#endif
}