aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2007-04-24 14:09:50 +0000
committerMike Buland <eichlan@xagasoft.com>2007-04-24 14:09:50 +0000
commitff938b977db21378a1f016f65e7345c50e71ef8f (patch)
tree0f05b9b5b5ea13ce234cdd27e1eb8ccbccb2dc51
parentbe41caa5ca6756c7809cabaf6d8bee321928c45a (diff)
downloadbuild-ff938b977db21378a1f016f65e7345c50e71ef8f.tar.gz
build-ff938b977db21378a1f016f65e7345c50e71ef8f.tar.bz2
build-ff938b977db21378a1f016f65e7345c50e71ef8f.tar.xz
build-ff938b977db21378a1f016f65e7345c50e71ef8f.zip
Half way there on the road to implementing basic group functionality. You can
create groups, you can't do anything with them yet (although the syntax is supported already.)
-rw-r--r--build.conf1
-rw-r--r--src/build.cpp23
-rw-r--r--src/build.h4
-rw-r--r--src/build.l1
-rw-r--r--src/build.y7
-rw-r--r--src/buildparser.cpp11
-rw-r--r--src/buildparser.h2
7 files changed, 49 insertions, 0 deletions
diff --git a/build.conf b/build.conf
index 6da97e2..01ef6b6 100644
--- a/build.conf
+++ b/build.conf
@@ -10,6 +10,7 @@ set "LDFLAGS" += "-Llibbu++ -lbu++ -ldl"
10"build": 10"build":
11 rule "exe", 11 rule "exe",
12 target file, 12 target file,
13 group "program",
13 requires "libbu++/libbu++.a", 14 requires "libbu++/libbu++.a",
14 set "CXXFLAGS" += "-Ilibbu++/src", 15 set "CXXFLAGS" += "-Ilibbu++/src",
15 input filesIn("src") filter regexp(".*\\.(cpp|y|l)$") 16 input filesIn("src") filter regexp(".*\\.(cpp|y|l)$")
diff --git a/src/build.cpp b/src/build.cpp
index 889efa4..db14750 100644
--- a/src/build.cpp
+++ b/src/build.cpp
@@ -289,6 +289,19 @@ void Build::debugDump()
289 } 289 }
290 printf("\n"); 290 printf("\n");
291 } 291 }
292
293 printf("Groups:\n");
294 for( GroupMap::iterator i = mGroup.begin(); i != mGroup.end(); i++ )
295 {
296 printf(" %s: ", (*i).first.c_str() );
297 for( TargetList::iterator j = (*i).second.begin();
298 j != (*i).second.end(); j++ )
299 {
300 if( j != (*i).second.begin() ) printf(", ");
301 printf("%s", (*j)->getName().c_str() );
302 }
303 printf("\n");
304 }
292} 305}
293 306
294RuleList Build::findChainRules( Rule *pHead ) 307RuleList Build::findChainRules( Rule *pHead )
@@ -387,3 +400,13 @@ void Build::setMode( Action::eAction nAct )
387 } 400 }
388} 401}
389 402
403void Build::addToGroup( const std::string &sGroup, Target *pTarget )
404{
405 if( mGroup.find( sGroup ) == mGroup.end() )
406 {
407 mGroup[sGroup] = TargetList();
408 }
409
410 mGroup[sGroup].push_back( pTarget );
411}
412
diff --git a/src/build.h b/src/build.h
index dd8c11b..768d211 100644
--- a/src/build.h
+++ b/src/build.h
@@ -22,6 +22,8 @@ typedef std::map<std::string, VarMap> ContextMap;
22typedef std::map<std::string, Rule *> RuleMap; 22typedef std::map<std::string, Rule *> RuleMap;
23typedef std::list<Rule *> RuleList; 23typedef std::list<Rule *> RuleList;
24typedef std::map<std::string, Action *> ActionMap; 24typedef std::map<std::string, Action *> ActionMap;
25typedef std::list<Target *> TargetList;
26typedef std::map<std::string, TargetList> GroupMap;
25 27
26class Viewer; 28class Viewer;
27 29
@@ -43,6 +45,7 @@ public:
43 void addRequires( const std::string &who, const std::string &what ); 45 void addRequires( const std::string &who, const std::string &what );
44 void addRule( Rule *pRule ); 46 void addRule( Rule *pRule );
45 void addAction( Action *pAction ); 47 void addAction( Action *pAction );
48 void addToGroup( const std::string &sGroup, Target *pTarget );
46 49
47 void set( const std::string &cont, const std::string &var, const std::string &val ); 50 void set( const std::string &cont, const std::string &var, const std::string &val );
48 void setAdd( const std::string &cont, const std::string &var, const std::string &val ); 51 void setAdd( const std::string &cont, const std::string &var, const std::string &val );
@@ -92,6 +95,7 @@ private:
92 Cache cRequires; 95 Cache cRequires;
93 bool bCacheUpdated; 96 bool bCacheUpdated;
94 std::string sCacheName; 97 std::string sCacheName;
98 GroupMap mGroup;
95 99
96 //std::map<std::string, Rule *> mRule; 100 //std::map<std::string, Rule *> mRule;
97 //Action *pActDefault; 101 //Action *pActDefault;
diff --git a/src/build.l b/src/build.l
index 15c4003..5b69177 100644
--- a/src/build.l
+++ b/src/build.l
@@ -36,6 +36,7 @@ std::string strbuf;
36"filter" return TOK_FILTER; 36"filter" return TOK_FILTER;
37"prefix" return TOK_PREFIX; 37"prefix" return TOK_PREFIX;
38"aggregate" return TOK_AGGREGATE; 38"aggregate" return TOK_AGGREGATE;
39"group" return TOK_GROUP;
39 40
40\n+ { 41\n+ {
41 yylloc->last_line += yyleng; 42 yylloc->last_line += yyleng;
diff --git a/src/build.y b/src/build.y
index 0853bd9..bfda4b4 100644
--- a/src/build.y
+++ b/src/build.y
@@ -40,6 +40,7 @@ void yyerror( YYLTYPE *locp, BuildParser &bld, char const *msg );
40%token TOK_PERFORM "perform" 40%token TOK_PERFORM "perform"
41%token TOK_PRODUCES "produces" 41%token TOK_PRODUCES "produces"
42%token TOK_AGGREGATE "aggregate" 42%token TOK_AGGREGATE "aggregate"
43%token TOK_GROUP "group"
43 44
44%token ',' ':' '=' '(' ')' 45%token ',' ':' '=' '(' ')'
45 46
@@ -123,6 +124,8 @@ actioncmd: TOK_CHECK list
123 { 124 {
124 bld.addCommand( Action::actClean ); 125 bld.addCommand( Action::actClean );
125 } 126 }
127 | TOK_CHECK TOK_GROUP STRING
128 | TOK_CLEAN TOK_GROUP STRING
126 ; 129 ;
127 130
128// Target interpretation 131// Target interpretation
@@ -158,6 +161,10 @@ targetcmd: TOK_RULE STRING
158 bld.addTargetRequires(); 161 bld.addTargetRequires();
159 } 162 }
160 | TOK_SET targetset 163 | TOK_SET targetset
164 | TOK_GROUP STRING
165 {
166 bld.addTargetGroup( $2 );
167 }
161 ; 168 ;
162 169
163targetset: STRING '=' STRING 170targetset: STRING '=' STRING
diff --git a/src/buildparser.cpp b/src/buildparser.cpp
index 1c4f041..364aaa5 100644
--- a/src/buildparser.cpp
+++ b/src/buildparser.cpp
@@ -83,6 +83,11 @@ void BuildParser::addTargetSet( const char *sVar, const char *sVal, int nHow )
83 lTargetTmp.back().second.lVar.push_back( SetVar( sVar, sVal, nHow ) ); 83 lTargetTmp.back().second.lVar.push_back( SetVar( sVar, sVal, nHow ) );
84} 84}
85 85
86void BuildParser::addTargetGroup( const char *sGroup )
87{
88 lTargetTmp.back().second.lGroups.push_back( sGroup );
89}
90
86// 91//
87// Function functions 92// Function functions
88// 93//
@@ -458,6 +463,12 @@ Build *BuildParser::genBuild()
458 ); 463 );
459 464
460 bld->addTarget( pTarget ); 465 bld->addTarget( pTarget );
466
467 for( StringList::iterator c = (*i).second.lGroups.begin();
468 c != (*i).second.lGroups.end(); c++ )
469 {
470 bld->addToGroup( *c, pTarget );
471 }
461 } 472 }
462 StringList lReqs = buildToStringList( 473 StringList lReqs = buildToStringList(
463 (*i).second.lRequires, StringList() 474 (*i).second.lRequires, StringList()
diff --git a/src/buildparser.h b/src/buildparser.h
index 13c523c..fd988c6 100644
--- a/src/buildparser.h
+++ b/src/buildparser.h
@@ -77,6 +77,7 @@ public: // Target functions
77 void addTargetInput(); 77 void addTargetInput();
78 void addTargetRequires(); 78 void addTargetRequires();
79 void addTargetSet( const char *sVar, const char *sVal, int nHow ); 79 void addTargetSet( const char *sVar, const char *sVal, int nHow );
80 void addTargetGroup( const char *sGroup );
80 81
81private: // Target variables 82private: // Target variables
82 TargetFactory &fTarget; 83 TargetFactory &fTarget;
@@ -88,6 +89,7 @@ private: // Target variables
88 std::string sType; 89 std::string sType;
89 BuildList lInput; 90 BuildList lInput;
90 BuildList lRequires; 91 BuildList lRequires;
92 StringList lGroups;
91 SetVarList lVar; 93 SetVarList lVar;
92 }; 94 };
93 typedef std::pair<BuildList,TargetInfo> TargetTmp; 95 typedef std::pair<BuildList,TargetInfo> TargetTmp;