diff options
| author | Mike Buland <eichlan@xagasoft.com> | 2006-07-31 08:07:12 +0000 |
|---|---|---|
| committer | Mike Buland <eichlan@xagasoft.com> | 2006-07-31 08:07:12 +0000 |
| commit | 9139f1df4cda80b91ab68e5de27e85eaa4c54682 (patch) | |
| tree | 87fadb2618ee8228f7184aa14bfa2b21741e3f49 /src/builder.cpp | |
| parent | 113fc467a7170a8a564049c64d1036dd10e6abac (diff) | |
| download | build-9139f1df4cda80b91ab68e5de27e85eaa4c54682.tar.gz build-9139f1df4cda80b91ab68e5de27e85eaa4c54682.tar.bz2 build-9139f1df4cda80b91ab68e5de27e85eaa4c54682.tar.xz build-9139f1df4cda80b91ab68e5de27e85eaa4c54682.zip | |
I still can't get the pymake file to auto-make the bison and flex .c files, but
besides that everything is looking great. There's only one thing left to parse
and interpret before we can try actually building something.
Diffstat (limited to 'src/builder.cpp')
| -rw-r--r-- | src/builder.cpp | 152 |
1 files changed, 151 insertions, 1 deletions
diff --git a/src/builder.cpp b/src/builder.cpp index 2de6f5c..e5017e2 100644 --- a/src/builder.cpp +++ b/src/builder.cpp | |||
| @@ -3,13 +3,17 @@ | |||
| 3 | #include "builder.h" | 3 | #include "builder.h" |
| 4 | #include "action.h" | 4 | #include "action.h" |
| 5 | #include "command.h" | 5 | #include "command.h" |
| 6 | #include "target.h" | ||
| 6 | #include "build.tab.h" | 7 | #include "build.tab.h" |
| 8 | #include "rule.h" | ||
| 7 | 9 | ||
| 8 | subExceptionDef( BuildException ) | 10 | subExceptionDef( BuildException ) |
| 9 | 11 | ||
| 10 | Builder::Builder() : | 12 | Builder::Builder() : |
| 11 | pDefaultAction( NULL ), | 13 | pDefaultAction( NULL ), |
| 12 | pLastAddedAction( NULL ) | 14 | pLastAddedAction( NULL ), |
| 15 | sTmp(""), | ||
| 16 | sContext("") | ||
| 13 | { | 17 | { |
| 14 | } | 18 | } |
| 15 | 19 | ||
| @@ -51,13 +55,159 @@ void Builder::add( Command *pCmd ) | |||
| 51 | } | 55 | } |
| 52 | } | 56 | } |
| 53 | 57 | ||
| 58 | void Builder::add( Rule *pRule ) | ||
| 59 | { | ||
| 60 | pLastAddedRule = pRule; | ||
| 61 | mRule[pRule->getName()] = pRule; | ||
| 62 | } | ||
| 63 | |||
| 64 | void Builder::add( Target *pTarg ) | ||
| 65 | { | ||
| 66 | pLastAddedTarget = pTarg; | ||
| 67 | mTarget[pTarg->getName()] = pTarg; | ||
| 68 | } | ||
| 69 | |||
| 54 | void Builder::debug() | 70 | void Builder::debug() |
| 55 | { | 71 | { |
| 72 | printf("Actions:\n"); | ||
| 56 | pDefaultAction->debug(); | 73 | pDefaultAction->debug(); |
| 57 | for( std::map<const char *, Action *, ltstr>::iterator i = mAction.begin(); | 74 | for( std::map<const char *, Action *, ltstr>::iterator i = mAction.begin(); |
| 58 | i != mAction.end(); i++ ) | 75 | i != mAction.end(); i++ ) |
| 59 | { | 76 | { |
| 60 | (*i).second->debug(); | 77 | (*i).second->debug(); |
| 61 | } | 78 | } |
| 79 | |||
| 80 | printf("Targets:\n"); | ||
| 81 | for( std::map<const char *, Target *, ltstr>::iterator i = mTarget.begin(); | ||
| 82 | i != mTarget.end(); i++ ) | ||
| 83 | { | ||
| 84 | (*i).second->debug(); | ||
| 85 | } | ||
| 86 | |||
| 87 | printf("Rules:\n"); | ||
| 88 | for( std::map<const char *, Rule *, ltstr>::iterator i = mRule.begin(); | ||
| 89 | i != mRule.end(); i++ ) | ||
| 90 | { | ||
| 91 | (*i).second->debug(); | ||
| 92 | } | ||
| 93 | |||
| 94 | printf("Variables:\n"); | ||
| 95 | for( varmap::iterator i = mVar.begin(); i != mVar.end(); i++ ) | ||
| 96 | { | ||
| 97 | printf(" %s = \"%s\"\n", (*i).first.c_str(), (*i).second.c_str() ); | ||
| 98 | } | ||
| 99 | |||
| 100 | printf("Variables (by context):\n"); | ||
| 101 | for( std::map<std::string, varmap>::iterator j = mContVar.begin(); | ||
| 102 | j != mContVar.end(); j++ ) | ||
| 103 | { | ||
| 104 | printf(" %s:\n", (*j).first.c_str() ); | ||
| 105 | for( varmap::iterator i = (*j).second.begin(); | ||
| 106 | i != (*j).second.end(); i++ ) | ||
| 107 | { | ||
| 108 | printf(" %s = \"%s\"\n", | ||
| 109 | (*i).first.c_str(), (*i).second.c_str() ); | ||
| 110 | } | ||
| 111 | } | ||
| 112 | |||
| 113 | printf("Additional dependancies:\n"); | ||
| 114 | for( std::map<std::string, std::list<std::string> *>::iterator i = | ||
| 115 | mRequires.begin(); i != mRequires.end(); i++ ) | ||
| 116 | { | ||
| 117 | printf(" %s: ", (*i).first.c_str() ); | ||
| 118 | std::list<std::string> *pList = (*i).second; | ||
| 119 | for( std::list<std::string>::iterator j = pList->begin(); | ||
| 120 | j != pList->end(); j++ ) | ||
| 121 | { | ||
| 122 | if( j != pList->begin() ) | ||
| 123 | printf(", "); | ||
| 124 | printf("%s", (*j).c_str() ); | ||
| 125 | } | ||
| 126 | printf("\n"); | ||
| 127 | } | ||
| 128 | } | ||
| 129 | |||
| 130 | void Builder::checkVar( const char *cont, const char *sName ) | ||
| 131 | { | ||
| 132 | if( cont[0] != '\0' ) | ||
| 133 | { | ||
| 134 | varmap &mmVar = mContVar[cont]; | ||
| 135 | if( mmVar.find( sName ) == mmVar.end() ) | ||
| 136 | { | ||
| 137 | checkVar( "", sName ); | ||
| 138 | mmVar[sName] = mVar[sName]; | ||
| 139 | } | ||
| 140 | } | ||
| 141 | else | ||
| 142 | { | ||
| 143 | if( mVar.find( sName ) == mVar.end() ) | ||
| 144 | { | ||
| 145 | char *env = getenv( sName ); | ||
| 146 | if( env ) | ||
| 147 | mVar[sName] = env; | ||
| 148 | else | ||
| 149 | mVar[sName] = ""; | ||
| 150 | } | ||
| 151 | } | ||
| 152 | } | ||
| 153 | |||
| 154 | void Builder::varSet( const char *sName, const char *sValue ) | ||
| 155 | { | ||
| 156 | checkVar( sContext, sName ); | ||
| 157 | |||
| 158 | if( sContext[0] == '\0' ) | ||
| 159 | { | ||
| 160 | mVar[sName] = sValue; | ||
| 161 | } | ||
| 162 | else | ||
| 163 | { | ||
| 164 | mContVar[sContext.getString()][sName] = sValue; | ||
| 165 | } | ||
| 166 | } | ||
| 167 | |||
| 168 | void Builder::varAddSet( const char *sName, const char *sValue ) | ||
| 169 | { | ||
| 170 | checkVar( sContext, sName ); | ||
| 171 | |||
| 172 | if( sContext[0] == '\0' ) | ||
| 173 | { | ||
| 174 | std::string s = mVar[sName]; | ||
| 175 | s += " "; | ||
| 176 | s += sValue; | ||
| 177 | mVar[sName] = s; | ||
| 178 | } | ||
| 179 | else | ||
| 180 | { | ||
| 181 | std::string s = mContVar[sContext.getString()][sName]; | ||
| 182 | s += " "; | ||
| 183 | s += sValue; | ||
| 184 | mContVar[sContext.getString()][sName] = s; | ||
| 185 | } | ||
| 186 | } | ||
| 187 | |||
| 188 | void Builder::requires( const char *sBase, const char *sReq ) | ||
| 189 | { | ||
| 190 | std::list<std::string> *pList = NULL; | ||
| 191 | if( mRequires.find(sBase) == mRequires.end() ) | ||
| 192 | { | ||
| 193 | pList = new std::list<std::string>; | ||
| 194 | mRequires[sBase] = pList; | ||
| 195 | } | ||
| 196 | else | ||
| 197 | { | ||
| 198 | pList = mRequires[sBase]; | ||
| 199 | } | ||
| 200 | |||
| 201 | pList->push_back( sReq ); | ||
| 202 | } | ||
| 203 | |||
| 204 | void Builder::setContext( const char *sCont ) | ||
| 205 | { | ||
| 206 | sContext = sCont; | ||
| 207 | } | ||
| 208 | |||
| 209 | void Builder::setContext() | ||
| 210 | { | ||
| 211 | setContext(""); | ||
| 62 | } | 212 | } |
| 63 | 213 | ||
