Support define overriding in child .rbuild files

See issue #2745 for more details.

svn path=/trunk/; revision=29681
This commit is contained in:
Hervé Poussineau 2007-10-19 13:24:06 +00:00
parent 7b57d6a08d
commit e7d0bd05c2
4 changed files with 61 additions and 41 deletions

View file

@ -372,35 +372,31 @@ MingwBackend::GenerateHeader () const
ProjectNode.GetProjectFilename ().c_str () ); ProjectNode.GetProjectFilename ().c_str () );
} }
string
MingwBackend::GenerateIncludesAndDefines ( IfableData& data ) const
{
set<string> used_defs;
string includeParameters = MingwModuleHandler::GenerateGccIncludeParametersFromVector ( data.includes );
string defineParameters = MingwModuleHandler::GenerateGccDefineParametersFromVector ( data.defines, used_defs );
return includeParameters + " " + defineParameters;
}
void void
MingwBackend::GenerateProjectCFlagsMacro ( const char* assignmentOperation, MingwBackend::GenerateProjectCFlagsMacro ( const char* assignmentOperation,
IfableData& data ) const const IfableData& data ) const
{ {
fprintf ( set<string> used_defs;
fMakefile,
"PROJECT_CFLAGS %s",
assignmentOperation );
fprintf ( fMakefile,
" %s",
GenerateIncludesAndDefines ( data ).c_str() );
fprintf ( fMakefile, "\n" ); if ( data.includes.size () > 0 )
fprintf (
fMakefile,
"PROJECT_CFLAGS %s %s\n",
assignmentOperation,
MingwModuleHandler::GenerateGccIncludeParametersFromVector ( data.includes ).c_str ());
if ( data.defines.size () > 0 )
fprintf (
fMakefile,
"PROJECT_CDEFINES %s %s\n",
assignmentOperation,
MingwModuleHandler::GenerateGccDefineParametersFromVector ( data.defines, used_defs ).c_str ());
} }
void void
MingwBackend::GenerateGlobalCFlagsAndProperties ( MingwBackend::GenerateGlobalCFlagsAndProperties (
const char* assignmentOperation, const char* assignmentOperation,
IfableData& data ) const const IfableData& data ) const
{ {
size_t i; size_t i;
@ -420,7 +416,7 @@ MingwBackend::GenerateGlobalCFlagsAndProperties (
for ( i = 0; i < data.ifs.size(); i++ ) for ( i = 0; i < data.ifs.size(); i++ )
{ {
If& rIf = *data.ifs[i]; const If& rIf = *data.ifs[i];
if ( rIf.data.defines.size() if ( rIf.data.defines.size()
|| rIf.data.includes.size() || rIf.data.includes.size()
|| rIf.data.ifs.size() ) || rIf.data.ifs.size() )
@ -523,8 +519,8 @@ MingwBackend::GenerateGlobalVariables () const
GenerateGlobalCFlagsAndProperties ( "=", ProjectNode.non_if_data ); GenerateGlobalCFlagsAndProperties ( "=", ProjectNode.non_if_data );
GenerateProjectGccOptions ( "=", ProjectNode.non_if_data ); GenerateProjectGccOptions ( "=", ProjectNode.non_if_data );
fprintf ( fMakefile, "PROJECT_RCFLAGS := $(PROJECT_CFLAGS)\n" ); fprintf ( fMakefile, "PROJECT_RCFLAGS := $(PROJECT_CFLAGS) $(PROJECT_CDEFINES)\n" );
fprintf ( fMakefile, "PROJECT_WIDLFLAGS := $(PROJECT_CFLAGS)\n" ); fprintf ( fMakefile, "PROJECT_WIDLFLAGS := $(PROJECT_CFLAGS) $(PROJECT_CDEFINES)\n" );
fprintf ( fMakefile, "PROJECT_LFLAGS := %s\n", fprintf ( fMakefile, "PROJECT_LFLAGS := %s\n",
GenerateProjectLFLAGS ().c_str () ); GenerateProjectLFLAGS ().c_str () );
fprintf ( fMakefile, "PROJECT_CFLAGS += -Wall\n" ); fprintf ( fMakefile, "PROJECT_CFLAGS += -Wall\n" );

View file

@ -62,11 +62,10 @@ private:
void CreateMakefile (); void CreateMakefile ();
void CloseMakefile () const; void CloseMakefile () const;
void GenerateHeader () const; void GenerateHeader () const;
std::string GenerateIncludesAndDefines ( IfableData& data ) const;
void GenerateProjectCFlagsMacro ( const char* assignmentOperation, void GenerateProjectCFlagsMacro ( const char* assignmentOperation,
IfableData& data ) const; const IfableData& data ) const;
void GenerateGlobalCFlagsAndProperties ( const char* op, void GenerateGlobalCFlagsAndProperties ( const char* op,
IfableData& data ) const; const IfableData& data ) const;
void GenerateProjectGccOptionsMacro ( const char* assignmentOperation, void GenerateProjectGccOptionsMacro ( const char* assignmentOperation,
IfableData& data ) const; IfableData& data ) const;
void GenerateProjectGccOptions ( const char* assignmentOperation, void GenerateProjectGccOptions ( const char* assignmentOperation,

View file

@ -629,7 +629,7 @@ MingwModuleHandler::GetObjectFilenames ()
/* static */ string /* static */ string
MingwModuleHandler::GenerateGccDefineParametersFromVector ( MingwModuleHandler::GenerateGccDefineParametersFromVector (
const vector<Define*>& defines, const vector<Define*>& defines,
set<string>& used_defs) set<string>& used_defs)
{ {
string parameters; string parameters;
@ -640,8 +640,8 @@ MingwModuleHandler::GenerateGccDefineParametersFromVector (
continue; continue;
if (parameters.length () > 0) if (parameters.length () > 0)
parameters += " "; parameters += " ";
if (define.name.find('(') != string::npos) if (define.name.find('(') != string::npos)
parameters += "$(QT)"; parameters += "$(QT)";
parameters += "-D"; parameters += "-D";
parameters += define.name; parameters += define.name;
if (define.value.length () > 0) if (define.value.length () > 0)
@ -649,8 +649,8 @@ MingwModuleHandler::GenerateGccDefineParametersFromVector (
parameters += "="; parameters += "=";
parameters += define.value; parameters += define.value;
} }
if (define.name.find('(') != string::npos) if (define.name.find('(') != string::npos)
parameters += "$(QT)"; parameters += "$(QT)";
used_defs.insert(used_defs.begin(),define.name); used_defs.insert(used_defs.begin(),define.name);
} }
return parameters; return parameters;
@ -659,7 +659,7 @@ MingwModuleHandler::GenerateGccDefineParametersFromVector (
string string
MingwModuleHandler::GenerateGccDefineParameters () const MingwModuleHandler::GenerateGccDefineParameters () const
{ {
set<string> used_defs; set<string> used_defs;
string parameters = GenerateGccDefineParametersFromVector ( module.project.non_if_data.defines, used_defs ); string parameters = GenerateGccDefineParametersFromVector ( module.project.non_if_data.defines, used_defs );
string s = GenerateGccDefineParametersFromVector ( module.non_if_data.defines, used_defs ); string s = GenerateGccDefineParametersFromVector ( module.non_if_data.defines, used_defs );
if ( s.length () > 0 ) if ( s.length () > 0 )
@ -765,7 +765,8 @@ void
MingwModuleHandler::GenerateMacro ( MingwModuleHandler::GenerateMacro (
const char* assignmentOperation, const char* assignmentOperation,
const string& macro, const string& macro,
const IfableData& data ) const IfableData& data,
set<string> *used_defs )
{ {
size_t i; size_t i;
bool generateAssignment; bool generateAssignment;
@ -806,7 +807,14 @@ MingwModuleHandler::GenerateMacro (
} }
for ( i = 0; i < data.defines.size(); i++ ) for ( i = 0; i < data.defines.size(); i++ )
{ {
Define& d = *data.defines[i]; const Define& d = *data.defines[i];
if (used_defs && used_defs->find(d.name) != used_defs->end())
{
if ( backend->configuration.Verbose )
printf("%s define overridden in '%s' module\n",
d.name.c_str (), module.name.c_str () );
continue;
}
fprintf ( fprintf (
fMakefile, fMakefile,
" -D%s", " -D%s",
@ -816,6 +824,8 @@ MingwModuleHandler::GenerateMacro (
fMakefile, fMakefile,
"=%s", "=%s",
d.value.c_str() ); d.value.c_str() );
if (used_defs)
used_defs->insert(used_defs->begin(), d.name);
} }
if ( generateAssignment ) if ( generateAssignment )
{ {
@ -827,16 +837,19 @@ void
MingwModuleHandler::GenerateMacros ( MingwModuleHandler::GenerateMacros (
const char* assignmentOperation, const char* assignmentOperation,
const IfableData& data, const IfableData& data,
const vector<LinkerFlag*>* linkerFlags ) const vector<LinkerFlag*>* linkerFlags,
set<string>& used_defs )
{ {
size_t i; size_t i;
GenerateMacro ( assignmentOperation, GenerateMacro ( assignmentOperation,
cflagsMacro, cflagsMacro,
data ); data,
&used_defs );
GenerateMacro ( assignmentOperation, GenerateMacro ( assignmentOperation,
windresflagsMacro, windresflagsMacro,
data ); data,
NULL );
if ( linkerFlags != NULL ) if ( linkerFlags != NULL )
{ {
@ -886,7 +899,8 @@ MingwModuleHandler::GenerateMacros (
GenerateMacros ( GenerateMacros (
"+=", "+=",
rIf.data, rIf.data,
NULL ); NULL,
used_defs );
fprintf ( fprintf (
fMakefile, fMakefile,
"endif\n\n" ); "endif\n\n" );
@ -2020,6 +2034,8 @@ MingwModuleHandler::GetRpcHeaderDependencies (
void void
MingwModuleHandler::GenerateOtherMacros () MingwModuleHandler::GenerateOtherMacros ()
{ {
set<string> used_defs;
cflagsMacro = ssprintf ("%s_CFLAGS", module.name.c_str ()); cflagsMacro = ssprintf ("%s_CFLAGS", module.name.c_str ());
nasmflagsMacro = ssprintf ("%s_NASMFLAGS", module.name.c_str ()); nasmflagsMacro = ssprintf ("%s_NASMFLAGS", module.name.c_str ());
windresflagsMacro = ssprintf ("%s_RCFLAGS", module.name.c_str ()); windresflagsMacro = ssprintf ("%s_RCFLAGS", module.name.c_str ());
@ -2031,7 +2047,14 @@ MingwModuleHandler::GenerateOtherMacros ()
GenerateMacros ( GenerateMacros (
"=", "=",
module.non_if_data, module.non_if_data,
&module.linkerFlags ); &module.linkerFlags,
used_defs );
GenerateMacros (
"+=",
module.project.non_if_data,
NULL,
used_defs );
vector<FileLocation> s; vector<FileLocation> s;
if ( module.importLibrary ) if ( module.importLibrary )

View file

@ -136,10 +136,12 @@ private:
std::string GenerateLinkerParameters () const; std::string GenerateLinkerParameters () const;
void GenerateMacro ( const char* assignmentOperation, void GenerateMacro ( const char* assignmentOperation,
const std::string& macro, const std::string& macro,
const IfableData& data ); const IfableData& data,
std::set<std::string>* used_defs );
void GenerateMacros ( const char* op, void GenerateMacros ( const char* op,
const IfableData& data, const IfableData& data,
const std::vector<LinkerFlag*>* linkerFlags ); const std::vector<LinkerFlag*>* linkerFlags,
std::set<std::string>& used_defs );
void GenerateSourceMacros ( const char* assignmentOperation, void GenerateSourceMacros ( const char* assignmentOperation,
const IfableData& data ); const IfableData& data );
void GenerateObjectMacros ( const char* assignmentOperation, void GenerateObjectMacros ( const char* assignmentOperation,