CMake/Source/cmGeneratedFileStream.h

142 lines
4.4 KiB
C
Raw Normal View History

Simplify CMake per-source license notices Per-source copyright/license notice headers that spell out copyright holder names and years are hard to maintain and often out-of-date or plain wrong. Precise contributor information is already maintained automatically by the version control tool. Ultimately it is the receiver of a file who is responsible for determining its licensing status, and per-source notices are merely a convenience. Therefore it is simpler and more accurate for each source to have a generic notice of the license name and references to more detailed information on copyright holders and full license terms. Our `Copyright.txt` file now contains a list of Contributors whose names appeared source-level copyright notices. It also references version control history for more precise information. Therefore we no longer need to spell out the list of Contributors in each source file notice. Replace CMake per-source copyright/license notice headers with a short description of the license and links to `Copyright.txt` and online information available from "https://cmake.org/licensing". The online URL also handles cases of modules being copied out of our source into other projects, so we can drop our notices about replacing links with full license text. Run the `Utilities/Scripts/filter-notices.bash` script to perform the majority of the replacements mechanically. Manually fix up shebang lines and trailing newlines in a few files. Manually update the notices in a few files that the script does not handle.
2016-09-27 19:01:08 +00:00
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#ifndef cmGeneratedFileStream_h
#define cmGeneratedFileStream_h
#include "cmConfigure.h" // IWYU pragma: keep
#include "cm_codecvt.hxx"
#include "cmsys/FStream.hxx"
#include <string>
// This is the first base class of cmGeneratedFileStream. It will be
// created before and destroyed after the ofstream portion and can
// therefore be used to manage the temporary file.
class cmGeneratedFileStreamBase
{
protected:
// This constructor does not prepare the temporary file. The open
// method must be used.
cmGeneratedFileStreamBase();
// This constructor prepares the temporary output file.
cmGeneratedFileStreamBase(const char* name);
// The destructor renames the temporary output file to the real name.
~cmGeneratedFileStreamBase();
// Internal methods to handle the temporary file. Open is always
// called before the real stream is opened. Close is always called
2006-03-15 16:02:08 +00:00
// after the real stream is closed and Okay is set to whether the
// real stream was still valid for writing when it was closed.
void Open(const char* name);
bool Close();
// Internal file replacement implementation.
int RenameFile(const char* oldname, const char* newname);
2005-01-27 15:14:24 +00:00
// Internal file compression implementation.
int CompressFile(const char* oldname, const char* newname);
// The name of the final destination file for the output.
2006-03-15 16:02:08 +00:00
std::string Name;
// The name of the temporary file.
2006-03-15 16:02:08 +00:00
std::string TempName;
// Whether to do a copy-if-different.
2006-03-15 16:02:08 +00:00
bool CopyIfDifferent;
// Whether the real file stream was valid when it was closed.
2006-03-15 16:02:08 +00:00
bool Okay;
2005-01-27 15:14:24 +00:00
// Whether the destination file is compressed
2006-03-15 16:02:08 +00:00
bool Compress;
// Whether the destination file is compressed
2006-03-15 16:02:08 +00:00
bool CompressExtraExtension;
};
/** \class cmGeneratedFileStream
* \brief Output stream for generated files.
*
* File generation should be atomic so that if CMake is killed then a
* generated file is either the original version or the complete new
* version. This stream is used to make sure file generation is
* atomic. Optionally the output file is only replaced if its
* contents have changed to prevent the file modification time from
* being updated.
*/
class cmGeneratedFileStream : private cmGeneratedFileStreamBase,
public cmsys::ofstream
{
public:
typedef cmsys::ofstream Stream;
typedef codecvt::Encoding Encoding;
/**
* This constructor prepares a default stream. The open method must
* be used before writing to the stream.
*/
cmGeneratedFileStream(Encoding encoding = codecvt::None);
/**
* This constructor takes the name of the file to be generated. It
* automatically generates a name for the temporary file. If the
* file cannot be opened an error message is produced unless the
* second argument is set to true.
*/
cmGeneratedFileStream(const char* name, bool quiet = false,
Encoding encoding = codecvt::None);
/**
* The destructor checks the stream status to be sure the temporary
* file was successfully written before allowing the original to be
* replaced.
*/
~cmGeneratedFileStream() override;
/**
* Open an output file by name. This should be used only with a
* non-open stream. It automatically generates a name for the
* temporary file. If the file cannot be opened an error message is
* produced unless the second argument is set to true.
*/
cmGeneratedFileStream& Open(const char* name, bool quiet = false,
bool binaryFlag = false);
/**
* Close the output file. This should be used only with an open
* stream. The temporary file is atomically renamed to the
* destionation file if the stream is still valid when this method
* is called.
*/
bool Close();
/**
* Set whether copy-if-different is done.
*/
void SetCopyIfDifferent(bool copy_if_different);
2005-01-27 15:14:24 +00:00
/**
* Set whether compression is done.
*/
void SetCompression(bool compression);
2005-05-10 15:11:28 +00:00
/**
* Set whether compression has extra extension
*/
void SetCompressionExtraExtension(bool ext);
2005-05-10 15:11:28 +00:00
/**
* Set name of the file that will hold the actual output. This method allows
* the output file to be changed during the use of cmGeneratedFileStream.
*/
void SetName(const std::string& fname);
private:
cmGeneratedFileStream(cmGeneratedFileStream const&); // not implemented
};
#endif