-fix line endings
authorChristoph von Wittich <christoph_vw@reactos.org>
Wed, 22 Nov 2006 15:23:17 +0000 (15:23 +0000)
committerChristoph von Wittich <christoph_vw@reactos.org>
Wed, 22 Nov 2006 15:23:17 +0000 (15:23 +0000)
-set eol-style:native

svn path=/trunk/; revision=24800

reactos/tools/rbuild/backend/codeblocks/codeblocks.cpp
reactos/tools/rbuild/backend/codeblocks/codeblocks.h

index 2fc258d..d83b2b0 100644 (file)
-/*\r
- * Copyright (C) 2006 Christoph von Wittich\r
- *\r
- * This program is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
- */\r
-#ifdef _MSC_VER\r
-#pragma warning ( disable : 4786 )\r
-#endif//_MSC_VER\r
-\r
-#include <iostream>\r
-#include <fstream>\r
-#include <string>\r
-#include <vector>\r
-\r
-#include <stdio.h>\r
-\r
-#include "codeblocks.h"\r
-#include "../mingw/mingw.h"\r
-\r
-using std::string;\r
-using std::vector;\r
-using std::ifstream;\r
-\r
-#ifdef OUT\r
-#undef OUT\r
-#endif//OUT\r
-\r
-\r
-static class CBFactory : public Backend::Factory\r
-{\r
-       public:\r
-\r
-               CBFactory() : Factory("CB", "Code::Blocks") {}\r
-               Backend *operator() (Project &project,\r
-                                    Configuration& configuration)\r
-               {\r
-                       return new CBBackend(project, configuration);\r
-               }\r
-               \r
-} factory;\r
-\r
-\r
-CBBackend::CBBackend(Project &project,\r
-       Configuration& configuration) : Backend(project, configuration)\r
-{\r
-       m_unitCount = 0;\r
-}\r
-\r
-void CBBackend::Process()\r
-{\r
-\r
-       while ( m_configurations.size () > 0 )\r
-       {\r
-               const CBConfiguration* cfg = m_configurations.back();\r
-               m_configurations.pop_back();\r
-               delete cfg;\r
-       }\r
-\r
-       m_configurations.push_back ( new CBConfiguration( Debug ));\r
-       m_configurations.push_back ( new CBConfiguration( Release ));\r
-\r
-       string filename_wrkspace ( ProjectNode.name );\r
-       filename_wrkspace += "_auto.workspace";\r
-\r
-       printf ( "Creating Code::Blocks workspace: %s\n", filename_wrkspace.c_str() );\r
-       \r
-       ProcessModules();\r
-       m_wrkspaceFile = fopen ( filename_wrkspace.c_str(), "wb" );\r
-\r
-       if ( !m_wrkspaceFile )\r
-       {\r
-               printf ( "Could not create file '%s'.\n", filename_wrkspace.c_str() );\r
-               return;\r
-       }\r
-\r
-       _generate_workspace ( m_wrkspaceFile );\r
-\r
-       fclose ( m_wrkspaceFile );\r
-       printf ( "Done.\n" );\r
-}\r
-\r
-void CBBackend::ProcessModules()\r
-{\r
-       for(size_t i = 0; i < ProjectNode.modules.size(); i++)\r
-       {\r
-               Module &module = *ProjectNode.modules[i];\r
-               _generate_cbproj ( module );\r
-       }\r
-}\r
-\r
-static bool FileExists(string &filename)\r
-{\r
-       ifstream file(filename.c_str());\r
-\r
-       if(!file.is_open())\r
-               return false;\r
-\r
-       file.close();\r
-       return true;\r
-}\r
-\r
-void CBBackend::ProcessFile(string &filepath)\r
-{\r
-       // Remove the .\ at the start of the filenames\r
-       if ( filepath[0] == '.' && strchr ( "/\\", filepath[1] ) )\r
-               filepath.erase(0, 2);\r
-\r
-       if(!FileExists(filepath))\r
-               return;\r
-\r
-       // Change the \ to /\r
-       for(size_t i = 0; i < filepath.length(); i++)\r
-       {\r
-               if(filepath[i] == '\\')\r
-                       filepath[i] = '/';\r
-       }\r
-\r
-       // Remove the filename from the path\r
-       string folder = "";\r
-\r
-       size_t pos = filepath.rfind(string("/"), filepath.length() - 1);\r
-\r
-       if(pos != string::npos)\r
-       {\r
-               folder = filepath;\r
-               folder.erase(pos, folder.length() - pos);\r
-       }\r
-       \r
-       FileUnit fileUnit;\r
-       fileUnit.filename = filepath;\r
-       fileUnit.folder = folder;\r
-\r
-       m_fileUnits.push_back(fileUnit);\r
-\r
-       if(folder != "")\r
-               AddFolders(folder);\r
-\r
-       m_unitCount++;\r
-}\r
-\r
-bool CBBackend::CheckFolderAdded(string &folder)\r
-{\r
-       for(size_t i = 0; i < m_folders.size(); i++)\r
-       {\r
-               if(m_folders[i] == folder)\r
-                       return true;\r
-       }\r
-\r
-       return false;\r
-}\r
-\r
-void CBBackend::AddFolders(string &folder)\r
-{\r
-       // Check if this folder was already added. true if it was, false otherwise.\r
-       if(CheckFolderAdded(folder))\r
-               return;\r
-       \r
-       m_folders.push_back(folder);\r
-       \r
-       size_t pos = folder.rfind(string("/"), folder.length() - 1);\r
-\r
-       if(pos == string::npos)\r
-               return;\r
-\r
-       folder.erase(pos, folder.length() - pos);\r
-       AddFolders(folder);\r
-}\r
-\r
-void CBBackend::OutputFolders()\r
-{\r
-#if 0\r
-       m_devFile << "Folders=";\r
-\r
-       for(size_t i = 0; i < m_folders.size(); i++)\r
-       {\r
-               if(i > 0)\r
-                       m_devFile << ",";\r
-\r
-               m_devFile << m_folders[i];\r
-       }\r
-#endif\r
-}\r
-\r
-std::string\r
-CBBackend::CbpFileName ( const Module& module ) const\r
-{\r
-       return DosSeparator(\r
-               ReplaceExtension ( module.GetPath(), + "_auto.cbp" )\r
-               );\r
-}\r
-\r
-std::string\r
-CBBackend::LayoutFileName ( const Module& module ) const\r
-{\r
-       return DosSeparator(\r
-               ReplaceExtension ( module.GetPath(), + "_auto.layout" )\r
-               );\r
-}\r
-\r
-std::string\r
-CBBackend::DependFileName ( const Module& module ) const\r
-{\r
-       return DosSeparator(\r
-               ReplaceExtension ( module.GetPath(), + "_auto.depend" )\r
-               );\r
-}\r
-\r
-void \r
-CBBackend::_get_object_files ( const Module& module, vector<string>& out) const\r
-{\r
-       string basepath = module.GetBasePath ();\r
-       size_t i;\r
-       string intenv = Environment::GetIntermediatePath () + "\\" + basepath + "\\";\r
-       string outenv = Environment::GetOutputPath () + "\\" + basepath + "\\";\r
-\r
-       vector<string> cfgs;\r
-\r
-       if ( configuration.UseConfigurationInPath )\r
-       {\r
-               cfgs.push_back ( intenv + "Debug" );\r
-               cfgs.push_back ( intenv + "Release" );\r
-               cfgs.push_back ( outenv + "Debug" );\r
-               cfgs.push_back ( outenv + "Release" );\r
-       }\r
-       else\r
-       {\r
-               cfgs.push_back ( intenv );\r
-               cfgs.push_back ( outenv );\r
-       }\r
-\r
-       vector<const IfableData*> ifs_list;\r
-       ifs_list.push_back ( &module.project.non_if_data );\r
-       ifs_list.push_back ( &module.non_if_data );\r
-       while ( ifs_list.size () )\r
-       {\r
-               const IfableData& data = *ifs_list.back();\r
-               ifs_list.pop_back();\r
-               const vector<File*>& files = data.files;\r
-               for ( i = 0; i < files.size (); i++ )\r
-               {\r
-                       string file = files[i]->name;\r
-                       string::size_type pos = file.find_last_of ("\\");\r
-                       if ( pos != string::npos )\r
-                               file.erase ( 0, pos+1 );\r
-                       if ( !stricmp ( Right(file,3).c_str(), ".rc" ) )\r
-                               file = ReplaceExtension ( file, ".res" );\r
-                       else\r
-                               file = ReplaceExtension ( file, ".obj" );\r
-                       for ( size_t j = 0; j < cfgs.size () / 2; j++ )\r
-                               out.push_back ( cfgs[j] + "\\" + file );\r
-               }\r
-\r
-       }\r
-}\r
-\r
-void\r
-CBBackend::_clean_project_files ( void )\r
-{\r
-       for ( size_t i = 0; i < ProjectNode.modules.size(); i++ )\r
-       {\r
-               Module& module = *ProjectNode.modules[i];\r
-               vector<string> out;\r
-               printf("Cleaning project %s %s\n", module.name.c_str (), module.GetBasePath ().c_str () );\r
-               \r
-               string basepath = module.GetBasePath ();\r
-               remove ( CbpFileName ( module ).c_str () );     \r
-               remove ( DependFileName ( module ).c_str () );  \r
-               remove ( LayoutFileName ( module ).c_str () );  \r
-\r
-               _get_object_files ( module, out );\r
-               for ( size_t j = 0; j < out.size (); j++)\r
-               {\r
-                       //printf("Cleaning file %s\n", out[j].c_str () );\r
-                       remove ( out[j].c_str () );\r
-               }\r
-       }\r
-\r
-       string filename_wrkspace = ProjectNode.name + ".workspace";\r
-\r
-       remove ( filename_wrkspace.c_str () );\r
-}\r
-\r
-void\r
-CBBackend::_generate_workspace ( FILE* OUT )\r
-{\r
-       fprintf ( OUT, "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\r\n" );\r
+/*
+ * Copyright (C) 2006 Christoph von Wittich
+ *
+ * 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.
+ */
+#ifdef _MSC_VER
+#pragma warning ( disable : 4786 )
+#endif//_MSC_VER
+
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+
+#include <stdio.h>
+
+#include "codeblocks.h"
+#include "../mingw/mingw.h"
+
+using std::string;
+using std::vector;
+using std::ifstream;
+
+#ifdef OUT
+#undef OUT
+#endif//OUT
+
+
+static class CBFactory : public Backend::Factory
+{
+       public:
+
+               CBFactory() : Factory("CB", "Code::Blocks") {}
+               Backend *operator() (Project &project,
+                                    Configuration& configuration)
+               {
+                       return new CBBackend(project, configuration);
+               }
+               
+} factory;
+
+
+CBBackend::CBBackend(Project &project,
+       Configuration& configuration) : Backend(project, configuration)
+{
+       m_unitCount = 0;
+}
+
+void CBBackend::Process()
+{
+
+       while ( m_configurations.size () > 0 )
+       {
+               const CBConfiguration* cfg = m_configurations.back();
+               m_configurations.pop_back();
+               delete cfg;
+       }
+
+       m_configurations.push_back ( new CBConfiguration( Debug ));
+       m_configurations.push_back ( new CBConfiguration( Release ));
+
+       string filename_wrkspace ( ProjectNode.name );
+       filename_wrkspace += "_auto.workspace";
+
+       printf ( "Creating Code::Blocks workspace: %s\n", filename_wrkspace.c_str() );
+       
+       ProcessModules();
+       m_wrkspaceFile = fopen ( filename_wrkspace.c_str(), "wb" );
+
+       if ( !m_wrkspaceFile )
+       {
+               printf ( "Could not create file '%s'.\n", filename_wrkspace.c_str() );
+               return;
+       }
+
+       _generate_workspace ( m_wrkspaceFile );
+
+       fclose ( m_wrkspaceFile );
+       printf ( "Done.\n" );
+}
+
+void CBBackend::ProcessModules()
+{
+       for(size_t i = 0; i < ProjectNode.modules.size(); i++)
+       {
+               Module &module = *ProjectNode.modules[i];
+               _generate_cbproj ( module );
+       }
+}
+
+static bool FileExists(string &filename)
+{
+       ifstream file(filename.c_str());
+
+       if(!file.is_open())
+               return false;
+
+       file.close();
+       return true;
+}
+
+void CBBackend::ProcessFile(string &filepath)
+{
+       // Remove the .\ at the start of the filenames
+       if ( filepath[0] == '.' && strchr ( "/\\", filepath[1] ) )
+               filepath.erase(0, 2);
+
+       if(!FileExists(filepath))
+               return;
+
+       // Change the \ to /
+       for(size_t i = 0; i < filepath.length(); i++)
+       {
+               if(filepath[i] == '\\')
+                       filepath[i] = '/';
+       }
+
+       // Remove the filename from the path
+       string folder = "";
+
+       size_t pos = filepath.rfind(string("/"), filepath.length() - 1);
+
+       if(pos != string::npos)
+       {
+               folder = filepath;
+               folder.erase(pos, folder.length() - pos);
+       }
+       
+       FileUnit fileUnit;
+       fileUnit.filename = filepath;
+       fileUnit.folder = folder;
+
+       m_fileUnits.push_back(fileUnit);
+
+       if(folder != "")
+               AddFolders(folder);
+
+       m_unitCount++;
+}
+
+bool CBBackend::CheckFolderAdded(string &folder)
+{
+       for(size_t i = 0; i < m_folders.size(); i++)
+       {
+               if(m_folders[i] == folder)
+                       return true;
+       }
+
+       return false;
+}
+
+void CBBackend::AddFolders(string &folder)
+{
+       // Check if this folder was already added. true if it was, false otherwise.
+       if(CheckFolderAdded(folder))
+               return;
+       
+       m_folders.push_back(folder);
+       
+       size_t pos = folder.rfind(string("/"), folder.length() - 1);
+
+       if(pos == string::npos)
+               return;
+
+       folder.erase(pos, folder.length() - pos);
+       AddFolders(folder);
+}
+
+void CBBackend::OutputFolders()
+{
+#if 0
+       m_devFile << "Folders=";
+
+       for(size_t i = 0; i < m_folders.size(); i++)
+       {
+               if(i > 0)
+                       m_devFile << ",";
+
+               m_devFile << m_folders[i];
+       }
+#endif
+}
+
+std::string
+CBBackend::CbpFileName ( const Module& module ) const
+{
+       return DosSeparator(
+               ReplaceExtension ( module.GetPath(), + "_auto.cbp" )
+               );
+}
+
+std::string
+CBBackend::LayoutFileName ( const Module& module ) const
+{
+       return DosSeparator(
+               ReplaceExtension ( module.GetPath(), + "_auto.layout" )
+               );
+}
+
+std::string
+CBBackend::DependFileName ( const Module& module ) const
+{
+       return DosSeparator(
+               ReplaceExtension ( module.GetPath(), + "_auto.depend" )
+               );
+}
+
+void 
+CBBackend::_get_object_files ( const Module& module, vector<string>& out) const
+{
+       string basepath = module.GetBasePath ();
+       size_t i;
+       string intenv = Environment::GetIntermediatePath () + "\\" + basepath + "\\";
+       string outenv = Environment::GetOutputPath () + "\\" + basepath + "\\";
+
+       vector<string> cfgs;
+
+       if ( configuration.UseConfigurationInPath )
+       {
+               cfgs.push_back ( intenv + "Debug" );
+               cfgs.push_back ( intenv + "Release" );
+               cfgs.push_back ( outenv + "Debug" );
+               cfgs.push_back ( outenv + "Release" );
+       }
+       else
+       {
+               cfgs.push_back ( intenv );
+               cfgs.push_back ( outenv );
+       }
+
+       vector<const IfableData*> ifs_list;
+       ifs_list.push_back ( &module.project.non_if_data );
+       ifs_list.push_back ( &module.non_if_data );
+       while ( ifs_list.size () )
+       {
+               const IfableData& data = *ifs_list.back();
+               ifs_list.pop_back();
+               const vector<File*>& files = data.files;
+               for ( i = 0; i < files.size (); i++ )
+               {
+                       string file = files[i]->name;
+                       string::size_type pos = file.find_last_of ("\\");
+                       if ( pos != string::npos )
+                               file.erase ( 0, pos+1 );
+                       if ( !stricmp ( Right(file,3).c_str(), ".rc" ) )
+                               file = ReplaceExtension ( file, ".res" );
+                       else
+                               file = ReplaceExtension ( file, ".obj" );
+                       for ( size_t j = 0; j < cfgs.size () / 2; j++ )
+                               out.push_back ( cfgs[j] + "\\" + file );
+               }
+
+       }
+}
+
+void
+CBBackend::_clean_project_files ( void )
+{
+       for ( size_t i = 0; i < ProjectNode.modules.size(); i++ )
+       {
+               Module& module = *ProjectNode.modules[i];
+               vector<string> out;
+               printf("Cleaning project %s %s\n", module.name.c_str (), module.GetBasePath ().c_str () );
+               
+               string basepath = module.GetBasePath ();
+               remove ( CbpFileName ( module ).c_str () );     
+               remove ( DependFileName ( module ).c_str () );  
+               remove ( LayoutFileName ( module ).c_str () );  
+
+               _get_object_files ( module, out );
+               for ( size_t j = 0; j < out.size (); j++)
+               {
+                       //printf("Cleaning file %s\n", out[j].c_str () );
+                       remove ( out[j].c_str () );
+               }
+       }
+
+       string filename_wrkspace = ProjectNode.name + ".workspace";
+
+       remove ( filename_wrkspace.c_str () );
+}
+
+void
+CBBackend::_generate_workspace ( FILE* OUT )
+{
+       fprintf ( OUT, "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\r\n" );
        fprintf ( OUT, "<CodeBlocks_workspace_file>\r\n" );
        fprintf ( OUT, "\t<Workspace title=\"ReactOS\">\r\n" );
-       for ( size_t i = 0; i < ProjectNode.modules.size(); i++ )\r
-       {\r
-               Module& module = *ProjectNode.modules[i];\r
-               \r
-               std::string Cbp_file = CbpFileName ( module );\r
+       for ( size_t i = 0; i < ProjectNode.modules.size(); i++ )
+       {
+               Module& module = *ProjectNode.modules[i];
+               
+               std::string Cbp_file = CbpFileName ( module );
                fprintf ( OUT, "\t\t<Project filename=\"%s\" />\r\n", Cbp_file.c_str());
-               \r
-       }\r
+               
+       }
        fprintf ( OUT, "\t</Workspace>\r\n" );
        fprintf ( OUT, "</CodeBlocks_workspace_file>\r\n" );
-}\r
-\r
-void\r
-CBBackend::_generate_cbproj ( const Module& module )\r
-{\r
-\r
-       size_t i;\r
-\r
-       string cbproj_file = CbpFileName(module);\r
-       string outdir;\r
-       string intdir;\r
-       string path_basedir = module.GetPathToBaseDir ();\r
-       string intenv = Environment::GetIntermediatePath ();\r
-       string outenv = Environment::GetOutputPath ();\r
-       string module_type = GetExtension(module.GetTargetName());\r
-       string cbproj_path = module.GetBasePath();      \r
-\r
-       //bool lib = (module.type == ObjectLibrary) || (module.type == RpcClient) ||(module.type == RpcServer) || (module_type == ".lib") || (module_type == ".a");\r
-       //bool dll = (module_type == ".dll") || (module_type == ".cpl");\r
-       bool exe = (module_type == ".exe") || (module_type == ".scr");\r
-       //bool sys = (module_type == ".sys");\r
-\r
-       vector<string> source_files, resource_files, includes, libraries, libpaths;\r
-       vector<string> header_files, common_defines;\r
-       \r
-       if ( module.pch != NULL )\r
-       {\r
-               string pch_path = Path::RelativeFromDirectory (\r
-                                       module.pch->file.name,\r
-                                       module.GetBasePath() );\r
-\r
-               header_files.push_back ( pch_path );\r
-       }\r
-\r
-       if ( intenv == "obj-i386" )\r
-               intdir = path_basedir + "obj-i386"; /* append relative dir from project dir */\r
-       else\r
-               intdir = intenv;\r
-\r
-       if ( outenv == "output-i386" )\r
-               outdir = path_basedir + "output-i386";\r
-       else\r
-               outdir = outenv;\r
-\r
-       vector<const IfableData*> ifs_list;\r
-       ifs_list.push_back ( &module.project.non_if_data );\r
-       ifs_list.push_back ( &module.non_if_data );\r
-       while ( ifs_list.size() )\r
-       {\r
-               const IfableData& data = *ifs_list.back();\r
-               ifs_list.pop_back();\r
-               const vector<File*>& files = data.files;\r
-               for ( i = 0; i < files.size(); i++ )\r
-               {\r
-                       string file = string(".") + &files[i]->name[cbproj_path.size()];\r
-\r
-                       if ( !stricmp ( Right(file,3).c_str(), ".rc" ) )\r
-                               resource_files.push_back ( file );\r
-                       else\r
-                               source_files.push_back ( file );\r
-               }\r
-               const vector<Include*>& incs = data.includes;\r
-               for ( i = 0; i < incs.size(); i++ )\r
-               {\r
-                       string path = Path::RelativeFromDirectory (\r
-                               incs[i]->directory,\r
-                               module.GetBasePath() );\r
-\r
-                       includes.push_back ( path );\r
-               }\r
-               const vector<Library*>& libs = data.libraries;\r
-               for ( i = 0; i < libs.size(); i++ )\r
-               {\r
-                       string libpath = outdir + "\\" + libs[i]->importedModule->GetBasePath() + "\\" + libs[i]->name;\r
-                       libraries.push_back ( libs[i]->name );\r
-                       libpaths.push_back ( libpath );\r
-               }\r
-               const vector<Define*>& defs = data.defines;\r
-               for ( i = 0; i < defs.size(); i++ )\r
-               {\r
-                       if ( defs[i]->value[0] )\r
-                               common_defines.push_back( defs[i]->name + "=" + defs[i]->value );\r
-                       else\r
-                               common_defines.push_back( defs[i]->name );\r
-               }\r
-       }\r
-\r
-       FILE* OUT = fopen ( cbproj_file.c_str(), "wb" );\r
-\r
+}
+
+void
+CBBackend::_generate_cbproj ( const Module& module )
+{
+
+       size_t i;
+
+       string cbproj_file = CbpFileName(module);
+       string outdir;
+       string intdir;
+       string path_basedir = module.GetPathToBaseDir ();
+       string intenv = Environment::GetIntermediatePath ();
+       string outenv = Environment::GetOutputPath ();
+       string module_type = GetExtension(module.GetTargetName());
+       string cbproj_path = module.GetBasePath();      
+
+       //bool lib = (module.type == ObjectLibrary) || (module.type == RpcClient) ||(module.type == RpcServer) || (module_type == ".lib") || (module_type == ".a");
+       //bool dll = (module_type == ".dll") || (module_type == ".cpl");
+       bool exe = (module_type == ".exe") || (module_type == ".scr");
+       //bool sys = (module_type == ".sys");
+
+       vector<string> source_files, resource_files, includes, libraries, libpaths;
+       vector<string> header_files, common_defines;
+       
+       if ( module.pch != NULL )
+       {
+               string pch_path = Path::RelativeFromDirectory (
+                                       module.pch->file.name,
+                                       module.GetBasePath() );
+
+               header_files.push_back ( pch_path );
+       }
+
+       if ( intenv == "obj-i386" )
+               intdir = path_basedir + "obj-i386"; /* append relative dir from project dir */
+       else
+               intdir = intenv;
+
+       if ( outenv == "output-i386" )
+               outdir = path_basedir + "output-i386";
+       else
+               outdir = outenv;
+
+       vector<const IfableData*> ifs_list;
+       ifs_list.push_back ( &module.project.non_if_data );
+       ifs_list.push_back ( &module.non_if_data );
+       while ( ifs_list.size() )
+       {
+               const IfableData& data = *ifs_list.back();
+               ifs_list.pop_back();
+               const vector<File*>& files = data.files;
+               for ( i = 0; i < files.size(); i++ )
+               {
+                       string file = string(".") + &files[i]->name[cbproj_path.size()];
+
+                       if ( !stricmp ( Right(file,3).c_str(), ".rc" ) )
+                               resource_files.push_back ( file );
+                       else
+                               source_files.push_back ( file );
+               }
+               const vector<Include*>& incs = data.includes;
+               for ( i = 0; i < incs.size(); i++ )
+               {
+                       string path = Path::RelativeFromDirectory (
+                               incs[i]->directory,
+                               module.GetBasePath() );
+
+                       includes.push_back ( path );
+               }
+               const vector<Library*>& libs = data.libraries;
+               for ( i = 0; i < libs.size(); i++ )
+               {
+                       string libpath = outdir + "\\" + libs[i]->importedModule->GetBasePath() + "\\" + libs[i]->name;
+                       libraries.push_back ( libs[i]->name );
+                       libpaths.push_back ( libpath );
+               }
+               const vector<Define*>& defs = data.defines;
+               for ( i = 0; i < defs.size(); i++ )
+               {
+                       if ( defs[i]->value[0] )
+                               common_defines.push_back( defs[i]->name + "=" + defs[i]->value );
+                       else
+                               common_defines.push_back( defs[i]->name );
+               }
+       }
+
+       FILE* OUT = fopen ( cbproj_file.c_str(), "wb" );
+
        fprintf ( OUT, "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\r\n" );
        fprintf ( OUT, "<CodeBlocks_project_file>\r\n" );
-       fprintf ( OUT, "\t<FileVersion major=\"1\" minor=\"5\" />\r\n" );\r
-       fprintf ( OUT, "\t<Project>\r\n" );\r
+       fprintf ( OUT, "\t<FileVersion major=\"1\" minor=\"5\" />\r\n" );
+       fprintf ( OUT, "\t<Project>\r\n" );
        fprintf ( OUT, "\t\t<Option title=\"%s\" />\r\n", module.name.c_str() );
        fprintf ( OUT, "\t\t<Option pch_mode=\"2\" />\r\n" );
        fprintf ( OUT, "\t\t<Option default_target=\"\" />\r\n" );
        fprintf ( OUT, "\t\t<Option compiler=\"gcc\" />\r\n" );
        fprintf ( OUT, "\t\t<Option virtualFolders=\"\" />\r\n" );
-       fprintf ( OUT, "\t\t<Build>\r\n" );\r
-\r
-       for ( size_t icfg = 0; icfg < m_configurations.size(); icfg++ )\r
-       {\r
-               const CBConfiguration& cfg = *m_configurations[icfg];\r
-               fprintf ( OUT, "\t\t\t<Target title=\"%s\">\r\n", cfg.name.c_str() );\r
-\r
-               if ( configuration.UseConfigurationInPath )\r
-               {\r
-                       fprintf ( OUT, "\t\t\t\t<Option output=\"%s\\%s%s\\%s%s\" prefix_auto=\"1\" extension_auto=\"1\" />\r\n", outdir.c_str (), module.GetBasePath ().c_str (), cfg.name.c_str(), module.name.c_str(), module_type.c_str());\r
-                       fprintf ( OUT, "\t\t\t\t<Option object_output=\"%s\\%s%s\" />\r\n", intdir.c_str(), module.GetBasePath ().c_str (), cfg.name.c_str() );\r
-               }\r
-               else\r
-               {\r
-                       fprintf ( OUT, "\t\t\t\t<Option output=\"%s\\%s\\%s%s\" prefix_auto=\"1\" extension_auto=\"1\" />\r\n", outdir.c_str (), module.GetBasePath ().c_str (), module.name.c_str(), module_type.c_str() );\r
-                       fprintf ( OUT, "\t\t\t\t<Option object_output=\"%s\\%s\" />\r\n", intdir.c_str(), module.GetBasePath ().c_str () );\r
-               }\r
-\r
-               bool console = exe && (module.type == Win32CUI);\r
-\r
-               if ( console )\r
-                       fprintf ( OUT, "\t\t\t\t<Option type=\"1\" />\r\n" );\r
-               else /* Win32 GUI */\r
-                       fprintf ( OUT, "\t\t\t\t<Option type=\"0\" />\r\n" );\r
-               /* TODO: other subsystems */\r
-                       \r
-               fprintf ( OUT, "\t\t\t\t<Option compiler=\"gcc\" />\r\n" );\r
-               fprintf ( OUT, "\t\t\t\t<Compiler>\r\n" );\r
-               /* defines */\r
-               for ( i = 0; i < common_defines.size(); i++ )\r
-               {\r
-                       const string& define = common_defines[i];\r
-                       fprintf ( OUT, "\t\t\t\t\t<Add option=\"-D%s\" />\r\n", define.c_str() );\r
-               }\r
-               /* includes */\r
-               for ( i = 0; i < includes.size(); i++ )\r
-               {\r
-                       const string& include = includes[i];\r
-                       fprintf ( OUT, "\t\t\t\t\t<Add directory=\"%s\" />\r\n", include.c_str() );\r
-               }\r
-               fprintf ( OUT, "\t\t\t\t</Compiler>\r\n" );\r
-\r
-               /* includes */\r
-               fprintf ( OUT, "\t\t\t\t<ResourceCompiler>\r\n" );\r
-               for ( i = 0; i < includes.size(); i++ )\r
-               {\r
-                       const string& include = includes[i];\r
-                       fprintf ( OUT, "\t\t\t\t\t<Add directory=\"%s\" />\r\n", include.c_str() );\r
-               }\r
-               fprintf ( OUT, "\t\t\t\t</ResourceCompiler>\r\n" );\r
-\r
-               /* libraries */\r
-               fprintf ( OUT, "\t\t\t\t<Linker>\r\n" );\r
-               for ( i = 0; i < libraries.size(); i++ )\r
-               {\r
-                       const string& lib = libraries[i];\r
-                       fprintf ( OUT, "\t\t\t\t\t<Add library=\"%s\" />\r\n", lib.c_str() );\r
-               }\r
-               for ( i = 0; i < libpaths.size(); i++ )\r
-               {\r
-                       const string& lib = libpaths[i];\r
-                       fprintf ( OUT, "\t\t\t\t\t<Add directory=\"%s\" />\r\n", lib.c_str() );\r
-               }\r
-               fprintf ( OUT, "\t\t\t\t</Linker>\r\n" );\r
-\r
-               fprintf ( OUT, "\t\t\t</Target>\r\n" );\r
-\r
-       }\r
+       fprintf ( OUT, "\t\t<Build>\r\n" );
+
+       for ( size_t icfg = 0; icfg < m_configurations.size(); icfg++ )
+       {
+               const CBConfiguration& cfg = *m_configurations[icfg];
+               fprintf ( OUT, "\t\t\t<Target title=\"%s\">\r\n", cfg.name.c_str() );
+
+               if ( configuration.UseConfigurationInPath )
+               {
+                       fprintf ( OUT, "\t\t\t\t<Option output=\"%s\\%s%s\\%s%s\" prefix_auto=\"1\" extension_auto=\"1\" />\r\n", outdir.c_str (), module.GetBasePath ().c_str (), cfg.name.c_str(), module.name.c_str(), module_type.c_str());
+                       fprintf ( OUT, "\t\t\t\t<Option object_output=\"%s\\%s%s\" />\r\n", intdir.c_str(), module.GetBasePath ().c_str (), cfg.name.c_str() );
+               }
+               else
+               {
+                       fprintf ( OUT, "\t\t\t\t<Option output=\"%s\\%s\\%s%s\" prefix_auto=\"1\" extension_auto=\"1\" />\r\n", outdir.c_str (), module.GetBasePath ().c_str (), module.name.c_str(), module_type.c_str() );
+                       fprintf ( OUT, "\t\t\t\t<Option object_output=\"%s\\%s\" />\r\n", intdir.c_str(), module.GetBasePath ().c_str () );
+               }
+
+               bool console = exe && (module.type == Win32CUI);
+
+               if ( console )
+                       fprintf ( OUT, "\t\t\t\t<Option type=\"1\" />\r\n" );
+               else /* Win32 GUI */
+                       fprintf ( OUT, "\t\t\t\t<Option type=\"0\" />\r\n" );
+               /* TODO: other subsystems */
+                       
+               fprintf ( OUT, "\t\t\t\t<Option compiler=\"gcc\" />\r\n" );
+               fprintf ( OUT, "\t\t\t\t<Compiler>\r\n" );
+               /* defines */
+               for ( i = 0; i < common_defines.size(); i++ )
+               {
+                       const string& define = common_defines[i];
+                       fprintf ( OUT, "\t\t\t\t\t<Add option=\"-D%s\" />\r\n", define.c_str() );
+               }
+               /* includes */
+               for ( i = 0; i < includes.size(); i++ )
+               {
+                       const string& include = includes[i];
+                       fprintf ( OUT, "\t\t\t\t\t<Add directory=\"%s\" />\r\n", include.c_str() );
+               }
+               fprintf ( OUT, "\t\t\t\t</Compiler>\r\n" );
+
+               /* includes */
+               fprintf ( OUT, "\t\t\t\t<ResourceCompiler>\r\n" );
+               for ( i = 0; i < includes.size(); i++ )
+               {
+                       const string& include = includes[i];
+                       fprintf ( OUT, "\t\t\t\t\t<Add directory=\"%s\" />\r\n", include.c_str() );
+               }
+               fprintf ( OUT, "\t\t\t\t</ResourceCompiler>\r\n" );
+
+               /* libraries */
+               fprintf ( OUT, "\t\t\t\t<Linker>\r\n" );
+               for ( i = 0; i < libraries.size(); i++ )
+               {
+                       const string& lib = libraries[i];
+                       fprintf ( OUT, "\t\t\t\t\t<Add library=\"%s\" />\r\n", lib.c_str() );
+               }
+               for ( i = 0; i < libpaths.size(); i++ )
+               {
+                       const string& lib = libpaths[i];
+                       fprintf ( OUT, "\t\t\t\t\t<Add directory=\"%s\" />\r\n", lib.c_str() );
+               }
+               fprintf ( OUT, "\t\t\t\t</Linker>\r\n" );
+
+               fprintf ( OUT, "\t\t\t</Target>\r\n" );
+
+       }
        fprintf ( OUT, "\t\t</Build>\r\n" );
-\r
-       /* header files */\r
-       for ( i = 0; i < header_files.size(); i++ )\r
-       {\r
-               const string& header_file = header_files[i];\r
-               fprintf ( OUT, "\t\t<Unit filename=\"%s\">\r\n", header_file.c_str() );\r
+
+       /* header files */
+       for ( i = 0; i < header_files.size(); i++ )
+       {
+               const string& header_file = header_files[i];
+               fprintf ( OUT, "\t\t<Unit filename=\"%s\">\r\n", header_file.c_str() );
                fprintf ( OUT, "\t\t\t<Option compilerVar=\"CPP\" />\r\n" );
                fprintf ( OUT, "\t\t\t<Option compile=\"0\" />\r\n" );
                fprintf ( OUT, "\t\t\t<Option link=\"0\" />\r\n" );
-               for ( size_t icfg = 0; icfg < m_configurations.size(); icfg++ )\r
-               {\r
-                       const CBConfiguration& cfg = *m_configurations[icfg];\r
-                       fprintf ( OUT, "\t\t\t<Option target=\"%s\" />\r\n" , cfg.name.c_str() );\r
-               }\r
-               fprintf ( OUT, "\t\t</Unit>\r\n" );\r
-       }\r
-\r
-       /* source files */\r
-       for ( size_t isrcfile = 0; isrcfile < source_files.size(); isrcfile++ )\r
-       {\r
-               string source_file = DosSeparator(source_files[isrcfile]);\r
-               fprintf ( OUT, "\t\t<Unit filename=\"%s\">\r\n", source_file.c_str() );\r
-               for ( size_t icfg = 0; icfg < m_configurations.size(); icfg++ )\r
-               {\r
-                       const CBConfiguration& cfg = *m_configurations[icfg];\r
-                       fprintf ( OUT, "\t\t\t<Option target=\"%s\" />\r\n" , cfg.name.c_str() );\r
-               }\r
-               fprintf ( OUT, "\t\t</Unit>\r\n" );\r
-       }\r
-\r
-       /* resource files */\r
-       for ( i = 0; i < resource_files.size(); i++ )\r
-       {\r
-               const string& resource_file = resource_files[i];\r
-               fprintf ( OUT, "\t\t<Unit filename=\"%s\">\r\n", resource_file.c_str() );\r
+               for ( size_t icfg = 0; icfg < m_configurations.size(); icfg++ )
+               {
+                       const CBConfiguration& cfg = *m_configurations[icfg];
+                       fprintf ( OUT, "\t\t\t<Option target=\"%s\" />\r\n" , cfg.name.c_str() );
+               }
+               fprintf ( OUT, "\t\t</Unit>\r\n" );
+       }
+
+       /* source files */
+       for ( size_t isrcfile = 0; isrcfile < source_files.size(); isrcfile++ )
+       {
+               string source_file = DosSeparator(source_files[isrcfile]);
+               fprintf ( OUT, "\t\t<Unit filename=\"%s\">\r\n", source_file.c_str() );
+               for ( size_t icfg = 0; icfg < m_configurations.size(); icfg++ )
+               {
+                       const CBConfiguration& cfg = *m_configurations[icfg];
+                       fprintf ( OUT, "\t\t\t<Option target=\"%s\" />\r\n" , cfg.name.c_str() );
+               }
+               fprintf ( OUT, "\t\t</Unit>\r\n" );
+       }
+
+       /* resource files */
+       for ( i = 0; i < resource_files.size(); i++ )
+       {
+               const string& resource_file = resource_files[i];
+               fprintf ( OUT, "\t\t<Unit filename=\"%s\">\r\n", resource_file.c_str() );
                fprintf ( OUT, "\t\t\t<Option compilerVar=\"WINDRES\" />\r\n" );
-               for ( size_t icfg = 0; icfg < m_configurations.size(); icfg++ )\r
-               {\r
-                       const CBConfiguration& cfg = *m_configurations[icfg];\r
-                       fprintf ( OUT, "\t\t\t<Option target=\"%s\" />\r\n" , cfg.name.c_str() );\r
-               }\r
-               fprintf ( OUT, "\t\t</Unit>\r\n" );\r
-       }\r
-\r
-       fprintf ( OUT, "\t\t<Extensions />\r\n" );\r
+               for ( size_t icfg = 0; icfg < m_configurations.size(); icfg++ )
+               {
+                       const CBConfiguration& cfg = *m_configurations[icfg];
+                       fprintf ( OUT, "\t\t\t<Option target=\"%s\" />\r\n" , cfg.name.c_str() );
+               }
+               fprintf ( OUT, "\t\t</Unit>\r\n" );
+       }
+
+       fprintf ( OUT, "\t\t<Extensions />\r\n" );
        fprintf ( OUT, "\t</Project>\r\n" );
        fprintf ( OUT, "</CodeBlocks_project_file>\r\n" );
-\r
-\r
-       fclose ( OUT );\r
-}\r
-\r
-CBConfiguration::CBConfiguration ( const OptimizationType optimization, const std::string &name )\r
-{\r
-       this->optimization = optimization;\r
-       if ( name != "" )\r
-               this->name = name;\r
-       else\r
-       {\r
-               if ( optimization == Debug )\r
-                       this->name = "Debug";\r
-               else if ( optimization == Release )\r
-                       this->name = "Release";\r
-               else\r
-                       this->name = "Unknown";\r
-       }\r
-}\r
+
+
+       fclose ( OUT );
+}
+
+CBConfiguration::CBConfiguration ( const OptimizationType optimization, const std::string &name )
+{
+       this->optimization = optimization;
+       if ( name != "" )
+               this->name = name;
+       else
+       {
+               if ( optimization == Debug )
+                       this->name = "Debug";
+               else if ( optimization == Release )
+                       this->name = "Release";
+               else
+                       this->name = "Unknown";
+       }
+}
index e054466..e2e0176 100644 (file)
-/*\r
- * Copyright (C) 2005 Trevor McCort\r
- * Copyright (C) 2005 Casper S. Hornstrup\r
- *\r
- * This program is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
- */\r
-#ifndef __CODEBLOCKS_H__\r
-#define __CODEBLOCKS_H__\r
-\r
-#include <fstream>\r
-#include <vector>\r
-#include <string>\r
-\r
-#include "../backend.h"\r
-\r
-class FileUnit\r
-{\r
-       public:\r
-               std::string filename;\r
-               std::string folder;\r
-};\r
-\r
-enum OptimizationType\r
-{\r
-       Debug,\r
-       Release\r
-};\r
-\r
-class CBConfiguration\r
-{\r
-       public:\r
-               CBConfiguration(const OptimizationType optimization,\r
-                                 const std::string &name = "");\r
-               virtual ~CBConfiguration() {}\r
-               std::string name;\r
-               OptimizationType optimization;\r
-};\r
-\r
-class CBBackend : public Backend\r
-{\r
-       public:\r
-\r
-               CBBackend(Project &project,\r
-                             Configuration& configuration);\r
-               virtual ~CBBackend() {}\r
-\r
-               virtual void Process();\r
-\r
-       private:\r
-\r
-               void ProcessModules();\r
-               void ProcessFile(std::string &filename);\r
-               \r
-               bool CheckFolderAdded(std::string &folder);\r
-               void AddFolders(std::string &folder);\r
-\r
-               void OutputFolders();\r
-               void OutputFileUnits();\r
-\r
-               std::string CbpFileName ( const Module& module ) const;\r
-               std::string LayoutFileName ( const Module& module ) const;\r
-               std::string DependFileName ( const Module& module ) const;\r
-\r
-               std::vector<CBConfiguration*> m_configurations;\r
-\r
-               std::vector<FileUnit> m_fileUnits;\r
-               std::vector<std::string> m_folders;\r
-\r
-               int m_unitCount;\r
-\r
-               FILE* m_wrkspaceFile;\r
-\r
-               std::string _replace_str(\r
-                       std::string string1,\r
-                       const std::string &find_str,\r
-                       const std::string &replace_str);\r
-\r
-               void _generate_workspace ( FILE* OUT );\r
-               void _generate_cbproj ( const Module& module );\r
-\r
-               void _clean_project_files ( void );\r
-               void _get_object_files ( const Module& module, std::vector<std::string>& out ) const;\r
-               void _install_files ( const std::string& vcdir, const std::string& config );\r
-               bool _copy_file ( const std::string& inputname, const std::string& targetname ) const;\r
-               const Property* _lookup_property ( const Module& module, const std::string& name ) const;\r
-};\r
-\r
-#endif // __MSVC_H__\r
-\r
+/*
+ * Copyright (C) 2005 Trevor McCort
+ * Copyright (C) 2005 Casper S. Hornstrup
+ *
+ * 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 __CODEBLOCKS_H__
+#define __CODEBLOCKS_H__
+
+#include <fstream>
+#include <vector>
+#include <string>
+
+#include "../backend.h"
+
+class FileUnit
+{
+       public:
+               std::string filename;
+               std::string folder;
+};
+
+enum OptimizationType
+{
+       Debug,
+       Release
+};
+
+class CBConfiguration
+{
+       public:
+               CBConfiguration(const OptimizationType optimization,
+                                 const std::string &name = "");
+               virtual ~CBConfiguration() {}
+               std::string name;
+               OptimizationType optimization;
+};
+
+class CBBackend : public Backend
+{
+       public:
+
+               CBBackend(Project &project,
+                             Configuration& configuration);
+               virtual ~CBBackend() {}
+
+               virtual void Process();
+
+       private:
+
+               void ProcessModules();
+               void ProcessFile(std::string &filename);
+               
+               bool CheckFolderAdded(std::string &folder);
+               void AddFolders(std::string &folder);
+
+               void OutputFolders();
+               void OutputFileUnits();
+
+               std::string CbpFileName ( const Module& module ) const;
+               std::string LayoutFileName ( const Module& module ) const;
+               std::string DependFileName ( const Module& module ) const;
+
+               std::vector<CBConfiguration*> m_configurations;
+
+               std::vector<FileUnit> m_fileUnits;
+               std::vector<std::string> m_folders;
+
+               int m_unitCount;
+
+               FILE* m_wrkspaceFile;
+
+               std::string _replace_str(
+                       std::string string1,
+                       const std::string &find_str,
+                       const std::string &replace_str);
+
+               void _generate_workspace ( FILE* OUT );
+               void _generate_cbproj ( const Module& module );
+
+               void _clean_project_files ( void );
+               void _get_object_files ( const Module& module, std::vector<std::string>& out ) const;
+               void _install_files ( const std::string& vcdir, const std::string& config );
+               bool _copy_file ( const std::string& inputname, const std::string& targetname ) const;
+               const Property* _lookup_property ( const Module& module, const std::string& name ) const;
+};
+
+#endif // __MSVC_H__
+