Add Rule class, which writes to Makefile how to handle a source file

Later, hardcoded rules should be read from .rbuild files

svn path=/trunk/; revision=32226
This commit is contained in:
Hervé Poussineau 2008-02-08 19:10:19 +00:00
parent 1086d26c56
commit 1d39ac6bc4
5 changed files with 250 additions and 221 deletions

View file

@ -22,6 +22,7 @@
#include "../../rbuild.h"
#include "mingw.h"
#include "modulehandler.h"
#include "rule.h"
using std::set;
using std::string;
@ -1245,6 +1246,43 @@ MingwModuleHandler::GetPrecompiledHeaderFilename () const
ReplaceExtension ( module.pch->file.name, "_" + module.name + ".gch" ) );
}
Rule gasRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source) $(module_rbuild) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
"\t$(ECHO_GAS)\n"
"\t${gcc} -x assembler-with-cpp -c $< -o $@ -D__ASM__ $($(module_name)_CFLAGS)\n",
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o",
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
Rule bootRule ( "$(module_output): $(source) $(module_rbuild) | $(OUTPUT)$(SEP)$(source_dir)\n"
"\t$(ECHO_NASM)\n"
"\t$(Q)${nasm} -f win32 $< -o $@ $($(module_name)_NASMFLAGS)\n",
"$(OUTPUT)$(SEP)$(source_dir)$(SEP)", NULL );
Rule nasmRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source) $(module_rbuild) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
"\t$(ECHO_NASM)\n"
"\t$(Q)${nasm} -f win32 $< -o $@ $($(module_name)_NASMFLAGS)\n",
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o",
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
Rule windresRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).coff: $(source) $(module_rbuild) $(WRC_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
"\t$(ECHO_WRC)\n"
"\t${gcc} -xc -E -DRC_INVOKED ${$(module_name)_RCFLAGS} $(source) > $(TEMPORARY)$(SEP)$(module_name).$(source_name_noext).rci.tmp\n"
"\t$(Q)$(WRC_TARGET) ${$(module_name)_RCFLAGS} $(TEMPORARY)$(SEP)$(module_name).$(source_name_noext).rci.tmp $(TEMPORARY)$(SEP)$(module_name).$(source_name_noext).res.tmp\n"
"\t-@${rm} $(TEMPORARY)$(SEP)$(module_name).$(source_name_noext).rci.tmp 2>$(NUL)\n"
"\t${windres} $(TEMPORARY)$(SEP)$(module_name).$(source_name_noext).res.tmp -o $@\n"
"\t-@${rm} $(TEMPORARY)$(SEP)$(module_name).$(source_name_noext).res.tmp 2>$(NUL)\n",
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).coff",
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
Rule wmcRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).rc $(INTERMEDIATE)$(SEP)include$(SEP)reactos$(SEP)$(source_name_noext).h: $(WMC_TARGET) $(source)\n"
"\t$(ECHO_WMC)\n"
"\t$(Q)$(WMC_TARGET) -i -H $(INTERMEDIATE)$(SEP)include$(SEP)reactos$(SEP)$(source_name_noext).h -o $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).rc $(source)\n",
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).rc", "$(INTERMEDIATE)$(SEP)include$(SEP)reactos$(SEP)$(source_name_noext).h", NULL );
Rule winebuildRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec.def: $(source) $(module_rbuild) $(WINEBUILD_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
"\t$(ECHO_WINEBLD)\n"
"\t$(Q)$(WINEBUILD_TARGET) -o $(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext).spec.def --def -E $(source_path)$(SEP)$(source_name_noext).spec\n"
"$(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext).stubs.c: $(source_path)$(SEP)$(source_name_noext).spec $(WINEBUILD_TARGET)\n"
"\t$(ECHO_WINEBLD)\n"
"\t$(Q)$(WINEBUILD_TARGET) -o $(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext).stubs.c --pedll $(source_path)$(SEP)$(source_name_noext).spec\n",
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec.def",
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).stubs.c",
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
void
MingwModuleHandler::GenerateGccCommand (
const FileLocation* sourceFile,
@ -1286,175 +1324,7 @@ MingwModuleHandler::GenerateGccCommand (
delete pchFilename;
}
void
MingwModuleHandler::GenerateGccAssemblerCommand (
const FileLocation* sourceFile,
const string& cc,
const string& cflagsMacro )
{
string dependencies = backend->GetFullName ( *sourceFile );
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
const FileLocation *objectFilename = GetObjectFilename (
sourceFile, module, &clean_files );
fprintf ( fMakefile,
"%s: %s | %s\n",
backend->GetFullName ( *objectFilename ).c_str (),
dependencies.c_str (),
backend->GetFullPath ( *objectFilename ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_GAS)\n" );
fprintf ( fMakefile,
"\t%s -x assembler-with-cpp -c $< -o $@ -D__ASM__ %s\n",
cc.c_str (),
cflagsMacro.c_str () );
delete objectFilename;
}
void
MingwModuleHandler::GenerateNasmCommand (
const FileLocation* sourceFile,
const string& nasmflagsMacro )
{
string dependencies = backend->GetFullName ( *sourceFile );
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
const FileLocation *objectFilename = GetObjectFilename (
sourceFile, module, &clean_files );
fprintf ( fMakefile,
"%s: %s | %s\n",
backend->GetFullName ( *objectFilename ).c_str (),
dependencies.c_str (),
backend->GetFullPath ( *objectFilename ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_NASM)\n" );
fprintf ( fMakefile,
"\t%s -f win32 $< -o $@ %s\n",
"$(Q)${nasm}",
nasmflagsMacro.c_str () );
delete objectFilename;
}
void
MingwModuleHandler::GenerateWindresCommand (
const FileLocation* sourceFile,
const string& windresflagsMacro )
{
string dependencies = backend->GetFullName ( *sourceFile );
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
const FileLocation *objectFilename = GetObjectFilename ( sourceFile, module, &clean_files );
string sourceFilenamePart = module.name + "." + ReplaceExtension ( sourceFile->name, "" );
FileLocation rciFilename ( TemporaryDirectory,
"",
sourceFilenamePart + ".rci.tmp" );
FileLocation resFilename ( TemporaryDirectory,
"",
sourceFilenamePart + ".res.tmp" );
fprintf ( fMakefile,
"%s: %s $(WRC_TARGET) | %s\n",
backend->GetFullName ( *objectFilename ).c_str (),
dependencies.c_str (),
backend->GetFullPath ( *objectFilename ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_WRC)\n" );
fprintf ( fMakefile,
"\t${gcc} -xc -E -DRC_INVOKED ${%s} %s > %s\n",
windresflagsMacro.c_str (),
backend->GetFullName ( *sourceFile ).c_str (),
backend->GetFullName ( rciFilename ).c_str () );
fprintf ( fMakefile,
"\t$(Q)$(WRC_TARGET) ${%s} %s %s\n",
windresflagsMacro.c_str (),
backend->GetFullName ( rciFilename ).c_str (),
backend->GetFullName ( resFilename ).c_str () );
fprintf ( fMakefile,
"\t-@${rm} %s 2>$(NUL)\n",
backend->GetFullName ( rciFilename ).c_str () );
fprintf ( fMakefile,
"\t${windres} %s -o $@\n",
backend->GetFullName ( resFilename ).c_str () );
fprintf ( fMakefile,
"\t-@${rm} %s 2>$(NUL)\n",
backend->GetFullName ( resFilename ).c_str () );
delete objectFilename;
}
void
MingwModuleHandler::GenerateWinebuildCommands (
const FileLocation* sourceFile )
{
string dependencies = backend->GetFullName ( *sourceFile );
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
string basename = GetBasename ( sourceFile->name );
FileLocation def_file ( IntermediateDirectory,
sourceFile->relative_path,
basename + ".spec.def" );
CLEAN_FILE ( def_file );
const FileLocation *stub_file = GetActualSourceFilename ( sourceFile );
CLEAN_FILE ( *stub_file );
fprintf ( fMakefile,
"%s: %s $(WINEBUILD_TARGET) | %s\n",
backend->GetFullName ( def_file ).c_str (),
dependencies.c_str (),
backend->GetFullPath ( def_file ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_WINEBLD)\n" );
fprintf ( fMakefile,
"\t%s -o %s --def -E %s\n",
"$(Q)$(WINEBUILD_TARGET)",
backend->GetFullName ( def_file ).c_str (),
backend->GetFullName ( *sourceFile ).c_str () );
fprintf ( fMakefile,
"%s: %s $(WINEBUILD_TARGET)\n",
backend->GetFullName ( *stub_file ).c_str (),
backend->GetFullName ( *sourceFile ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_WINEBLD)\n" );
fprintf ( fMakefile,
"\t%s -o %s --pedll %s\n",
"$(Q)$(WINEBUILD_TARGET)",
backend->GetFullName ( *stub_file ).c_str (),
backend->GetFullName ( *sourceFile ).c_str () );
delete stub_file;
}
void
MingwModuleHandler::GenerateWmcCommands (
const FileLocation* sourceFile )
{
string dependencies = backend->GetFullName ( *sourceFile );
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
string basename = GetBasename ( sourceFile->name );
FileLocation rc_file ( IntermediateDirectory,
sourceFile->relative_path,
basename + ".rc" );
FileLocation h_file ( IntermediateDirectory,
"include/reactos",
basename + ".h" );
CLEAN_FILE ( rc_file );
CLEAN_FILE ( h_file );
fprintf ( fMakefile,
"%s %s: $(WMC_TARGET) %s\n",
backend->GetFullName ( rc_file ).c_str (),
backend->GetFullName ( h_file ).c_str (),
backend->GetFullName ( *sourceFile ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_WMC)\n" );
fprintf ( fMakefile,
"\t%s -i -H %s -o %s %s\n",
"$(Q)$(WMC_TARGET)",
backend->GetFullName ( h_file ).c_str (),
backend->GetFullName ( rc_file ).c_str (),
backend->GetFullName ( *sourceFile ).c_str () );
}
string
const std::string&
MingwModuleHandler::GetWidlFlags ( const CompilationUnit& compilationUnit )
{
return compilationUnit.GetSwitches ();
@ -1722,9 +1592,43 @@ MingwModuleHandler::GenerateCommands (
{
const FileLocation& sourceFile = compilationUnit.GetFilename ();
string extension = GetExtension ( sourceFile );
std::transform ( extension.begin (), extension.end (), extension.begin (), tolower );
struct
{
HostType host;
ModuleType type;
string extension;
Rule* rule;
} rules[] = {
{ HostDontCare, TypeDontCare, ".s", &gasRule },
{ HostDontCare, BootSector, ".asm", &bootRule },
{ HostDontCare, TypeDontCare, ".asm", &nasmRule },
{ HostDontCare, TypeDontCare, ".rc", &windresRule },
{ HostDontCare, TypeDontCare, ".mc", &wmcRule },
{ HostDontCare, TypeDontCare, ".spec", &winebuildRule },
};
size_t i;
Rule *customRule = NULL;
for ( i = 0; i < sizeof ( rules ) / sizeof ( rules[0] ); i++ )
{
if ( rules[i].host != HostDontCare && rules[i].host != module.host )
continue;
if ( rules[i].type != TypeDontCare && rules[i].type != module.type )
continue;
if ( rules[i].extension != extension )
continue;
customRule = rules[i].rule;
break;
}
if ( customRule )
customRule->Execute ( fMakefile, backend, module, &sourceFile, clean_files );
string flags = cflagsMacro;
flags += " ";
if ( extension == ".c" || extension == ".C" )
if ( extension == ".c" )
{
flags += GenerateCompilerParametersFromVector ( module.non_if_data.compilerFlags , CompilerTypeCC );
GenerateGccCommand ( &sourceFile,
@ -1732,9 +1636,9 @@ MingwModuleHandler::GenerateCommands (
cc,
flags );
}
else if ( extension == ".cc" || extension == ".CC" ||
extension == ".cpp" || extension == ".CPP" ||
extension == ".cxx" || extension == ".CXX" )
else if ( extension == ".cc" ||
extension == ".cpp" ||
extension == ".cxx" )
{
flags += GenerateCompilerParametersFromVector ( module.non_if_data.compilerFlags , CompilerTypeCPP );
GenerateGccCommand ( &sourceFile,
@ -1742,35 +1646,14 @@ MingwModuleHandler::GenerateCommands (
cppc,
flags );
}
else if ( extension == ".s" || extension == ".S" )
else if ( extension == ".spec" )
{
GenerateGccAssemblerCommand ( &sourceFile,
cc,
cflagsMacro );
}
else if ( extension == ".asm" || extension == ".ASM" )
{
GenerateNasmCommand ( &sourceFile,
nasmflagsMacro );
}
else if ( extension == ".rc" || extension == ".RC" )
{
GenerateWindresCommand ( &sourceFile,
windresflagsMacro );
}
else if ( extension == ".mc" || extension == ".MC" )
{
GenerateWmcCommands ( &sourceFile );
}
else if ( extension == ".spec" || extension == ".SPEC" )
{
GenerateWinebuildCommands ( &sourceFile );
GenerateGccCommand ( &sourceFile,
extraDependencies,
cc,
cflagsMacro );
}
else if ( extension == ".idl" || extension == ".IDL" )
else if ( extension == ".idl" )
{
GenerateWidlCommands ( compilationUnit,
widlflagsMacro );
@ -1782,7 +1665,7 @@ MingwModuleHandler::GenerateCommands (
cflagsMacro );
}
}
else
else if ( !customRule )
{
throw InvalidOperationException ( __FILE__,
__LINE__,

View file

@ -155,16 +155,7 @@ private:
const std::string& extraDependencies,
const std::string& cc,
const std::string& cflagsMacro );
void GenerateGccAssemblerCommand ( const FileLocation* sourceFile,
const std::string& cc,
const std::string& cflagsMacro );
void GenerateNasmCommand ( const FileLocation* sourceFile,
const std::string& nasmflagsMacro );
void GenerateWindresCommand ( const FileLocation* sourceFile,
const std::string& windresflagsMacro );
void GenerateWinebuildCommands ( const FileLocation* sourceFile );
void GenerateWmcCommands ( const FileLocation* sourceFile);
std::string GetWidlFlags ( const CompilationUnit& compilationUnit );
const std::string& GetWidlFlags ( const CompilationUnit& compilationUnit );
void GenerateWidlCommandsServer (
const CompilationUnit& compilationUnit,
const std::string& widlflagsMacro );

View file

@ -0,0 +1,117 @@
/*
* Copyright (C) 2008 Hervé Poussineau
*
* 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"
#include "modulehandler.h"
#include "rule.h"
using std::string;
static void
ReplaceVariable( string& str,
const string& name,
const string& value )
{
size_t i = str.find ( name );
while ( i != string::npos )
{
str.replace ( i, name.length (), value );
i = str.find ( name );
}
}
static std::string
FixString ( const string& str, Backend *backend, const Module& module, const FileLocation *source )
{
string ret = str;
if ( source )
{
ReplaceVariable ( ret, "$(source_noext)", ReplaceExtension ( backend->GetFullName ( *source ), "" ) );
ReplaceVariable ( ret, "$(source)", backend->GetFullName ( *source ) );
ReplaceVariable ( ret, "$(source_dir)", source->relative_path );
ReplaceVariable ( ret, "$(source_name)", source->name );
ReplaceVariable ( ret, "$(source_name_noext)", ReplaceExtension ( source->name , "" ) );
ReplaceVariable ( ret, "$(source_path)", backend->GetFullPath ( *source ) );
}
ReplaceVariable ( ret, "$(module_name)", module.name );
ReplaceVariable ( ret, "$(module_rbuild)", module.xmlbuildFile );
ReplaceVariable ( ret, "$(module_output)", GetTargetMacro ( module, true ) );
ReplaceVariable ( ret, "$(SEP)", sSep );
return ret;
}
Rule::Rule( const std::string& command, const char *generatedFile1, ... )
: command ( command )
{
va_list ap;
const char *s;
s = generatedFile1;
va_start ( ap, generatedFile1 );
while ( s )
{
generatedFiles.push_back ( s );
s = va_arg ( ap, const char* );
}
va_end ( ap );
}
void Rule::Execute ( FILE *outputFile,
MingwBackend *backend,
const Module& module,
const FileLocation *source,
string_list& clean_files )
{
string cmd = FixString ( command, backend, module, source );
fprintf ( outputFile, "%s", cmd.c_str () );
for ( size_t i = 0; i < generatedFiles.size (); i++ )
{
string file = FixString ( generatedFiles[i], backend, module, source );
if ( file[file.length () - 1] != cSep )
{
clean_files.push_back ( file );
continue;
}
if ( file[0] != '$' )
throw InvalidOperationException ( __FILE__,
__LINE__,
"Invalid directory %s.",
file.c_str () );
size_t pos = file.find_first_of ( cSep );
string relative_path = file.substr ( pos + 1, file.length () - pos - 2 );
string dir = file.substr ( 0, pos );
if ( dir == "$(INTERMEDIATE)" )
backend->AddDirectoryTarget ( relative_path, backend->intermediateDirectory );
else if ( dir == "$(OUTPUT)" )
backend->AddDirectoryTarget ( relative_path, backend->outputDirectory );
else if ( dir == "$(INSTALL)" )
backend->AddDirectoryTarget ( relative_path, backend->installDirectory );
else
throw InvalidOperationException ( __FILE__,
__LINE__,
"Invalid directory %s.",
dir.c_str () );
}
}

View file

@ -0,0 +1,38 @@
/*
* Copyright (C) 2008 Hervé Poussineau
*
* 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.
*/
#ifndef MINGW_RULE_H
#define MINGW_RULE_H
#include "mingw.h"
class Rule
{
public:
Rule ( const std::string& command, const char *generatedFile1, ... );
void Execute ( FILE *outputFile,
MingwBackend *backend,
const Module& module,
const FileLocation *source,
string_list& clean_files );
private:
const std::string command;
string_list generatedFiles;
};
#endif

View file

@ -200,6 +200,7 @@ RBUILD_BACKEND_MINGW_BASE_SOURCES = $(addprefix $(RBUILD_MINGW_BASE_), \
mingw.cpp \
modulehandler.cpp \
proxymakefile.cpp \
rule.cpp \
)
RBUILD_BACKEND_DEVCPP_BASE_SOURCES = $(addprefix $(RBUILD_DEVCPP_BASE_), \
@ -239,7 +240,7 @@ RBUILD_BACKEND_SOURCES = \
$(RBUILD_BACKEND_MSBUILD_BASE_SOURCES) \
$(RBUILD_BACKEND_BASE_)backend.cpp
RBUILD_COMMON_SOURCES = \
RBUILD_SOURCES = \
$(RBUILD_BACKEND_SOURCES) \
$(addprefix $(RBUILD_BASE_), \
global.cpp \
@ -261,28 +262,18 @@ RBUILD_COMMON_SOURCES = \
linkerscript.cpp \
module.cpp \
project.cpp \
rbuild.cpp \
stubbedcomponent.cpp \
syssetupgenerator.cpp \
testsupportcode.cpp \
xmlnode.cpp \
)
RBUILD_SPECIAL_SOURCES = \
$(RBUILD_BASE_)rbuild.cpp
RBUILD_SOURCES = \
$(RBUILD_COMMON_SOURCES) \
$(RBUILD_SPECIAL_SOURCES)
RBUILD_COMMON_OBJECTS = \
$(addprefix $(INTERMEDIATE_), $(RBUILD_COMMON_SOURCES:.cpp=.o))
RBUILD_SPECIAL_OBJECTS = \
$(addprefix $(INTERMEDIATE_), $(RBUILD_SPECIAL_SOURCES:.cpp=.o))
RBUILD_OBJECTS = \
$(RBUILD_COMMON_OBJECTS) \
$(RBUILD_SPECIAL_OBJECTS)
$(addprefix $(INTERMEDIATE_), $(RBUILD_SOURCES:.cpp=.o))
RBUILD_BACKEND_DEVCPP_HEADERS = \
devcpp.h
@ -304,7 +295,8 @@ RBUILD_BACKEND_MSBUILD_HEADERS = \
RBUILD_BACKEND_MINGW_HEADERS = \
mingw.h \
modulehandler.h
modulehandler.h \
rule.h
RBUILD_BACKEND_HEADERS = \
backend.h \
@ -447,6 +439,10 @@ $(RBUILD_INT_)rbuild.o: $(RBUILD_BASE_)rbuild.cpp $(RBUILD_HEADERS) | $(RBUILD_I
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
$(RBUILD_INT_)rule.o: $(RBUILD_BASE_)rule.cpp $(RBUILD_HEADERS) | $(RBUILD_INT)
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
$(RBUILD_INT_)stubbedcomponent.o: $(RBUILD_BASE_)stubbedcomponent.cpp $(RBUILD_HEADERS) | $(RBUILD_INT)
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
@ -483,6 +479,10 @@ $(RBUILD_MINGW_INT_)proxymakefile.o: $(RBUILD_MINGW_BASE_)proxymakefile.cpp $(RB
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
$(RBUILD_MINGW_INT_)rule.o: $(RBUILD_MINGW_BASE_)rule.cpp $(RBUILD_HEADERS) | $(RBUILD_MINGW_INT)
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
$(RBUILD_DEVCPP_INT_)devcpp.o: $(RBUILD_DEVCPP_BASE_)devcpp.cpp $(RBUILD_HEADERS) | $(RBUILD_DEVCPP_INT)
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@