Partial 'make install' implementation
[reactos.git] / reactos / tools / rbuild / backend / mingw / mingw.cpp
index 27482c3..59f0da1 100644 (file)
@@ -20,6 +20,28 @@ using std::map;
 typedef set<string> set_string;\r
 typedef map<string,Directory*> directory_map;\r
 \r
+\r
+string\r
+v2s ( const string_list& v, int wrap_at )\r
+{\r
+       if ( !v.size() )\r
+               return "";\r
+       string s;\r
+       int wrap_count = 0;\r
+       for ( size_t i = 0; i < v.size(); i++ )\r
+       {\r
+               if ( !v[i].size() )\r
+                       continue;\r
+               if ( wrap_at > 0 && wrap_count++ == wrap_at )\r
+                       s += " \\\n\t\t";\r
+               else if ( s.size() )\r
+                       s += " ";\r
+               s += v[i];\r
+       }\r
+       return s;\r
+}\r
+\r
+\r
 class Directory\r
 {\r
 public:\r
@@ -262,6 +284,7 @@ MingwBackend::Process ()
        GenerateGlobalVariables ();\r
        GenerateXmlBuildFilesMacro ();\r
        ProcessModules ();\r
+       GenerateInstallTarget ();\r
        GenerateDirectories ();\r
        CheckAutomaticDependencies ();\r
        CloseMakefile ();\r
@@ -590,3 +613,85 @@ MingwBackend::DetectPCHSupport ()
        // TODO FIXME - eventually check for ROS_USE_PCH env var and\r
        // allow that to override use_pch if true\r
 }\r
+\r
+string\r
+MingwBackend::GetNonModuleInstallDirectories ( const string& installDirectory )\r
+{\r
+       string directories;\r
+       for ( size_t i = 0; i < ProjectNode.installfiles.size (); i++ )\r
+       {\r
+               const InstallFile& installfile = *ProjectNode.installfiles[i];\r
+               string targetDirectory ( installDirectory + SSEP + installfile.base );\r
+               if ( directories.size () > 0 )\r
+                       directories += " ";\r
+               directories += MingwModuleHandler::PassThruCacheDirectory (\r
+                       FixupTargetFilename ( targetDirectory ),\r
+                       true );\r
+       }\r
+       return directories;\r
+}\r
+\r
+string\r
+MingwBackend::GetInstallDirectories ( const string& installDirectory )\r
+{\r
+       return GetNonModuleInstallDirectories ( installDirectory );\r
+}\r
+\r
+void\r
+MingwBackend::GetNonModuleInstallFiles (\r
+       vector<string>& out ) const\r
+{\r
+       for ( size_t i = 0; i < ProjectNode.installfiles.size (); i++ )\r
+       {\r
+               const InstallFile& installfile = *ProjectNode.installfiles[i];\r
+               out.push_back ( NormalizeFilename ( installfile.GetPath () ) );\r
+       }\r
+}\r
+\r
+void\r
+MingwBackend::GetInstallFiles (\r
+       vector<string>& out ) const\r
+{\r
+       GetNonModuleInstallFiles ( out );\r
+}\r
+\r
+void\r
+MingwBackend::OutputInstallfileCopyCommands ( const string& installDirectory )\r
+{\r
+       for ( size_t i = 0; i < ProjectNode.installfiles.size (); i++ )\r
+       {\r
+               const InstallFile& installfile = *ProjectNode.installfiles[i];\r
+               string targetFilenameNoFixup = installDirectory + SSEP + installfile.base + SSEP + installfile.newname;\r
+               string targetFilename = MingwModuleHandler::PassThruCacheDirectory (\r
+                       FixupTargetFilename ( targetFilenameNoFixup ),\r
+                       true );\r
+               fprintf ( fMakefile,\r
+                         "\t$(ECHO_CP)\n" );\r
+               fprintf ( fMakefile,\r
+                         "\t${cp} %s %s\n",\r
+                         installfile.GetPath ().c_str (),\r
+                         targetFilename.c_str () );\r
+       }\r
+}\r
+\r
+void\r
+MingwBackend::GenerateInstallTarget ()\r
+{\r
+       string installDirectoryNoFixup = "reactos";\r
+       string installDirectory = MingwModuleHandler::PassThruCacheDirectory (\r
+               FixupTargetFilename ( installDirectoryNoFixup ),\r
+               true );\r
+       string installDirectories = GetInstallDirectories ( installDirectoryNoFixup );\r
+       vector<string> vInstallFiles;\r
+       GetInstallFiles ( vInstallFiles );\r
+       string installFiles = v2s ( vInstallFiles, 5 );\r
+\r
+       fprintf ( fMakefile,\r
+                 "install: all %s %s %s\n",\r
+                 installDirectory.c_str (),\r
+                 installDirectories.c_str (),\r
+                 installFiles.c_str () );\r
+       OutputInstallfileCopyCommands ( installDirectoryNoFixup );\r
+       fprintf ( fMakefile,\r
+                 "\n" );\r
+}\r