| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #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 setevn
- // 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;
- }
|