Partial 'make install' implementation
authorCasper Hornstrup <chorns@users.sourceforge.net>
Sun, 3 Apr 2005 19:25:58 +0000 (19:25 +0000)
committerCasper Hornstrup <chorns@users.sourceforge.net>
Sun, 3 Apr 2005 19:25:58 +0000 (19:25 +0000)
svn path=/branches/xmlbuildsystem/; revision=14483

14 files changed:
reactos/Makefile
reactos/media/directory.xml
reactos/media/drivers/etc/etc.xml
reactos/media/fonts/fonts.xml [new file with mode: 0644]
reactos/media/inf/inf.xml [new file with mode: 0644]
reactos/media/nls/nls.xml
reactos/tools/rbuild/backend/mingw/mingw.cpp
reactos/tools/rbuild/backend/mingw/mingw.h
reactos/tools/rbuild/backend/mingw/modulehandler.cpp
reactos/tools/rbuild/installfile.cpp [new file with mode: 0644]
reactos/tools/rbuild/project.cpp
reactos/tools/rbuild/rbuild.h
reactos/tools/rbuild/rbuild.mak
reactos/tools/rbuild/rbuild.txt

index f9041b9..f214a4a 100644 (file)
 #        a path separator at the end. The variable defaults to the current
 #        directory.
 #
+#    ROS_INSTALL
+#        This variable controls where to install output files to when using
+#        'make install'. N.B. Don't put a path separator at the end. The variable
+#        defaults to .\reactos.
+#
 #    ROS_BUILDMAP
 #        This variable controls if map files are to be generated for executable
 #        output files. Map files have the extension .map. The value can be either
@@ -63,6 +68,7 @@ else
 endif
 endif
 ifeq ($(HALFVERBOSEECHO),yes)
+  ECHO_CP      =@echo [COPY]     $@
   ECHO_MKDIR   =@echo [MKDIR]    $@
   ECHO_BUILDNO =@echo [BUILDNO]  $@
   ECHO_INVOKE  =@echo [INVOKE]   $<
@@ -87,6 +93,7 @@ ifeq ($(HALFVERBOSEECHO),yes)
   ECHO_REGTESTS=@echo [REGTESTS] $@
   ECHO_TEST    =@echo [TEST]     $@
 else
+  ECHO_CP      =
   ECHO_MKDIR   =
   ECHO_BUILDNO =
   ECHO_INVOKE  =
index 4927d0e..41c6d89 100644 (file)
@@ -1,6 +1,12 @@
 <directory name="drivers">\r
        <xi:include href="drivers/directory.xml" />\r
 </directory>\r
+<directory name="fonts">\r
+       <xi:include href="fonts/fonts.xml" />\r
+</directory>\r
+<directory name="inf">\r
+       <xi:include href="inf/inf.xml" />\r
+</directory>\r
 <directory name="nls">\r
        <xi:include href="nls/nls.xml" />\r
 </directory>\r
index b0addb9..23872aa 100644 (file)
@@ -1 +1,2 @@
 <cdfile base="reactos">services</cdfile>\r
+<installfile base="system32/drivers/etc">services</installfile>\r
diff --git a/reactos/media/fonts/fonts.xml b/reactos/media/fonts/fonts.xml
new file mode 100644 (file)
index 0000000..fae43b4
--- /dev/null
@@ -0,0 +1,28 @@
+<installfile base="media/fonts">c0419bt_.ttf</installfile>\r
+<installfile base="media/fonts">c0582bt_.ttf</installfile>\r
+<installfile base="media/fonts">c0583bt_.ttf</installfile>\r
+<installfile base="media/fonts">c0611bt_.ttf</installfile>\r
+<installfile base="media/fonts">c0632bt_.ttf</installfile>\r
+<installfile base="media/fonts">c0633bt_.ttf</installfile>\r
+<installfile base="media/fonts">c0648bt_.ttf</installfile>\r
+<installfile base="media/fonts">c0649bt_.ttf</installfile>\r
+<installfile base="media/fonts">cour.ttf</installfile>\r
+<installfile base="media/fonts">courb.ttf</installfile>\r
+<installfile base="media/fonts">courbi.ttf</installfile>\r
+<installfile base="media/fonts">helb____.ttf</installfile>\r
+<installfile base="media/fonts">TGMarlett.ttf</installfile>\r
+<installfile base="media/fonts">timr____.ttf</installfile>\r
+<installfile base="media/fonts">UTB_____.ttf</installfile>\r
+<installfile base="media/fonts">UTBI____.ttf</installfile>\r
+<installfile base="media/fonts">UTI_____.ttf</installfile>\r
+<installfile base="media/fonts">UTRG____.ttf</installfile>\r
+<installfile base="media/fonts">Vera.ttf</installfile>\r
+<installfile base="media/fonts">VeraBd.ttf</installfile>\r
+<installfile base="media/fonts">VeraBI.ttf</installfile>\r
+<installfile base="media/fonts">VeraIt.ttf</installfile>\r
+<installfile base="media/fonts">VeraMoBd.ttf</installfile>\r
+<installfile base="media/fonts">VeraMoBI.ttf</installfile>\r
+<installfile base="media/fonts">VeraMoIt.ttf</installfile>\r
+<installfile base="media/fonts">VeraMono.ttf</installfile>\r
+<installfile base="media/fonts">VeraSe.ttf</installfile>\r
+<installfile base="media/fonts">VeraSeBd.ttf</installfile>\r
diff --git a/reactos/media/inf/inf.xml b/reactos/media/inf/inf.xml
new file mode 100644 (file)
index 0000000..4a93b9f
--- /dev/null
@@ -0,0 +1,4 @@
+<installfile base="system32/inf">layout.inf</installfile>\r
+<installfile base="system32/inf">NET_NIC.inf</installfile>\r
+<installfile base="system32/inf">scsi.inf</installfile>\r
+<installfile base="system32/inf">syssetup.inf</installfile>\r
index 2a816b0..907972c 100644 (file)
@@ -1,3 +1,59 @@
 <cdfile base="reactos">c_437.nls</cdfile>\r
 <cdfile base="reactos">c_1252.nls</cdfile>\r
 <cdfile base="reactos">l_intl.nls</cdfile>\r
+\r
+<installfile base="system32">c_037.nls</installfile>\r
+<installfile base="system32">c_037.nls</installfile>\r
+<installfile base="system32">c_10000.nls</installfile>\r
+<installfile base="system32">c_10006.nls</installfile>\r
+<installfile base="system32">c_10007.nls</installfile>\r
+<installfile base="system32">c_10029.nls</installfile>\r
+<installfile base="system32">c_1006.nls</installfile>\r
+<installfile base="system32">c_10079.nls</installfile>\r
+<installfile base="system32">c_10081.nls</installfile>\r
+<installfile base="system32">c_1026.nls</installfile>\r
+<installfile base="system32">c_1250.nls</installfile>\r
+<installfile base="system32">c_1251.nls</installfile>\r
+<installfile base="system32" newname="ansi.nls">c_1252.nls</installfile>\r
+<installfile base="system32">c_1253.nls</installfile>\r
+<installfile base="system32">c_1254.nls</installfile>\r
+<installfile base="system32">c_1255.nls</installfile>\r
+<installfile base="system32">c_1256.nls</installfile>\r
+<installfile base="system32">c_1257.nls</installfile>\r
+<installfile base="system32">c_1258.nls</installfile>\r
+<installfile base="system32">c_20866.nls</installfile>\r
+<installfile base="system32">c_28591.nls</installfile>\r
+<installfile base="system32">c_28592.nls</installfile>\r
+<installfile base="system32">c_28593.nls</installfile>\r
+<installfile base="system32">c_28594.nls</installfile>\r
+<installfile base="system32">c_28595.nls</installfile>\r
+<installfile base="system32">c_28596.nls</installfile>\r
+<installfile base="system32">c_28597.nls</installfile>\r
+<installfile base="system32">c_28598.nls</installfile>\r
+<installfile base="system32">c_28599.nls</installfile>\r
+<installfile base="system32">c_424.nls</installfile>\r
+<installfile base="system32" newname="oem.nls">c_437.nls</installfile>\r
+<installfile base="system32">c_500.nls</installfile>\r
+<installfile base="system32">c_737.nls</installfile>\r
+<installfile base="system32">c_775.nls</installfile>\r
+<installfile base="system32">c_850.nls</installfile>\r
+<installfile base="system32">c_852.nls</installfile>\r
+<installfile base="system32">c_855.nls</installfile>\r
+<installfile base="system32">c_856.nls</installfile>\r
+<installfile base="system32">c_857.nls</installfile>\r
+<installfile base="system32">c_860.nls</installfile>\r
+<installfile base="system32">c_861.nls</installfile>\r
+<installfile base="system32">c_862.nls</installfile>\r
+<installfile base="system32">c_863.nls</installfile>\r
+<installfile base="system32">c_864.nls</installfile>\r
+<installfile base="system32">c_865.nls</installfile>\r
+<installfile base="system32">c_866.nls</installfile>\r
+<installfile base="system32">c_869.nls</installfile>\r
+<installfile base="system32">c_874.nls</installfile>\r
+<installfile base="system32">c_875.nls</installfile>\r
+<installfile base="system32">c_878.nls</installfile>\r
+<installfile base="system32">c_932.nls</installfile>\r
+<installfile base="system32">c_936.nls</installfile>\r
+<installfile base="system32">c_949.nls</installfile>\r
+<installfile base="system32">c_950.nls</installfile>\r
+<installfile base="system32" newname="casemap.nls">l_intl.nls</installfile>\r
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
index 696bc35..7843581 100644 (file)
@@ -12,6 +12,9 @@
 class Directory;\r
 class MingwModuleHandler;\r
 \r
+extern std::string\r
+v2s ( const string_list& v, int wrap_at );\r
+\r
 class MingwBackend : public Backend\r
 {\r
 public:\r
@@ -41,6 +44,12 @@ private:
        void DetectPipeSupport ();\r
        void DetectPCHSupport ();\r
        void ProcessModules ();\r
+       std::string GetNonModuleInstallDirectories ( const std::string& installDirectory );\r
+       std::string GetInstallDirectories ( const std::string& installDirectory );\r
+       void GetNonModuleInstallFiles ( std::vector<std::string>& out ) const;\r
+       void GetInstallFiles ( std::vector<std::string>& out ) const;\r
+       void OutputInstallfileCopyCommands ( const std::string& installDirectory );\r
+       void GenerateInstallTarget ();\r
        FILE* fMakefile;\r
        bool use_pch;\r
        Directory *int_directories, *out_directories;\r
index 512a660..3024d10 100644 (file)
@@ -40,26 +40,6 @@ PrefixFilename (
        return out;\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
 string\r
 GetTargetMacro ( const Module& module, bool with_dollar )\r
 {\r
@@ -1570,6 +1550,7 @@ MingwModuleHandler::GetDefinitionDependencies (
        }\r
 }\r
 \r
+\r
 MingwBuildToolModuleHandler::MingwBuildToolModuleHandler ( const Module& module_ )\r
        : MingwModuleHandler ( module_ )\r
 {\r
@@ -2205,6 +2186,8 @@ MingwIsoModuleHandler::OutputBootstrapfileCopyCommands (
                {\r
                        string targetFilenameNoFixup ( bootcdDirectory + SSEP + m.bootstrap->base + SSEP + m.bootstrap->nameoncd );\r
                        string targetFilename ( GetTargetMacro ( module ) );\r
+                       fprintf ( fMakefile,\r
+                                 "\t$(ECHO_CP)\n" );\r
                        fprintf ( fMakefile,\r
                                  "\t${cp} %s %s\n",\r
                                  m.GetPath ().c_str (),\r
@@ -2221,7 +2204,11 @@ MingwIsoModuleHandler::OutputCdfileCopyCommands (
        {\r
                const CDFile& cdfile = *module.project.cdfiles[i];\r
                string targetFilenameNoFixup = bootcdDirectory + SSEP + cdfile.base + SSEP + cdfile.nameoncd;\r
-               string targetFilename = GetTargetMacro(module);\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
                          cdfile.GetPath ().c_str (),\r
diff --git a/reactos/tools/rbuild/installfile.cpp b/reactos/tools/rbuild/installfile.cpp
new file mode 100644 (file)
index 0000000..1e497f4
--- /dev/null
@@ -0,0 +1,42 @@
+#include "pch.h"\r
+#include <assert.h>\r
+\r
+#include "rbuild.h"\r
+\r
+using std::string;\r
+\r
+InstallFile::InstallFile ( const Project& project_,\r
+                              const XMLElement& installfileNode,\r
+                              const string& path )\r
+       : project ( project_ ),\r
+         node ( installfileNode )\r
+{\r
+       const XMLAttribute* att = node.GetAttribute ( "base", false );\r
+       if ( att != NULL )\r
+               base = att->value;\r
+       else\r
+               base = "";\r
+\r
+       att = node.GetAttribute ( "newname", false );\r
+       if ( att != NULL )\r
+               newname = att->value;\r
+       else\r
+               newname = node.value;\r
+       name = node.value;\r
+       this->path = path;\r
+}\r
+\r
+InstallFile::~InstallFile ()\r
+{\r
+}\r
+\r
+string\r
+InstallFile::GetPath () const\r
+{\r
+       return path + SSEP + name;\r
+}\r
+\r
+void\r
+InstallFile::ProcessXML()\r
+{\r
+}\r
index e3d51fa..c10da9f 100644 (file)
@@ -24,6 +24,8 @@ Project::~Project ()
                delete linkerFlags[i];\r
        for ( i = 0; i < cdfiles.size (); i++ )\r
                delete cdfiles[i];\r
+       for ( i = 0; i < installfiles.size (); i++ )\r
+               delete installfiles[i];\r
        delete head;\r
 }\r
 \r
@@ -220,6 +222,8 @@ Project::ProcessXML ( const string& path )
        non_if_data.ProcessXML ();\r
        for ( i = 0; i < cdfiles.size (); i++ )\r
                cdfiles[i]->ProcessXML ();\r
+       for ( i = 0; i < installfiles.size (); i++ )\r
+               installfiles[i]->ProcessXML ();\r
 }\r
 \r
 void\r
@@ -251,6 +255,12 @@ Project::ProcessXMLSubElement ( const XMLElement& e,
                cdfiles.push_back ( cdfile );\r
                subs_invalid = true;\r
        }\r
+       else if ( e.name == "installfile" )\r
+       {\r
+               InstallFile* installfile = new InstallFile ( *this, e, path );\r
+               installfiles.push_back ( installfile );\r
+               subs_invalid = true;\r
+       }\r
        else if ( e.name == "directory" )\r
        {\r
                const XMLAttribute* att = e.GetAttribute ( "name", true );\r
index b7db6cf..0a1949e 100644 (file)
@@ -58,6 +58,7 @@ class Property;
 class AutomaticDependency;\r
 class Bootstrap;\r
 class CDFile;\r
+class InstallFile;\r
 class PchFile;\r
 class StubbedComponent;\r
 class StubbedSymbol;\r
@@ -89,6 +90,7 @@ public:
        std::vector<Module*> modules;\r
        std::vector<LinkerFlag*> linkerFlags;\r
        std::vector<CDFile*> cdfiles;\r
+       std::vector<InstallFile*> installfiles;\r
        IfableData non_if_data;\r
 \r
        Project ( const std::string& filename );\r
@@ -518,6 +520,25 @@ public:
 };\r
 \r
 \r
+class InstallFile\r
+{\r
+public:\r
+       const Project& project;\r
+       const XMLElement& node;\r
+       std::string name;\r
+       std::string base;\r
+       std::string newname;\r
+       std::string path;\r
+\r
+       InstallFile ( const Project& project,\r
+                     const XMLElement& bootstrapNode,\r
+                     const std::string& path );\r
+       ~InstallFile ();\r
+       void ProcessXML ();\r
+       std::string GetPath () const;\r
+};\r
+\r
+\r
 class PchFile\r
 {\r
 public:\r
index 6f79c3b..ce67540 100644 (file)
@@ -117,6 +117,7 @@ RBUILD_COMMON_SOURCES = \
                define.cpp \\r
                exception.cpp \\r
                include.cpp \\r
+               installfile.cpp \\r
                linkerflag.cpp \\r
                module.cpp \\r
                project.cpp \\r
@@ -209,6 +210,10 @@ $(RBUILD_INT_)include.o: $(RBUILD_BASE_)include.cpp $(RBUILD_INT)
        $(ECHO_CC)\r
        ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@\r
 \r
+$(RBUILD_INT_)installfile.o: $(RBUILD_BASE_)installfile.cpp $(RBUILD_INT)\r
+       $(ECHO_CC)\r
+       ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@\r
+\r
 $(RBUILD_INT_)linkerflag.o: $(RBUILD_BASE_)linkerflag.cpp $(RBUILD_INT)\r
        $(ECHO_CC)\r
        ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@\r
index 1b21fea..9e90c9a 100644 (file)
@@ -341,6 +341,24 @@ Elements:
        None.\r
 \r
 \r
+Installfile element\r
+-------------------\r
+An installfile element specifies the name of a file that is to be installed when using 'make install'.\r
+\r
+Syntax:\r
+       <installfile base="reactos" newname="ReadMe.txt">ReadMe.txt</installfile>\r
+\r
+Attributes:\r
+       base - Put file in this directory within the install directory. This attribute is optional.\r
+       newname - Name of file within the install directory. This attribute is optional.\r
+\r
+Value:\r
+       Name of file.\r
+\r
+Elements:\r
+       None.\r
+\r
+\r
 Invoke element\r
 --------------\r
 An invoke element specifies the name of a module which is to be executed before the current module is processed.\r