]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/GenBuild/org/tianocore/build/global/OutputManager.java
Change to new XML Schema.
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / global / OutputManager.java
index 01e24e653f1ed915c33a6e74fc10082a5bdd39c2..773fe3e94922b395e06c1fade0e6712af65704b7 100644 (file)
@@ -19,158 +19,180 @@ import java.io.File;
 \r
 /**\r
   OutputManager class is used to setup output directories (BIN_DIR, DEST_DIR_OUTPUT, \r
-  DEST_DIR_DEBUG) according to BUILD_MODE\r
+  DEST_DIR_DEBUG). \r
   \r
   @since GenBuild 1.0\r
 **/\r
 public class OutputManager {\r
-    \r
-    ///\r
-    /// Single Module build\r
-    ///\r
-    public static final String MODULE_BUILD = "MODULE";\r
-\r
-    ///\r
-    /// Package build\r
-    ///\r
-    public static final String PACKAGE_BUILD = "PACKAGE";\r
 \r
     ///\r
-    /// Platform build\r
+    /// means intermediate files will put under Module's dir\r
     ///\r
-    public static final String PLATFORM_BUILD = "PLATFORM";\r
-    \r
-    public static String buildMode = MODULE_BUILD;\r
+    private String MODULE = "MODULE";\r
     \r
     ///\r
-    /// For Package build, PLATFORM represent PACKAGE\r
+    /// mean intermediate files will put under a unify dir\r
     ///\r
-    public static String PLATFORM;\r
+    private String UNIFIED = "UNIFIED";\r
     \r
-    ///\r
-    /// For Platform build, PLATFORM_DIR represent PACKAGE_DIR\r
-    ///\r
-    public static String PLATFORM_DIR;\r
     \r
-    ///\r
-    /// means intermediate files will put under Module's dir\r
-    ///\r
-    public static final String MODULE = "MODULE";\r
+    private String userdir;\r
     \r
+    private String type;\r
     ///\r
-    /// mean intermediate files will put under a unify dir\r
+    /// Singleton Design Pattern\r
     ///\r
-    public static final String UNIFIED = "UNIFIED";\r
+    private static OutputManager object;\r
     \r
-    ///\r
-    /// Flag to ensure the function <code>update</code> will be called only one in the whole build.\r
-    ///\r
-    private static boolean flag = true;\r
+    public synchronized static OutputManager getInstance() {\r
+        if ( object == null ) {\r
+            object = new OutputManager();\r
+        }\r
+        return object;\r
+    }\r
+    \r
+    public void setup(String userdir, String type) {\r
+        this.userdir = userdir;\r
+        this.type = type;\r
+    }\r
     \r
     /**\r
-      If BUILD_MODE is PLATFORM or PACKAGE, record PLATFORM and PLARFORM_DIR.\r
-      Reminder that for PACKAGE build, here set value PACKAGE to PLATFORM and\r
-      PACKAGE_DIR to PLARFORM_DIR, and also update the ant properties. \r
+      Setup BIN_DIR, DEST_DIR_OUTPUT and DEST_DIR_OUTPUT, following are the rules:\r
+      \r
+      <p>Divide all output files into two types: one is final files, such as FFS \r
+      file for driver module while LIB file for library module; another is \r
+      intermediate files, such AutoGen.c, OBJ files, Section files and so on. \r
+      \r
+      <p>In FPD, OutputDirectory element is used to specify where to put the output \r
+      files to. There are two mode (MODULE | UNIFIED). MODULE mode means that all \r
+      output files will put to the module directory while UNIFIED mode means that \r
+      all output files will put together. Default is UNIFIED mode. \r
+      \r
+      <p>BUILD_DIR is the base directory for current module build. By default, \r
+      BUILD_DIR is PLATFORM_DIR/Build in UNIFIED mode while is MODULE_DIR/Build \r
+      in MODULE mode. Of course, user can customize BUILD_DIR. If user-defined \r
+      BUILD_DIR is relative path, then look as related to WORKSPACE_DIR. \r
       \r
-      <p>Note that this function will be called only once in the whole build.</p> \r
+      <p>Then, BIN_DIR is BUILD_DIR/TARGET/TOOLCHAIN/ARCH;\r
+      \r
+      <p>FV_DIR is BUILD_DIR/TARGET/TOOLCHAIN/FV;\r
+      \r
+      <p>DEST_DIR_DEBUG | DEST_DIR_OUTPUT is: \r
+      BIN_DIR/PACKAGE_RELATIVE_DIR/MODULE_RELATIVE_DIR/DEBUG | OUTPUT\r
+\r
       \r
       @param project current ANT build Project\r
+      @param userdir user-defined directory\r
+      @param type the module build type (MODULE or UNIFIED)\r
     **/\r
-    public synchronized static void update(Project project) {\r
-        if (flag){\r
-            flag = false;\r
-            String str = project.getProperty("BUILD_MODE");\r
-            if (str != null){\r
-                if (str.equals(PLATFORM_BUILD)) {\r
-                    buildMode = PLATFORM_BUILD;\r
-                    PLATFORM = project.getProperty("PLATFORM");\r
-                    PLATFORM_DIR = project.getProperty("PLATFORM_DIR");\r
-                }\r
-                else if (str.equals(PACKAGE_BUILD)) {\r
-                    buildMode = PACKAGE_BUILD;\r
-                    PLATFORM = project.getProperty("PACKAGE");\r
-                    PLATFORM_DIR = project.getProperty("PACKAGE_DIR");\r
-                    project.setProperty("PLATFORM", PLATFORM);\r
-                    project.setProperty("PLATFORM_DIR", PLATFORM_DIR);\r
-                }\r
+    public void update(Project project) {\r
+//        GlobalData.log.info("" + userdir + ":" + type);\r
+        //\r
+        // Default mode is UNIFIED. \r
+        //\r
+        if (type != null && type.equalsIgnoreCase(MODULE)) {\r
+            type = MODULE;\r
+        }\r
+        else {\r
+            type = UNIFIED;\r
+        }\r
+        \r
+        //\r
+        // default BUILD_DIR value\r
+        //\r
+        String buildDir;\r
+        if(type.equals(MODULE)){\r
+            buildDir = project.getProperty("MODULE_DIR") + File.separatorChar + "Build";\r
+        }\r
+        else {\r
+            buildDir = project.getProperty("PLATFORM_DIR") + File.separatorChar + "Build";\r
+        }\r
+        \r
+        //\r
+        // If user define BUILD_DIR\r
+        //\r
+        if (userdir != null && ! userdir.equals("")) {\r
+            File buildFile = new File(userdir);\r
+            if (buildFile.isAbsolute()){\r
+                buildDir = userdir;\r
+            }\r
+            //\r
+            // If path is not absolute, then look as related to WORKSPACE_DIR\r
+            //\r
+            else {\r
+                buildDir = GlobalData.getWorkspacePath() + File.separatorChar + userdir;\r
             }\r
         }\r
-    }\r
-    \r
-    /**\r
-      Setup BIN_DIR, DEST_DIR_OUTPUT and DEST_DIR_OUTPUT, following are the rules:\r
-      \r
-      <pre>\r
-        Those three variables are defined as following\r
-        DEST_DIR_OUTPUT (intermediate files)\r
-        DEST_DIR_DEBUG (intermediate debug files)\r
-        BIN_DIR (final files)\r
         \r
-        Output Dir (MODULE or UNIFIED):\r
-        For <b>Module</b> build: \r
-        All intermediate files are at ${MODULE_DIR}/Build/${TARGET}/${ARCH}/DEBUG|OUTPUT\r
-        All final files are at ${MODULE_DIR}/Build/${TARGET}/${ARCH}\r
+        //\r
+        // Define BIN_DIR and FV_DIR\r
+        //\r
+        String binDir = buildDir + File.separatorChar + project.getProperty("TARGET")\r
+                                 + File.separatorChar + project.getProperty("TOOLCHAIN") \r
+                                 + File.separatorChar + project.getProperty("ARCH") ;\r
         \r
-        For <b>Platform</b> build:\r
-        If specified with MODULE\r
-        Intermediate files->${MODULE_DIR}/Build/${PLATFORM}/${TARGET}/${ARCH}/DEBUG|OUTPUT\r
-        Final files -> ${PLARFORM_DIR}/Build/${TARGET}/${ARCH}\r
+        String fvDir = buildDir + File.separatorChar + project.getProperty("TARGET")\r
+                                + File.separatorChar + project.getProperty("TOOLCHAIN") \r
+                                + File.separatorChar + "FV";\r
         \r
-        Else if specified with UNIFIED\r
-        Intermediate files->${PLARFORM_DIR}/Build/${TARGET}/${ARCH}/${PACKAGE}/${SOURCE_RELATIVE_PATH}/DEBUG|OUTPUT\r
-        Final files -> ${PLARFORM_DIR}/Build/${TARGET}/${ARCH}\r
+        //\r
+        // Define DEST_DIR_OUTPUT and DEST_DIR_DEBUG\r
+        //\r
+        String destDir = binDir + File.separatorChar + project.getProperty("PACKAGE_RELATIVE_DIR")\r
+                                + File.separatorChar + project.getProperty("MODULE_RELATIVE_DIR");\r
         \r
-        For <b>Package</b> build:\r
-        If specified with MODULE\r
-        Intermediate files->${MODULE_DIR}/Build/${PACKAGE}/${TARGET}/${ARCH}/DEBUG|OUTPUT\r
-        Final files -> ${PACKAGE_DIR}/Build/${TARGET}/${ARCH}\r
+        //\r
+        // Set properties\r
+        //\r
+        project.setProperty("BUILD_DIR", buildDir.replaceAll("(\\\\)", "/"));\r
+        project.setProperty("FV_DIR", fvDir.replaceAll("(\\\\)", "/"));\r
+        project.setProperty("BIN_DIR", binDir.replaceAll("(\\\\)", "/"));\r
+        project.setProperty("DEST_DIR_DEBUG", (destDir + File.separatorChar + "DEBUG").replaceAll("(\\\\)", "/"));\r
+        project.setProperty("DEST_DIR_OUTPUT", (destDir + File.separatorChar + "OUTPUT").replaceAll("(\\\\)", "/"));\r
         \r
-        Else if specified with UNIFIED\r
-        Intermediate files->${PACKAGE_DIR}/Build/${TARGET}/${ARCH}/${PACKAGE}/${SOURCE_RELATIVE_PATH}/DEBUG|OUTPUT\r
-        Final files -> ${PACKAGE_DIR}/Build/${TARGET}/${ARCH}\r
-      </pre>\r
-      \r
-      @param project current ANT build Project\r
-      @param userdir user-defined directory\r
-      @param type the module build type (MODULE or UNIFIED)\r
-    **/\r
-    public synchronized static void update(Project project, String userdir, String type) {\r
-        //\r
-        // userdir TBD\r
-        //\r
-       if(  type == null || ! type.equals(MODULE)){\r
-           type = UNIFIED;\r
-       }\r
-       if (buildMode.equals(MODULE_BUILD)){\r
-           project.setProperty("DEST_DIR_OUTPUT", project.replaceProperties("${MODULE_DIR}"\r
-                        + File.separatorChar + "Build" + File.separatorChar + "${TARGET}"\r
-                        + File.separatorChar + "${ARCH}" + File.separatorChar + "OUTPUT"));\r
-           project.setProperty("DEST_DIR_DEBUG", project.replaceProperties("${MODULE_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}" + File.separatorChar + "DEBUG"));\r
-           project.setProperty("BIN_DIR", project.replaceProperties("${MODULE_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}"));\r
-       }\r
-       else if (buildMode.equals(PLATFORM_BUILD)) {\r
-           if (type.equals(MODULE)) {\r
-               project.setProperty("DEST_DIR_OUTPUT", project.replaceProperties("${MODULE_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${PLATFORM}" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}" + File.separatorChar + "OUTPUT"));\r
-               project.setProperty("DEST_DIR_DEBUG", project.replaceProperties("${MODULE_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${PLATFORM}" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}" + File.separatorChar + "DEBUG"));\r
-               project.setProperty("BIN_DIR", project.replaceProperties("${PLATFORM_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}"));\r
-           }\r
-           else if (type.equals(UNIFIED)){\r
-               project.setProperty("DEST_DIR_OUTPUT", project.replaceProperties("${PLATFORM_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}" + File.separatorChar + "${PACKAGE}" + File.separatorChar + "${MODULE_RELATIVE_PATH}" + File.separatorChar + "OUTPUT"));\r
-               project.setProperty("DEST_DIR_DEBUG", project.replaceProperties("${PLATFORM_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}" + File.separatorChar + "${PACKAGE}" + File.separatorChar + "${MODULE_RELATIVE_PATH}" + File.separatorChar + "DEBUG"));\r
-               project.setProperty("BIN_DIR", project.replaceProperties("${PLATFORM_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}"));\r
-           }\r
-       }\r
-       else if (buildMode.equals(PACKAGE_BUILD)) {\r
-           if (type.equals(MODULE)) {\r
-               project.setProperty("DEST_DIR_OUTPUT", project.replaceProperties("${MODULE_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${PLATFORM}" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}" + File.separatorChar + "OUTPUT"));\r
-               project.setProperty("DEST_DIR_DEBUG", project.replaceProperties("${MODULE_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${PLATFORM}" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}" + File.separatorChar + "DEBUG"));\r
-               project.setProperty("BIN_DIR", project.replaceProperties("${PLATFORM_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}"));\r
-           }\r
-           else if (type.equals(UNIFIED)){\r
-               project.setProperty("DEST_DIR_OUTPUT", project.replaceProperties("${PLATFORM_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}" + File.separatorChar + "${PACKAGE}" + File.separatorChar + "${MODULE_RELATIVE_PATH}" + File.separatorChar + "OUTPUT"));\r
-               project.setProperty("DEST_DIR_DEBUG", project.replaceProperties("${PLATFORM_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}" + File.separatorChar + "${PACKAGE}" + File.separatorChar + "${MODULE_RELATIVE_PATH}" + File.separatorChar + "DEBUG"));\r
-               project.setProperty("BIN_DIR", project.replaceProperties("${PLATFORM_DIR}" + File.separatorChar + "Build" + File.separatorChar + "${TARGET}" + File.separatorChar + "${ARCH}"));\r
-           }\r
-       }\r
+        //\r
+        // Create all directory if necessary\r
+        //\r
+        (new File(buildDir)).mkdirs();\r
+        (new File(fvDir)).mkdirs();\r
+        (new File(binDir)).mkdirs();\r
+        (new File(destDir + File.separatorChar + "DEBUG")).mkdirs();\r
+        (new File(destDir + File.separatorChar + "OUTPUT")).mkdirs();\r
     }\r
-}\r
+    \r
+    public boolean prepareBuildDir(Project project){\r
+        boolean isUnified = true;\r
+        \r
+        if (type.equalsIgnoreCase("MODULE")) {\r
+            isUnified = false;\r
+        }\r
+        \r
+        String buildDir = project.getProperty("PLATFORM_DIR") + File.separatorChar + "Build";\r
+        //\r
+        // If user define BUILD_DIR\r
+        //\r
+        if (userdir != null && ! userdir.equals("")) {\r
+            File buildFile = new File(userdir);\r
+            if (buildFile.isAbsolute()){\r
+                buildDir = userdir;\r
+            }\r
+            //\r
+            // If path is not absolute, then look as related to WORKSPACE_DIR\r
+            //\r
+            else {\r
+                buildDir = GlobalData.getWorkspacePath() + File.separatorChar + userdir;\r
+            }\r
+        }\r
+        //\r
+        // Set to property\r
+        //\r
+        project.setProperty("BUILD_DIR", buildDir.replaceAll("(\\\\)", "/"));\r
+        \r
+        //\r
+        // Create all directory if necessary\r
+        //\r
+        (new File(buildDir)).mkdirs();\r
+        return isUnified;\r
+    }\r
+\r
+}
\ No newline at end of file