void\r
AutomaticDependency::ProcessModule ( Module& module )\r
{\r
- for ( size_t i = 0; i < module.files.size (); i++ )\r
- ProcessFile ( module, *module.files[i] );\r
+ const vector<File*>& files = module.non_if_data.files;\r
+ for ( size_t i = 0; i < files.size (); i++ )\r
+ ProcessFile ( module, *files[i] );\r
}\r
\r
void\r
bool includeNext,\r
string& resolvedFilename )\r
{\r
- size_t i;\r
- for ( i = 0; i < module.includes.size (); i++ )\r
- {\r
- Include* include = module.includes[i];\r
- if ( LocateIncludedFile ( include->directory,\r
- includedFilename,\r
- resolvedFilename ) )\r
- {\r
- if ( includeNext && stricmp ( resolvedFilename.c_str (),\r
- sourceFile->filename.c_str () ) == 0 )\r
- continue;\r
- return true;\r
- }\r
- }\r
-\r
- /* FIXME: Ifs */\r
-\r
- for ( i = 0; i < module.project.includes.size (); i++ )\r
+ size_t i, j;\r
+ const vector<Include*>* pincludes;\r
+ for ( i = 0; i < 2; i++ )\r
{\r
- Include* include = module.project.includes[i];\r
- if ( LocateIncludedFile ( include->directory,\r
- includedFilename,\r
- resolvedFilename ) )\r
+ if ( !i )\r
+ pincludes = &module.non_if_data.includes;\r
+ else\r
+ pincludes = &module.project.non_if_data.includes;\r
+ const vector<Include*>& includes = *pincludes;\r
+ for ( j = 0; j < includes.size (); j++ )\r
{\r
- if ( includeNext && stricmp ( resolvedFilename.c_str (),\r
- sourceFile->filename.c_str () ) == 0 )\r
- continue;\r
- return true;\r
+ Include& include = *includes[j];\r
+ if ( LocateIncludedFile ( include.directory,\r
+ includedFilename,\r
+ resolvedFilename ) )\r
+ {\r
+ if ( includeNext && stricmp ( resolvedFilename.c_str (),\r
+ sourceFile->filename.c_str () ) == 0 )\r
+ continue;\r
+ return true;\r
+ }\r
}\r
}\r
\r
struct utimbuf timebuf;\r
for ( size_t mi = 0; mi < project.modules.size (); mi++ )\r
{\r
- Module& module = *project.modules[mi];\r
- for ( size_t fi = 0; fi < module.files.size (); fi++ )\r
+ const vector<File*>& files = project.modules[mi]->non_if_data.files;\r
+ //Module& module = *project.modules[mi];\r
+ for ( size_t fi = 0; fi < files.size (); fi++ )\r
{\r
- File& file = *module.files[fi];\r
+ File& file = *files[fi];\r
string normalizedFilename = NormalizeFilename ( file.name );\r
\r
SourceFile* sourceFile = RetrieveFromCache ( normalizedFilename );\r
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+\r
+#ifdef _MSC_VER\r
+#pragma warning ( disable : 4786 )\r
+#endif//_MSC_VER\r
#include <iostream>
#include <fstream>
{
Module &module = *ProjectNode.modules[i];
- for(size_t k = 0; k < module.files.size(); k++)
+ for(size_t k = 0; k < module.non_if_data.files.size(); k++)
{
- File &file = *module.files[k];
+ File &file = *module.non_if_data.files[k];
ProcessFile(file.name);
}
\r
void\r
MingwBackend::GenerateProjectCFlagsMacro ( const char* assignmentOperation,\r
- const vector<Include*>& includes,\r
- const vector<Define*>& defines ) const\r
+ IfableData& data ) const\r
{\r
size_t i;\r
\r
fMakefile,\r
"PROJECT_CFLAGS %s",\r
assignmentOperation );\r
- for ( i = 0; i < includes.size(); i++ )\r
+ for ( i = 0; i < data.includes.size(); i++ )\r
{\r
fprintf (\r
fMakefile,\r
" -I%s",\r
- includes[i]->directory.c_str() );\r
+ data.includes[i]->directory.c_str() );\r
}\r
\r
- for ( i = 0; i < defines.size(); i++ )\r
+ for ( i = 0; i < data.defines.size(); i++ )\r
{\r
- Define& d = *defines[i];\r
+ Define& d = *data.defines[i];\r
fprintf (\r
fMakefile,\r
" -D%s",\r
void\r
MingwBackend::GenerateGlobalCFlagsAndProperties (\r
const char* assignmentOperation,\r
- const vector<Property*>& properties,\r
- const vector<Include*>& includes,\r
- const vector<Define*>& defines,\r
- const vector<If*>& ifs ) const\r
+ IfableData& data ) const\r
{\r
size_t i;\r
\r
- for ( i = 0; i < properties.size(); i++ )\r
+ for ( i = 0; i < data.properties.size(); i++ )\r
{\r
- Property& prop = *properties[i];\r
+ Property& prop = *data.properties[i];\r
fprintf ( fMakefile, "%s := %s\n",\r
prop.name.c_str(),\r
prop.value.c_str() );\r
}\r
\r
- if ( includes.size() || defines.size() )\r
+ if ( data.includes.size() || data.defines.size() )\r
{\r
GenerateProjectCFlagsMacro ( assignmentOperation,\r
- includes,\r
- defines );\r
+ data );\r
}\r
\r
- for ( i = 0; i < ifs.size(); i++ )\r
+ for ( i = 0; i < data.ifs.size(); i++ )\r
{\r
- If& rIf = *ifs[i];\r
- if ( rIf.defines.size() || rIf.includes.size() || rIf.ifs.size() )\r
+ If& rIf = *data.ifs[i];\r
+ if ( rIf.data.defines.size()\r
+ || rIf.data.includes.size()\r
+ || rIf.data.ifs.size() )\r
{\r
fprintf (\r
fMakefile,\r
rIf.value.c_str() );\r
GenerateGlobalCFlagsAndProperties (\r
"+=",\r
- rIf.properties,\r
- rIf.includes,\r
- rIf.defines,\r
- rIf.ifs );\r
+ rIf.data );\r
fprintf (\r
fMakefile,\r
"endif\n\n" );\r
fprintf ( fMakefile, "\n" );\r
GenerateGlobalCFlagsAndProperties (\r
"=",\r
- ProjectNode.properties,\r
- ProjectNode.includes,\r
- ProjectNode.defines,\r
- ProjectNode.ifs );\r
+ ProjectNode.non_if_data );\r
fprintf ( fMakefile, "PROJECT_RCFLAGS = $(PROJECT_CFLAGS)\n" );\r
fprintf ( fMakefile, "PROJECT_LFLAGS = %s\n",\r
GenerateProjectLFLAGS ().c_str () );\r
void CloseMakefile () const;\r
void GenerateHeader () const;\r
void GenerateProjectCFlagsMacro ( const char* assignmentOperation,\r
- const std::vector<Include*>& includes,\r
- const std::vector<Define*>& defines ) const;\r
+ IfableData& data ) const;\r
void GenerateGlobalCFlagsAndProperties ( const char* op,\r
- const std::vector<Property*>& properties,\r
- const std::vector<Include*>& includes,\r
- const std::vector<Define*>& defines,\r
- const std::vector<If*>& ifs ) const;\r
+ IfableData& data ) const;\r
std::string GenerateProjectLFLAGS () const;\r
void GenerateDirectoryTargets () const;\r
void GenerateGlobalVariables () const;\r
size_t i;\r
\r
string sourceFilenames ( "" );\r
- for ( i = 0; i < module.files.size (); i++ )\r
+ const vector<File*>& files = module.non_if_data.files;\r
+ for ( i = 0; i < files.size (); i++ )\r
{\r
- if ( includeGeneratedFiles || !IsGeneratedFile ( *module.files[i] ) )\r
- sourceFilenames += " " + GetActualSourceFilename ( module.files[i]->name );\r
+ if ( includeGeneratedFiles || !IsGeneratedFile ( *files[i] ) )\r
+ sourceFilenames += " " + GetActualSourceFilename ( files[i]->name );\r
}\r
- vector<If*> ifs = module.ifs;\r
- for ( i = 0; i < ifs.size (); i++ )\r
+ // intentionally make a copy so that we can append more work in\r
+ // the middle of processing without having to go recursive\r
+ vector<If*> v = module.non_if_data.ifs;\r
+ for ( i = 0; i < v.size (); i++ )\r
{\r
size_t j;\r
- If& rIf = *ifs[i];\r
- for ( j = 0; j < rIf.ifs.size (); j++ )\r
- ifs.push_back ( rIf.ifs[j] );\r
- for ( j = 0; j < rIf.files.size (); j++ )\r
+ If& rIf = *v[i];\r
+ // check for sub-ifs to add to list\r
+ const vector<If*>& ifs = rIf.data.ifs;\r
+ for ( j = 0; j < ifs.size (); j++ )\r
+ v.push_back ( ifs[j] );\r
+ const vector<File*>& files = rIf.data.files;\r
+ for ( j = 0; j < files.size (); j++ )\r
{\r
- if ( includeGeneratedFiles || !IsGeneratedFile ( *rIf.files[j] ) )\r
- sourceFilenames += " " + GetActualSourceFilename ( rIf.files[j]->name );\r
+ File& file = *files[j];\r
+ if ( includeGeneratedFiles || !IsGeneratedFile ( file ) )\r
+ sourceFilenames += " " + GetActualSourceFilename ( file.name );\r
}\r
}\r
return sourceFilenames;\r
string\r
MingwModuleHandler::GetObjectFilenames ( const Module& module ) const\r
{\r
- if ( module.files.size () == 0 )\r
+ const vector<File*>& files = module.non_if_data.files;\r
+ if ( files.size () == 0 )\r
return "";\r
\r
string objectFilenames ( "" );\r
- for ( size_t i = 0; i < module.files.size (); i++ )\r
+ for ( size_t i = 0; i < files.size (); i++ )\r
{\r
if ( objectFilenames.size () > 0 )\r
objectFilenames += " ";\r
- objectFilenames += PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( module.files[i]->name ) );\r
+ objectFilenames += PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( files[i]->name ) );\r
}\r
return objectFilenames;\r
}\r
string\r
MingwModuleHandler::GenerateGccDefineParameters ( const Module& module ) const\r
{\r
- string parameters = GenerateGccDefineParametersFromVector ( module.project.defines );\r
- string s = GenerateGccDefineParametersFromVector ( module.defines );\r
+ string parameters = GenerateGccDefineParametersFromVector ( module.project.non_if_data.defines );\r
+ string s = GenerateGccDefineParametersFromVector ( module.non_if_data.defines );\r
if ( s.length () > 0 )\r
{\r
parameters += " ";\r
string\r
MingwModuleHandler::GenerateGccIncludeParameters ( const Module& module ) const\r
{\r
- string parameters = GenerateGccIncludeParametersFromVector ( module.includes );\r
- string s = GenerateGccIncludeParametersFromVector ( module.project.includes );\r
+ string parameters = GenerateGccIncludeParametersFromVector ( module.non_if_data.includes );\r
+ string s = GenerateGccIncludeParametersFromVector ( module.project.non_if_data.includes );\r
if ( s.length () > 0 )\r
{\r
parameters += " ";\r
}\r
\r
void\r
-MingwModuleHandler::GenerateMacro ( const char* assignmentOperation,\r
- const string& macro,\r
- const vector<Include*>& includes,\r
- const vector<Define*>& defines,\r
- const vector<CompilerFlag*>* compilerFlags ) const\r
+MingwModuleHandler::GenerateMacro (\r
+ const char* assignmentOperation,\r
+ const string& macro,\r
+ const IfableData& data,\r
+ const vector<CompilerFlag*>* compilerFlags ) const\r
{\r
size_t i;\r
\r
}\r
}\r
\r
- for ( i = 0; i < includes.size(); i++ )\r
+ for ( i = 0; i < data.includes.size(); i++ )\r
{\r
fprintf (\r
fMakefile,\r
" -I%s",\r
- includes[i]->directory.c_str() );\r
+ data.includes[i]->directory.c_str() );\r
}\r
- for ( i = 0; i < defines.size(); i++ )\r
+ for ( i = 0; i < data.defines.size(); i++ )\r
{\r
- Define& d = *defines[i];\r
+ Define& d = *data.defines[i];\r
fprintf (\r
fMakefile,\r
" -D%s",\r
void\r
MingwModuleHandler::GenerateMacros (\r
const char* assignmentOperation,\r
- const vector<File*>& files,\r
- const vector<Include*>& includes,\r
- const vector<Define*>& defines,\r
- const vector<Library*>& libraries,\r
+ const IfableData& data,\r
const vector<CompilerFlag*>* compilerFlags,\r
const vector<LinkerFlag*>* linkerFlags,\r
- const vector<If*>& ifs,\r
const string& cflags_macro,\r
const string& nasmflags_macro,\r
const string& windresflags_macro,\r
{\r
size_t i;\r
\r
- if ( includes.size () > 0 || defines.size () > 0 )\r
+ if ( data.includes.size () > 0 || data.defines.size () > 0 )\r
{\r
GenerateMacro ( assignmentOperation,\r
cflags_macro,\r
- includes,\r
- defines,\r
+ data,\r
compilerFlags );\r
GenerateMacro ( assignmentOperation,\r
windresflags_macro,\r
- includes,\r
- defines,\r
+ data,\r
compilerFlags );\r
}\r
\r
}\r
}\r
\r
- if ( libraries.size () > 0 )\r
+ if ( data.libraries.size () > 0 )\r
{\r
- string deps = GenerateImportLibraryDependenciesFromVector ( libraries );\r
+ string deps = GenerateImportLibraryDependenciesFromVector ( data.libraries );\r
if ( deps.size () > 0 )\r
{\r
fprintf (\r
}\r
}\r
\r
+ const vector<File*>& files = data.files;\r
if ( files.size () > 0 )\r
{\r
for ( i = 0; i < files.size (); i++ )\r
{\r
- if ( files[i]->first )\r
+ File& file = *files[i];\r
+ if ( file.first )\r
{\r
fprintf ( fMakefile,\r
"%s := %s $(%s)\n",\r
objs_macro.c_str(),\r
- PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( files[i]->name ) ).c_str (),\r
+ PassThruCacheDirectory (\r
+ MingwModuleHandler::GetObjectFilename ( file.name ) ).c_str (),\r
objs_macro.c_str() );\r
}\r
}\r
assignmentOperation );\r
for ( i = 0; i < files.size(); i++ )\r
{\r
- if ( !files[i]->first )\r
+ File& file = *files[i];\r
+ if ( !file.first )\r
{\r
fprintf (\r
fMakefile,\r
"%s%s",\r
( i%10 == 9 ? "\\\n\t" : " " ),\r
- PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( files[i]->name ) ).c_str () );\r
+ PassThruCacheDirectory (\r
+ MingwModuleHandler::GetObjectFilename ( file.name ) ).c_str () );\r
}\r
}\r
fprintf ( fMakefile, "\n" );\r
}\r
\r
+ const vector<If*>& ifs = data.ifs;\r
for ( i = 0; i < ifs.size(); i++ )\r
{\r
If& rIf = *ifs[i];\r
- if ( rIf.defines.size()\r
- || rIf.includes.size()\r
- || rIf.libraries.size()\r
- || rIf.files.size()\r
- || rIf.ifs.size() )\r
+ if ( rIf.data.defines.size()\r
+ || rIf.data.includes.size()\r
+ || rIf.data.libraries.size()\r
+ || rIf.data.files.size()\r
+ || rIf.data.ifs.size() )\r
{\r
fprintf (\r
fMakefile,\r
rIf.value.c_str() );\r
GenerateMacros (\r
"+=",\r
- rIf.files,\r
- rIf.includes,\r
- rIf.defines,\r
- rIf.libraries,\r
+ rIf.data,\r
NULL,\r
NULL,\r
- rIf.ifs,\r
cflags_macro,\r
nasmflags_macro,\r
windresflags_macro,\r
{\r
GenerateMacros (\r
"=",\r
- module.files,\r
- module.includes,\r
- module.defines,\r
- module.libraries,\r
+ module.non_if_data,\r
&module.compilerFlags,\r
&module.linkerFlags,\r
- module.ifs,\r
cflags_macro,\r
nasmflags_macro,\r
windresflags_macro,\r
if ( module.importLibrary )\r
{\r
string s;\r
- for ( size_t i = 0; i < module.files.size (); i++ )\r
+ const vector<File*>& files = module.non_if_data.files;\r
+ for ( size_t i = 0; i < files.size (); i++ )\r
{\r
- File& file = *module.files[i];\r
+ File& file = *files[i];\r
string extension = GetExtension ( file.name );\r
if ( extension == ".spec" || extension == ".SPEC" )\r
{\r
void\r
MingwModuleHandler::GenerateObjectFileTargets (\r
const Module& module,\r
- const vector<File*>& files,\r
- const vector<If*>& ifs,\r
+ const IfableData& data,\r
const string& cc,\r
const string& cppc,\r
const string& cflagsMacro,\r
{\r
size_t i;\r
\r
+ const vector<File*>& files = data.files;\r
for ( i = 0; i < files.size (); i++ )\r
{\r
string sourceFilename = files[i]->name;\r
"\n" );\r
}\r
\r
+ const vector<If*>& ifs = data.ifs;\r
for ( i = 0; i < ifs.size(); i++ )\r
{\r
GenerateObjectFileTargets ( module,\r
- ifs[i]->files,\r
- ifs[i]->ifs,\r
+ ifs[i]->data,\r
cc,\r
cppc,\r
cflagsMacro,\r
string_list& clean_files ) const\r
{\r
GenerateObjectFileTargets ( module,\r
- module.files,\r
- module.ifs,\r
+ module.non_if_data,\r
cc,\r
cppc,\r
cflagsMacro,\r
}\r
\r
void\r
-MingwModuleHandler::GetCleanTargets ( string_list& out,\r
- const vector<File*>& files,\r
- const vector<If*>& ifs ) const\r
+MingwModuleHandler::GetCleanTargets (\r
+ string_list& out,\r
+ const IfableData& data ) const\r
{\r
size_t i;\r
\r
+ const vector<File*>& files = data.files;\r
for ( i = 0; i < files.size(); i++ )\r
out.push_back ( PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( files[i]->name ) ) );\r
\r
+ const vector<If*>& ifs = data.ifs;\r
for ( i = 0; i < ifs.size(); i++ )\r
- GetCleanTargets ( out, ifs[i]->files, ifs[i]->ifs );\r
+ GetCleanTargets ( out, ifs[i]->data );\r
}\r
\r
string\r
string dkNkmLibNoFixup = "dk/nkm/lib";\r
dependencies += FixupTargetFilename ( dkNkmLibNoFixup );\r
PassThruCacheDirectory ( dkNkmLibNoFixup + SSEP );\r
- for ( size_t i = 0; i < module.files.size (); i++ )\r
+ const vector<File*>& files = module.non_if_data.files;\r
+ for ( size_t i = 0; i < files.size (); i++ )\r
{\r
- File& file = *module.files[i];\r
+ File& file = *files[i];\r
string extension = GetExtension ( file.name );\r
if ( extension == ".spec" || extension == ".SPEC" )\r
{\r
return dependencies;\r
}\r
\r
-/*string\r
-MingwModuleHandler::GetLinkingDependencies ( const Module& module ) const\r
-{\r
- string dependencies = GetImportLibraryDependencies ( module );\r
- string s = GetDefinitionDependencies ( module );\r
- if ( s.length () > 0 )\r
- {\r
- dependencies += " ";\r
- dependencies += s;\r
- }\r
- return dependencies;\r
-}*/\r
-\r
bool\r
MingwModuleHandler::IsCPlusPlusModule ( const Module& module ) const\r
{\r
- if ( module.HasFileWithExtensions ( ".cc", ".CC" ) )\r
+ if ( module.HasFileWithExtension ( module.non_if_data, ".cc" ) )\r
return true;\r
- if ( module.HasFileWithExtensions ( ".cxx", ".CXX" ) )\r
+ if ( module.HasFileWithExtension ( module.non_if_data, ".cxx" ) )\r
return true;\r
- if ( module.HasFileWithExtensions ( ".cpp", ".CPP" ) )\r
+ if ( module.HasFileWithExtension ( module.non_if_data, ".cpp" ) )\r
return true;\r
return false;\r
}\r
}\r
\r
void\r
-MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget ( const Module& module, string_list& clean_files )\r
+MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget (\r
+ const Module& module,\r
+ string_list& clean_files )\r
{\r
static string ros_junk ( "$(ROS_TEMPORARY)" );\r
string target ( FixupTargetFilename ( module.GetPath () ) );\r
\r
GenerateImportLibraryTargetIfNeeded ( module, clean_files );\r
\r
- if ( module.files.size () > 0 )\r
+ if ( module.non_if_data.files.size () > 0 )\r
{\r
GenerateMacrosAndTargetsTarget ( module, clean_files );\r
\r
\r
GenerateImportLibraryTargetIfNeeded ( module, clean_files );\r
\r
- if ( module.files.size () > 0 )\r
+ if ( module.non_if_data.files.size () > 0 )\r
{\r
string cflags ( "-D__NTDRIVER__" );\r
GenerateMacrosAndTargetsTarget ( module,\r
\r
GenerateImportLibraryTargetIfNeeded ( module, clean_files );\r
\r
- if ( module.files.size () > 0 )\r
+ if ( module.non_if_data.files.size () > 0 )\r
{\r
GenerateMacrosAndTargetsTarget ( module, clean_files );\r
\r
\r
GenerateImportLibraryTargetIfNeeded ( module, clean_files );\r
\r
- if ( module.files.size () > 0 )\r
+ if ( module.non_if_data.files.size () > 0 )\r
{\r
string cflags ( "-D__NTAPP__" );\r
GenerateMacrosAndTargetsTarget ( module,\r
module.name.c_str () );\r
fprintf ( fMakefile, "%s_extractresources: bin2res\n",\r
module.name.c_str () );\r
- for ( size_t i = 0; i < module.files.size (); i++ )\r
+ const vector<File*>& files = module.non_if_data.files;\r
+ for ( size_t i = 0; i < files.size (); i++ )\r
{\r
- File& file = *module.files[i];\r
+ File& file = *files[i];\r
string extension = GetExtension ( file.name );\r
if ( extension == ".rc" || extension == ".RC" )\r
{\r
\r
GenerateImportLibraryTargetIfNeeded ( module, clean_files );\r
\r
- if ( module.files.size () > 0 )\r
+ if ( module.non_if_data.files.size () > 0 )\r
{\r
GenerateMacrosAndTargetsTarget ( module, clean_files );\r
\r
\r
GenerateImportLibraryTargetIfNeeded ( module, clean_files );\r
\r
- if ( module.files.size () > 0 )\r
+ if ( module.non_if_data.files.size () > 0 )\r
{\r
GenerateMacrosAndTargetsTarget ( module, clean_files );\r
\r
\r
GenerateImportLibraryTargetIfNeeded ( module, clean_files );\r
\r
- if ( module.files.size () > 0 )\r
+ if ( module.non_if_data.files.size () > 0 )\r
{\r
GenerateMacrosAndTargetsTarget ( module, clean_files );\r
\r
std::string GenerateLinkerParameters ( const Module& module ) const;\r
void GenerateMacro ( const char* assignmentOperation,\r
const std::string& macro,\r
- const std::vector<Include*>& includes,\r
- const std::vector<Define*>& defines,\r
+ const IfableData& data,\r
const std::vector<CompilerFlag*>* compilerFlags ) const;\r
void GenerateMacros ( const char* op,\r
- const std::vector<File*>& files,\r
- const std::vector<Include*>& includes,\r
- const std::vector<Define*>& defines,\r
- const std::vector<Library*>& libraries,\r
+ const IfableData& data,\r
const std::vector<CompilerFlag*>* compilerFlags,\r
const std::vector<LinkerFlag*>* linkerFlags,\r
- const std::vector<If*>& ifs,\r
const std::string& cflags_macro,\r
const std::string& nasmflags_macro,\r
const std::string& windresflags_macro,\r
const std::string& windresflagsMacro,\r
string_list& clean_files ) const;\r
void GenerateObjectFileTargets ( const Module& module,\r
- const std::vector<File*>& files,\r
- const std::vector<If*>& ifs,\r
+ const IfableData& data,\r
const std::string& cc,\r
const std::string& cppc,\r
const std::string& cflagsMacro,\r
const std::string& windresflagsMacro,\r
string_list& clean_files ) const;\r
void GetCleanTargets ( string_list& out,\r
- const std::vector<File*>& files,\r
- const std::vector<If*>& ifs ) const;\r
+ const IfableData& data ) const;\r
std::string GenerateArchiveTarget ( const Module& module,\r
const std::string& ar,\r
const std::string& objs_macro ) const;\r
return FixSeparator ( relativeNormalizedPath );\r
}\r
\r
+IfableData::~IfableData()\r
+{\r
+ size_t i;\r
+ for ( i = 0; i < files.size(); i++ )\r
+ delete files[i];\r
+ for ( i = 0; i < includes.size(); i++ )\r
+ delete includes[i];\r
+ for ( i = 0; i < defines.size(); i++ )\r
+ delete defines[i];\r
+ for ( i = 0; i < libraries.size(); i++ )\r
+ delete libraries[i];\r
+ for ( i = 0; i < properties.size(); i++ )\r
+ delete properties[i];\r
+ for ( i = 0; i < ifs.size(); i++ )\r
+ delete ifs[i];\r
+}\r
+\r
+void IfableData::ProcessXML ()\r
+{\r
+ size_t i;\r
+ for ( i = 0; i < files.size (); i++ )\r
+ files[i]->ProcessXML ();\r
+ for ( i = 0; i < includes.size (); i++ )\r
+ includes[i]->ProcessXML ();\r
+ for ( i = 0; i < defines.size (); i++ )\r
+ defines[i]->ProcessXML ();\r
+ for ( i = 0; i < libraries.size (); i++ )\r
+ libraries[i]->ProcessXML ();\r
+ for ( i = 0; i < properties.size(); i++ )\r
+ properties[i]->ProcessXML ();\r
+ for ( i = 0; i < ifs.size (); i++ )\r
+ ifs[i]->ProcessXML ();\r
+}\r
+\r
Module::Module ( const Project& project,\r
const XMLElement& moduleNode,\r
const string& modulePath )\r
Module::~Module ()\r
{\r
size_t i;\r
- for ( i = 0; i < files.size(); i++ )\r
- delete files[i];\r
- for ( i = 0; i < libraries.size(); i++ )\r
- delete libraries[i];\r
- for ( i = 0; i < includes.size(); i++ )\r
- delete includes[i];\r
- for ( i = 0; i < defines.size(); i++ )\r
- delete defines[i];\r
for ( i = 0; i < invocations.size(); i++ )\r
delete invocations[i];\r
for ( i = 0; i < dependencies.size(); i++ )\r
delete dependencies[i];\r
- for ( i = 0; i < ifs.size(); i++ )\r
- delete ifs[i];\r
for ( i = 0; i < compilerFlags.size(); i++ )\r
delete compilerFlags[i];\r
for ( i = 0; i < linkerFlags.size(); i++ )\r
size_t i;\r
for ( i = 0; i < node.subElements.size(); i++ )\r
ProcessXMLSubElement ( *node.subElements[i], path );\r
- for ( i = 0; i < files.size (); i++ )\r
- files[i]->ProcessXML ();\r
- for ( i = 0; i < libraries.size(); i++ )\r
- libraries[i]->ProcessXML ();\r
- for ( i = 0; i < includes.size(); i++ )\r
- includes[i]->ProcessXML ();\r
- for ( i = 0; i < defines.size(); i++ )\r
- defines[i]->ProcessXML ();\r
for ( i = 0; i < invocations.size(); i++ )\r
invocations[i]->ProcessXML ();\r
for ( i = 0; i < dependencies.size(); i++ )\r
dependencies[i]->ProcessXML ();\r
- for ( i = 0; i < ifs.size(); i++ )\r
- ifs[i]->ProcessXML();\r
for ( i = 0; i < compilerFlags.size(); i++ )\r
compilerFlags[i]->ProcessXML();\r
for ( i = 0; i < linkerFlags.size(); i++ )\r
linkerFlags[i]->ProcessXML();\r
+ non_if_data.ProcessXML();\r
}\r
\r
void\r
}\r
File* pFile = new File ( FixSeparator ( path + CSEP + e.value ), first );\r
if ( pIf )\r
- pIf->files.push_back ( pFile );\r
+ pIf->data.files.push_back ( pFile );\r
else\r
- files.push_back ( pFile );\r
+ non_if_data.files.push_back ( pFile );\r
subs_invalid = true;\r
}\r
else if ( e.name == "library" && e.value.size () )\r
{\r
- /*if ( pIf )\r
- throw InvalidBuildFileException (\r
- e.location,\r
- "<library> is not a valid sub-element of <if>" );*/\r
- libraries.push_back ( new Library ( e, *this, e.value ) );\r
+ Library* pLibrary = new Library ( e, *this, e.value );\r
+ if ( pIf )\r
+ pIf->data.libraries.push_back ( pLibrary );\r
+ else\r
+ non_if_data.libraries.push_back ( pLibrary );\r
subs_invalid = true;\r
}\r
else if ( e.name == "directory" )\r
{\r
Include* include = new Include ( project, this, e );\r
if ( pIf )\r
- pIf->includes.push_back ( include );\r
+ pIf->data.includes.push_back ( include );\r
else\r
- includes.push_back ( include );\r
+ non_if_data.includes.push_back ( include );\r
subs_invalid = true;\r
}\r
else if ( e.name == "define" )\r
{\r
Define* pDefine = new Define ( project, this, e );\r
if ( pIf )\r
- pIf->defines.push_back ( pDefine );\r
+ pIf->data.defines.push_back ( pDefine );\r
else\r
- defines.push_back ( pDefine );\r
+ non_if_data.defines.push_back ( pDefine );\r
subs_invalid = true;\r
}\r
else if ( e.name == "invoke" )\r
If* pOldIf = pIf;\r
pIf = new If ( e, project, this );\r
if ( pOldIf )\r
- pOldIf->ifs.push_back ( pIf );\r
+ pOldIf->data.ifs.push_back ( pIf );\r
else\r
- ifs.push_back ( pIf );\r
+ non_if_data.ifs.push_back ( pIf );\r
subs_invalid = false;\r
}\r
else if ( e.name == "compilerflag" )\r
}\r
\r
bool\r
-Module::HasFileWithExtensions ( const std::string& extension1,\r
- const std::string& extension2 ) const\r
+Module::HasFileWithExtension (\r
+ const IfableData& data,\r
+ const std::string& extension ) const\r
{\r
- for ( size_t i = 0; i < files.size (); i++ )\r
+ size_t i;\r
+ for ( i = 0; i < data.files.size (); i++ )\r
{\r
- File& file = *files[i];\r
- string extension = GetExtension ( file.name );\r
- if ( extension == extension1 || extension == extension2 )\r
+ File& file = *data.files[i];\r
+ string file_ext = GetExtension ( file.name );\r
+ if ( !stricmp ( file_ext.c_str (), extension.c_str () ) )\r
+ return true;\r
+ }\r
+ for ( i = 0; i < data.ifs.size (); i++ )\r
+ {\r
+ if ( HasFileWithExtension ( data.ifs[i]->data, extension ) )\r
return true;\r
}\r
return false;\r
\r
If::~If ()\r
{\r
- size_t i;\r
- for ( i = 0; i < files.size(); i++ )\r
- delete files[i];\r
- for ( i = 0; i < includes.size(); i++ )\r
- delete includes[i];\r
- for ( i = 0; i < defines.size(); i++ )\r
- delete defines[i];\r
- for ( i = 0; i < ifs.size(); i++ )\r
- delete ifs[i];\r
}\r
\r
void\r
size_t i;\r
for ( i = 0; i < modules.size (); i++ )\r
delete modules[i];\r
- for ( i = 0; i < includes.size (); i++ )\r
- delete includes[i];\r
- for ( i = 0; i < defines.size (); i++ )\r
- delete defines[i];\r
for ( i = 0; i < linkerFlags.size (); i++ )\r
delete linkerFlags[i];\r
- for ( i = 0; i < properties.size (); i++ )\r
- delete properties[i];\r
- for ( i = 0; i < ifs.size (); i++ )\r
- delete ifs[i];\r
for ( i = 0; i < cdfiles.size (); i++ )\r
delete cdfiles[i];\r
delete head;\r
const Property*\r
Project::LookupProperty ( const string& name ) const\r
{\r
- for ( size_t i = 0; i < properties.size (); i++ )\r
+ for ( size_t i = 0; i < non_if_data.properties.size (); i++ )\r
{\r
- const Property* property = properties[i];\r
+ const Property* property = non_if_data.properties[i];\r
if ( property->name == name )\r
return property;\r
}\r
ProcessXMLSubElement ( *node->subElements[i], path );\r
for ( i = 0; i < modules.size (); i++ )\r
modules[i]->ProcessXML ();\r
- for ( i = 0; i < includes.size (); i++ )\r
- includes[i]->ProcessXML ();\r
- for ( i = 0; i < defines.size (); i++ )\r
- defines[i]->ProcessXML ();\r
for ( i = 0; i < linkerFlags.size (); i++ )\r
linkerFlags[i]->ProcessXML ();\r
- for ( i = 0; i < properties.size(); i++ )\r
- properties[i]->ProcessXML ();\r
- for ( i = 0; i < ifs.size (); i++ )\r
- ifs[i]->ProcessXML ();\r
+ non_if_data.ProcessXML ();\r
for ( i = 0; i < cdfiles.size (); i++ )\r
- ifs[i]->ProcessXML ();\r
+ cdfiles[i]->ProcessXML ();\r
}\r
\r
void\r
{\r
Include* include = new Include ( *this, e );\r
if ( pIf )\r
- pIf->includes.push_back ( include );\r
+ pIf->data.includes.push_back ( include );\r
else\r
- includes.push_back ( include );\r
+ non_if_data.includes.push_back ( include );\r
subs_invalid = true;\r
}\r
else if ( e.name == "define" )\r
{\r
Define* define = new Define ( *this, e );\r
if ( pIf )\r
- pIf->defines.push_back ( define );\r
+ pIf->data.defines.push_back ( define );\r
else\r
- defines.push_back ( define );\r
+ non_if_data.defines.push_back ( define );\r
subs_invalid = true;\r
}\r
else if ( e.name == "linkerflag" )\r
If* pOldIf = pIf;\r
pIf = new If ( e, *this, NULL );\r
if ( pOldIf )\r
- pOldIf->ifs.push_back ( pIf );\r
+ pOldIf->data.ifs.push_back ( pIf );\r
else\r
- ifs.push_back ( pIf );\r
+ non_if_data.ifs.push_back ( pIf );\r
subs_invalid = false;\r
}\r
else if ( e.name == "property" )\r
{\r
Property* property = new Property ( e, *this, NULL );\r
if ( pIf )\r
- pIf->properties.push_back ( property );\r
+ pIf->data.properties.push_back ( property );\r
else\r
- properties.push_back ( property );\r
+ non_if_data.properties.push_back ( property );\r
}\r
if ( subs_invalid && e.subElements.size() )\r
throw InvalidBuildFileException (\r
#endif\r
\r
class Project;\r
+class IfableData;\r
class Module;\r
class Include;\r
class Define;\r
\r
class SourceFileTest;\r
\r
+class IfableData\r
+{\r
+public:\r
+ std::vector<File*> files;\r
+ std::vector<Include*> includes;\r
+ std::vector<Define*> defines;\r
+ std::vector<Library*> libraries;\r
+ std::vector<Property*> properties;\r
+ std::vector<If*> ifs;\r
+\r
+ ~IfableData();\r
+ void ProcessXML();\r
+};\r
+\r
class Project\r
{\r
std::string xmlfile;\r
std::string makefile;\r
XMLIncludes xmlbuildfiles;\r
std::vector<Module*> modules;\r
- std::vector<Include*> includes;\r
- std::vector<Define*> defines;\r
std::vector<LinkerFlag*> linkerFlags;\r
- std::vector<Property*> properties;\r
- std::vector<If*> ifs;\r
std::vector<CDFile*> cdfiles;\r
+ IfableData non_if_data;\r
\r
Project ( const std::string& filename );\r
~Project ();\r
ImportLibrary* importLibrary;\r
bool mangledSymbols;\r
Bootstrap* bootstrap;\r
- std::vector<File*> files;\r
- std::vector<Library*> libraries;\r
- std::vector<Include*> includes;\r
- std::vector<Define*> defines;\r
+ IfableData non_if_data;\r
std::vector<Invoke*> invocations;\r
std::vector<Dependency*> dependencies;\r
- std::vector<If*> ifs;\r
std::vector<CompilerFlag*> compilerFlags;\r
std::vector<LinkerFlag*> linkerFlags;\r
\r
std::string GetPathWithPrefix ( const std::string& prefix ) const;\r
std::string GetTargets () const;\r
std::string GetInvocationTarget ( const int index ) const;\r
- bool HasFileWithExtensions ( const std::string& extension1,\r
- const std::string& extension2 ) const;\r
+ bool HasFileWithExtension ( const IfableData&, const std::string& extension ) const;\r
void InvokeModule () const;\r
void ProcessXML ();\r
private:\r
const Project& project;\r
const Module* module;\r
std::string property, value;\r
- std::vector<File*> files;\r
- std::vector<Include*> includes;\r
- std::vector<Define*> defines;\r
- std::vector<Property*> properties;\r
- std::vector<If*> ifs;\r
- std::vector<Library*> libraries;\r
+ IfableData data;\r
\r
If ( const XMLElement& node_,\r
const Project& project_,\r