summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmSystemTools.cxx52
-rw-r--r--Source/cmSystemTools.h1
-rw-r--r--Source/cmake.cxx17
3 files changed, 64 insertions, 6 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 2377afb..df80b9a 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -1382,7 +1382,7 @@ bool cmSystemTools::CreateTar(const char* outFileName, const std::vector<cmStdSt
TAR_VERBOSE
| 0) == -1)
{
- fprintf(stderr, "tar_open(): %s\n", strerror(errno));
+ cmSystemTools::Error("Problem with tar_open(): ", strerror(errno));
return false;
}
@@ -1395,9 +1395,10 @@ bool cmSystemTools::CreateTar(const char* outFileName, const std::vector<cmStdSt
buf[sizeof(buf)-1] = 0;
if (tar_append_tree(t, buf, pathname) != 0)
{
- fprintf(stderr,
- "tar_append_tree(\"%s\", \"%s\"): %s\n", buf,
- pathname, strerror(errno));
+ cmOStringStream ostr;
+ ostr << "Problem with tar_append_tree(\"" << buf << "\", \"" << pathname << "\"): "
+ << strerror(errno);
+ cmSystemTools::Error(ostr.str().c_str());
tar_close(t);
return false;
}
@@ -1405,14 +1406,53 @@ bool cmSystemTools::CreateTar(const char* outFileName, const std::vector<cmStdSt
if (tar_append_eof(t) != 0)
{
- fprintf(stderr, "tar_append_eof(): %s\n", strerror(errno));
+ cmSystemTools::Error("Problem with tar_append_eof(): ", strerror(errno));
tar_close(t);
return false;
}
if (tar_close(t) != 0)
{
- fprintf(stderr, "tar_close(): %s\n", strerror(errno));
+ cmSystemTools::Error("Problem with tar_close(): ", strerror(errno));
+ return false;
+ }
+ return true;
+#else
+ return false;
+#endif
+}
+
+bool cmSystemTools::ExtractTar(const char* outFileName, const std::vector<cmStdString>& 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<char> 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 59ca1d1..3103300 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<cmStdString>& files);
+ static bool ExtractTar(const char* inFileName, const std::vector<cmStdString>& files);
private:
static bool s_ForceUnixPaths;
static bool s_RunCommandHideConsole;
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index 5176e10..32cad9a 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -963,6 +963,23 @@ int cmake::CMakeCommand(std::vector<std::string>& args)
return 0;
}
+ // Untar files
+ else if (args[1] == "untar" && args.size() > 3)
+ {
+ std::string outFile = args[2];
+ std::vector<cmStdString> 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)