From 69251b5abf1fde4e7a5a78ebb525ee5e5d680f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Mon, 5 Nov 2007 08:57:04 +0000 Subject: [PATCH] Better error reporting in case of define override Support empty defines svn path=/trunk/; revision=30149 --- .../rbuild/backend/mingw/modulehandler.cpp | 57 +++++++++++-------- .../rbuild/backend/mingw/modulehandler.h | 4 +- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/reactos/tools/rbuild/backend/mingw/modulehandler.cpp b/reactos/tools/rbuild/backend/mingw/modulehandler.cpp index c0d4611e10b..60c41897301 100644 --- a/reactos/tools/rbuild/backend/mingw/modulehandler.cpp +++ b/reactos/tools/rbuild/backend/mingw/modulehandler.cpp @@ -644,11 +644,8 @@ MingwModuleHandler::GenerateGccDefineParametersFromVector ( parameters += "$(QT)"; parameters += "-D"; parameters += define.name; - if (define.value.length () > 0) - { - parameters += "="; - parameters += define.value; - } + parameters += "="; + parameters += define.value; if (define.name.find('(') != string::npos) parameters += "$(QT)"; used_defs.insert(used_defs.begin(),define.name); @@ -766,7 +763,7 @@ MingwModuleHandler::GenerateMacro ( const char* assignmentOperation, const string& macro, const IfableData& data, - set *used_defs, + set *used_defs, bool generatingCompilerMacro ) { size_t i; @@ -814,32 +811,42 @@ MingwModuleHandler::GenerateMacro ( for ( i = 0; i < data.defines.size(); i++ ) { const Define& define = *data.defines[i]; - if ( used_defs && used_defs->find ( define.name ) != used_defs->end () ) + if ( used_defs ) { - if ( !define.overridable ) + set::const_iterator last_define; + for (last_define = used_defs->begin (); + last_define != used_defs->end (); + last_define++) { - throw InvalidOperationException ( __FILE__, - __LINE__, - "Invalid override of define '%s' in module '%s'", - define.name.c_str (), - module.name.c_str () ); + if ( (*last_define)->name != define.name ) + continue; + if ( !define.overridable ) + { + throw InvalidOperationException ( define.node->location.c_str (), + 0, + "Invalid override of define '%s', already defined at %s", + define.name.c_str (), + (*last_define)->node->location.c_str () ); + } + if ( backend->configuration.Verbose ) + printf("%s: Overriding '%s' already defined at %s\n", + (*last_define)->node->location.c_str (), define.name.c_str (), + define.node->location.c_str () ); + break; } - if ( backend->configuration.Verbose ) - printf("Define '%s' overridden in module '%s'\n", - define.name.c_str (), module.name.c_str () ); - continue; + if ( last_define != used_defs->end () ) + continue; } fprintf ( fMakefile, " -D%s", define.name.c_str() ); - if ( define.value.size() ) - fprintf ( - fMakefile, - "=%s", - define.value.c_str() ); + fprintf ( + fMakefile, + "=%s", + define.value.c_str() ); if ( used_defs ) - used_defs->insert(used_defs->begin(), define.name); + used_defs->insert( used_defs->begin (), &define ); } if ( generateAssignment ) { @@ -852,7 +859,7 @@ MingwModuleHandler::GenerateMacros ( const char* assignmentOperation, const IfableData& data, const vector* linkerFlags, - set& used_defs ) + set& used_defs ) { size_t i; @@ -2050,7 +2057,7 @@ MingwModuleHandler::GetRpcHeaderDependencies ( void MingwModuleHandler::GenerateOtherMacros () { - set used_defs; + set used_defs; cflagsMacro = ssprintf ("%s_CFLAGS", module.name.c_str ()); nasmflagsMacro = ssprintf ("%s_NASMFLAGS", module.name.c_str ()); diff --git a/reactos/tools/rbuild/backend/mingw/modulehandler.h b/reactos/tools/rbuild/backend/mingw/modulehandler.h index 48e04de92a2..00da1e754e3 100644 --- a/reactos/tools/rbuild/backend/mingw/modulehandler.h +++ b/reactos/tools/rbuild/backend/mingw/modulehandler.h @@ -137,12 +137,12 @@ private: void GenerateMacro ( const char* assignmentOperation, const std::string& macro, const IfableData& data, - std::set* used_defs, + std::set* used_defs, bool generatingCompilerMacro ); void GenerateMacros ( const char* op, const IfableData& data, const std::vector* linkerFlags, - std::set& used_defs ); + std::set& used_defs ); void GenerateSourceMacros ( const char* assignmentOperation, const IfableData& data ); void GenerateObjectMacros ( const char* assignmentOperation,