summaryrefslogtreecommitdiff
path: root/Source/cmakexbuild.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmakexbuild.cxx')
-rw-r--r--Source/cmakexbuild.cxx92
1 files changed, 92 insertions, 0 deletions
diff --git a/Source/cmakexbuild.cxx b/Source/cmakexbuild.cxx
new file mode 100644
index 000000000..8eaae4795
--- /dev/null
+++ b/Source/cmakexbuild.cxx
@@ -0,0 +1,92 @@
+/*============================================================================
+ CMake - Cross Platform Makefile Generator
+ Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
+
+ 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.
+============================================================================*/
+#include <cmsys/Process.h>
+#include "cmStandardIncludes.h"
+#include "cmSystemTools.h"
+
+// This is a wrapper program for xcodebuild
+// it calls xcodebuild, and does two things
+// it removes much of the output, all the setenv
+// stuff. Also, it checks for the text file busy
+// error, and re-runs xcodebuild until that error does
+// not show up.
+
+int RunXCode(std::vector<const char*>& argv, bool& hitbug)
+{
+ hitbug = false;
+ cmsysProcess* cp = cmsysProcess_New();
+ cmsysProcess_SetCommand(cp, &*argv.begin());
+ cmsysProcess_SetTimeout(cp, 0);
+ cmsysProcess_Execute(cp);
+ std::vector<char> out;
+ std::vector<char> err;
+ std::string line;
+ int pipe = cmSystemTools::WaitForLine(cp, line, 100.0, out, err);
+ while(pipe != cmsysProcess_Pipe_None)
+ {
+ if(line.find("/bin/sh: bad interpreter: Text file busy")
+ != line.npos)
+ {
+ hitbug = true;
+ std::cerr << "Hit xcodebuild bug : " << line << "\n";
+ }
+ // if the bug is hit, no more output should be generated
+ // because it may contain bogus errors
+ // also remove all output with setenv in it to tone down
+ // the verbosity of xcodebuild
+ if(!hitbug && (line.find("setenv") == line.npos))
+ {
+ if(pipe == cmsysProcess_Pipe_STDERR)
+ {
+ std::cerr << line << "\n";
+ }
+ else if(pipe == cmsysProcess_Pipe_STDOUT)
+ {
+ std::cout << line << "\n";
+ }
+ }
+ pipe = cmSystemTools::WaitForLine(cp, line, 100, out, err);
+ }
+ cmsysProcess_WaitForExit(cp, 0);
+ if(cmsysProcess_GetState(cp) == cmsysProcess_State_Exited)
+ {
+ return cmsysProcess_GetExitValue(cp);
+ }
+ if(cmsysProcess_GetState(cp) == cmsysProcess_State_Error)
+ {
+ return -1;
+ }
+ return -1;
+}
+
+int main(int ac, char*av[])
+{
+ std::vector<const char*> argv;
+ argv.push_back("xcodebuild");
+ for(int i =1; i < ac; i++)
+ {
+ argv.push_back(av[i]);
+ }
+ argv.push_back(0);
+ bool hitbug = true;
+ int ret = 0;
+ while(hitbug)
+ {
+ ret = RunXCode(argv, hitbug);
+ }
+ if(ret < 0)
+ {
+ return 255;
+ }
+ return ret;
+}
+