simplified <if> handling ( and fixed several bugs, too )
authorRoyce Mitchell III <royce3@ev1.net>
Wed, 9 Mar 2005 22:29:18 +0000 (22:29 +0000)
committerRoyce Mitchell III <royce3@ev1.net>
Wed, 9 Mar 2005 22:29:18 +0000 (22:29 +0000)
cleaned up devcpp backend to compile with these changes

svn path=/branches/xmlbuildsystem/; revision=13901

reactos/tools/rbuild/automaticdependency.cpp
reactos/tools/rbuild/backend/devcpp/devcpp.cpp
reactos/tools/rbuild/backend/mingw/mingw.cpp
reactos/tools/rbuild/backend/mingw/mingw.h
reactos/tools/rbuild/backend/mingw/modulehandler.cpp
reactos/tools/rbuild/backend/mingw/modulehandler.h
reactos/tools/rbuild/module.cpp
reactos/tools/rbuild/project.cpp
reactos/tools/rbuild/rbuild.h

index bf7f3e5..291e005 100644 (file)
@@ -281,8 +281,9 @@ AutomaticDependency::Process ()
 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
@@ -330,34 +331,27 @@ AutomaticDependency::LocateIncludedFile ( SourceFile* sourceFile,
                                              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
@@ -398,10 +392,11 @@ AutomaticDependency::CheckAutomaticDependencies ()
        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
index a6f6cea..4d8de61 100644 (file)
  * 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>
@@ -122,9 +126,9 @@ void DevCppBackend::ProcessModules()
        {
                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);
                }
index 9780ebe..a5511c4 100644 (file)
@@ -67,8 +67,7 @@ MingwBackend::GenerateHeader () const
 \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
@@ -76,17 +75,17 @@ MingwBackend::GenerateProjectCFlagsMacro ( const char* assignmentOperation,
                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
@@ -103,32 +102,30 @@ MingwBackend::GenerateProjectCFlagsMacro ( const char* assignmentOperation,
 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
@@ -137,10 +134,7 @@ MingwBackend::GenerateGlobalCFlagsAndProperties (
                                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
@@ -175,10 +169,7 @@ MingwBackend::GenerateGlobalVariables () const
        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
index 7d4c5a7..e14ba77 100644 (file)
@@ -16,13 +16,9 @@ private:
        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
index 9ad9327..98ff6d8 100644 (file)
@@ -179,22 +179,29 @@ MingwModuleHandler::GetSourceFilenames ( const Module& module,
        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
@@ -250,15 +257,16 @@ MingwModuleHandler::GenerateCleanTarget (
 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
@@ -342,8 +350,8 @@ MingwModuleHandler::GenerateGccDefineParametersFromVector ( const vector<Define*
 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
@@ -381,8 +389,8 @@ MingwModuleHandler::GenerateGccIncludeParametersFromVector ( const vector<Includ
 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
@@ -444,11 +452,11 @@ MingwModuleHandler::GenerateLinkerParameters ( const Module& module ) const
 }\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
@@ -470,16 +478,16 @@ MingwModuleHandler::GenerateMacro ( const char* assignmentOperation,
                }\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
@@ -496,13 +504,9 @@ MingwModuleHandler::GenerateMacro ( const char* assignmentOperation,
 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
@@ -513,17 +517,15 @@ MingwModuleHandler::GenerateMacros (
 {\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
@@ -541,9 +543,9 @@ MingwModuleHandler::GenerateMacros (
                }\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
@@ -555,16 +557,19 @@ MingwModuleHandler::GenerateMacros (
                }\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
@@ -575,26 +580,29 @@ MingwModuleHandler::GenerateMacros (
                        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
@@ -603,13 +611,9 @@ MingwModuleHandler::GenerateMacros (
                                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
@@ -637,13 +641,9 @@ MingwModuleHandler::GenerateMacros (
 {\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
@@ -655,9 +655,10 @@ MingwModuleHandler::GenerateMacros (
        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
@@ -991,8 +992,7 @@ MingwModuleHandler::GenerateLinkerCommand (
 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
@@ -1002,6 +1002,7 @@ MingwModuleHandler::GenerateObjectFileTargets (
 {\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
@@ -1017,11 +1018,11 @@ MingwModuleHandler::GenerateObjectFileTargets (
                          "\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
@@ -1042,8 +1043,7 @@ MingwModuleHandler::GenerateObjectFileTargets (
        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
@@ -1054,17 +1054,19 @@ MingwModuleHandler::GenerateObjectFileTargets (
 }\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
@@ -1405,9 +1407,10 @@ MingwModuleHandler::GetDefinitionDependencies ( const Module& module ) const
        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
@@ -1419,27 +1422,14 @@ MingwModuleHandler::GetDefinitionDependencies ( const Module& module ) const
        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
@@ -1636,7 +1626,9 @@ MingwKernelModeDLLModuleHandler::Process ( const Module& module, string_list& cl
 }\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
@@ -1647,7 +1639,7 @@ MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget ( const Modul
 \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
@@ -1706,7 +1698,7 @@ MingwKernelModeDriverModuleHandler::GenerateKernelModeDriverModuleTarget (
 \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
@@ -1766,7 +1758,7 @@ MingwNativeDLLModuleHandler::GenerateNativeDLLModuleTarget ( const Module& modul
        \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
@@ -1822,7 +1814,7 @@ MingwNativeCUIModuleHandler::GenerateNativeCUIModuleTarget ( const Module& modul
        \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
@@ -1878,9 +1870,10 @@ MingwWin32DLLModuleHandler::GenerateExtractWineDLLResourcesTarget ( const Module
                  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
@@ -1905,7 +1898,7 @@ MingwWin32DLLModuleHandler::GenerateWin32DLLModuleTarget ( const Module& module,
 \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
@@ -1967,7 +1960,7 @@ MingwWin32CUIModuleHandler::GenerateWin32CUIModuleTarget ( const Module& module,
 \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
@@ -2029,7 +2022,7 @@ MingwWin32GUIModuleHandler::GenerateWin32GUIModuleTarget ( const Module& module,
 \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
index 3bdb2e9..3ce812c 100644 (file)
@@ -86,17 +86,12 @@ private:
        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
@@ -141,8 +136,7 @@ private:
                                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
@@ -157,8 +151,7 @@ private:
                                         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
index c9e3504..7033181 100644 (file)
@@ -50,6 +50,40 @@ NormalizeFilename ( const string& filename )
        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
@@ -99,20 +133,10 @@ Module::Module ( const Project& project,
 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
@@ -125,24 +149,15 @@ Module::ProcessXML()
        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
@@ -167,18 +182,18 @@ Module::ProcessXMLSubElement ( const XMLElement& e,
                }\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
@@ -191,18 +206,18 @@ Module::ProcessXMLSubElement ( const XMLElement& e,
        {\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
@@ -241,9 +256,9 @@ Module::ProcessXMLSubElement ( const XMLElement& e,
                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
@@ -483,14 +498,21 @@ Module::GetInvocationTarget ( const int index ) const
 }\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
@@ -756,15 +778,6 @@ If::If ( const XMLElement& node_,
 \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
index e0a333d..e929c0c 100644 (file)
@@ -20,16 +20,8 @@ Project::~Project ()
        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
@@ -38,9 +30,9 @@ Project::~Project ()
 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
@@ -222,18 +214,11 @@ Project::ProcessXML ( const string& path )
                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
@@ -275,18 +260,18 @@ Project::ProcessXMLSubElement ( const XMLElement& e,
        {\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
@@ -299,18 +284,18 @@ Project::ProcessXMLSubElement ( const XMLElement& e,
                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
index 0f9d8a2..3750535 100644 (file)
@@ -37,6 +37,7 @@
 #endif\r
 \r
 class Project;\r
+class IfableData;\r
 class Module;\r
 class Include;\r
 class Define;\r
@@ -56,6 +57,20 @@ class CDFile;
 \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
@@ -65,12 +80,9 @@ public:
        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
@@ -133,13 +145,9 @@ public:
        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
@@ -157,8 +165,7 @@ public:
        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
@@ -313,12 +320,7 @@ public:
        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