From 047a5e4d6656f362151b855b34c259708b8419ba Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Wed, 1 Mar 2017 13:40:22 -0500 Subject: cmWorkingDirectory: add class for changing the workdir --- Source/CMakeLists.txt | 2 ++ Source/cmWorkingDirectory.cxx | 24 ++++++++++++++++++++++++ Source/cmWorkingDirectory.h | 25 +++++++++++++++++++++++++ bootstrap | 1 + 4 files changed, 52 insertions(+) create mode 100644 Source/cmWorkingDirectory.cxx create mode 100644 Source/cmWorkingDirectory.h diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 76b98fc..e47a2eb 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -381,6 +381,8 @@ set(SRCS cmVariableWatch.h cmVersion.cxx cmVersion.h + cmWorkingDirectory.cxx + cmWorkingDirectory.h cmXMLParser.cxx cmXMLParser.h cmXMLSafe.cxx diff --git a/Source/cmWorkingDirectory.cxx b/Source/cmWorkingDirectory.cxx new file mode 100644 index 0000000..99c9ba8 --- /dev/null +++ b/Source/cmWorkingDirectory.cxx @@ -0,0 +1,24 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#include "cmWorkingDirectory.h" + +#include "cmSystemTools.h" + +cmWorkingDirectory::cmWorkingDirectory(std::string const& newdir) +{ + this->OldDir = cmSystemTools::GetCurrentWorkingDirectory(); + cmSystemTools::ChangeDirectory(newdir); +} + +cmWorkingDirectory::~cmWorkingDirectory() +{ + this->Pop(); +} + +void cmWorkingDirectory::Pop() +{ + if (!this->OldDir.empty()) { + cmSystemTools::ChangeDirectory(this->OldDir); + this->OldDir.clear(); + } +} diff --git a/Source/cmWorkingDirectory.h b/Source/cmWorkingDirectory.h new file mode 100644 index 0000000..af0fd44 --- /dev/null +++ b/Source/cmWorkingDirectory.h @@ -0,0 +1,25 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#ifndef cmWorkingDirectory_h +#define cmWorkingDirectory_h + +#include // IWYU pragma: keep + +#include + +/** \class cmWorkingDirectory + * \brief An RAII class to manipulate the working directory. + */ +class cmWorkingDirectory +{ +public: + cmWorkingDirectory(std::string const& newdir); + ~cmWorkingDirectory(); + + void Pop(); + +private: + std::string OldDir; +}; + +#endif diff --git a/bootstrap b/bootstrap index 8063edb..4f58365 100755 --- a/bootstrap +++ b/bootstrap @@ -404,6 +404,7 @@ CMAKE_CXX_SOURCES="\ cmUnsetCommand \ cmVersion \ cmWhileCommand \ + cmWorkingDirectory \ cmake \ cmakemain \ cmcmd \ -- cgit v0.12