aboutsummaryrefslogtreecommitdiff
path: root/src/build.cpp
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2006-09-20 18:56:49 +0000
committerMike Buland <eichlan@xagasoft.com>2006-09-20 18:56:49 +0000
commit85539c8c262c0c9e227c87fd1de02c53c163b7d8 (patch)
treeb6f96899ca745c157a6de93ad27013416976fc06 /src/build.cpp
parent5a32418a040e967887aa6e01e41abc22932471db (diff)
downloadbuild-85539c8c262c0c9e227c87fd1de02c53c163b7d8.tar.gz
build-85539c8c262c0c9e227c87fd1de02c53c163b7d8.tar.bz2
build-85539c8c262c0c9e227c87fd1de02c53c163b7d8.tar.xz
build-85539c8c262c0c9e227c87fd1de02c53c163b7d8.zip
Changed the api for variable replacement contexts. There can now be multiple
levels of contextual inheritance, so now sub-targets automatically get their parent target's context variables, if they need them.
Diffstat (limited to '')
-rw-r--r--src/build.cpp33
1 files changed, 22 insertions, 11 deletions
diff --git a/src/build.cpp b/src/build.cpp
index 89366f9..b48e9f1 100644
--- a/src/build.cpp
+++ b/src/build.cpp
@@ -54,14 +54,14 @@ void Build::setStringProc( StringProc *pStrProc )
54 this->pStrProc = pStrProc; 54 this->pStrProc = pStrProc;
55} 55}
56 56
57std::string Build::replVars( const std::string &sSrc, const std::string &sCont, VarMap *mExtra ) 57std::string Build::replVars( const std::string &sSrc, const StringList *pCont, VarMap *mExtra )
58{ 58{
59 if( pStrProc == NULL ) 59 if( pStrProc == NULL )
60 throw BuildException( 60 throw BuildException(
61 "No valid string processor was registered with the Build object." 61 "No valid string processor was registered with the Build object."
62 ); 62 );
63 63
64 return pStrProc->replVars( sSrc, sCont, mExtra ); 64 return pStrProc->replVars( sSrc, pCont, mExtra );
65} 65}
66 66
67void Build::execAction( const std::string &sWhat ) 67void Build::execAction( const std::string &sWhat )
@@ -144,11 +144,13 @@ void Build::set( const std::string &cont, const std::string &var, const std::str
144{ 144{
145 if( cont == "" ) 145 if( cont == "" )
146 { 146 {
147 mVars[var] = replVars( val, cont, NULL ); 147 mVars[var] = replVars( val, NULL, NULL );
148 } 148 }
149 else 149 else
150 { 150 {
151 mContVars[cont][var] = replVars( val, cont, NULL ); 151 StringList cl;
152 cl.push_front( cont );
153 mContVars[cont][var] = replVars( val, &cl, NULL );
152 } 154 }
153} 155}
154 156
@@ -156,15 +158,17 @@ void Build::setAdd( const std::string &cont, const std::string &var, const std::
156{ 158{
157 if( cont == "" ) 159 if( cont == "" )
158 { 160 {
159 mVars[var] = getVar( cont, var, NULL ) + " " + replVars( val, cont, NULL ); 161 mVars[var] = getVar( NULL, var, NULL ) + " " + replVars( val, NULL, NULL );
160 } 162 }
161 else 163 else
162 { 164 {
163 mContVars[cont][var] = getVar( cont, var, NULL ) + " " + replVars( val, cont, NULL ); 165 StringList cl;
166 cl.push_front( cont );
167 mContVars[cont][var] = getVar( &cl, var, NULL ) + " " + replVars( val, &cl, NULL );
164 } 168 }
165} 169}
166 170
167std::string Build::getVar( const std::string &cont, const std::string &var, VarMap *mExtra ) 171std::string Build::getVar( const StringList *cont, const std::string &var, VarMap *mExtra )
168{ 172{
169 if( mExtra != NULL ) 173 if( mExtra != NULL )
170 { 174 {
@@ -175,7 +179,7 @@ std::string Build::getVar( const std::string &cont, const std::string &var, VarM
175 return (*mExtra)[var]; 179 return (*mExtra)[var];
176 } 180 }
177 181
178 if( cont == "" ) 182 if( cont == NULL )
179 { 183 {
180 if( mVars.find(var) == mVars.end() ) 184 if( mVars.find(var) == mVars.end() )
181 { 185 {
@@ -192,11 +196,18 @@ std::string Build::getVar( const std::string &cont, const std::string &var, VarM
192 } 196 }
193 else 197 else
194 { 198 {
195 if( mContVars[cont].find(var) == mContVars[cont].end() ) 199 if( cont->empty() )
200 {
201 return getVar( NULL, var, NULL );
202 }
203 std::string sTop = cont->front();
204 if( mContVars[sTop].find(var) == mContVars[sTop].end() )
196 { 205 {
197 mContVars[cont][var] = getVar( "", var, NULL ); 206 ((StringList *)cont)->pop_front();
207 mContVars[sTop][var] = getVar( cont, var, NULL );
208 ((StringList *)cont)->push_front( sTop );
198 } 209 }
199 return mContVars[cont][var]; 210 return mContVars[sTop][var];
200 } 211 }
201} 212}
202 213