summaryrefslogtreecommitdiffstats
path: root/Source/cmFilePathUuid.h
diff options
context:
space:
mode:
authorSebastian Holtermann <sebholt@xwmw.org>2016-08-06 11:09:59 (GMT)
committerBrad King <brad.king@kitware.com>2016-08-10 17:21:33 (GMT)
commit0a5dd3c700f1873be217707aa89a805d009bac3e (patch)
tree46932c472df8f97ff38afb95e183f391f2423dd1 /Source/cmFilePathUuid.h
parent3a5f609cbb4ae63fca1eb87918767a4296d16e5f (diff)
downloadCMake-0a5dd3c700f1873be217707aa89a805d009bac3e.zip
CMake-0a5dd3c700f1873be217707aa89a805d009bac3e.tar.gz
CMake-0a5dd3c700f1873be217707aa89a805d009bac3e.tar.bz2
cmFilePathUuid: Add class to generate deterministic unique file names
The class generates a semi-unique (checksum based) pathless file name from a full source file path.
Diffstat (limited to 'Source/cmFilePathUuid.h')
-rw-r--r--Source/cmFilePathUuid.h77
1 files changed, 77 insertions, 0 deletions
diff --git a/Source/cmFilePathUuid.h b/Source/cmFilePathUuid.h
new file mode 100644
index 0000000..42e89b1
--- /dev/null
+++ b/Source/cmFilePathUuid.h
@@ -0,0 +1,77 @@
+/*============================================================================
+ CMake - Cross Platform Makefile Generator
+ Copyright 2016 Sebastian Holtermann (sebholt@xwmw.org)
+
+ Distributed under the OSI-approved BSD License (the "License");
+ see accompanying file Copyright.txt for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the License for more information.
+============================================================================*/
+
+#ifndef cmFilePathUuid_h
+#define cmFilePathUuid_h
+
+#include "cmStandardIncludes.h"
+
+#include <string>
+#include <utility>
+
+class cmMakefile;
+
+/** \class cmFilePathUuid
+ * @brief Generates a unique pathless file name with a checksum component
+ * calculated from the file path.
+ *
+ * The checksum is calculated from the relative file path to the
+ * closest known project directory. This guarantees reproducibility
+ * when source and build directory differ e.g. for different project
+ * build directories.
+ */
+class cmFilePathUuid
+{
+public:
+ /// Maximum number of characters to use from the file name
+ static const size_t partLengthName = 14;
+ /// Maximum number of characters to use from the path checksum
+ static const size_t partLengthCheckSum = 14;
+
+ /// @brief Initilizes the parent directories from a makefile
+ cmFilePathUuid(cmMakefile* makefile);
+
+ /// @brief Initilizes the parent directories manually
+ cmFilePathUuid(const std::string& currentSrcDir,
+ const std::string& currentBinDir,
+ const std::string& projectSrcDir,
+ const std::string& projectBinDir);
+
+ /* @brief Calculates and returns the uuid for a file path
+ *
+ * @arg outputPrefix optional string to prepend to the result
+ * @arg outputSuffix optional string to append to the result
+ */
+ std::string get(const std::string& filePath, const char* outputPrefix = NULL,
+ const char* outputSuffix = NULL);
+
+private:
+ void initParentDirs(const std::string& currentSrcDir,
+ const std::string& currentBinDir,
+ const std::string& projectSrcDir,
+ const std::string& projectBinDir);
+
+ /// Returns the relative path and the parent directory key string (seed)
+ void GetRelPathSeed(const std::string& filePath, std::string& sourceRelPath,
+ std::string& sourceRelSeed);
+
+ std::string GetChecksumString(const std::string& sourceFilename,
+ const std::string& sourceRelPath,
+ const std::string& sourceRelSeed);
+
+ /// Size of the parent directory list
+ static const size_t numParentDirs = 4;
+ /// List of (directory name, seed name) pairs
+ std::pair<std::string, std::string> parentDirs[numParentDirs];
+};
+
+#endif