<include> now has attribute 'base' which allows to specify subdirectory of another module

svn path=/branches/xmlbuildsystem/; revision=12880
This commit is contained in:
Royce Mitchell III 2005-01-08 04:33:01 +00:00
parent 774f167e5e
commit aead7a68f9
10 changed files with 67 additions and 23 deletions

View file

@ -1,4 +1,6 @@
<project name="ReactOS" makefile="Makefile.auto"> <?xml version="1.0"?>
<!DOCTYPE project SYSTEM "tools/rbuild/project.dtd">
<project name="ReactOS" makefile="Makefile.auto" xmlns:xi="http://www.w3.org/2001/XInclude">
<define name="_M_IX86"></define> <define name="_M_IX86"></define>
<include>include</include> <include>include</include>
<include>w32api/include</include> <include>w32api/include</include>

View file

@ -1,7 +1,7 @@
<module name="kjs" type="staticlibrary"> <module name="kjs" type="staticlibrary">
<include>.</include> <include base="kjs">.</include>
<include>src</include> <include base="kjs">src</include>
<include>include</include> <include base="kjs">include</include>
<directory name="ksrc"> <directory name="ksrc">
<file>setjmp.S</file> <file>setjmp.S</file>
<file>longjmp.S</file> <file>longjmp.S</file>

View file

@ -4,8 +4,7 @@
<define name="__NTOSKRNL__" /> <define name="__NTOSKRNL__" />
<define name="__3GB__" /> <define name="__3GB__" />
<include>.</include> <include>.</include>
<include>./include</include> <include base="kjs">./include</include>
<include>../lib/kjs/include</include>
<library>kjs</library> <library>kjs</library>
<directory name="cc"> <directory name="cc">
<file>cacheman.c</file> <file>cacheman.c</file>

View file

@ -140,8 +140,7 @@ MingwModuleHandler::ConcatenatePaths ( const string& path1,
} }
string string
MingwModuleHandler::GenerateGccIncludeParametersFromVector ( const string& basePath, MingwModuleHandler::GenerateGccIncludeParametersFromVector ( const vector<Include*>& includes ) const
const vector<Include*>& includes ) const
{ {
string parameters; string parameters;
for (size_t i = 0; i < includes.size (); i++) for (size_t i = 0; i < includes.size (); i++)
@ -149,9 +148,7 @@ MingwModuleHandler::GenerateGccIncludeParametersFromVector ( const string& baseP
Include& include = *includes[i]; Include& include = *includes[i];
if (parameters.length () > 0) if (parameters.length () > 0)
parameters += " "; parameters += " ";
parameters += "-I"; parameters += "-I" + include.directory;
parameters += ConcatenatePaths ( basePath,
include.directory );
} }
return parameters; return parameters;
} }
@ -159,10 +156,8 @@ MingwModuleHandler::GenerateGccIncludeParametersFromVector ( const string& baseP
string string
MingwModuleHandler::GenerateGccIncludeParameters ( const Module& module ) const MingwModuleHandler::GenerateGccIncludeParameters ( const Module& module ) const
{ {
string parameters = GenerateGccIncludeParametersFromVector ( ".", string parameters = GenerateGccIncludeParametersFromVector ( module.project.includes );
module.project.includes ); string s = GenerateGccIncludeParametersFromVector ( module.includes );
string s = GenerateGccIncludeParametersFromVector ( module.path,
module.includes );
if (s.length () > 0) if (s.length () > 0)
{ {
parameters += " "; parameters += " ";

View file

@ -26,8 +26,7 @@ private:
const std::string& path2 ) const; const std::string& path2 ) const;
std::string GenerateGccDefineParametersFromVector ( const std::vector<Define*>& defines ) const; std::string GenerateGccDefineParametersFromVector ( const std::vector<Define*>& defines ) const;
std::string GenerateGccDefineParameters ( const Module& module ) const; std::string GenerateGccDefineParameters ( const Module& module ) const;
std::string GenerateGccIncludeParametersFromVector ( const std::string& basePath, std::string GenerateGccIncludeParametersFromVector ( const std::vector<Include*>& includes ) const;
const std::vector<Include*>& includes ) const;
std::string GenerateGccIncludeParameters ( const Module& module ) const; std::string GenerateGccIncludeParameters ( const Module& module ) const;
std::string GenerateGccParameters ( const Module& module ) const; std::string GenerateGccParameters ( const Module& module ) const;
}; };

View file

@ -10,7 +10,8 @@ Include::Include ( const Project& project_,
const XMLElement& includeNode ) const XMLElement& includeNode )
: project(project_), : project(project_),
module(NULL), module(NULL),
node(includeNode) node(includeNode),
base(NULL)
{ {
Initialize(); Initialize();
} }
@ -20,7 +21,8 @@ Include::Include ( const Project& project_,
const XMLElement& includeNode ) const XMLElement& includeNode )
: project(project_), : project(project_),
module(module_), module(module_),
node(includeNode) node(includeNode),
base(NULL)
{ {
Initialize(); Initialize();
} }
@ -32,10 +34,27 @@ Include::~Include ()
void void
Include::Initialize() Include::Initialize()
{ {
directory = FixSeparator ( node.value );
} }
void void
Include::ProcessXML() Include::ProcessXML()
{ {
const XMLAttribute* att;
att = node.GetAttribute("base",false);
if ( att )
{
if ( !module )
throw InvalidBuildFileException (
node.location,
"'base' attribute illegal from global <include>" );
base = project.LocateModule ( att->value );
if ( !base )
throw InvalidBuildFileException (
node.location,
"<include> attribute 'base' references non-existant module '%s'",
att->value.c_str() );
directory = FixSeparator ( base->GetBasePath() + "/" + node.value );
}
else
directory = FixSeparator ( node.value );
} }

View file

@ -62,8 +62,14 @@ Module::ProcessXML()
size_t i; size_t i;
for ( i = 0; i < node.subElements.size(); i++ ) for ( i = 0; i < node.subElements.size(); i++ )
ProcessXMLSubElement ( *node.subElements[i], path ); ProcessXMLSubElement ( *node.subElements[i], path );
for ( i = 0; i < files.size(); i++ )
files[i]->ProcessXML();
for ( i = 0; i < libraries.size(); i++ ) for ( i = 0; i < libraries.size(); i++ )
libraries[i]->ProcessXML(); libraries[i]->ProcessXML();
for ( i = 0; i < includes.size(); i++ )
includes[i]->ProcessXML();
for ( i = 0; i < defines.size(); i++ )
defines[i]->ProcessXML();
} }
void void
@ -136,10 +142,16 @@ Module::GetDefaultModuleExtension () const
__LINE__); __LINE__);
} }
string
Module::GetBasePath() const
{
return path;
}
string string
Module::GetPath () const Module::GetPath () const
{ {
return FixSeparator (path) + CSEP + name + extension; return path + CSEP + name + extension;
} }
@ -148,6 +160,10 @@ File::File ( const string& _name )
{ {
} }
void
File::ProcessXML()
{
}
Library::Library ( const XMLElement& _node, Library::Library ( const XMLElement& _node,
const Module& _module, const Module& _module,

View file

@ -79,6 +79,7 @@ public:
const std::string& modulePath ); const std::string& modulePath );
~Module (); ~Module ();
ModuleType GetModuleType (const XMLAttribute& attribute ); ModuleType GetModuleType (const XMLAttribute& attribute );
std::string GetBasePath() const;
std::string GetPath () const; std::string GetPath () const;
void ProcessXML(); void ProcessXML();
private: private:
@ -95,6 +96,7 @@ public:
const Module* module; const Module* module;
const XMLElement& node; const XMLElement& node;
std::string directory; std::string directory;
const Module* base;
Include ( const Project& project, Include ( const Project& project,
const XMLElement& includeNode ); const XMLElement& includeNode );
@ -135,6 +137,8 @@ public:
std::string name; std::string name;
File ( const std::string& _name ); File ( const std::string& _name );
void ProcessXML();
}; };

View file

@ -6,4 +6,9 @@
<include>include2</include> <include>include2</include>
</module> </module>
</directory> </directory>
<directory name="dir2">
<module name="module2" type="buildtool">
<include base="module1">include3</include>
</module>
</directory>
</project> </project>

View file

@ -10,10 +10,15 @@ void IncludeTest::Run()
Include& include1 = *project.includes[0]; Include& include1 = *project.includes[0];
ARE_EQUAL("include1", include1.directory); ARE_EQUAL("include1", include1.directory);
ARE_EQUAL(1, project.modules.size()); ARE_EQUAL(2, project.modules.size());
Module& module1 = *project.modules[0]; Module& module1 = *project.modules[0];
Module& module2 = *project.modules[1];
ARE_EQUAL(1, module1.includes.size()); ARE_EQUAL(1, module1.includes.size());
Include& include2 = *module1.includes[0]; Include& include2 = *module1.includes[0];
ARE_EQUAL("include2", include2.directory); ARE_EQUAL("include2", include2.directory);
ARE_EQUAL(1, module2.includes.size());
Include& include3 = *module2.includes[0];
ARE_EQUAL(FixSeparator("./dir1/include3"), include3.directory);
} }