mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 14:23:18 +00:00
Include and define support.
svn path=/branches/xmlbuildsystem/; revision=12876
This commit is contained in:
parent
679e6f6c09
commit
49a2dd8017
16 changed files with 334 additions and 13 deletions
|
@ -1,4 +1,7 @@
|
|||
<project name="ReactOS" makefile="Makefile.auto">
|
||||
<define name="_M_IX86"></define>
|
||||
<include>./include</include>
|
||||
<include>./w32api/include</include>
|
||||
<directory name="tools">
|
||||
<module name="depends" type="buildtool">
|
||||
<file>depends.c</file>
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
<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>../lib/kjs/include</include>
|
||||
<library>kjs</library>
|
||||
|
@ -7,7 +12,6 @@
|
|||
<file>copy.c</file>
|
||||
<file>fs.c</file>
|
||||
<file>mdl.c</file>
|
||||
<file>misc.c</file>
|
||||
<file>pin.c</file>
|
||||
<file>view.c</file>
|
||||
</directory>
|
||||
|
@ -35,8 +39,8 @@
|
|||
<file>kdb.c</file>
|
||||
<file>kdb_keyboard.c</file>
|
||||
<file>kdb_serial.c</file>
|
||||
<file>profile.c</file>
|
||||
<file>rdebug.c</file>
|
||||
<file>profile.c</file>
|
||||
</group>
|
||||
</if>
|
||||
<or>
|
||||
|
@ -53,10 +57,10 @@
|
|||
</group>
|
||||
</if>
|
||||
</or>
|
||||
<file>user.c</file>
|
||||
<file>dbgctrl.c</file>
|
||||
<file>errinfo.c</file>
|
||||
<file>print.c</file>
|
||||
<file>user.c</file>
|
||||
</directory>
|
||||
<directory name="ex">
|
||||
<if property="arch" value="i386">
|
||||
|
@ -100,10 +104,6 @@
|
|||
<file>util.c</file>
|
||||
</directory>
|
||||
<directory name="inbv">
|
||||
<if property="arch" value="i386">
|
||||
<directory name="i386">
|
||||
</directory>
|
||||
</if>
|
||||
<file>inbv.c</file>
|
||||
</directory>
|
||||
<directory name="io">
|
||||
|
@ -177,8 +177,7 @@
|
|||
<file>i386-mcount.S</file>
|
||||
<file>idt.c</file>
|
||||
<file>irq.c</file>
|
||||
<file>irqhand.S</file>
|
||||
<file>kernel.c</file>
|
||||
<file>irqhand.s</file>
|
||||
<file>kernel.c</file>
|
||||
<file>ldt.c</file>
|
||||
<file>multiboot.S</file>
|
||||
|
@ -251,6 +250,9 @@
|
|||
<file>balance.c</file>
|
||||
<file>cont.c</file>
|
||||
<file>drvlck.c</file>
|
||||
<file>elf32.c</file>
|
||||
<file>elf64.c</file>
|
||||
<file>elf.c</file>
|
||||
<file>freelist.c</file>
|
||||
<file>iospace.c</file>
|
||||
<file>kmap.c</file>
|
||||
|
@ -266,6 +268,7 @@
|
|||
<file>pager.c</file>
|
||||
<file>pagfault.c</file>
|
||||
<file>paging.c</file>
|
||||
<file>pe.c</file>
|
||||
<file>physical.c</file>
|
||||
<file>pool.c</file>
|
||||
<file>ppool.c</file>
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "modulehandler.h"
|
||||
|
||||
using std::string;
|
||||
using std::vector;
|
||||
|
||||
MingwModuleHandler::MingwModuleHandler ( FILE* fMakefile )
|
||||
: fMakefile ( fMakefile )
|
||||
|
@ -93,6 +94,80 @@ MingwModuleHandler::GetObjectFilenames ( Module& module )
|
|||
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
|
||||
MingwModuleHandler::GenerateObjectFileTargets ( Module& module )
|
||||
{
|
||||
|
@ -108,9 +183,10 @@ MingwModuleHandler::GenerateObjectFileTargets ( Module& module )
|
|||
objectFilename.c_str (),
|
||||
sourceFilename.c_str() );
|
||||
fprintf ( fMakefile,
|
||||
"\t${gcc} -c %s -o %s\n",
|
||||
"\t${gcc} -c %s -o %s %s\n",
|
||||
sourceFilename.c_str (),
|
||||
objectFilename.c_str () );
|
||||
objectFilename.c_str (),
|
||||
GenerateGccParameters ( module ).c_str () );
|
||||
}
|
||||
|
||||
fprintf ( fMakefile, "\n" );
|
||||
|
|
|
@ -21,6 +21,12 @@ protected:
|
|||
void GenerateObjectFileTargets ( Module& module );
|
||||
void GenerateArchiveTarget ( Module& module );
|
||||
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 );
|
||||
};
|
||||
|
||||
|
||||
|
|
44
reactos/tools/rbuild/define.cpp
Normal file
44
reactos/tools/rbuild/define.cpp
Normal 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 )
|
||||
{
|
||||
}
|
39
reactos/tools/rbuild/include.cpp
Normal file
39
reactos/tools/rbuild/include.cpp
Normal 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 )
|
||||
{
|
||||
}
|
|
@ -14,7 +14,9 @@ BACKEND_BASE_OBJECTS = \
|
|||
|
||||
BASE_OBJECTS = \
|
||||
$(BACKEND_BASE_OBJECTS) \
|
||||
define.o \
|
||||
exception.o \
|
||||
include.o \
|
||||
module.o \
|
||||
project.o \
|
||||
ssprintf.o \
|
||||
|
@ -23,6 +25,8 @@ BASE_OBJECTS = \
|
|||
OBJECTS = $(BASE_OBJECTS) rbuild.o
|
||||
|
||||
TESTS = \
|
||||
tests/definetest.o \
|
||||
tests/includetest.o \
|
||||
tests/moduletest.o \
|
||||
tests/projecttest.o
|
||||
|
||||
|
|
|
@ -61,6 +61,18 @@ Module::ProcessXML ( const XMLElement& e,
|
|||
assert(att);
|
||||
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++ )
|
||||
ProcessXML ( *e.subElements[i], subpath );
|
||||
}
|
||||
|
|
|
@ -72,6 +72,18 @@ Project::ProcessXML ( const XMLElement& e, const string& path )
|
|||
assert(att);
|
||||
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++ )
|
||||
ProcessXML ( *e.subElements[i], subpath );
|
||||
}
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
class Project;
|
||||
class Module;
|
||||
class Include;
|
||||
class Define;
|
||||
class File;
|
||||
class Library;
|
||||
|
||||
|
@ -32,7 +34,9 @@ public:
|
|||
std::string name;
|
||||
std::string makefile;
|
||||
std::vector<Module*> modules;
|
||||
|
||||
std::vector<Include*> includes;
|
||||
std::vector<Define*> defines;
|
||||
|
||||
Project ();
|
||||
Project ( const std::string& filename );
|
||||
~Project ();
|
||||
|
@ -53,6 +57,7 @@ enum ModuleType
|
|||
KernelModeDLL
|
||||
};
|
||||
|
||||
|
||||
class Module
|
||||
{
|
||||
public:
|
||||
|
@ -63,18 +68,61 @@ public:
|
|||
ModuleType type;
|
||||
std::vector<File*> files;
|
||||
std::vector<Library*> libraries;
|
||||
std::vector<Include*> includes;
|
||||
std::vector<Define*> defines;
|
||||
|
||||
Module ( Project* project,
|
||||
const XMLElement& moduleNode,
|
||||
const std::string& moduleName,
|
||||
const std::string& modulePath );
|
||||
~Module();
|
||||
~Module ();
|
||||
ModuleType GetModuleType (const XMLAttribute& attribute );
|
||||
std::string GetPath ();
|
||||
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
|
||||
{
|
||||
public:
|
||||
|
|
|
@ -52,4 +52,18 @@ public:
|
|||
void Run();
|
||||
};
|
||||
|
||||
|
||||
class DefineTest : public BaseTest
|
||||
{
|
||||
public:
|
||||
void Run();
|
||||
};
|
||||
|
||||
|
||||
class IncludeTest : public BaseTest
|
||||
{
|
||||
public:
|
||||
void Run();
|
||||
};
|
||||
|
||||
#endif /* __TEST_H */
|
||||
|
|
|
@ -147,6 +147,8 @@ private:
|
|||
{
|
||||
tests.push_back(new ProjectTest());
|
||||
tests.push_back(new ModuleTest());
|
||||
tests.push_back(new DefineTest());
|
||||
tests.push_back(new IncludeTest());
|
||||
}
|
||||
};
|
||||
|
||||
|
|
9
reactos/tools/rbuild/tests/data/define.xml
Normal file
9
reactos/tools/rbuild/tests/data/define.xml
Normal 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>
|
9
reactos/tools/rbuild/tests/data/include.xml
Normal file
9
reactos/tools/rbuild/tests/data/include.xml
Normal 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>
|
21
reactos/tools/rbuild/tests/definetest.cpp
Normal file
21
reactos/tools/rbuild/tests/definetest.cpp
Normal 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);
|
||||
}
|
19
reactos/tools/rbuild/tests/includetest.cpp
Normal file
19
reactos/tools/rbuild/tests/includetest.cpp
Normal 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);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue