On Mon, Jun 27, 2011 at 12:37 PM, Norbert Thiebaud <nthieb...@gmail.com> wrote: > On Mon, Jun 27, 2011 at 12:26 PM, Norbert Thiebaud <nthieb...@gmail.com> > wrote: >> On Mon, Jun 27, 2011 at 12:03 PM, Tor Lillqvist <tlillqv...@novell.com> >> wrote: >>>> If we do that, we definitely should then also add built-in mkdir and cp >>>> commands in it, >>> >>> Hmm, or actually, I don't think that will be such a great win after all, as >>> the gbuild recipies where tons of mkdir commands are being run typically >>> are in a shell expression with && anyway, so they couldn't be run as >>> "built-in" simple make commands anyway. Forget it. >> >> Yeah, but maybe there is something to be investigated to avoid fork >> when running recipies... I've read somewhere that spawn was much more >> performant than fork under cywin (note: I don;t know if make already >> do that or not, nor what are the implication...) >> >> Another thing: I think most of these mkdir could be avoided at the >> cost of another layer of dependencies: create rules for every target >> so that the parent directory is a pre-req target and have rules for >> directories to build them... that should put most of the the workload >> on make itself an limit drastically the number of mkdir... > > Another solution is a quick and dirty path to make to have ot try to > create the base directory of a target before running a recipe for it.
something like diff -r -u make-3.82/commands.c make-3.82-lo_trace/commands.c --- make-3.82/commands.c 2010-07-12 20:20:37.000000000 -0500 +++ make-3.82-lo_trace/commands.c 2011-06-27 13:48:40.000000000 -0500 @@ -437,6 +437,45 @@ } } ^L +static int _create_dirname(const char* name) +{ + char buffer[PATH_MAX + 1]; + char* cursor; + + if(name == NULL) + { + return 0; + } + strncpy(buffer, name, PATH_MAX); + buffer[PATH_MAX] = 0; + cursor = buffer + strlen(buffer); + while(cursor > buffer) + { + if(*cursor == '/' || *cursor == '\\') + { + struct stat s; + *cursor = 0; + if(stat(buffer, &s)) + { + if(errno == ENOENT) + { + if(_create_dirname(buffer)) + { + return -1; + } + return mkdir(buffer, 0777); + } + } + else + { + return 0; + } + } + cursor -= 1; + } + return -1; +} + /* Execute the commands to remake FILE. If they are currently executing, return or have already finished executing, just return. Otherwise, fork off a child process to run the first command line in the sequence. */ @@ -446,6 +485,7 @@ { const char *p; + _create_dirname(file->name); /* Don't go through all the preparations if the commands are nothing but whitespace. */ Note: this need hardening on windows to deal with C:\ and //xxx stuf and possibly with /./ or /../ in the path (I'm not sure they are possible at that stage of make) Norbert _______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice