From 34baac2c5c5b914a502f4d0df4a3b692d9827e74 Mon Sep 17 00:00:00 2001 From: Casper Hornstrup Date: Mon, 21 Nov 2005 18:02:28 +0000 Subject: [PATCH] Parse svn path=/trunk/; revision=19411 --- reactos/tools/rbuild/compilationunit.cpp | 42 ++++++++++ reactos/tools/rbuild/doc/rbuild.txt | 23 ++++- reactos/tools/rbuild/global.cpp | 70 ++++++++++++++++ reactos/tools/rbuild/module.cpp | 83 ++++++++++++------- reactos/tools/rbuild/project.cpp | 50 ++++++----- reactos/tools/rbuild/rbuild.cpp | 44 +--------- reactos/tools/rbuild/rbuild.h | 37 ++++++++- reactos/tools/rbuild/rbuild.mak | 15 ++++ reactos/tools/rbuild/test.h | 8 ++ reactos/tools/rbuild/tests/alltests.cpp | 2 + .../rbuild/tests/compilationunittest.cpp | 36 ++++++++ .../rbuild/tests/data/compilationunit.xml | 11 +++ reactos/tools/tools.mak | 6 +- 13 files changed, 323 insertions(+), 104 deletions(-) create mode 100644 reactos/tools/rbuild/compilationunit.cpp create mode 100644 reactos/tools/rbuild/global.cpp create mode 100644 reactos/tools/rbuild/tests/compilationunittest.cpp create mode 100644 reactos/tools/rbuild/tests/data/compilationunit.xml diff --git a/reactos/tools/rbuild/compilationunit.cpp b/reactos/tools/rbuild/compilationunit.cpp new file mode 100644 index 00000000000..7bae5378d5e --- /dev/null +++ b/reactos/tools/rbuild/compilationunit.cpp @@ -0,0 +1,42 @@ +/* + * 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 + +#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 () +{ +} diff --git a/reactos/tools/rbuild/doc/rbuild.txt b/reactos/tools/rbuild/doc/rbuild.txt index b514b69dc2a..832212f1c56 100644 --- a/reactos/tools/rbuild/doc/rbuild.txt +++ b/reactos/tools/rbuild/doc/rbuild.txt @@ -129,7 +129,7 @@ Value: None. Elements: - bootstrap, component, define, dependency, directory, file, if, importlibrary, include, invoke, library, linkerscript, property. + bootstrap, component, compilationunit, define, dependency, directory, file, if, importlibrary, include, invoke, library, linkerscript, property. Module types @@ -190,6 +190,25 @@ Elements: None. +CompilationUnit element +----------------------- +A compilationunit element specifies that one or more source code files are to be compiled as a single compilation unit. + +Syntax: + + ... + + +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. @@ -313,7 +332,7 @@ Value: None. Elements: - compilerflag, define, directory, file, if, include, property. + compilationunit, compilerflag, define, directory, file, if, include, property. Importlibrary element diff --git a/reactos/tools/rbuild/global.cpp b/reactos/tools/rbuild/global.cpp new file mode 100644 index 00000000000..da53dbd5415 --- /dev/null +++ b/reactos/tools/rbuild/global.cpp @@ -0,0 +1,70 @@ +/* + * 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 : ""; + } +} diff --git a/reactos/tools/rbuild/module.cpp b/reactos/tools/rbuild/module.cpp index 1b5644bce8c..3333f263bf6 100644 --- a/reactos/tools/rbuild/module.cpp +++ b/reactos/tools/rbuild/module.cpp @@ -182,20 +182,22 @@ GetBooleanValue ( const string& value ) 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 () @@ -215,6 +217,8 @@ 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, @@ -413,7 +417,10 @@ Module::ProcessXML() size_t i; for ( i = 0; i < node.subElements.size(); i++ ) - ProcessXMLSubElement ( *node.subElements[i], path ); + { + ParseContext parseContext; + ProcessXMLSubElement ( *node.subElements[i], path, parseContext ); + } for ( i = 0; i < invocations.size(); i++ ) invocations[i]->ProcessXML (); for ( i = 0; i < dependencies.size(); i++ ) @@ -434,7 +441,7 @@ Module::ProcessXML() void Module::ProcessXMLSubElement ( const XMLElement& e, const string& path, - If* pIf /*= NULL*/ ) + ParseContext& parseContext ) { bool subs_invalid = false; string subpath ( path ); @@ -470,17 +477,19 @@ Module::ProcessXMLSubElement ( const XMLElement& e, first, switches, false ); - if ( pIf ) - pIf->data.files.push_back ( pFile ); + if ( parseContext.ifData ) + parseContext.ifData->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 ( pIf ) - pIf->data.libraries.push_back ( pLibrary ); + if ( parseContext.ifData ) + parseContext.ifData->data.libraries.push_back ( pLibrary ); else non_if_data.libraries.push_back ( pLibrary ); subs_invalid = true; @@ -494,8 +503,8 @@ Module::ProcessXMLSubElement ( const XMLElement& e, else if ( e.name == "include" ) { Include* include = new Include ( project, this, &e ); - if ( pIf ) - pIf->data.includes.push_back ( include ); + if ( parseContext.ifData ) + parseContext.ifData->data.includes.push_back ( include ); else non_if_data.includes.push_back ( include ); subs_invalid = true; @@ -503,15 +512,15 @@ Module::ProcessXMLSubElement ( const XMLElement& e, else if ( e.name == "define" ) { Define* pDefine = new Define ( project, this, e ); - if ( pIf ) - pIf->data.defines.push_back ( pDefine ); + if ( parseContext.ifData ) + parseContext.ifData->data.defines.push_back ( pDefine ); else non_if_data.defines.push_back ( pDefine ); subs_invalid = true; } else if ( e.name == "invoke" ) { - if ( pIf ) + if ( parseContext.ifData ) throw InvalidBuildFileException ( e.location, " is not a valid sub-element of " ); @@ -520,7 +529,7 @@ Module::ProcessXMLSubElement ( const XMLElement& e, } else if ( e.name == "dependency" ) { - if ( pIf ) + if ( parseContext.ifData ) throw InvalidBuildFileException ( e.location, " is not a valid sub-element of " ); @@ -529,7 +538,7 @@ Module::ProcessXMLSubElement ( const XMLElement& e, } else if ( e.name == "importlibrary" ) { - if ( pIf ) + if ( parseContext.ifData ) throw InvalidBuildFileException ( e.location, " is not a valid sub-element of " ); @@ -542,29 +551,29 @@ Module::ProcessXMLSubElement ( const XMLElement& e, } else if ( e.name == "if" ) { - If* pOldIf = pIf; - pIf = new If ( e, project, this ); + If* pOldIf = parseContext.ifData; + parseContext.ifData = new If ( e, project, this ); if ( pOldIf ) - pOldIf->data.ifs.push_back ( pIf ); + pOldIf->data.ifs.push_back ( parseContext.ifData ); else - non_if_data.ifs.push_back ( pIf ); + non_if_data.ifs.push_back ( parseContext.ifData ); subs_invalid = false; } else if ( e.name == "ifnot" ) { - If* pOldIf = pIf; - pIf = new If ( e, project, this, true ); + If* pOldIf = parseContext.ifData; + parseContext.ifData = new If ( e, project, this, true ); if ( pOldIf ) - pOldIf->data.ifs.push_back ( pIf ); + pOldIf->data.ifs.push_back ( parseContext.ifData ); else - non_if_data.ifs.push_back ( pIf ); + non_if_data.ifs.push_back ( parseContext.ifData ); subs_invalid = false; } else if ( e.name == "compilerflag" ) { CompilerFlag* pCompilerFlag = new CompilerFlag ( project, this, e ); - if ( pIf ) - pIf->data.compilerFlags.push_back ( pCompilerFlag ); + if ( parseContext.ifData ) + parseContext.ifData->data.compilerFlags.push_back ( pCompilerFlag ); else non_if_data.compilerFlags.push_back ( pCompilerFlag ); subs_invalid = true; @@ -601,7 +610,7 @@ Module::ProcessXMLSubElement ( const XMLElement& e, } else if ( e.name == "pch" ) { - if ( pIf ) + if ( parseContext.ifData ) throw InvalidBuildFileException ( e.location, " is not a valid sub-element of " ); @@ -613,13 +622,23 @@ Module::ProcessXMLSubElement ( const XMLElement& e, 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, pIf ); + ProcessXMLSubElement ( *e.subElements[i], subpath, parseContext ); } ModuleType diff --git a/reactos/tools/rbuild/project.cpp b/reactos/tools/rbuild/project.cpp index e74e44f4f4d..297a63e175a 100644 --- a/reactos/tools/rbuild/project.cpp +++ b/reactos/tools/rbuild/project.cpp @@ -66,6 +66,11 @@ Environment::GetInstallPath () "reactos" ); } +ParseContext::ParseContext () + : ifData (NULL), + compilationUnit (NULL) +{ +} Project::Project ( const string& filename ) : xmlfile (filename), @@ -254,7 +259,10 @@ Project::ProcessXML ( const string& path ) size_t i; for ( i = 0; i < node->subElements.size (); i++ ) - ProcessXMLSubElement ( *node->subElements[i], path ); + { + ParseContext parseContext; + ProcessXMLSubElement ( *node->subElements[i], path, parseContext ); + } for ( i = 0; i < modules.size (); i++ ) modules[i]->ProcessXML (); for ( i = 0; i < linkerFlags.size (); i++ ) @@ -269,13 +277,13 @@ Project::ProcessXML ( const string& path ) void Project::ProcessXMLSubElement ( const XMLElement& e, const string& path, - If* pIf ) + ParseContext& parseContext ) { bool subs_invalid = false; string subpath(path); if ( e.name == "module" ) { - if ( pIf ) + if ( parseContext.ifData ) throw InvalidBuildFileException ( e.location, " is not a valid sub-element of " ); @@ -310,8 +318,8 @@ Project::ProcessXMLSubElement ( const XMLElement& e, else if ( e.name == "include" ) { Include* include = new Include ( *this, &e ); - if ( pIf ) - pIf->data.includes.push_back ( include ); + if ( parseContext.ifData ) + parseContext.ifData->data.includes.push_back ( include ); else non_if_data.includes.push_back ( include ); subs_invalid = true; @@ -319,8 +327,8 @@ Project::ProcessXMLSubElement ( const XMLElement& e, else if ( e.name == "define" ) { Define* define = new Define ( *this, e ); - if ( pIf ) - pIf->data.defines.push_back ( define ); + if ( parseContext.ifData ) + parseContext.ifData->data.defines.push_back ( define ); else non_if_data.defines.push_back ( define ); subs_invalid = true; @@ -328,8 +336,8 @@ Project::ProcessXMLSubElement ( const XMLElement& e, else if ( e.name == "compilerflag" ) { CompilerFlag* pCompilerFlag = new CompilerFlag ( *this, e ); - if ( pIf ) - pIf->data.compilerFlags.push_back ( pCompilerFlag ); + if ( parseContext.ifData ) + parseContext.ifData->data.compilerFlags.push_back ( pCompilerFlag ); else non_if_data.compilerFlags.push_back ( pCompilerFlag ); subs_invalid = true; @@ -341,29 +349,29 @@ Project::ProcessXMLSubElement ( const XMLElement& e, } else if ( e.name == "if" ) { - If* pOldIf = pIf; - pIf = new If ( e, *this, NULL ); + If* pOldIf = parseContext.ifData; + parseContext.ifData = new If ( e, *this, NULL ); if ( pOldIf ) - pOldIf->data.ifs.push_back ( pIf ); + pOldIf->data.ifs.push_back ( parseContext.ifData ); else - non_if_data.ifs.push_back ( pIf ); + non_if_data.ifs.push_back ( parseContext.ifData ); subs_invalid = false; } else if ( e.name == "ifnot" ) { - If* pOldIf = pIf; - pIf = new If ( e, *this, NULL, true ); + If* pOldIf = parseContext.ifData; + parseContext.ifData = new If ( e, *this, NULL, true ); if ( pOldIf ) - pOldIf->data.ifs.push_back ( pIf ); + pOldIf->data.ifs.push_back ( parseContext.ifData ); else - non_if_data.ifs.push_back ( pIf ); + non_if_data.ifs.push_back ( parseContext.ifData ); subs_invalid = false; } else if ( e.name == "property" ) { Property* property = new Property ( e, *this, NULL ); - if ( pIf ) - pIf->data.properties.push_back ( property ); + if ( parseContext.ifData ) + parseContext.ifData->data.properties.push_back ( property ); else non_if_data.properties.push_back ( property ); } @@ -373,7 +381,7 @@ Project::ProcessXMLSubElement ( const XMLElement& e, "<%s> cannot have sub-elements", e.name.c_str() ); for ( size_t i = 0; i < e.subElements.size (); i++ ) - ProcessXMLSubElement ( *e.subElements[i], subpath, pIf ); + ProcessXMLSubElement ( *e.subElements[i], subpath, parseContext ); } Module* @@ -405,5 +413,3 @@ Project::GetProjectFilename () const { return xmlfile; } - - diff --git a/reactos/tools/rbuild/rbuild.cpp b/reactos/tools/rbuild/rbuild.cpp index d7edd1349fb..00e685b6b6c 100644 --- a/reactos/tools/rbuild/rbuild.cpp +++ b/reactos/tools/rbuild/rbuild.cpp @@ -35,13 +35,6 @@ static string BuildSystem; 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 ) @@ -193,42 +186,7 @@ ParseArguments ( int argc, char** argv ) int main ( int argc, char** argv ) { - 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 : ""; - } + InitializeEnvironment (); if ( !ParseArguments ( argc, argv ) ) { diff --git a/reactos/tools/rbuild/rbuild.h b/reactos/tools/rbuild/rbuild.h index 53ab14e364a..c7fb4b879cd 100644 --- a/reactos/tools/rbuild/rbuild.h +++ b/reactos/tools/rbuild/rbuild.h @@ -91,6 +91,7 @@ class InstallFile; class PchFile; class StubbedComponent; class StubbedSymbol; +class CompilationUnit; class SourceFileTest; @@ -121,6 +122,7 @@ public: const std::string& defaultValue ); }; + class FileSupportCode { public: @@ -128,9 +130,20 @@ public: std::string filename ); }; + +class ParseContext +{ +public: + If* ifData; + CompilationUnit* compilationUnit; + ParseContext (); +}; + + class IfableData { public: + std::vector compilationUnits; std::vector files; std::vector includes; std::vector defines; @@ -177,7 +190,7 @@ private: void ReadXml (); void ProcessXMLSubElement ( const XMLElement& e, const std::string& path, - If* pIf = NULL ); + ParseContext& parseContext ); // disable copy semantics Project ( const Project& ); @@ -277,7 +290,7 @@ private: std::string GetDefaultModuleBaseaddress () const; void ProcessXMLSubElement ( const XMLElement& e, const std::string& path, - If* pIf = NULL ); + ParseContext& parseContext ); }; @@ -771,6 +784,26 @@ private: std::string StripSymbol ( std::string symbol ); }; + +class CompilationUnit +{ +public: + const Project& project; + const Module* module; + const XMLElement& node; + std::vector 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 ); diff --git a/reactos/tools/rbuild/rbuild.mak b/reactos/tools/rbuild/rbuild.mak index cde64588801..f4ba5698325 100644 --- a/reactos/tools/rbuild/rbuild.mak +++ b/reactos/tools/rbuild/rbuild.mak @@ -152,9 +152,11 @@ RBUILD_BACKEND_SOURCES = \ 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 \ @@ -219,6 +221,7 @@ RBUILD_HEADERS = \ RBUILD_TESTS = \ tests$(SEP)cdfiletest.cpp \ + tests$(SEP)compilationunittest.cpp \ tests$(SEP)definetest.cpp \ tests$(SEP)functiontest.cpp \ tests$(SEP)iftest.cpp \ @@ -256,6 +259,10 @@ $(RBUILD_TARGET): $(RBUILD_OBJECTS) | $(RBUILD_OUT) $(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 $@ @@ -268,6 +275,10 @@ $(RBUILD_INT_)cdfile.o: $(RBUILD_BASE_)cdfile.cpp $(RBUILD_HEADERS) | $(RBUILD_I $(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 $@ @@ -380,6 +391,10 @@ $(RBUILD_TESTS_INT_)cdfiletest.o: $(RBUILD_TESTS_BASE_)cdfiletest.cpp $(RBUILD_H $(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 $@ diff --git a/reactos/tools/rbuild/test.h b/reactos/tools/rbuild/test.h index 8aaee42bf9f..4b8ec491d55 100644 --- a/reactos/tools/rbuild/test.h +++ b/reactos/tools/rbuild/test.h @@ -21,6 +21,8 @@ #include "rbuild.h" #include "backend/mingw/mingw.h" +#define SSEP DEF_SSEP + #define RBUILD_BASE "tools" SSEP "rbuild" SSEP class BaseTest @@ -153,4 +155,10 @@ public: void Run (); }; +class CompilationUnitTest : public BaseTest +{ +public: + void Run (); +}; + #endif /* __TEST_H */ diff --git a/reactos/tools/rbuild/tests/alltests.cpp b/reactos/tools/rbuild/tests/alltests.cpp index b7a9edbadc0..ee2a702483b 100644 --- a/reactos/tools/rbuild/tests/alltests.cpp +++ b/reactos/tools/rbuild/tests/alltests.cpp @@ -196,6 +196,7 @@ private: tests.push_back(new SourceFileTest()); tests.push_back(new CDFileTest()); tests.push_back(new SymbolTest()); + tests.push_back(new CompilationUnitTest()); } }; @@ -203,6 +204,7 @@ private: int main(int argc, char** argv) { + InitializeEnvironment (); TestDispatcher testDispatcher; testDispatcher.Run(); return 0; diff --git a/reactos/tools/rbuild/tests/compilationunittest.cpp b/reactos/tools/rbuild/tests/compilationunittest.cpp new file mode 100644 index 00000000000..64ab8dd1e85 --- /dev/null +++ b/reactos/tools/rbuild/tests/compilationunittest.cpp @@ -0,0 +1,36 @@ +/* + * 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 () ); +} diff --git a/reactos/tools/rbuild/tests/data/compilationunit.xml b/reactos/tools/rbuild/tests/data/compilationunit.xml new file mode 100644 index 00000000000..92719cdf164 --- /dev/null +++ b/reactos/tools/rbuild/tests/data/compilationunit.xml @@ -0,0 +1,11 @@ + + + + + + file1.c + file2.c + + + + diff --git a/reactos/tools/tools.mak b/reactos/tools/tools.mak index eb724c27f68..2ee18039024 100644 --- a/reactos/tools/tools.mak +++ b/reactos/tools/tools.mak @@ -5,9 +5,9 @@ TOOLS_INT_ = $(TOOLS_INT)$(SEP) TOOLS_OUT = $(OUTPUT_)$(TOOLS_BASE) TOOLS_OUT_ = $(TOOLS_OUT)$(SEP) -TOOLS_CFLAGS = -Wall -Wpointer-arith -Wno-strict-aliasing -TOOLS_CPPFLAGS = -Wall -Wpointer-arith -TOOLS_LFLAGS = +TOOLS_CFLAGS = $(CFLAGS) -Wall -Wpointer-arith -Wno-strict-aliasing +TOOLS_CPPFLAGS = $(CPPFLAGS) -Wall -Wpointer-arith +TOOLS_LFLAGS = $(LFLAGS) $(TOOLS_INT): | $(INTERMEDIATE) $(ECHO_MKDIR)