Revision 6fd9c68ed02d6b1dc013a6984f890d2c9457b1c8 authored by Brad King on 16 March 2021, 13:34:51 UTC, committed by Brad King on 16 March 2021, 13:37:35 UTC
Since commit fb18215904 (Ninja: clean ninja metadata once generated,
2019-05-13, v3.17.0-rc1~207^2) we recompact the ninja deps log during
regeneration.  That does not make sense during a build, so skip it if we
are regenerating during a build.

This problem went unnoticed previously because on non-Windows platforms
the deps log is just overwritten again by the outer build.  On Windows
platforms, recompaction during the build fails, but we did not actually
try to do that until commit 11f4259362 (Ninja: Clean metadata after
regen during build on Windows with 1.10.2+, 2020-11-30, v3.19.2~29^2~1).

Fixes: #21916
1 parent 22612dd
Raw File
cmFileTime.h
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#pragma once

#include "cmConfigure.h" // IWYU pragma: keep

#include <string>

/** \class cmFileTime
 * \brief Abstract file modification time with support for comparison with
 *        other file modification times.
 */
class cmFileTime
{
public:
  using TimeType = long long;
  // unit time per second
#if !defined(_WIN32) || defined(__CYGWIN__)
  // unit time is one nanosecond
  static constexpr TimeType UtPerS = 1000000000;
#else
  // unit time is 100 nanosecond
  static constexpr TimeType UtPerS = 10000000;
#endif
  cmFileTime() = default;
  ~cmFileTime() = default;

  /**
   * @brief Loads the file time of fileName from the file system
   * @return true on success
   */
  bool Load(std::string const& fileName);

  /**
   * @brief Return true if this is older than ftm
   */
  bool Older(cmFileTime const& ftm) const
  {
    return (this->Time - ftm.Time) < 0;
  }

  /**
   * @brief Return true if this is newer than ftm
   */
  bool Newer(cmFileTime const& ftm) const
  {
    return (ftm.Time - this->Time) < 0;
  }

  /**
   * @brief Return true if this is the same as ftm
   */
  bool Equal(cmFileTime const& ftm) const { return this->Time == ftm.Time; }

  /**
   * @brief Return true if this is not the same as ftm
   */
  bool Differ(cmFileTime const& ftm) const { return this->Time != ftm.Time; }

  /**
   * @brief Compare file modification times.
   * @return -1, 0, +1 for this older, same, or newer than ftm.
   */
  int Compare(cmFileTime const& ftm) const
  {
    TimeType const diff = this->Time - ftm.Time;
    if (diff == 0) {
      return 0;
    }
    return (diff < 0) ? -1 : 1;
  }

  // -- Comparison in second resolution

  /**
   * @brief Return true if this is at least a second older than ftm
   */
  bool OlderS(cmFileTime const& ftm) const
  {
    return (ftm.Time - this->Time) >= cmFileTime::UtPerS;
  }

  /**
   * @brief Return true if this is at least a second newer than ftm
   */
  bool NewerS(cmFileTime const& ftm) const
  {
    return (this->Time - ftm.Time) >= cmFileTime::UtPerS;
  }

  /**
   * @brief Return true if this is within the same second as ftm
   */
  bool EqualS(cmFileTime const& ftm) const
  {
    TimeType diff = this->Time - ftm.Time;
    if (diff < 0) {
      diff = -diff;
    }
    return (diff < cmFileTime::UtPerS);
  }

  /**
   * @brief Return true if this is older or newer than ftm by at least a second
   */
  bool DifferS(cmFileTime const& ftm) const
  {
    TimeType diff = this->Time - ftm.Time;
    if (diff < 0) {
      diff = -diff;
    }
    return (diff >= cmFileTime::UtPerS);
  }

  /**
   * @brief Compare file modification times.
   * @return -1: this at least a second older, 0: this within the same second
   *         as ftm, +1: this at least a second newer than ftm.
   */
  int CompareS(cmFileTime const& ftm) const
  {
    TimeType const diff = this->Time - ftm.Time;
    if (diff <= -cmFileTime::UtPerS) {
      return -1;
    }
    if (diff >= cmFileTime::UtPerS) {
      return 1;
    }
    return 0;
  }

  /**
   * @brief The file modification time in unit time per second
   */
  TimeType GetTime() const { return this->Time; }

private:
  TimeType Time = 0;
};
back to top