Coverage Report

Created: 2026-10-28 06:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Source/cmWriteFileCommand.cxx
Line
Count
Source
1
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2
   file LICENSE.rst or https://cmake.org/licensing for details.  */
3
#include "cmWriteFileCommand.h"
4
5
#include "cmsys/FStream.hxx"
6
7
#include "cm_sys_stat.h"
8
9
#include "cmDiagnostics.h"
10
#include "cmExecutionStatus.h"
11
#include "cmMakefile.h"
12
#include "cmStringAlgorithms.h"
13
#include "cmSystemTools.h"
14
15
// cmLibraryCommand
16
bool cmWriteFileCommand(std::vector<std::string> const& args,
17
                        cmExecutionStatus& status)
18
0
{
19
0
  cmMakefile& mf = status.GetMakefile();
20
21
0
  mf.IssueDiagnostic(cmDiagnostics::CMD_DEPRECATED,
22
0
                     "The 'write_file' command has been superseded. "
23
0
                     "Use 'file(WRITE)' instead.");
24
25
0
  if (args.size() < 2) {
26
0
    status.SetError("called with incorrect number of arguments");
27
0
    return false;
28
0
  }
29
0
  std::string message;
30
0
  auto i = args.begin();
31
32
0
  std::string const& fileName = *i;
33
0
  bool overwrite = true;
34
0
  i++;
35
36
0
  for (; i != args.end(); ++i) {
37
0
    if (*i == "APPEND") {
38
0
      overwrite = false;
39
0
    } else {
40
0
      message += *i;
41
0
    }
42
0
  }
43
44
0
  if (!mf.CanIWriteThisFile(fileName)) {
45
0
    status.SetError(cmStrCat("attempted to write a file: ", fileName,
46
0
                             " into a source directory."));
47
0
    cmSystemTools::SetFatalErrorOccurred();
48
0
    return false;
49
0
  }
50
51
0
  std::string dir = cmSystemTools::GetFilenamePath(fileName);
52
0
  cmSystemTools::MakeDirectory(dir);
53
54
0
  mode_t mode = 0;
55
0
  bool writable = false;
56
57
  // Set permissions to writable
58
0
  if (cmSystemTools::GetPermissions(fileName.c_str(), mode)) {
59
#if defined(_MSC_VER) || defined(__MINGW32__)
60
    writable = (mode & S_IWRITE) != 0;
61
    mode_t newMode = mode | S_IWRITE;
62
#else
63
0
    writable = mode & S_IWUSR;
64
0
    mode_t newMode = mode | S_IWUSR | S_IWGRP;
65
0
#endif
66
0
    if (!writable) {
67
0
      cmSystemTools::SetPermissions(fileName.c_str(), newMode);
68
0
    }
69
0
  }
70
  // If GetPermissions fails, pretend like it is ok. File open will fail if
71
  // the file is not writable
72
0
  cmsys::ofstream file(fileName.c_str(),
73
0
                       overwrite ? std::ios::out : std::ios::app);
74
0
  if (!file) {
75
0
    status.SetError(cmStrCat("Internal CMake error when trying to open file: ",
76
0
                             fileName, " for writing."));
77
0
    return false;
78
0
  }
79
0
  file << message << '\n';
80
0
  file.close();
81
0
  if (mode && !writable) {
82
0
    cmSystemTools::SetPermissions(fileName.c_str(), mode);
83
0
  }
84
85
0
  return true;
86
0
}