diff options
| author | Mike Buland <eichlan@xagasoft.com> | 2006-08-01 03:09:58 +0000 |
|---|---|---|
| committer | Mike Buland <eichlan@xagasoft.com> | 2006-08-01 03:09:58 +0000 |
| commit | 935bc7d5223883d87f58a6798f4a0ade7df95afc (patch) | |
| tree | 83119cd6b407c6e17c21774f1f0cea940d9c948c /src | |
| parent | 73d53b0962cb19a6d2a7686de658a5540ab07017 (diff) | |
| download | build-935bc7d5223883d87f58a6798f4a0ade7df95afc.tar.gz build-935bc7d5223883d87f58a6798f4a0ade7df95afc.tar.bz2 build-935bc7d5223883d87f58a6798f4a0ade7df95afc.tar.xz build-935bc7d5223883d87f58a6798f4a0ade7df95afc.zip | |
It actually builds, now it just needs dependancy tracking, and maybe auto-target
check triggering.
Diffstat (limited to 'src')
| -rw-r--r-- | src/builder.cpp | 33 | ||||
| -rw-r--r-- | src/builder.h | 9 | ||||
| -rw-r--r-- | src/filetarget.cpp | 12 | ||||
| -rw-r--r-- | src/filetarget.h | 1 | ||||
| -rw-r--r-- | src/main.cpp | 4 | ||||
| -rw-r--r-- | src/perform.cpp | 3 | ||||
| -rw-r--r-- | src/perform.h | 8 | ||||
| -rw-r--r-- | src/performcmd.cpp | 9 | ||||
| -rw-r--r-- | src/performcmd.h | 1 | ||||
| -rw-r--r-- | src/rule.cpp | 103 | ||||
| -rw-r--r-- | src/rule.h | 5 |
11 files changed, 116 insertions, 72 deletions
diff --git a/src/builder.cpp b/src/builder.cpp index 852d70d..6bde1b4 100644 --- a/src/builder.cpp +++ b/src/builder.cpp | |||
| @@ -248,9 +248,8 @@ void Builder::processRequires( std::list<std::string> &lInput ) | |||
| 248 | if( re->execute( (*j).c_str() ) ) | 248 | if( re->execute( (*j).c_str() ) ) |
| 249 | { | 249 | { |
| 250 | varmap *revars = regexVars( re ); | 250 | varmap *revars = regexVars( re ); |
| 251 | FILE *fcmd = popen( | 251 | std::string s = varRepl( (*i).second.c_str(), "", revars ); |
| 252 | varRepl( (*i).second.c_str(), "", revars ).c_str(), | 252 | FILE *fcmd = popen( s.c_str(), "r" ); |
| 253 | "r" ); | ||
| 254 | std::string rhs; | 253 | std::string rhs; |
| 255 | bool bHeader = true; | 254 | bool bHeader = true; |
| 256 | for(;;) | 255 | for(;;) |
| @@ -296,7 +295,7 @@ void Builder::processRequires( std::list<std::string> &lInput ) | |||
| 296 | ); | 295 | ); |
| 297 | rhs = ""; | 296 | rhs = ""; |
| 298 | } | 297 | } |
| 299 | fclose( fcmd ); | 298 | pclose( fcmd ); |
| 300 | delete revars; | 299 | delete revars; |
| 301 | } | 300 | } |
| 302 | } | 301 | } |
| @@ -407,17 +406,17 @@ std::string Builder::varRepl( const char *sSrc, const char *cont, varmap *mExtra | |||
| 407 | } | 406 | } |
| 408 | else if( *s == '}' && bVar ) | 407 | else if( *s == '}' && bVar ) |
| 409 | { | 408 | { |
| 410 | if( hasVar( &mVar, var ) ) | 409 | if( hasVar( mExtra, var ) ) |
| 411 | { | 410 | { |
| 412 | out += mVar[var]; | 411 | out += (*mExtra)[var]; |
| 413 | } | 412 | } |
| 414 | else if( hasVar( mCont, var ) ) | 413 | else if( hasVar( mCont, var ) ) |
| 415 | { | 414 | { |
| 416 | out += (*mCont)[var]; | 415 | out += (*mCont)[var]; |
| 417 | } | 416 | } |
| 418 | else if( hasVar( mExtra, var ) ) | 417 | else if( hasVar( &mVar, var ) ) |
| 419 | { | 418 | { |
| 420 | out += (*mExtra)[var]; | 419 | out += mVar[var]; |
| 421 | } | 420 | } |
| 422 | var = ""; | 421 | var = ""; |
| 423 | bVar = false; | 422 | bVar = false; |
| @@ -464,3 +463,21 @@ std::list<Rule *> Builder::findRuleChain( Rule *pRule ) | |||
| 464 | return ret; | 463 | return ret; |
| 465 | } | 464 | } |
| 466 | 465 | ||
| 466 | void cleanList( std::list<std::string> &lst ) | ||
| 467 | { | ||
| 468 | std::map<std::string, bool> m; | ||
| 469 | |||
| 470 | for( std::list<std::string>::iterator i = lst.begin(); i != lst.end(); i++ ) | ||
| 471 | { | ||
| 472 | if( m.find( *i ) == m.end() ) | ||
| 473 | m[ *i ] = true; | ||
| 474 | else | ||
| 475 | { | ||
| 476 | std::list<std::string>::iterator j = i; | ||
| 477 | j--; | ||
| 478 | lst.erase( i ); | ||
| 479 | i = j; | ||
| 480 | } | ||
| 481 | } | ||
| 482 | } | ||
| 483 | |||
diff --git a/src/builder.h b/src/builder.h index faa82c2..f21e411 100644 --- a/src/builder.h +++ b/src/builder.h | |||
| @@ -100,11 +100,16 @@ public: | |||
| 100 | return mTarget[sName]; | 100 | return mTarget[sName]; |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | std::list<std::string> getRequires( const char *sReq ) | ||
| 104 | { | ||
| 105 | return mRequires[sReq]; | ||
| 106 | } | ||
| 107 | |||
| 103 | typedef std::map<std::string, std::string> varmap; | 108 | typedef std::map<std::string, std::string> varmap; |
| 104 | varmap *regexVars( RegExp *re ); | 109 | varmap *regexVars( RegExp *re ); |
| 105 | std::string varRepl( const char *sSrc, const char *cont, varmap *mExtra ); | 110 | std::string varRepl( const char *sSrc, const char *cont, varmap *mExtra ); |
| 106 | private: | ||
| 107 | 111 | ||
| 112 | private: | ||
| 108 | void requiresNormal( const char *sBase, const char *sReq ); | 113 | void requiresNormal( const char *sBase, const char *sReq ); |
| 109 | void requiresRegexp( const char *sBase, const char *sReq ); | 114 | void requiresRegexp( const char *sBase, const char *sReq ); |
| 110 | void checkVar( const char *cont, const char *sName ); | 115 | void checkVar( const char *cont, const char *sName ); |
| @@ -139,4 +144,6 @@ private: | |||
| 139 | bool bReqRegexp; | 144 | bool bReqRegexp; |
| 140 | }; | 145 | }; |
| 141 | 146 | ||
| 147 | void cleanList( std::list<std::string> &lst ); | ||
| 148 | |||
| 142 | #endif | 149 | #endif |
diff --git a/src/filetarget.cpp b/src/filetarget.cpp index 3fefd9f..1880c35 100644 --- a/src/filetarget.cpp +++ b/src/filetarget.cpp | |||
| @@ -70,10 +70,18 @@ void FileTarget::check( Builder &bld ) | |||
| 70 | { | 70 | { |
| 71 | Rule *pRule = bld.getRule( sRule ); | 71 | Rule *pRule = bld.getRule( sRule ); |
| 72 | 72 | ||
| 73 | std::list<std::string> tmp = pRule->execute( bld, lInput, getName() ); | 73 | std::list<Perform *> perf; |
| 74 | std::list<std::string> tmp = pRule->execute( bld, lInput, perf, getName() ); | ||
| 74 | lOutput.insert( lOutput.end(), tmp.begin(), tmp.end() ); | 75 | lOutput.insert( lOutput.end(), tmp.begin(), tmp.end() ); |
| 75 | 76 | ||
| 76 | bld.processRequires( lInput ); | 77 | bld.processRequires( lOutput ); |
| 78 | |||
| 79 | for( std::list<Perform *>::iterator i = perf.begin(); | ||
| 80 | i != perf.end(); i++ ) | ||
| 81 | { | ||
| 82 | std::list<std::string> lReqs = bld.getRequires( (*i)->getTarget() ); | ||
| 83 | |||
| 84 | } | ||
| 77 | } | 85 | } |
| 78 | 86 | ||
| 79 | void FileTarget::clean( Builder &bld ) | 87 | void FileTarget::clean( Builder &bld ) |
diff --git a/src/filetarget.h b/src/filetarget.h index 11dc180..c872c0a 100644 --- a/src/filetarget.h +++ b/src/filetarget.h | |||
| @@ -18,6 +18,7 @@ public: | |||
| 18 | virtual void clean( class Builder &bld ); | 18 | virtual void clean( class Builder &bld ); |
| 19 | 19 | ||
| 20 | private: | 20 | private: |
| 21 | // start here with the file time cache | ||
| 21 | 22 | ||
| 22 | }; | 23 | }; |
| 23 | 24 | ||
diff --git a/src/main.cpp b/src/main.cpp index 2e13b16..ebf0cfd 100644 --- a/src/main.cpp +++ b/src/main.cpp | |||
| @@ -7,8 +7,8 @@ int main() | |||
| 7 | bld.load("build.conf"); | 7 | bld.load("build.conf"); |
| 8 | 8 | ||
| 9 | bld.build(); | 9 | bld.build(); |
| 10 | 10 | /* | |
| 11 | printf("\n\n----------\nDebug dump\n----------\n"); | 11 | printf("\n\n----------\nDebug dump\n----------\n"); |
| 12 | bld.debug(); | 12 | bld.debug();*/ |
| 13 | } | 13 | } |
| 14 | 14 | ||
diff --git a/src/perform.cpp b/src/perform.cpp index 937a76c..d7082a0 100644 --- a/src/perform.cpp +++ b/src/perform.cpp | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | #include "perform.h" | 1 | #include "perform.h" |
| 2 | 2 | ||
| 3 | Perform::Perform() | 3 | Perform::Perform( const char *sTarget ) : |
| 4 | sTarget( sTarget ) | ||
| 4 | { | 5 | { |
| 5 | } | 6 | } |
| 6 | 7 | ||
diff --git a/src/perform.h b/src/perform.h index fefb05e..2eb8cb0 100644 --- a/src/perform.h +++ b/src/perform.h | |||
| @@ -6,12 +6,18 @@ | |||
| 6 | class Perform | 6 | class Perform |
| 7 | { | 7 | { |
| 8 | public: | 8 | public: |
| 9 | Perform(); | 9 | Perform( const char *sTarget ); |
| 10 | virtual ~Perform(); | 10 | virtual ~Perform(); |
| 11 | 11 | ||
| 12 | virtual void execute( class Builder &bld ) = 0; | 12 | virtual void execute( class Builder &bld ) = 0; |
| 13 | 13 | ||
| 14 | const char *getTarget() | ||
| 15 | { | ||
| 16 | return sTarget; | ||
| 17 | } | ||
| 18 | |||
| 14 | private: | 19 | private: |
| 20 | StaticString sTarget; | ||
| 15 | 21 | ||
| 16 | }; | 22 | }; |
| 17 | 23 | ||
diff --git a/src/performcmd.cpp b/src/performcmd.cpp index 21ba737..724f42b 100644 --- a/src/performcmd.cpp +++ b/src/performcmd.cpp | |||
| @@ -2,8 +2,8 @@ | |||
| 2 | #include "builder.h" | 2 | #include "builder.h" |
| 3 | 3 | ||
| 4 | PerformCmd::PerformCmd( const char *sCmd, const char *sTarget ) : | 4 | PerformCmd::PerformCmd( const char *sCmd, const char *sTarget ) : |
| 5 | Perform( sTarget ), | ||
| 5 | sCommand( sCmd ), | 6 | sCommand( sCmd ), |
| 6 | sTarget( sTarget ) | ||
| 7 | { | 7 | { |
| 8 | } | 8 | } |
| 9 | 9 | ||
| @@ -14,6 +14,11 @@ PerformCmd::~PerformCmd() | |||
| 14 | void PerformCmd::execute( class Builder &bld ) | 14 | void PerformCmd::execute( class Builder &bld ) |
| 15 | { | 15 | { |
| 16 | printf("%s\n", sCommand.getString() ); | 16 | printf("%s\n", sCommand.getString() ); |
| 17 | system( sCommand.getString() ); | 17 | int ret; |
| 18 | if( (ret = system( sCommand.getString() )) != 0 ) | ||
| 19 | { | ||
| 20 | printf("Error code: %d\n", WEXITSTATUS(ret) ); | ||
| 21 | exit( WEXITSTATUS(ret) ); | ||
| 22 | } | ||
| 18 | } | 23 | } |
| 19 | 24 | ||
diff --git a/src/performcmd.h b/src/performcmd.h index 3bc83aa..59510a6 100644 --- a/src/performcmd.h +++ b/src/performcmd.h | |||
| @@ -16,7 +16,6 @@ public: | |||
| 16 | 16 | ||
| 17 | private: | 17 | private: |
| 18 | StaticString sCommand; | 18 | StaticString sCommand; |
| 19 | StaticString sTarget; | ||
| 20 | }; | 19 | }; |
| 21 | 20 | ||
| 22 | #endif | 21 | #endif |
diff --git a/src/rule.cpp b/src/rule.cpp index 4425ea5..979075b 100644 --- a/src/rule.cpp +++ b/src/rule.cpp | |||
| @@ -67,20 +67,48 @@ void Rule::setPerforms( ePerform pwhat, const char *sperfcmd ) | |||
| 67 | sPerfCmd = sperfcmd; | 67 | sPerfCmd = sperfcmd; |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | Perform *Rule::buildCommand( Builder &bld, const char *sCmd, const char *sTarget, const char *sMatches ) | 70 | Perform *Rule::buildCommand( Builder &bld, const char *sCmd, Builder::varmap *vars ) |
| 71 | { | 71 | { |
| 72 | Builder::varmap vars; | 72 | return new PerformCmd( |
| 73 | vars["target"] = sTarget; | 73 | bld.varRepl( sCmd, (*vars)["target"].c_str(), vars ).c_str(), |
| 74 | vars["match"] = sMatches; | 74 | (*vars)["target"].c_str() |
| 75 | return new PerformCmd( bld.varRepl( sCmd, "", &vars ).c_str(), sTarget ); | 75 | ); |
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | std::list<std::string> Rule::findTargets( Builder &bld, std::list<std::string> &lIn, std::string &sMatches, const char *sTarget ) | 78 | std::list<std::string> Rule::execute( Builder &bld, std::list<std::string> lInput, std::list<Perform *> &lPerf, const char *sTarget ) |
| 79 | { | 79 | { |
| 80 | std::list<std::string> lTmp; | 80 | std::list<Rule *> lRule = bld.findRuleChain( this ); |
| 81 | /* | ||
| 82 | if( !lRule.empty() ) | ||
| 83 | { | ||
| 84 | printf("Rule %s chains to: ", sName.getString() ); | ||
| 85 | for( std::list<Rule *>::iterator i = lRule.begin(); | ||
| 86 | i != lRule.end(); i++ ) | ||
| 87 | { | ||
| 88 | if( i != lRule.begin() ) | ||
| 89 | printf(", "); | ||
| 90 | printf("%s", (*i)->sName.getString() ); | ||
| 91 | } | ||
| 92 | printf("\n"); | ||
| 93 | }*/ | ||
| 81 | 94 | ||
| 82 | for( std::list<std::string>::iterator i = lIn.begin(); | 95 | std::list<std::string> lOutput; |
| 83 | i != lIn.end(); i++ ) | 96 | std::string sMatches; |
| 97 | |||
| 98 | for( std::list<Rule *>::iterator i = lRule.begin(); i != lRule.end(); i++ ) | ||
| 99 | { | ||
| 100 | std::list<std::string> lTmp = (*i)->execute( bld, lInput, lPerf ); | ||
| 101 | lOutput.insert( lOutput.end(), lTmp.begin(), lTmp.end() ); | ||
| 102 | } | ||
| 103 | |||
| 104 | std::list<std::string> lTest; | ||
| 105 | lTest.insert( lTest.end(), lInput.begin(), lInput.end() ); | ||
| 106 | lTest.insert( lTest.end(), lOutput.begin(), lOutput.end() ); | ||
| 107 | |||
| 108 | cleanList( lTest ); | ||
| 109 | |||
| 110 | for( std::list<std::string>::iterator i = lTest.begin(); | ||
| 111 | i != lTest.end(); i++ ) | ||
| 84 | { | 112 | { |
| 85 | if( rWhat.execute( (*i).c_str() ) ) | 113 | if( rWhat.execute( (*i).c_str() ) ) |
| 86 | { | 114 | { |
| @@ -90,21 +118,22 @@ std::list<std::string> Rule::findTargets( Builder &bld, std::list<std::string> & | |||
| 90 | { | 118 | { |
| 91 | if( mHow == matchOne ) | 119 | if( mHow == matchOne ) |
| 92 | { | 120 | { |
| 93 | lTmp.push_back( | 121 | lOutput.push_back( |
| 94 | bld.varRepl( | 122 | bld.varRepl( |
| 95 | (*j).c_str(), | 123 | (*j).c_str(), |
| 96 | "", | 124 | "", |
| 97 | revars | 125 | revars |
| 98 | ) | 126 | ) |
| 99 | ); | 127 | ); |
| 128 | (*revars)["target"] = (sTarget==NULL)? | ||
| 129 | (lOutput.back().c_str()):(sTarget); | ||
| 130 | (*revars)["match"] = (*i).c_str(); | ||
| 100 | Perform *p = buildCommand( | 131 | Perform *p = buildCommand( |
| 101 | bld, | 132 | bld, |
| 102 | sPerfCmd, | 133 | sPerfCmd, |
| 103 | (sTarget==NULL)?(lTmp.back().c_str()):(sTarget), | 134 | revars |
| 104 | (*i).c_str() | ||
| 105 | ); | 135 | ); |
| 106 | p->execute( bld ); | 136 | lPerf.push_back( p ); |
| 107 | delete p; | ||
| 108 | } | 137 | } |
| 109 | else if( mHow == matchAll ) | 138 | else if( mHow == matchAll ) |
| 110 | { | 139 | { |
| @@ -115,57 +144,27 @@ std::list<std::string> Rule::findTargets( Builder &bld, std::list<std::string> & | |||
| 115 | delete revars; | 144 | delete revars; |
| 116 | } | 145 | } |
| 117 | } | 146 | } |
| 118 | 147 | //std::list<std::string> lTmp = findTargets( bld, lTest, sMatches, sTarget ); | |
| 119 | return lTmp; | 148 | //lOutput.insert( lOutput.end(), lTmp.begin(), lTmp.end() ); |
| 120 | } | ||
| 121 | |||
| 122 | std::list<std::string> Rule::execute( Builder &bld, std::list<std::string> lInput, const char *sTarget ) | ||
| 123 | { | ||
| 124 | std::list<Rule *> lRule = bld.findRuleChain( this ); | ||
| 125 | |||
| 126 | if( !lRule.empty() ) | ||
| 127 | { | ||
| 128 | printf("Rule %s chains to: ", sName.getString() ); | ||
| 129 | for( std::list<Rule *>::iterator i = lRule.begin(); | ||
| 130 | i != lRule.end(); i++ ) | ||
| 131 | { | ||
| 132 | if( i != lRule.begin() ) | ||
| 133 | printf(", "); | ||
| 134 | printf("%s", (*i)->sName.getString() ); | ||
| 135 | } | ||
| 136 | printf("\n"); | ||
| 137 | } | ||
| 138 | |||
| 139 | std::list<std::string> lOutput; | ||
| 140 | std::string sMatches; | ||
| 141 | |||
| 142 | for( std::list<Rule *>::iterator i = lRule.begin(); i != lRule.end(); i++ ) | ||
| 143 | { | ||
| 144 | std::list<std::string> lTmp = (*i)->execute( bld, lInput ); | ||
| 145 | lOutput.insert( lOutput.end(), lTmp.begin(), lTmp.end() ); | ||
| 146 | } | ||
| 147 | |||
| 148 | std::list<std::string> lTmp = findTargets( bld, lInput, sMatches, sTarget ); | ||
| 149 | lOutput.insert( lOutput.end(), lTmp.begin(), lTmp.end() ); | ||
| 150 | lTmp = findTargets( bld, lOutput, sMatches, sTarget ); | ||
| 151 | lOutput.insert( lOutput.end(), lTmp.begin(), lTmp.end() ); | ||
| 152 | 149 | ||
| 153 | if( mHow == matchAll ) | 150 | if( mHow == matchAll ) |
| 154 | { | 151 | { |
| 155 | lOutput.push_back( | 152 | lOutput.push_back( |
| 156 | bld.varRepl( | 153 | bld.varRepl( |
| 157 | sTarget, | 154 | sTarget, |
| 158 | "", | 155 | sTarget, |
| 159 | NULL | 156 | NULL |
| 160 | ) | 157 | ) |
| 161 | ); | 158 | ); |
| 159 | Builder::varmap vars; | ||
| 160 | vars["target"] = sTarget; | ||
| 161 | vars["match"] = sMatches; | ||
| 162 | Perform *p = buildCommand( | 162 | Perform *p = buildCommand( |
| 163 | bld, | 163 | bld, |
| 164 | sPerfCmd, | 164 | sPerfCmd, |
| 165 | sTarget, | 165 | &vars |
| 166 | sMatches.c_str() | ||
| 167 | ); | 166 | ); |
| 168 | p->execute( bld ); | 167 | lPerf.push_back( p ); |
| 169 | } | 168 | } |
| 170 | 169 | ||
| 171 | return lOutput; | 170 | return lOutput; |
| @@ -6,6 +6,7 @@ | |||
| 6 | #include <stdint.h> | 6 | #include <stdint.h> |
| 7 | #include "regexp.h" | 7 | #include "regexp.h" |
| 8 | #include "staticstring.h" | 8 | #include "staticstring.h" |
| 9 | #include "builder.h" | ||
| 9 | 10 | ||
| 10 | class Perform; | 11 | class Perform; |
| 11 | 12 | ||
| @@ -40,10 +41,10 @@ public: | |||
| 40 | 41 | ||
| 41 | bool willChain( Rule *pRule ); | 42 | bool willChain( Rule *pRule ); |
| 42 | 43 | ||
| 43 | std::list<std::string> execute( class Builder &bld, std::list<std::string> lInput, const char *sTarget=NULL ); | 44 | std::list<std::string> execute( class Builder &bld, std::list<std::string> lInput, std::list<Perform *> &lPerf, const char *sTarget=NULL ); |
| 44 | 45 | ||
| 45 | private: | 46 | private: |
| 46 | class Perform *buildCommand( class Builder &bld, const char *sCmd, const char *sTarget, const char *sMatches ); | 47 | class Perform *buildCommand( class Builder &bld, const char *sCmd, Builder::varmap *vars ); |
| 47 | std::list<std::string> findTargets( class Builder &bld, std::list<std::string> &lIn, std::string &sMatches, const char *sTarget ); | 48 | std::list<std::string> findTargets( class Builder &bld, std::list<std::string> &lIn, std::string &sMatches, const char *sTarget ); |
| 48 | StaticString sName; | 49 | StaticString sName; |
| 49 | std::list<std::string> lProduces; | 50 | std::list<std::string> lProduces; |
