11 : node(NULL), head(NULL)
15 Project::Project ( const string
& filename
)
16 : xmlfile(filename
), node(NULL
), head(NULL
)
24 for ( i
= 0; i
< modules
.size (); i
++ )
26 for ( i
= 0; i
< includes
.size(); i
++ )
28 for ( i
= 0; i
< defines
.size(); i
++ )
30 for ( i
= 0; i
< properties
.size(); i
++ )
32 for ( i
= 0; i
< ifs
.size(); i
++ )
41 head
= XMLLoadFile ( xmlfile
, path
);
43 for ( size_t i
= 0; i
< head
->subElements
.size(); i
++ )
45 if ( head
->subElements
[i
]->name
== "project" )
47 node
= head
->subElements
[i
];
48 this->ProcessXML ( "." );
53 throw InvalidBuildFileException (
55 "Document contains no 'project' tag." );
59 Project::ProcessXML ( const string
& path
)
61 const XMLAttribute
*att
;
62 if ( node
->name
!= "project" )
63 throw Exception ( "internal tool error: Project::ProcessXML() called with non-<project> node" );
65 att
= node
->GetAttribute ( "name", false );
71 att
= node
->GetAttribute ( "makefile", true );
73 makefile
= att
->value
;
76 for ( i
= 0; i
< node
->subElements
.size(); i
++ )
77 ProcessXMLSubElement ( *node
->subElements
[i
], path
);
78 for ( i
= 0; i
< modules
.size(); i
++ )
79 modules
[i
]->ProcessXML();
80 for ( i
= 0; i
< includes
.size(); i
++ )
81 includes
[i
]->ProcessXML();
82 for ( i
= 0; i
< defines
.size(); i
++ )
83 defines
[i
]->ProcessXML();
84 for ( i
= 0; i
< properties
.size(); i
++ )
85 properties
[i
]->ProcessXML();
86 for ( i
= 0; i
< ifs
.size(); i
++ )
91 Project::ProcessXMLSubElement ( const XMLElement
& e
,
95 bool subs_invalid
= false;
97 if ( e
.name
== "module" )
99 Module
* module
= new Module ( *this, e
, path
);
100 if ( LocateModule ( module
->name
) )
101 throw InvalidBuildFileException (
103 "module name conflict: '%s' (originally defined at %s)",
104 module
->name
.c_str(),
105 module
->node
.location
.c_str() );
106 modules
.push_back ( module
);
107 return; // defer processing until later
109 else if ( e
.name
== "directory" )
111 const XMLAttribute
* att
= e
.GetAttribute ( "name", true );
113 subpath
= path
+ CSEP
+ att
->value
;
115 else if ( e
.name
== "include" )
117 includes
.push_back ( new Include ( *this, e
) );
120 else if ( e
.name
== "define" )
122 Define
* define
= new Define ( *this, e
);
124 pIf
->defines
.push_back ( define
);
126 defines
.push_back ( define
);
129 else if ( e
.name
== "if" )
132 pIf
= new If ( e
, *this, NULL
);
134 pOldIf
->ifs
.push_back ( pIf
);
136 ifs
.push_back ( pIf
);
137 subs_invalid
= false;
139 else if ( e
.name
== "property" )
141 Property
* property
= new Property ( e
, *this, NULL
);
143 pIf
->properties
.push_back ( property
);
145 properties
.push_back ( property
);
147 if ( subs_invalid
&& e
.subElements
.size() )
148 throw InvalidBuildFileException (
150 "<%s> cannot have sub-elements",
152 for ( size_t i
= 0; i
< e
.subElements
.size (); i
++ )
153 ProcessXMLSubElement ( *e
.subElements
[i
], subpath
, pIf
);
157 Project::LocateModule ( const string
& name
)
159 for ( size_t i
= 0; i
< modules
.size (); i
++ )
161 if (modules
[i
]->name
== name
)
169 Project::LocateModule ( const string
& name
) const
171 for ( size_t i
= 0; i
< modules
.size (); i
++ )
173 if (modules
[i
]->name
== name
)