support for <if> tag .PHONY must be output before the target gets defined Modified: branches/xmlbuildsystem/reactos/ReactOS.xml Modified: branches/xmlbuildsystem/reactos/ntoskrnl/ntoskrnl.xml Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler .cpp Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler .h Modified: branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h _____
Modified: branches/xmlbuildsystem/reactos/ReactOS.xml --- branches/xmlbuildsystem/reactos/ReactOS.xml 2005-01-12 05:01:49 UTC (rev 12943) +++ branches/xmlbuildsystem/reactos/ReactOS.xml 2005-01-12 06:02:58 UTC (rev 12944) @@ -6,9 +6,18 @@
<xi:include href="config.template.xml" /> </xi:fallback> </xi:include> + <define name="_M_IX86" /> + <if property="dbg" value="true"> + <define name="dbg_or_kdbg" value="true" /> + </if> + <if property="kdbg" value="true"> + <define name="dbg_or_kdbg" value="true" /> + </if> + <include>include</include> <include>w32api/include</include> + <directory name="tools"> <xi:include href="tools/tools.xml" /> </directory> _____
Modified: branches/xmlbuildsystem/reactos/ntoskrnl/ntoskrnl.xml --- branches/xmlbuildsystem/reactos/ntoskrnl/ntoskrnl.xml 2005-01-12 05:01:49 UTC (rev 12943) +++ branches/xmlbuildsystem/reactos/ntoskrnl/ntoskrnl.xml 2005-01-12 06:02:58 UTC (rev 12944) @@ -41,10 +41,9 @@
<file>rtlfunc.c</file> </directory> <directory name="dbg"> - <!-- <if property="arch" value="i386"> <directory name="i386"> - <if property="kdbg" value="true"> + <if property="kdbg" value="1"> <group> <file>i386-dis.c</file> <file>kdb_help.S</file> @@ -52,36 +51,17 @@ </if> </directory> </if> - --> - <!-- - <if property="kdbg" value="true"> - <group> - <file>kdb.c</file> - <file>kdb_keyboard.c</file> - <file>kdb_serial.c</file> - <file>rdebug.c</file> - <file>profile.c</file> - </group> + <if property="kdbg" value="1"> + <file>kdb.c</file> + <file>kdb_keyboard.c</file> + <file>kdb_serial.c</file> + <file>rdebug.c</file> + <file>profile.c</file> </if> - --> - <or> - <!-- - <if property="kdbg" value="true"> - <group> - <file>kdb_stabs.c</file> - <file>kdb_symbols.c</file> - </group> - </if> - --> - <!-- - <if property="dbg" value="true"> - <group> - <file>kdb_stabs.c</file> - <file>kdb_symbols.c</file> - </group> - </if> - --> - </or> + <if property="dbg_or_kdbg" value="true"> + <file>kdb_stabs.c</file> + <file>kdb_symbols.c</file> + </if> <file>dbgctrl.c</file> <file>errinfo.c</file> <file>print.c</file> _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler .cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler .cpp 2005-01-12 05:01:49 UTC (rev 12943) +++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler .cpp 2005-01-12 06:02:58 UTC (rev 12944) @@ -237,12 +237,14 @@
void MingwModuleHandler::GenerateGccModuleIncludeVariable ( const Module& module ) const { +#if 0 string name ( module.name + "_CFLAGS" ); fprintf ( fMakefile, "%s := %s %s\n", name.c_str(), - GenerateGccDefineParameters(module).c_str(), + GenerateGccDefineParameters(module).c_str(), GenerateGccIncludeParameters(module).c_str() ); +#endif }
string @@ -258,73 +260,174 @@ return parameters; }
-string -MingwModuleHandler::GenerateGccParameters ( const Module& module ) const +void +MingwModuleHandler::GenerateMacros ( + const Module& module, + const char* op, + const vector<File*>& files, + const vector<Include*>* includes, + const vector<Define*>& defines, + const string& cflags_macro, + const string& nasmflags_macro, + const string& objs_macro) const { - return ssprintf(" $(%s_CFLAGS)", module.name.c_str()); + size_t i; + + if ( (includes && includes->size()) || defines.size() ) + { + fprintf ( + fMakefile, + "%s %s", + cflags_macro.c_str(), + op ); + if ( includes ) + for ( i = 0; i < includes->size(); i++ ) + fprintf ( + fMakefile, + " -I%s", + (*includes)[i]->directory.c_str() ); + for ( i = 0; i < module.defines.size(); i++ ) + { + Define& d = *module.defines[i]; + fprintf ( + fMakefile, + " -D%s", + d.name.c_str() ); + if ( d.value.size() ) + fprintf ( + fMakefile, + "=%s", + d.value.c_str() ); + } + fprintf ( fMakefile, "\n" ); + } + + if ( files.size() ) + { + fprintf ( + fMakefile, + "%s %s", + objs_macro.c_str(), + op ); + for ( i = 0; i < files.size(); i++ ) + { + fprintf ( + fMakefile, + "%s%s", + ( i%10 == 9 ? "\\n\t" : " " ), + GetObjectFilename(files[i]->name).c_str() ); + } + fprintf ( fMakefile, "\n" ); + } }
-string -MingwModuleHandler::GenerateNasmParameters ( const Module& module ) const +void +MingwModuleHandler::GenerateMacros ( + const Module& module, + const string& cflags_macro, + const string& nasmflags_macro, + const string& objs_macro) const { - return ""; + GenerateMacros ( + module, + "=", + module.files, + &module.includes, + module.defines, + cflags_macro, + nasmflags_macro, + objs_macro ); + fprintf ( fMakefile, "\n" ); + + for ( size_t i = 0; i < module.ifs.size(); i++ ) + { + If& rIf = *module.ifs[i]; + if ( rIf.defines.size() || rIf.files.size() ) + { + fprintf ( + fMakefile, + "ifeq ($(%s),"%s")\n", + rIf.property.c_str(), + rIf.value.c_str() ); + GenerateMacros ( + module, + "+=", + rIf.files, + NULL, + rIf.defines, + cflags_macro, + nasmflags_macro, + objs_macro ); + fprintf ( + fMakefile, + "endif\n\n" ); + } + } }
string MingwModuleHandler::GenerateGccCommand ( const Module& module, - const string& sourceFilename, - const string& cc ) const + const string& sourceFilename, + const string& cc, + const string& cflagsMacro ) const { string objectFilename = GetObjectFilename ( sourceFilename ); return ssprintf ( "%s -c %s -o %s %s\n", cc.c_str (), sourceFilename.c_str (), objectFilename.c_str (), - GenerateGccParameters ( module ).c_str () ); + cflagsMacro.c_str () ); }
string MingwModuleHandler::GenerateGccAssemblerCommand ( const Module& module, - const string& sourceFilename, - const string& cc ) const + const string& sourceFilename, + const string& cc, + const string& cflagsMacro ) const { string objectFilename = GetObjectFilename ( sourceFilename ); return ssprintf ( "%s -x assembler-with-cpp -c %s -o %s -D__ASM__ %s\n", - cc.c_str (), - sourceFilename.c_str (), - objectFilename.c_str (), - GenerateGccParameters ( module ).c_str () ); + cc.c_str (), + sourceFilename.c_str (), + objectFilename.c_str (), + cflagsMacro.c_str () ); }
string MingwModuleHandler::GenerateNasmCommand ( const Module& module, - const string& sourceFilename ) const + const string& sourceFilename, + const string& nasmflagsMacro ) const { string objectFilename = GetObjectFilename ( sourceFilename ); return ssprintf ( "%s -f win32 %s -o %s %s\n", "nasm", sourceFilename.c_str (), objectFilename.c_str (), - GenerateNasmParameters ( module ).c_str () ); + nasmflagsMacro.c_str () ); }
string MingwModuleHandler::GenerateCommand ( const Module& module, - const string& sourceFilename, - const string& cc ) const + const string& sourceFilename, + const string& cc, + const string& cflagsMacro, + const string& nasmflagsMacro ) const { string extension = GetExtension ( sourceFilename ); if ( extension == ".c" || extension == ".C" ) return GenerateGccCommand ( module, sourceFilename, - cc ); + cc, + cflagsMacro ); else if ( extension == ".s" || extension == ".S" ) return GenerateGccAssemblerCommand ( module, sourceFilename, - cc ); + cc, + cflagsMacro ); else if ( extension == ".asm" || extension == ".ASM" ) return GenerateNasmCommand ( module, - sourceFilename ); + sourceFilename, + nasmflagsMacro );
throw InvalidOperationException ( __FILE__, __LINE__, @@ -335,16 +438,17 @@
void MingwModuleHandler::GenerateObjectFileTargets ( const Module& module, - const string& cc) const + const vector<File*>& files, + const string& cc, + const string& cflagsMacro, + const string& nasmflagsMacro ) const { - if ( module.files.size () == 0 ) + if ( files.size () == 0 ) return; - - GenerateGccModuleIncludeVariable ( module );
- for ( size_t i = 0; i < module.files.size (); i++ ) + for ( size_t i = 0; i < files.size (); i++ ) { - string sourceFilename = module.files[i]->name; + string sourceFilename = files[i]->name; string objectFilename = GetObjectFilename ( sourceFilename ); fprintf ( fMakefile, "%s: %s\n", @@ -354,60 +458,78 @@ "\t%s\n", GenerateCommand ( module, sourceFilename, - cc ).c_str () ); + cc, + cflagsMacro, + nasmflagsMacro ).c_str () ); } fprintf ( fMakefile, "\n" ); }
void -MingwModuleHandler::GenerateObjectFileTargetsHost ( const Module& module ) const +MingwModuleHandler::GenerateObjectFileTargets ( const Module& module, + const string& cc, + const string& cflagsMacro, + const string& nasmflagsMacro ) const { - GenerateObjectFileTargets ( module, - "${host_gcc}" ); + GenerateObjectFileTargets ( module, module.files, cc, cflagsMacro, nasmflagsMacro ); + for ( size_t i = 0; i < module.ifs.size(); i++ ) + GenerateObjectFileTargets ( module, module.ifs[i]->files, cc, cflagsMacro, nasmflagsMacro ); }
void -MingwModuleHandler::GenerateObjectFileTargetsTarget ( const Module& module ) const -{ - GenerateObjectFileTargets ( module, - "${gcc}" ); -} - -void MingwModuleHandler::GenerateArchiveTarget ( const Module& module, - const string& ar ) const + const string& ar, + const string& objs_macro ) const { string archiveFilename = GetModuleArchiveFilename ( module ); string sourceFilenames = GetSourceFilenames ( module ); - string objectsMacro = GenerateObjectList ( module ); fprintf ( fMakefile, "%s: %s\n", archiveFilename.c_str (), - objectsMacro.c_str ()); + objs_macro.c_str ());
fprintf ( fMakefile, "\t%s -rc %s %s\n\n", ar.c_str (), archiveFilename.c_str (), - objectsMacro.c_str ()); + objs_macro.c_str ()); }
void -MingwModuleHandler::GenerateArchiveTargetHost ( const Module& module ) const +MingwModuleHandler::GenerateMacrosAndTargets ( + const Module& module, + const string& cc, + const string& ar ) const { - GenerateArchiveTarget ( module, - "${host_ar}" ); + string cflagsMacro = ssprintf("%s_CFLAGS",module.name.c_str()); + string nasmflagsMacro = ssprintf("%s_NASMFLAGS",module.name.c_str()); + string objectsMacro = ssprintf("%s_OBJS",module.name.c_str()); + + GenerateMacros ( module, cflagsMacro, nasmflagsMacro, objectsMacro ); + + // future references to the macros will be to get their values + cflagsMacro = ssprintf("$(%s)",cflagsMacro.c_str()); + nasmflagsMacro = ssprintf("$(%s)",nasmflagsMacro.c_str()); + objectsMacro = ssprintf("$(%s)",objectsMacro.c_str()); + + GenerateArchiveTarget ( module, ar, objectsMacro ); + GenerateObjectFileTargets ( module, cc, cflagsMacro, nasmflagsMacro ); }
void -MingwModuleHandler::GenerateArchiveTargetTarget ( const Module& module ) const +MingwModuleHandler::GenerateMacrosAndTargetsHost ( const Module& module ) const { - GenerateArchiveTarget ( module, - "${ar}" ); + GenerateMacrosAndTargets ( module, "${host_gcc}", "${host_ar}" ); }
+void +MingwModuleHandler::GenerateMacrosAndTargetsTarget ( const Module& module ) const +{ + GenerateMacrosAndTargets ( module, "${gcc}", "${ar}" ); +} + string MingwModuleHandler::GetInvocationDependencies ( const Module& module ) const { @@ -514,30 +636,39 @@ } fprintf ( fMakefile, + ".PHONY: %s\n\n", + preconditionDependenciesName.c_str () ); + fprintf ( fMakefile, "%s: %s\n\n", preconditionDependenciesName.c_str (), dependencies.c_str () ); - fprintf ( fMakefile, - "%s: %s\n\n", - sourceFilenames.c_str (), - preconditionDependenciesName.c_str ()); - fprintf ( fMakefile, - ".PHONY: %s\n\n", - preconditionDependenciesName.c_str () ); + const char* p = sourceFilenames.c_str(); + const char* end = p + strlen(p); + while ( p < end ) + { + const char* p2 = &p[512]; + if ( p2 > end ) + p2 = end; + while ( p2 > p && !isspace(*p2) ) + --p2; + if ( p == p2 ) + { + p2 = strpbrk ( p, " \t" ); + if ( !p2 ) + p2 = end; + } + fprintf ( fMakefile, + "%.*s: %s\n", + p2-p, + p, + preconditionDependenciesName.c_str ()); + p = p2; + p += strspn ( p, " \t" ); + } + fprintf ( fMakefile, "\n" ); }
-string MingwModuleHandler::GenerateObjectList ( const Module& module ) const -{ - string macro ( ssprintf("%s_OBJS",module.name.c_str()) ); - fprintf ( - fMakefile, - "%s = %s\n", - macro.c_str(), - GetObjectFilenames(module).c_str() ); - return ssprintf("$(%s)",macro.c_str()); -}
- static MingwBuildToolModuleHandler buildtool_handler;
MingwBuildToolModuleHandler::MingwBuildToolModuleHandler() @@ -562,11 +693,10 @@ target.c_str (), archiveFilename.c_str () ); fprintf ( fMakefile, - "\t${host_gcc} -o %s %s\n", + "\t${host_gcc} -o %s %s\n\n", target.c_str (), archiveFilename.c_str () ); - GenerateArchiveTargetHost ( module ); - GenerateObjectFileTargetsHost ( module ); + GenerateMacrosAndTargetsHost ( module ); }
static MingwKernelModuleHandler kernelmodule_handler; @@ -628,11 +758,10 @@ archiveFilename.c_str (), importLibraryDependencies.c_str () ); fprintf ( fMakefile, - "\t${rm} %s\n", + "\t${rm} %s\n\n", temp_exp.c_str () ); - GenerateArchiveTargetTarget ( module ); - GenerateObjectFileTargetsTarget ( module ); + GenerateMacrosAndTargetsTarget ( module ); }
@@ -654,8 +783,7 @@ void MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ( const Module& module ) { - GenerateArchiveTargetTarget ( module ); - GenerateObjectFileTargetsTarget ( module ); + GenerateMacrosAndTargetsTarget ( module ); }
@@ -703,17 +831,16 @@ importLibraryDependencies.c_str () ); fprintf ( fMakefile, - "\t${gcc} -Wl,--subsystem,native -Wl,--entry,_DriverEntry@8 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll -o %s %s %s\n", + "\t${gcc} -Wl,--subsystem,native -Wl,--entry,_DriverEntry@8 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll -o %s %s %s\n\n", target.c_str (), archiveFilename.c_str (), importLibraryDependencies.c_str () ); - GenerateArchiveTargetTarget ( module ); - GenerateObjectFileTargetsTarget ( module ); + GenerateMacrosAndTargetsTarget ( module ); } else { - fprintf ( fMakefile, "%s:\n\n", + fprintf ( fMakefile, "%s:\n", target.c_str ()); fprintf ( fMakefile, ".PHONY: %s\n\n", target.c_str ()); @@ -765,13 +892,12 @@ importLibraryDependencies.c_str () ); fprintf ( fMakefile, - "\t${gcc} -Wl,--subsystem,native -Wl,--entry,_DllMainCRTStartup@12 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib -mdll -o %s %s %s\n", + "\t${gcc} -Wl,--subsystem,native -Wl,--entry,_DllMainCRTStartup@12 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib -mdll -o %s %s %s\n\n", target.c_str (), archiveFilename.c_str (), importLibraryDependencies.c_str () ); - GenerateArchiveTargetTarget ( module ); - GenerateObjectFileTargetsTarget ( module ); + GenerateMacrosAndTargetsTarget ( module ); } else { _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler .h --- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler .h 2005-01-12 05:01:49 UTC (rev 12943) +++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler .h 2005-01-12 06:02:58 UTC (rev 12944) @@ -30,15 +30,15 @@
std::string GetObjectFilename ( const std::string& sourceFilename ) const; std::string GetObjectFilenames ( const Module& module ) const; - void GenerateObjectFileTargetsHost ( const Module& module ) const; - void GenerateObjectFileTargetsTarget ( const Module& module ) const; - void GenerateArchiveTargetHost ( const Module& module ) const; - void GenerateArchiveTargetTarget ( const Module& module ) const; + void GenerateMacrosAndTargetsHost ( const Module& module ) const; + void GenerateMacrosAndTargetsTarget ( const Module& module ) const; std::string GetInvocationDependencies ( const Module& module ) const; std::string GetInvocationParameters ( const Invoke& invoke ) const; void GenerateInvocations ( const Module& module ) const; void GeneratePreconditionDependencies ( const Module& module ) const; - std::string GenerateObjectList ( const Module& module ) const; + std::string GenerateMacros ( const Module& module, + const std::string& cflags_macro, + const std::string& objs_macro ) const; static FILE* fMakefile; private: std::string ConcatenatePaths ( const std::string& path1, @@ -46,25 +46,53 @@ std::string GenerateGccDefineParametersFromVector ( const std::vector<Define*>& defines ) const; std::string GenerateGccDefineParameters ( const Module& module ) const; std::string GenerateGccIncludeParametersFromVector ( const std::vector<Include*>& includes ) const; + void GenerateMacros ( const Module& module, + const char* op, + const std::vector<File*>& files, + const std::vector<Include*>* includes, + const std::vector<Define*>& defines, + const std::string& cflags_macro, + const std::string& nasmflags_macro, + const std::string& objs_macro) const; + void GenerateMacros ( const Module& module, + const std::string& cflags_macro, + const std::string& nasmflags_macro, + const std::string& objs_macro) const; void GenerateGccModuleIncludeVariable ( const Module& module ) const; std::string GenerateGccIncludeParameters ( const Module& module ) const; std::string GenerateGccParameters ( const Module& module ) const; std::string GenerateNasmParameters ( const Module& module ) const; std::string GenerateGccCommand ( const Module& module, const std::string& sourceFilename, - const std::string& cc ) const; + const std::string& cc, + const std::string& cflagsMacro ) const; std::string GenerateGccAssemblerCommand ( const Module& module, const std::string& sourceFilename, - const std::string& cc ) const; + const std::string& cc, + const std::string& cflagsMacro ) const; std::string GenerateNasmCommand ( const Module& module, - const std::string& sourceFilename ) const; + const std::string& sourceFilename, + const std::string& nasmflagsMacro ) const; std::string GenerateCommand ( const Module& module, const std::string& sourceFilename, - const std::string& cc ) const; + const std::string& cc, + const std::string& cflagsMacro, + const std::string& nasmflagsMacro ) const; void GenerateObjectFileTargets ( const Module& module, - const std::string& cc ) const; + const std::vector<File*>& files, + const std::string& cc, + const std::string& cflagsMacro, + const std::string& nasmflagsMacro ) const; + void GenerateObjectFileTargets ( const Module& module, + const std::string& cc, + const std::string& cflagsMacro, + const std::string& nasmflagsMacro ) const; void GenerateArchiveTarget ( const Module& module, - const std::string& ar ) const; + const std::string& ar, + const std::string& objs_macro ) const; + void GenerateMacrosAndTargets ( const Module& module, + const std::string& cc, + const std::string& ar ) const; std::string GetPreconditionDependenciesName ( const Module& module ) const; };
_____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp 2005-01-12 05:01:49 UTC (rev 12943) +++ branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp 2005-01-12 06:02:58 UTC (rev 12944) @@ -63,6 +63,8 @@
delete invocations[i]; for ( i = 0; i < dependencies.size(); i++ ) delete dependencies[i]; + for ( i = 0; i < ifs.size(); i++ ) + delete ifs[i]; }
void @@ -83,21 +85,32 @@ invocations[i]->ProcessXML (); for ( i = 0; i < dependencies.size(); i++ ) dependencies[i]->ProcessXML (); + for ( i = 0; i < ifs.size(); i++ ) + ifs[i]->ProcessXML(); }
void Module::ProcessXMLSubElement ( const XMLElement& e, - const string& path ) + const string& path, + If* pIf /*= NULL*/ ) { bool subs_invalid = false; string subpath ( path ); if ( e.name == "file" && e.value.size () > 0 ) { - files.push_back ( new File ( FixSeparator ( path + CSEP + e.value ) ) ); + File* pFile = new File ( FixSeparator ( path + CSEP + e.value ) ); + if ( pIf ) + pIf->files.push_back ( pFile ); + else + files.push_back ( pFile ); subs_invalid = true; } else if ( e.name == "library" && e.value.size () ) { + if ( pIf ) + throw InvalidBuildFileException ( + e.location, + "<library> is not a valid sub-element of <if>" ); libraries.push_back ( new Library ( e, *this, e.value ) ); subs_invalid = true; } @@ -109,36 +122,66 @@ } else if ( e.name == "include" ) { + if ( pIf ) + throw InvalidBuildFileException ( + e.location, + "<include> is not a valid sub-element of <if>" ); includes.push_back ( new Include ( project, this, e ) ); subs_invalid = true; } else if ( e.name == "define" ) { - defines.push_back ( new Define ( project, this, e ) ); + Define* pDefine = new Define ( project, this, e ); + if ( pIf ) + pIf->defines.push_back ( pDefine ); + else + defines.push_back ( pDefine ); subs_invalid = true; } else if ( e.name == "invoke" ) { + if ( pIf ) + throw InvalidBuildFileException ( + e.location, + "<invoke> is not a valid sub-element of <if>" ); invocations.push_back ( new Invoke ( e, *this ) ); subs_invalid = false; } else if ( e.name == "dependency" ) { + if ( pIf ) + throw InvalidBuildFileException ( + e.location, + "<dependency> is not a valid sub-element of <if>" ); dependencies.push_back ( new Dependency ( e, *this ) ); subs_invalid = true; } else if ( e.name == "importlibrary" ) { + if ( pIf ) + throw InvalidBuildFileException ( + e.location, + "<importlibrary> is not a valid sub-element of <if>" ); + if ( importLibrary ) + throw InvalidBuildFileException ( + e.location, + "Only one <importlibrary> is valid per module" ); importLibrary = new ImportLibrary ( e, *this ); subs_invalid = true; } + else if ( e.name == "if" ) + { + pIf = new If ( e, *this ); + ifs.push_back ( pIf ); + 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 ); + ProcessXMLSubElement ( *e.subElements[i], subpath, pIf ); }
ModuleType @@ -188,14 +231,23 @@ string Module::GetDependencyPath () const { - if ( type == KernelModeDLL ) + switch ( type ) + { + case KernelModeDLL: return ssprintf ( "dk%snkm%slib%slib%s.a", SSEP, SSEP, SSEP, name.c_str () ); - else - return GetPath (); + case NativeDLL: + return ssprintf ( "dk%sw32%slib%slib%s.a", + SSEP, + SSEP, + SSEP, + name.c_str () ); + default: + return GetPath(); + } }
string @@ -425,5 +477,36 @@
att = _node.GetAttribute ( "definition", true ); assert (att); - definition = att->value; + definition = FixSeparator(att->value); } + + +If::If ( const XMLElement& node_, const Module& module_ ) + : node(node_), module(module_) +{ + const XMLAttribute* att; + + att = node.GetAttribute ( "property", true ); + assert(att); + property = att->value; + + att = node.GetAttribute ( "value", true ); + assert(att); + value = att->value; +} + +If::~If () +{ + size_t i; + for ( i = 0; i < files.size(); i++ ) + delete files[i]; + for ( i = 0; i < defines.size(); i++ ) + delete defines[i]; + for ( i = 0; i < ifs.size(); i++ ) + delete ifs[i]; +} + +void +If::ProcessXML() +{ +} _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h --- branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h 2005-01-12 05:01:49 UTC (rev 12943) +++ branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h 2005-01-12 06:02:58 UTC (rev 12944) @@ -31,6 +31,7 @@
class InvokeFile; class Dependency; class ImportLibrary; +class If;
class Project { @@ -86,6 +87,7 @@ std::vector<Define*> defines; std::vector<Invoke*> invocations; std::vector<Dependency*> dependencies; + std::vector<If*> ifs;
Module ( const Project& project, const XMLElement& moduleNode, @@ -104,7 +106,8 @@ private: std::string GetDefaultModuleExtension () const; void ProcessXMLSubElement ( const XMLElement& e, - const std::string& path ); + const std::string& path, + If* pIf = NULL ); };
@@ -239,6 +242,23 @@ void ProcessXML (); };
+class If +{ +public: + const XMLElement& node; + const Module& module; + std::string property, value; + std::vector<File*> files; + std::vector<Define*> defines; + std::vector<If*> ifs; + + If ( const XMLElement& node_, + const Module& module_ ); + ~If(); + + void ProcessXML(); +}; + extern std::string FixSeparator ( const std::string& s );