\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