Include and define support.

svn path=/branches/xmlbuildsystem/; revision=12876
This commit is contained in:
Casper Hornstrup 2005-01-07 21:46:18 +00:00
parent 679e6f6c09
commit 49a2dd8017
16 changed files with 334 additions and 13 deletions

View file

@ -1,4 +1,7 @@
<project name="ReactOS" makefile="Makefile.auto"> <project name="ReactOS" makefile="Makefile.auto">
<define name="_M_IX86"></define>
<include>./include</include>
<include>./w32api/include</include>
<directory name="tools"> <directory name="tools">
<module name="depends" type="buildtool"> <module name="depends" type="buildtool">
<file>depends.c</file> <file>depends.c</file>

View file

@ -1,4 +1,9 @@
<module name="ntoskrnl" type="kernelmodedll"> <module name="ntoskrnl" type="kernelmodedll">
<define name="_SEH_NO_NATIVE_NLG"></define>
<define name="_DISABLE_TIDENTS"></define>
<define name="__NTOSKRNL__"></define>
<define name="__3GB__"></define>
<include>.</include>
<include>./include</include> <include>./include</include>
<include>../lib/kjs/include</include> <include>../lib/kjs/include</include>
<library>kjs</library> <library>kjs</library>
@ -7,7 +12,6 @@
<file>copy.c</file> <file>copy.c</file>
<file>fs.c</file> <file>fs.c</file>
<file>mdl.c</file> <file>mdl.c</file>
<file>misc.c</file>
<file>pin.c</file> <file>pin.c</file>
<file>view.c</file> <file>view.c</file>
</directory> </directory>
@ -35,8 +39,8 @@
<file>kdb.c</file> <file>kdb.c</file>
<file>kdb_keyboard.c</file> <file>kdb_keyboard.c</file>
<file>kdb_serial.c</file> <file>kdb_serial.c</file>
<file>profile.c</file>
<file>rdebug.c</file> <file>rdebug.c</file>
<file>profile.c</file>
</group> </group>
</if> </if>
<or> <or>
@ -53,10 +57,10 @@
</group> </group>
</if> </if>
</or> </or>
<file>user.c</file>
<file>dbgctrl.c</file> <file>dbgctrl.c</file>
<file>errinfo.c</file> <file>errinfo.c</file>
<file>print.c</file> <file>print.c</file>
<file>user.c</file>
</directory> </directory>
<directory name="ex"> <directory name="ex">
<if property="arch" value="i386"> <if property="arch" value="i386">
@ -100,10 +104,6 @@
<file>util.c</file> <file>util.c</file>
</directory> </directory>
<directory name="inbv"> <directory name="inbv">
<if property="arch" value="i386">
<directory name="i386">
</directory>
</if>
<file>inbv.c</file> <file>inbv.c</file>
</directory> </directory>
<directory name="io"> <directory name="io">
@ -177,8 +177,7 @@
<file>i386-mcount.S</file> <file>i386-mcount.S</file>
<file>idt.c</file> <file>idt.c</file>
<file>irq.c</file> <file>irq.c</file>
<file>irqhand.S</file> <file>irqhand.s</file>
<file>kernel.c</file>
<file>kernel.c</file> <file>kernel.c</file>
<file>ldt.c</file> <file>ldt.c</file>
<file>multiboot.S</file> <file>multiboot.S</file>
@ -251,6 +250,9 @@
<file>balance.c</file> <file>balance.c</file>
<file>cont.c</file> <file>cont.c</file>
<file>drvlck.c</file> <file>drvlck.c</file>
<file>elf32.c</file>
<file>elf64.c</file>
<file>elf.c</file>
<file>freelist.c</file> <file>freelist.c</file>
<file>iospace.c</file> <file>iospace.c</file>
<file>kmap.c</file> <file>kmap.c</file>
@ -266,6 +268,7 @@
<file>pager.c</file> <file>pager.c</file>
<file>pagfault.c</file> <file>pagfault.c</file>
<file>paging.c</file> <file>paging.c</file>
<file>pe.c</file>
<file>physical.c</file> <file>physical.c</file>
<file>pool.c</file> <file>pool.c</file>
<file>ppool.c</file> <file>ppool.c</file>

View file

@ -7,6 +7,7 @@
#include "modulehandler.h" #include "modulehandler.h"
using std::string; using std::string;
using std::vector;
MingwModuleHandler::MingwModuleHandler ( FILE* fMakefile ) MingwModuleHandler::MingwModuleHandler ( FILE* fMakefile )
: fMakefile ( fMakefile ) : fMakefile ( fMakefile )
@ -93,6 +94,80 @@ MingwModuleHandler::GetObjectFilenames ( Module& module )
return objectFilenames; return objectFilenames;
} }
string
MingwModuleHandler::GenerateGccDefineParametersFromVector ( vector<Define*> defines )
{
string parameters;
for (size_t i = 0; i < defines.size (); i++)
{
Define& define = *defines[i];
if (parameters.length () > 0)
parameters += " ";
parameters += "-D";
parameters += define.name;
if (define.value.length () > 0)
{
parameters += "=";
parameters += define.value;
}
}
return parameters;
}
string
MingwModuleHandler::GenerateGccDefineParameters ( Module& module )
{
string parameters = GenerateGccDefineParametersFromVector ( module.project->defines );
string s = GenerateGccDefineParametersFromVector ( module.defines );
if (s.length () > 0)
{
parameters += " ";
parameters += s;
}
return parameters;
}
string
MingwModuleHandler::GenerateGccIncludeParametersFromVector ( vector<Include*> includes )
{
string parameters;
for (size_t i = 0; i < includes.size (); i++)
{
Include& include = *includes[i];
if (parameters.length () > 0)
parameters += " ";
parameters += "-I";
parameters += include.directory;
}
return parameters;
}
string
MingwModuleHandler::GenerateGccIncludeParameters ( Module& module )
{
string parameters = GenerateGccIncludeParametersFromVector ( module.project->includes );
string s = GenerateGccIncludeParametersFromVector ( module.includes );
if (s.length () > 0)
{
parameters += " ";
parameters += s;
}
return parameters;
}
string
MingwModuleHandler::GenerateGccParameters ( Module& module )
{
string parameters = GenerateGccDefineParameters ( module );
string s = GenerateGccIncludeParameters ( module );
if (s.length () > 0)
{
parameters += " ";
parameters += s;
}
return parameters;
}
void void
MingwModuleHandler::GenerateObjectFileTargets ( Module& module ) MingwModuleHandler::GenerateObjectFileTargets ( Module& module )
{ {
@ -108,9 +183,10 @@ MingwModuleHandler::GenerateObjectFileTargets ( Module& module )
objectFilename.c_str (), objectFilename.c_str (),
sourceFilename.c_str() ); sourceFilename.c_str() );
fprintf ( fMakefile, fprintf ( fMakefile,
"\t${gcc} -c %s -o %s\n", "\t${gcc} -c %s -o %s %s\n",
sourceFilename.c_str (), sourceFilename.c_str (),
objectFilename.c_str () ); objectFilename.c_str (),
GenerateGccParameters ( module ).c_str () );
} }
fprintf ( fMakefile, "\n" ); fprintf ( fMakefile, "\n" );

View file

@ -21,6 +21,12 @@ protected:
void GenerateObjectFileTargets ( Module& module ); void GenerateObjectFileTargets ( Module& module );
void GenerateArchiveTarget ( Module& module ); void GenerateArchiveTarget ( Module& module );
FILE* fMakefile; FILE* fMakefile;
private:
std::string GenerateGccDefineParametersFromVector ( std::vector<Define*> defines );
std::string GenerateGccDefineParameters ( Module& module );
std::string GenerateGccIncludeParametersFromVector ( std::vector<Include*> includes );
std::string GenerateGccIncludeParameters ( Module& module );
std::string GenerateGccParameters ( Module& module );
}; };

View file

@ -0,0 +1,44 @@
#include "pch.h"
#include <assert.h>
#include "rbuild.h"
using std::string;
using std::vector;
Define::Define ( Project* project,
const XMLElement& defineNode )
: project(project),
module(NULL),
node(defineNode)
{
Initialize (defineNode);
}
Define::Define ( Project* project,
Module* module,
const XMLElement& defineNode )
: project(project),
module(module),
node(defineNode)
{
Initialize (defineNode);
}
Define::~Define ()
{
}
void
Define::Initialize ( const XMLElement& defineNode )
{
const XMLAttribute* att = defineNode.GetAttribute ( "name", true );
assert(att);
name = att->value;
value = defineNode.value;
}
void
Define::ProcessXML ( const XMLElement& e )
{
}

View file

@ -0,0 +1,39 @@
#include "pch.h"
#include <assert.h>
#include "rbuild.h"
using std::string;
using std::vector;
Include::Include ( Project* project,
const XMLElement& includeNode )
: project(project),
node(includeNode)
{
Initialize ( includeNode );
}
Include::Include ( Project* project,
Module* module,
const XMLElement& includeNode )
: project(project),
node(includeNode)
{
Initialize ( includeNode );
}
Include::~Include ()
{
}
void
Include::Initialize ( const XMLElement& includeNode )
{
directory = includeNode.value;
}
void
Include::ProcessXML ( const XMLElement& e )
{
}

View file

@ -14,7 +14,9 @@ BACKEND_BASE_OBJECTS = \
BASE_OBJECTS = \ BASE_OBJECTS = \
$(BACKEND_BASE_OBJECTS) \ $(BACKEND_BASE_OBJECTS) \
define.o \
exception.o \ exception.o \
include.o \
module.o \ module.o \
project.o \ project.o \
ssprintf.o \ ssprintf.o \
@ -23,6 +25,8 @@ BASE_OBJECTS = \
OBJECTS = $(BASE_OBJECTS) rbuild.o OBJECTS = $(BASE_OBJECTS) rbuild.o
TESTS = \ TESTS = \
tests/definetest.o \
tests/includetest.o \
tests/moduletest.o \ tests/moduletest.o \
tests/projecttest.o tests/projecttest.o

View file

@ -61,6 +61,18 @@ Module::ProcessXML ( const XMLElement& e,
assert(att); assert(att);
subpath = path + CSEP + att->value; subpath = path + CSEP + att->value;
} }
else if ( e.name == "include" )
{
Include* include = new Include ( project, this, e );
includes.push_back ( include );
include->ProcessXML ( e );
}
else if ( e.name == "define" )
{
Define* define = new Define ( project, this, e );
defines.push_back ( define );
define->ProcessXML ( e );
}
for ( size_t i = 0; i < e.subElements.size (); i++ ) for ( size_t i = 0; i < e.subElements.size (); i++ )
ProcessXML ( *e.subElements[i], subpath ); ProcessXML ( *e.subElements[i], subpath );
} }

View file

@ -72,6 +72,18 @@ Project::ProcessXML ( const XMLElement& e, const string& path )
assert(att); assert(att);
subpath = path + CSEP + att->value; subpath = path + CSEP + att->value;
} }
else if ( e.name == "include" )
{
Include* include = new Include ( this, e );
includes.push_back ( include );
include->ProcessXML ( e );
}
else if ( e.name == "define" )
{
Define* define = new Define ( this, e );
defines.push_back ( define );
define->ProcessXML ( e );
}
for ( size_t i = 0; i < e.subElements.size (); i++ ) for ( size_t i = 0; i < e.subElements.size (); i++ )
ProcessXML ( *e.subElements[i], subpath ); ProcessXML ( *e.subElements[i], subpath );
} }

View file

@ -23,6 +23,8 @@
class Project; class Project;
class Module; class Module;
class Include;
class Define;
class File; class File;
class Library; class Library;
@ -32,7 +34,9 @@ public:
std::string name; std::string name;
std::string makefile; std::string makefile;
std::vector<Module*> modules; std::vector<Module*> modules;
std::vector<Include*> includes;
std::vector<Define*> defines;
Project (); Project ();
Project ( const std::string& filename ); Project ( const std::string& filename );
~Project (); ~Project ();
@ -53,6 +57,7 @@ enum ModuleType
KernelModeDLL KernelModeDLL
}; };
class Module class Module
{ {
public: public:
@ -63,18 +68,61 @@ public:
ModuleType type; ModuleType type;
std::vector<File*> files; std::vector<File*> files;
std::vector<Library*> libraries; std::vector<Library*> libraries;
std::vector<Include*> includes;
std::vector<Define*> defines;
Module ( Project* project, Module ( Project* project,
const XMLElement& moduleNode, const XMLElement& moduleNode,
const std::string& moduleName, const std::string& moduleName,
const std::string& modulePath ); const std::string& modulePath );
~Module(); ~Module ();
ModuleType GetModuleType (const XMLAttribute& attribute ); ModuleType GetModuleType (const XMLAttribute& attribute );
std::string GetPath (); std::string GetPath ();
void ProcessXML ( const XMLElement& e, const std::string& path ); void ProcessXML ( const XMLElement& e, const std::string& path );
}; };
class Include
{
public:
Project* project;
Module* module;
const XMLElement& node;
std::string directory;
Include ( Project* project,
const XMLElement& includeNode );
Include ( Project* project,
Module* module,
const XMLElement& includeNode );
~Include ();
void ProcessXML ( const XMLElement& e );
private:
void Initialize ( const XMLElement& includeNode );
};
class Define
{
public:
Project* project;
Module* module;
const XMLElement& node;
std::string name;
std::string value;
Define ( Project* project,
const XMLElement& defineNode );
Define ( Project* project,
Module* module,
const XMLElement& defineNode );
~Define();
void ProcessXML ( const XMLElement& e );
private:
void Initialize ( const XMLElement& defineNode );
};
class File class File
{ {
public: public:

View file

@ -52,4 +52,18 @@ public:
void Run(); void Run();
}; };
class DefineTest : public BaseTest
{
public:
void Run();
};
class IncludeTest : public BaseTest
{
public:
void Run();
};
#endif /* __TEST_H */ #endif /* __TEST_H */

View file

@ -147,6 +147,8 @@ private:
{ {
tests.push_back(new ProjectTest()); tests.push_back(new ProjectTest());
tests.push_back(new ModuleTest()); tests.push_back(new ModuleTest());
tests.push_back(new DefineTest());
tests.push_back(new IncludeTest());
} }
}; };

View file

@ -0,0 +1,9 @@
<?xml version="1.0" ?>
<project name="Project" makefile="Makefile">
<define name="define1">value1</define>
<directory name="dir1">
<module name="module1" type="buildtool">
<define name="define2">value2</define>
</module>
</directory>
</project>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" ?>
<project name="Project" makefile="Makefile">
<include>include1</include>
<directory name="dir1">
<module name="module1" type="buildtool">
<include>include2</include>
</module>
</directory>
</project>

View file

@ -0,0 +1,21 @@
#include "test.h"
using std::string;
void DefineTest::Run()
{
string projectFilename ( "tests/data/define.xml" );
Project project ( projectFilename );
ARE_EQUAL(1, project.defines.size());
Define& define1 = *project.defines[0];
ARE_EQUAL("define1", define1.name);
ARE_EQUAL("value1", define1.value);
ARE_EQUAL(1, project.modules.size());
Module& module1 = *project.modules[0];
ARE_EQUAL(1, module1.defines.size());
Define& define2 = *module1.defines[0];
ARE_EQUAL("define2", define2.name);
ARE_EQUAL("value2", define2.value);
}

View file

@ -0,0 +1,19 @@
#include "test.h"
using std::string;
void IncludeTest::Run()
{
string projectFilename ( "tests/data/include.xml" );
Project project ( projectFilename );
ARE_EQUAL(1, project.includes.size());
Include& include1 = *project.includes[0];
ARE_EQUAL("include1", include1.directory);
ARE_EQUAL(1, project.modules.size());
Module& module1 = *project.modules[0];
ARE_EQUAL(1, module1.includes.size());
Include& include2 = *module1.includes[0];
ARE_EQUAL("include2", include2.directory);
}