2011/11/15 Bill Hoffman <bill.hoff...@kitware.com> > On 11/15/2011 1:11 PM, Nicolas Desprès wrote: > >> >> >> 2011/11/15 Bill Hoffman <bill.hoff...@kitware.com >> <mailto:bill.hoffman@kitware.**com <bill.hoff...@kitware.com>>> >> >> >> On 11/15/2011 12:54 PM, Nicolas Desprès wrote: >> >> Too much in my opinion. Specially the && operator of the shell. >> Using >> cmake -E is the first step. I am planning to suggest an evolution >> of >> Ninja to fix this issue. Actually, it is the main issue which >> stop me >> while writing the beginning of this generator. >> Cheers, >> >> >> What type of evolution will Ninja need? I suppose it could use >> cmake scripts and exectue_process which can do && type things pretty >> easy. >> >> >> Writting cmake script is one solution but since (at least when I started >> the Ninja Generator) Ninja uses $in as input file for the build >> statement it can be hard to pass to the cmake script. I had a >> discussion on this email some month ago about how to pass argument to >> the cmake script. Maybe it will work using -D option. Not sure about >> that. It is old in my mind and I have to check this out again. >> > > -D will work, but is a bit ugly. I see the ninja build files do not have > a rule per file, but rather have production rules most of the time?
Actually you have rule statement like this one for instance: # Rule for compiling CXX files. rule CXX_COMPILER depfile = $out.d command = /usr/bin/c++ $DEFINES -MMD -MF $out.d $FLAGS -o $out -c $in description = Building CXX object $out Where you can describe only one command and not a list of command. And you have build statement where you mention outputs, inputs the rule to deals with them and overload some variables. For example: build Source/kwsys/CMakeFiles/cmsys.dir/SystemTools.cxx.o: CXX_COMPILER ../Source/kwsys/SystemTools.cxx DEFINES = -DKWSYS_NAMESPACE=cmsys FLAGS = -g -ISource -ISource/kwsys > > >> In a general manner I wanted to prevent Ninja to spawn a shell which in >> turn parse the command since it is not that portable on Windows and thus >> to provide an alternative syntax to just spawn a process. Something >> closer to "execute_process" than "system" to say it shortly. >> >> > OK, so ninja does not have a native execute_process. How is anyone doing > anything with ninja on windows right now? > Sorry for the delayed answer. I wanted to take the time to have a look at Ninja's source code to give the right answer. So actually, there is two implementations of the Subprocess class. The one for Linux spawn a /bin/sh whereas the one for Windows uses CreateProcessA(): // Do not prepend 'cmd /c' on Windows, this breaks command // lines greater than 8,191 chars. if (!CreateProcessA(NULL, (char*)command.c_str(), NULL, NULL, /* inherit handles */ TRUE, 0, NULL, NULL, &startup_info, &process_info)) { Win32Fatal("CreateProcess"); } So actually contrary to what I said before the Windows implementation is quite good. Finally, the only thing missing would be the ability to call several commands if a cmake script is not enough. Cheers, -- Nicolas Desprès
-- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers