diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/builder.cpp | 66 | ||||
-rw-r--r-- | src/builder.h | 1 | ||||
-rw-r--r-- | src/filetarget.cpp | 12 |
3 files changed, 78 insertions, 1 deletions
diff --git a/src/builder.cpp b/src/builder.cpp index d448243..c4f2d12 100644 --- a/src/builder.cpp +++ b/src/builder.cpp | |||
@@ -217,6 +217,7 @@ void Builder::varAddSet( const char *sName, const char *sValue ) | |||
217 | 217 | ||
218 | void Builder::processRequires( std::list<std::string> &lInput ) | 218 | void Builder::processRequires( std::list<std::string> &lInput ) |
219 | { | 219 | { |
220 | // These are cheap and handy to have all the time | ||
220 | for( regreqlist::iterator i = lRequiresRegexp.begin(); | 221 | for( regreqlist::iterator i = lRequiresRegexp.begin(); |
221 | i != lRequiresRegexp.end(); i++ ) | 222 | i != lRequiresRegexp.end(); i++ ) |
222 | { | 223 | { |
@@ -240,6 +241,8 @@ void Builder::processRequires( std::list<std::string> &lInput ) | |||
240 | } | 241 | } |
241 | } | 242 | } |
242 | 243 | ||
244 | // These are only done on request now, they were too expensive | ||
245 | /* | ||
243 | for( regreqlist::iterator i = lRequiresRegexpCommand.begin(); | 246 | for( regreqlist::iterator i = lRequiresRegexpCommand.begin(); |
244 | i != lRequiresRegexpCommand.end(); i++ ) | 247 | i != lRequiresRegexpCommand.end(); i++ ) |
245 | { | 248 | { |
@@ -302,6 +305,69 @@ void Builder::processRequires( std::list<std::string> &lInput ) | |||
302 | } | 305 | } |
303 | } | 306 | } |
304 | } | 307 | } |
308 | */ | ||
309 | } | ||
310 | |||
311 | void Builder::genRequiresFor( const char *sName ) | ||
312 | { | ||
313 | for( regreqlist::iterator i = lRequiresRegexpCommand.begin(); | ||
314 | i != lRequiresRegexpCommand.end(); i++ ) | ||
315 | { | ||
316 | RegExp *re = (*i).first; | ||
317 | if( re->execute( sName ) ) | ||
318 | { | ||
319 | varmap *revars = regexVars( re ); | ||
320 | std::string s = varRepl( (*i).second.c_str(), "", revars ); | ||
321 | FILE *fcmd = popen( s.c_str(), "r" ); | ||
322 | std::string rhs; | ||
323 | bool bHeader = true; | ||
324 | for(;;) | ||
325 | { | ||
326 | if( feof( fcmd ) ) | ||
327 | break; | ||
328 | int cc = fgetc( fcmd ); | ||
329 | if( cc == EOF ) | ||
330 | break; | ||
331 | unsigned char c = cc; | ||
332 | if( bHeader ) | ||
333 | { | ||
334 | if( c == ':' ) | ||
335 | bHeader = false; | ||
336 | } | ||
337 | else | ||
338 | { | ||
339 | if( c == ' ' || c == '\t' ) | ||
340 | { | ||
341 | if( rhs != "" ) | ||
342 | { | ||
343 | requiresNormal( | ||
344 | sName, | ||
345 | rhs.c_str() | ||
346 | ); | ||
347 | rhs = ""; | ||
348 | } | ||
349 | } | ||
350 | else | ||
351 | { | ||
352 | if( c == '\\' ) | ||
353 | c = fgetc( fcmd ); | ||
354 | if( c != '\n' ) | ||
355 | rhs += c; | ||
356 | } | ||
357 | } | ||
358 | } | ||
359 | if( rhs != "" ) | ||
360 | { | ||
361 | requiresNormal( | ||
362 | sName, | ||
363 | rhs.c_str() | ||
364 | ); | ||
365 | rhs = ""; | ||
366 | } | ||
367 | pclose( fcmd ); | ||
368 | delete revars; | ||
369 | } | ||
370 | } | ||
305 | } | 371 | } |
306 | 372 | ||
307 | std::map<std::string, std::string> *Builder::regexVars( RegExp *re ) | 373 | std::map<std::string, std::string> *Builder::regexVars( RegExp *re ) |
diff --git a/src/builder.h b/src/builder.h index f27a042..296b9d7 100644 --- a/src/builder.h +++ b/src/builder.h | |||
@@ -54,6 +54,7 @@ public: | |||
54 | void processRequires( std::list<std::string> &lInput ); | 54 | void processRequires( std::list<std::string> &lInput ); |
55 | void requires( const char *sBase, const char *sReq ); | 55 | void requires( const char *sBase, const char *sReq ); |
56 | void requiresFromCommand( const char *sBase, const char *sReq ); | 56 | void requiresFromCommand( const char *sBase, const char *sReq ); |
57 | void genRequiresFor( const char *sName ); | ||
57 | void requiresRegexp( bool on ) | 58 | void requiresRegexp( bool on ) |
58 | { | 59 | { |
59 | bReqRegexp = on; | 60 | bReqRegexp = on; |
diff --git a/src/filetarget.cpp b/src/filetarget.cpp index cd95188..ca9a39f 100644 --- a/src/filetarget.cpp +++ b/src/filetarget.cpp | |||
@@ -81,10 +81,10 @@ void FileTarget::check( Builder &bld ) | |||
81 | 81 | ||
82 | bld.processRequires( lOutput ); | 82 | bld.processRequires( lOutput ); |
83 | 83 | ||
84 | |||
85 | for( std::list<Perform *>::iterator i = perf.begin(); | 84 | for( std::list<Perform *>::iterator i = perf.begin(); |
86 | i != perf.end(); i++ ) | 85 | i != perf.end(); i++ ) |
87 | { | 86 | { |
87 | bool bExtraReqs = false; | ||
88 | time_t target = getTime( std::string((*i)->getTarget()) ); | 88 | time_t target = getTime( std::string((*i)->getTarget()) ); |
89 | std::list<std::string> *lReqs = bld.getRequires( (*i)->getTarget() ); | 89 | std::list<std::string> *lReqs = bld.getRequires( (*i)->getTarget() ); |
90 | if( lReqs == NULL ) | 90 | if( lReqs == NULL ) |
@@ -101,6 +101,16 @@ void FileTarget::check( Builder &bld ) | |||
101 | updateTime( (*i)->getTarget() ); | 101 | updateTime( (*i)->getTarget() ); |
102 | break; | 102 | break; |
103 | } | 103 | } |
104 | if( bExtraReqs == false ) | ||
105 | { | ||
106 | std::list<std::string>::iterator k = j; | ||
107 | k++; | ||
108 | if( k == lReqs->end() ) | ||
109 | { | ||
110 | bExtraReqs = true; | ||
111 | bld.genRequiresFor( (*i)->getTarget() ); | ||
112 | } | ||
113 | } | ||
104 | } | 114 | } |
105 | } | 115 | } |
106 | 116 | ||