+++ /dev/null
-/*
- * Copyright (C) 2005 Casper S. Hornstrup
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include "pch.h"
-#include <assert.h>
-
-#include "rbuild.h"
-
-using std::string;
-using std::vector;
-
-CompilationUnit::CompilationUnit ( const Project& project,
- const Module* module,
- const XMLElement& node )
- : project(project),
- module(module),
- node(node)
-{
-}
-
-CompilationUnit::~CompilationUnit ()
-{
-}
-
-void
-CompilationUnit::ProcessXML ()
-{
-}
None.
Elements:
- bootstrap, component, compilationunit, define, dependency, directory, file, if, importlibrary, include, invoke, library, linkerscript, property.
+ bootstrap, component, define, dependency, directory, file, if, importlibrary, include, invoke, library, linkerscript, property.
Module types
None.
-CompilationUnit element
------------------------
-A compilationunit element specifies that one or more source code files are to be compiled as a single compilation unit.
-
-Syntax:
- <compilationunit>
- ...
- </compilationunit>
-
-Attributes:
- None.
-
-Value:
- None.
-
-Elements:
- directory, file, if.
-
-
Component element
-----------------
A component element specifies that imports from a library are to be stubbed so tests can be run without actually calling the functions in the library. This element can only be used for modules of type test.
None.
Elements:
- compilationunit, compilerflag, define, directory, file, if, include, property.
+ compilerflag, define, directory, file, if, include, property.
Importlibrary element
+++ /dev/null
-/*
- * Copyright (C) 2005 Casper S. Hornstrup
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include "rbuild.h"
-
-using std::string;
-using std::vector;
-
-string ExePrefix;
-string ExePostfix;
-string sSep;
-string sBadSep;
-char cSep;
-char cBadSep;
-
-
-void
-InitializeEnvironment ()
-{
- char *SepValue, *ExePostfixValue, *ExePrefixValue;;
-
- SepValue = getenv ( "SEP" );
- if ( SepValue && ( 0 == strcmp ( SepValue, DEF_SSEP ) || 0 == strcmp ( SepValue, DEF_SBAD_SEP ) ) )
- {
- cSep = SepValue[0];
- sSep = SepValue;
- }
- else
- {
- cSep = DEF_CSEP;
- sSep = DEF_SSEP;
- }
- if ( cSep == DEF_CSEP )
- {
- cBadSep = DEF_CBAD_SEP;
- sBadSep = DEF_SBAD_SEP;
- }
- else
- {
- cBadSep = DEF_CSEP;
- sBadSep = DEF_SSEP;
- }
- ExePostfixValue = getenv ( "EXEPOSTFIX" );
- ExePrefixValue = getenv ( "EXEPREFIX" );
- if ( ( ExePostfixValue == NULL || 0 == strlen ( ExePostfixValue ) ) &&
- ( ExePrefixValue == NULL || 0 == strlen ( ExePrefixValue ) ) )
- {
- ExePostfix = DEF_EXEPOSTFIX;
- ExePrefix = DEF_EXEPREFIX;
- }
- else
- {
- ExePostfix = ExePostfixValue ? ExePostfixValue : "";
- ExePrefix = ExePrefixValue ? ExePrefixValue : "";
- }
-}
IfableData::~IfableData()
{
size_t i;
- for ( i = 0; i < files.size (); i++ )
+ for ( i = 0; i < files.size(); i++ )
delete files[i];
- for ( i = 0; i < includes.size (); i++ )
+ for ( i = 0; i < includes.size(); i++ )
delete includes[i];
- for ( i = 0; i < defines.size (); i++ )
+ for ( i = 0; i < defines.size(); i++ )
delete defines[i];
- for ( i = 0; i < libraries.size (); i++ )
+ for ( i = 0; i < libraries.size(); i++ )
delete libraries[i];
- for ( i = 0; i < properties.size (); i++ )
+ for ( i = 0; i < properties.size(); i++ )
delete properties[i];
- for ( i = 0; i < compilerFlags.size (); i++ )
+ for ( i = 0; i < compilerFlags.size(); i++ )
delete compilerFlags[i];
- for ( i = 0; i < ifs.size (); i++ )
+ for ( i = 0; i < ifs.size(); i++ )
delete ifs[i];
- for ( i = 0; i < compilationUnits.size (); i++ )
- delete compilationUnits[i];
}
void IfableData::ProcessXML ()
compilerFlags[i]->ProcessXML ();
for ( i = 0; i < ifs.size (); i++ )
ifs[i]->ProcessXML ();
- for ( i = 0; i < compilationUnits.size (); i++ )
- compilationUnits[i]->ProcessXML ();
}
Module::Module ( const Project& project,
size_t i;
for ( i = 0; i < node.subElements.size(); i++ )
- {
- ParseContext parseContext;
- ProcessXMLSubElement ( *node.subElements[i], path, parseContext );
- }
+ ProcessXMLSubElement ( *node.subElements[i], path );
for ( i = 0; i < invocations.size(); i++ )
invocations[i]->ProcessXML ();
for ( i = 0; i < dependencies.size(); i++ )
void
Module::ProcessXMLSubElement ( const XMLElement& e,
const string& path,
- ParseContext& parseContext )
+ If* pIf /*= NULL*/ )
{
bool subs_invalid = false;
string subpath ( path );
first,
switches,
false );
- if ( parseContext.ifData )
- parseContext.ifData->data.files.push_back ( pFile );
+ if ( pIf )
+ pIf->data.files.push_back ( pFile );
else
non_if_data.files.push_back ( pFile );
- if ( parseContext.compilationUnit )
- parseContext.compilationUnit->files.push_back ( pFile );
subs_invalid = true;
}
else if ( e.name == "library" && e.value.size () )
{
Library* pLibrary = new Library ( e, *this, e.value );
- if ( parseContext.ifData )
- parseContext.ifData->data.libraries.push_back ( pLibrary );
+ if ( pIf )
+ pIf->data.libraries.push_back ( pLibrary );
else
non_if_data.libraries.push_back ( pLibrary );
subs_invalid = true;
else if ( e.name == "include" )
{
Include* include = new Include ( project, this, &e );
- if ( parseContext.ifData )
- parseContext.ifData->data.includes.push_back ( include );
+ if ( pIf )
+ pIf->data.includes.push_back ( include );
else
non_if_data.includes.push_back ( include );
subs_invalid = true;
else if ( e.name == "define" )
{
Define* pDefine = new Define ( project, this, e );
- if ( parseContext.ifData )
- parseContext.ifData->data.defines.push_back ( pDefine );
+ if ( pIf )
+ pIf->data.defines.push_back ( pDefine );
else
non_if_data.defines.push_back ( pDefine );
subs_invalid = true;
}
else if ( e.name == "invoke" )
{
- if ( parseContext.ifData )
+ if ( pIf )
throw InvalidBuildFileException (
e.location,
"<invoke> is not a valid sub-element of <if>" );
}
else if ( e.name == "dependency" )
{
- if ( parseContext.ifData )
+ if ( pIf )
throw InvalidBuildFileException (
e.location,
"<dependency> is not a valid sub-element of <if>" );
}
else if ( e.name == "importlibrary" )
{
- if ( parseContext.ifData )
+ if ( pIf )
throw InvalidBuildFileException (
e.location,
"<importlibrary> is not a valid sub-element of <if>" );
}
else if ( e.name == "if" )
{
- If* pOldIf = parseContext.ifData;
- parseContext.ifData = new If ( e, project, this );
+ If* pOldIf = pIf;
+ pIf = new If ( e, project, this );
if ( pOldIf )
- pOldIf->data.ifs.push_back ( parseContext.ifData );
+ pOldIf->data.ifs.push_back ( pIf );
else
- non_if_data.ifs.push_back ( parseContext.ifData );
+ non_if_data.ifs.push_back ( pIf );
subs_invalid = false;
}
else if ( e.name == "ifnot" )
{
- If* pOldIf = parseContext.ifData;
- parseContext.ifData = new If ( e, project, this, true );
+ If* pOldIf = pIf;
+ pIf = new If ( e, project, this, true );
if ( pOldIf )
- pOldIf->data.ifs.push_back ( parseContext.ifData );
+ pOldIf->data.ifs.push_back ( pIf );
else
- non_if_data.ifs.push_back ( parseContext.ifData );
+ non_if_data.ifs.push_back ( pIf );
subs_invalid = false;
}
else if ( e.name == "compilerflag" )
{
CompilerFlag* pCompilerFlag = new CompilerFlag ( project, this, e );
- if ( parseContext.ifData )
- parseContext.ifData->data.compilerFlags.push_back ( pCompilerFlag );
+ if ( pIf )
+ pIf->data.compilerFlags.push_back ( pCompilerFlag );
else
non_if_data.compilerFlags.push_back ( pCompilerFlag );
subs_invalid = true;
}
else if ( e.name == "pch" )
{
- if ( parseContext.ifData )
+ if ( pIf )
throw InvalidBuildFileException (
e.location,
"<pch> is not a valid sub-element of <if>" );
e, *this, File ( FixSeparator ( path + cSep + e.value ), false, "", true ) );
subs_invalid = true;
}
- else if ( e.name == "compilationunit" )
- {
- CompilationUnit* pCompilationUnit = new CompilationUnit ( project, this, e );
- if ( parseContext.ifData )
- parseContext.ifData->data.compilationUnits.push_back ( pCompilationUnit );
- else
- non_if_data.compilationUnits.push_back ( pCompilationUnit );
- parseContext.compilationUnit = pCompilationUnit;
- subs_invalid = false;
- }
if ( subs_invalid && e.subElements.size() > 0 )
throw InvalidBuildFileException (
e.location,
"<%s> cannot have sub-elements",
e.name.c_str() );
for ( size_t i = 0; i < e.subElements.size (); i++ )
- ProcessXMLSubElement ( *e.subElements[i], subpath, parseContext );
+ ProcessXMLSubElement ( *e.subElements[i], subpath, pIf );
}
ModuleType
"reactos" );
}
-ParseContext::ParseContext ()
- : ifData (NULL),
- compilationUnit (NULL)
-{
-}
Project::Project ( const string& filename )
: xmlfile (filename),
size_t i;
for ( i = 0; i < node->subElements.size (); i++ )
- {
- ParseContext parseContext;
- ProcessXMLSubElement ( *node->subElements[i], path, parseContext );
- }
+ ProcessXMLSubElement ( *node->subElements[i], path );
for ( i = 0; i < modules.size (); i++ )
modules[i]->ProcessXML ();
for ( i = 0; i < linkerFlags.size (); i++ )
void
Project::ProcessXMLSubElement ( const XMLElement& e,
const string& path,
- ParseContext& parseContext )
+ If* pIf )
{
bool subs_invalid = false;
string subpath(path);
if ( e.name == "module" )
{
- if ( parseContext.ifData )
+ if ( pIf )
throw InvalidBuildFileException (
e.location,
"<module> is not a valid sub-element of <if>" );
else if ( e.name == "include" )
{
Include* include = new Include ( *this, &e );
- if ( parseContext.ifData )
- parseContext.ifData->data.includes.push_back ( include );
+ if ( pIf )
+ pIf->data.includes.push_back ( include );
else
non_if_data.includes.push_back ( include );
subs_invalid = true;
else if ( e.name == "define" )
{
Define* define = new Define ( *this, e );
- if ( parseContext.ifData )
- parseContext.ifData->data.defines.push_back ( define );
+ if ( pIf )
+ pIf->data.defines.push_back ( define );
else
non_if_data.defines.push_back ( define );
subs_invalid = true;
else if ( e.name == "compilerflag" )
{
CompilerFlag* pCompilerFlag = new CompilerFlag ( *this, e );
- if ( parseContext.ifData )
- parseContext.ifData->data.compilerFlags.push_back ( pCompilerFlag );
+ if ( pIf )
+ pIf->data.compilerFlags.push_back ( pCompilerFlag );
else
non_if_data.compilerFlags.push_back ( pCompilerFlag );
subs_invalid = true;
}
else if ( e.name == "if" )
{
- If* pOldIf = parseContext.ifData;
- parseContext.ifData = new If ( e, *this, NULL );
+ If* pOldIf = pIf;
+ pIf = new If ( e, *this, NULL );
if ( pOldIf )
- pOldIf->data.ifs.push_back ( parseContext.ifData );
+ pOldIf->data.ifs.push_back ( pIf );
else
- non_if_data.ifs.push_back ( parseContext.ifData );
+ non_if_data.ifs.push_back ( pIf );
subs_invalid = false;
}
else if ( e.name == "ifnot" )
{
- If* pOldIf = parseContext.ifData;
- parseContext.ifData = new If ( e, *this, NULL, true );
+ If* pOldIf = pIf;
+ pIf = new If ( e, *this, NULL, true );
if ( pOldIf )
- pOldIf->data.ifs.push_back ( parseContext.ifData );
+ pOldIf->data.ifs.push_back ( pIf );
else
- non_if_data.ifs.push_back ( parseContext.ifData );
+ non_if_data.ifs.push_back ( pIf );
subs_invalid = false;
}
else if ( e.name == "property" )
{
Property* property = new Property ( e, *this, NULL );
- if ( parseContext.ifData )
- parseContext.ifData->data.properties.push_back ( property );
+ if ( pIf )
+ pIf->data.properties.push_back ( property );
else
non_if_data.properties.push_back ( property );
}
"<%s> cannot have sub-elements",
e.name.c_str() );
for ( size_t i = 0; i < e.subElements.size (); i++ )
- ProcessXMLSubElement ( *e.subElements[i], subpath, parseContext );
+ ProcessXMLSubElement ( *e.subElements[i], subpath, pIf );
}
Module*
{
return xmlfile;
}
+
+
static string RootXmlFile = "ReactOS.xml";
static Configuration configuration;
+string ExePrefix;
+string ExePostfix;
+string sSep;
+string sBadSep;
+char cSep;
+char cBadSep;
+
bool
ParseAutomaticDependencySwitch ( char switchChar2,
char* switchStart )
int
main ( int argc, char** argv )
{
- InitializeEnvironment ();
+ char *SepValue, *ExePostfixValue, *ExePrefixValue;;
+
+ SepValue = getenv("SEP");
+ if (SepValue && (0 == strcmp(SepValue, DEF_SSEP) || 0 == strcmp(SepValue, DEF_SBAD_SEP)))
+ {
+ cSep = SepValue[0];
+ sSep = SepValue;
+ }
+ else
+ {
+ cSep = DEF_CSEP;
+ sSep = DEF_SSEP;
+ }
+ if (cSep == DEF_CSEP)
+ {
+ cBadSep = DEF_CBAD_SEP;
+ sBadSep = DEF_SBAD_SEP;
+ }
+ else
+ {
+ cBadSep = DEF_CSEP;
+ sBadSep = DEF_SSEP;
+ }
+ ExePostfixValue = getenv("EXEPOSTFIX");
+ ExePrefixValue = getenv("EXEPREFIX");
+ if ((ExePostfixValue == NULL || 0 == strlen(ExePostfixValue)) &&
+ (ExePrefixValue == NULL || 0 == strlen(ExePrefixValue)))
+ {
+ ExePostfix = DEF_EXEPOSTFIX;
+ ExePrefix = DEF_EXEPREFIX;
+ }
+ else
+ {
+ ExePostfix = ExePostfixValue ? ExePostfixValue : "";
+ ExePrefix = ExePrefixValue ? ExePrefixValue : "";
+ }
if ( !ParseArguments ( argc, argv ) )
{
class PchFile;
class StubbedComponent;
class StubbedSymbol;
-class CompilationUnit;
class SourceFileTest;
const std::string& defaultValue );
};
-
class FileSupportCode
{
public:
std::string filename );
};
-
-class ParseContext
-{
-public:
- If* ifData;
- CompilationUnit* compilationUnit;
- ParseContext ();
-};
-
-
class IfableData
{
public:
- std::vector<CompilationUnit*> compilationUnits;
std::vector<File*> files;
std::vector<Include*> includes;
std::vector<Define*> defines;
void ReadXml ();
void ProcessXMLSubElement ( const XMLElement& e,
const std::string& path,
- ParseContext& parseContext );
+ If* pIf = NULL );
// disable copy semantics
Project ( const Project& );
std::string GetDefaultModuleBaseaddress () const;
void ProcessXMLSubElement ( const XMLElement& e,
const std::string& path,
- ParseContext& parseContext );
+ If* pIf = NULL );
};
std::string StripSymbol ( std::string symbol );
};
-
-class CompilationUnit
-{
-public:
- const Project& project;
- const Module* module;
- const XMLElement& node;
- std::vector<File*> files;
-
- CompilationUnit ( const Project& project,
- const Module* module,
- const XMLElement& node );
- ~CompilationUnit ();
- void ProcessXML();
-};
-
-
-extern void
-InitializeEnvironment ();
-
extern std::string
Right ( const std::string& s, size_t n );
RBUILD_COMMON_SOURCES = \
$(RBUILD_BACKEND_SOURCES) \
$(addprefix $(RBUILD_BASE_), \
- global.cpp \
automaticdependency.cpp \
bootstrap.cpp \
cdfile.cpp \
- compilationunit.cpp \
compilerflag.cpp \
configuration.cpp \
define.cpp \
RBUILD_TESTS = \
tests$(SEP)cdfiletest.cpp \
- tests$(SEP)compilationunittest.cpp \
tests$(SEP)definetest.cpp \
tests$(SEP)functiontest.cpp \
tests$(SEP)iftest.cpp \
$(ECHO_LD)
${host_gpp} $(RBUILD_OBJECTS) $(RBUILD_HOST_LFLAGS) -o $@
-$(RBUILD_INT_)global.o: $(RBUILD_BASE_)global.cpp $(RBUILD_HEADERS) | $(RBUILD_INT)
- $(ECHO_CC)
- ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
-
$(RBUILD_INT_)automaticdependency.o: $(RBUILD_BASE_)automaticdependency.cpp $(RBUILD_HEADERS) | $(RBUILD_INT)
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
-$(RBUILD_INT_)compilationunit.o: $(RBUILD_BASE_)compilationunit.cpp $(RBUILD_HEADERS) | $(RBUILD_INT)
- $(ECHO_CC)
- ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
-
$(RBUILD_INT_)compilerflag.o: $(RBUILD_BASE_)compilerflag.cpp $(RBUILD_HEADERS) | $(RBUILD_INT)
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
-$(RBUILD_TESTS_INT_)compilationunittest.o: $(RBUILD_TESTS_BASE_)compilationunittest.cpp $(RBUILD_HEADERS) | $(RBUILD_TESTS_INT)
- $(ECHO_CC)
- ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
-
$(RBUILD_TESTS_INT_)definetest.o: $(RBUILD_TESTS_BASE_)definetest.cpp $(RBUILD_HEADERS) | $(RBUILD_TESTS_INT)
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
#include "rbuild.h"
#include "backend/mingw/mingw.h"
-#define SSEP DEF_SSEP
-
#define RBUILD_BASE "tools" SSEP "rbuild" SSEP
class BaseTest
void Run ();
};
-class CompilationUnitTest : public BaseTest
-{
-public:
- void Run ();
-};
-
#endif /* __TEST_H */
tests.push_back(new SourceFileTest());
tests.push_back(new CDFileTest());
tests.push_back(new SymbolTest());
- tests.push_back(new CompilationUnitTest());
}
};
int main(int argc,
char** argv)
{
- InitializeEnvironment ();
TestDispatcher testDispatcher;
testDispatcher.Run();
return 0;
+++ /dev/null
-/*
- * Copyright (C) 2005 Casper S. Hornstrup
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include "test.h"
-
-using std::string;
-
-void CompilationUnitTest::Run()
-{
- string projectFilename ( RBUILD_BASE "tests/data/compilationunit.xml" );
- Project project ( projectFilename );
- ARE_EQUAL ( 1, project.modules.size () );
-
- Module& module1 = *project.modules[0];
- IS_TRUE ( module1.type == BuildTool );
-
- ARE_EQUAL ( 2, module1.non_if_data.files.size());
- ARE_EQUAL ( 1, module1.non_if_data.compilationUnits.size () );
-
- CompilationUnit& compilationUnit1 = *module1.non_if_data.compilationUnits[0];
- ARE_EQUAL ( 2, compilationUnit1.files.size () );
-}
+++ /dev/null
-<?xml version="1.0" ?>
-<project name="Project" makefile="Makefile">
- <directory name="dir1">
- <module name="module1" type="buildtool">
- <compilationunit>
- <file>file1.c</file>
- <file>file2.c</file>
- </compilationunit>
- </module>
- </directory>
-</project>
TOOLS_OUT = $(OUTPUT_)$(TOOLS_BASE)
TOOLS_OUT_ = $(TOOLS_OUT)$(SEP)
-TOOLS_CFLAGS = $(CFLAGS) -Wall -Wpointer-arith -Wno-strict-aliasing
-TOOLS_CPPFLAGS = $(CPPFLAGS) -Wall -Wpointer-arith
-TOOLS_LFLAGS = $(LFLAGS)
+TOOLS_CFLAGS = -Wall -Wpointer-arith -Wno-strict-aliasing
+TOOLS_CPPFLAGS = -Wall -Wpointer-arith
+TOOLS_LFLAGS =
$(TOOLS_INT): | $(INTERMEDIATE)
$(ECHO_MKDIR)