diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 2377afb27..df80b9a42 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1382,7 +1382,7 @@ bool cmSystemTools::CreateTar(const char* outFileName, const std::vector& files) +{ +#if defined(CMAKE_BUILD_WITH_CMAKE) + TAR *t; + // Ok, this libtar is not const safe. for now use auto_ptr hack + char* realName = new char[ strlen(outFileName) + 1 ]; + std::auto_ptr realNamePtr(realName); + strcpy(realName, outFileName); + if (tar_open(&t, realName, + NULL, + O_RDONLY +#ifdef _WIN32 + | O_BINARY +#endif + , 0, + TAR_VERBOSE + | 0) == -1) + { + cmSystemTools::Error("Problem with tar_open(): ", strerror(errno)); + return false; + } + + if (tar_extract_all(t, 0) != 0) + { + cmSystemTools::Error("Problem with tar_extract_all(): ", strerror(errno)); + return false; + } + + if (tar_close(t) != 0) + { + cmSystemTools::Error("Problem with tar_close(): ", strerror(errno)); return false; } return true; diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index 59ca1d113..31033004c 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -299,6 +299,7 @@ public: /** Create tar */ static bool CreateTar(const char* outFileName, const std::vector& files); + static bool ExtractTar(const char* inFileName, const std::vector& files); private: static bool s_ForceUnixPaths; static bool s_RunCommandHideConsole; diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 5176e1008..32cad9ab5 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -963,6 +963,23 @@ int cmake::CMakeCommand(std::vector& args) return 0; } + // Untar files + else if (args[1] == "untar" && args.size() > 3) + { + std::string outFile = args[2]; + std::vector files; + for (std::string::size_type cc = 3; cc < args.size(); cc ++) + { + files.push_back(args[cc]); + } + if ( !cmSystemTools::ExtractTar(outFile.c_str(), files) ) + { + cmSystemTools::Error("Problem extracting tar: ", outFile.c_str()); + return 1; + } + return 0; + } + #if defined(CMAKE_BUILD_WITH_CMAKE) // Internal CMake Fortran module support. else if (args[1] == "cmake_copy_f90_mod" && args.size() >= 4)