]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Java/Source/ContextTool/org/tianocore/context/TargetFile.java
Restructuring for better separation of Tool packages.
[mirror_edk2.git] / Tools / Java / Source / ContextTool / org / tianocore / context / TargetFile.java
diff --git a/Tools/Java/Source/ContextTool/org/tianocore/context/TargetFile.java b/Tools/Java/Source/ContextTool/org/tianocore/context/TargetFile.java
new file mode 100644 (file)
index 0000000..3143b8c
--- /dev/null
@@ -0,0 +1,497 @@
+/** @file\r
+  File is TargetFile class which is used to generate the new target.txt. \r
\r
+Copyright (c) 2006, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+**/\r
+package org.tianocore.context;\r
+\r
+import java.io.BufferedReader;\r
+import java.io.BufferedWriter;\r
+import java.io.File;\r
+import java.io.FileNotFoundException;\r
+import java.io.FileOutputStream;\r
+import java.io.FileReader;\r
+import java.io.FileWriter;\r
+import java.io.IOException;\r
+import java.nio.ByteBuffer;\r
+import java.nio.channels.FileChannel;\r
+\r
+public class TargetFile {\r
+\r
+    /** \r
+     * check the validity of path and file\r
+     * @param String filename : the name of target file\r
+     * @return true or false\r
+     **/\r
+    public static boolean parsePath(String filename) {\r
+\r
+        String workspacePath = System.getenv("WORKSPACE");\r
+        \r
+        Fd = new File(workspacePath + File.separator + "Tools" + File.separator + "Conf" + File.separator + filename);\r
+\r
+        if (Fd.exists() == true) {\r
+            if (createTempFile(filename + "tmp") == false) {\r
+                return false;\r
+            }\r
+            if (readwriteFile() == false) {\r
+                return false;\r
+            }\r
+            return true;\r
+        } else {\r
+            try {\r
+                Fd.createNewFile();\r
+            } catch (IOException e) {\r
+                System.out.printf("%n%s", "Create the file:target.txt failed!");\r
+                return false;\r
+            }\r
+        }\r
+        TargetFile.writeFile(Fd);\r
+        return true;\r
+    }\r
+\r
+    /**\r
+     * create a empty temp file, which is located at the same directory with target file\r
+     * @param String filename : the name of target temp file\r
+     * @return true or false\r
+     **/\r
+    private static boolean createTempFile(String filename) {\r
+\r
+        String workspacePath = System.getenv("WORKSPACE");\r
+        \r
+        TempFd = new File(workspacePath + File.separator + "Tools" + File.separator + "Conf" + File.separator + filename);\r
+\r
+        if (TempFd.exists() == true) {\r
+            if (TempFd.delete() == false) {\r
+                System.out.println("\n#  delete file failed !");\r
+                return false;\r
+            }\r
+        }\r
+        try {\r
+            TempFd.createNewFile();\r
+        } catch (IOException e) {\r
+            System.out.printf("%n%s",\r
+                    "Create the temp file:target.txttmp failed!");\r
+            return false;\r
+        }\r
+\r
+        return true;\r
+    }\r
+\r
+    /**\r
+     * read from target.txt and write to target.txttmp, del target.txt, rename\r
+     * @param no paremeter\r
+     * @return true or false\r
+     **/\r
+    private static boolean readwriteFile() {\r
+\r
+        if (Fd.canRead() != true)\r
+            return false;\r
+\r
+        BufferedReader br = null;\r
+        BufferedWriter bw = null;\r
+        String textLine = null;\r
+\r
+        try {\r
+            br = new BufferedReader(new FileReader(Fd));\r
+        } catch (FileNotFoundException e) {\r
+            System.out\r
+                    .println("\n# create the BufferedReader failed, because can't find the file:target.txt!");\r
+            return false;\r
+        }\r
+        try {\r
+            bw = new BufferedWriter(new FileWriter(TempFd));\r
+        } catch (IOException e) {\r
+            System.out.println("\n# create the BufferedWriter failed!");\r
+            return false;\r
+        }\r
+        \r
+        //\r
+        //TARGET_ARCH must be in front of TARGET!!! according to the target.txt\r
+        //\r
+        try {\r
+            while ((textLine = br.readLine()) != null) {\r
+                //\r
+                // the line is composed of Space\r
+                //\r
+                if (textLine.trim().compareToIgnoreCase("") == 0) {\r
+                    bw.write(textLine);\r
+                    bw.newLine();\r
+                } \r
+                //\r
+                // the line starts with "#", and no "="\r
+                //\r
+                else if ((textLine.trim().charAt(0) == '#') && (textLine.indexOf("=") == -1)){\r
+                    bw.write(textLine);\r
+                    bw.newLine();\r
+                } else {\r
+                    //\r
+                    //modify at the first time, and there should be *ACTIVE_PLATFORM*=* in the line\r
+                    //\r
+                    if (textLine.indexOf("ACTIVE_PLATFORM") != -1) {\r
+                        if(pflag == true){\r
+                            if(textLine.trim().charAt(0) == '#'){\r
+                                if(ParseParameter.pstr.length() > ParseParameter.length) {\r
+                                    bw.write(ParseParameter.pstr);\r
+                                    bw.newLine();\r
+                                    pflag = false;\r
+                                }\r
+                                continue;\r
+                            }\r
+                            if(ParseParameter.pstr.length() > ParseParameter.length) {\r
+                                bw.write(ParseParameter.pstr);\r
+                            } else {\r
+                                bw.write(textLine);\r
+                            }\r
+                            bw.newLine();\r
+                            pflag = false;\r
+                        }\r
+                    } else if (textLine.indexOf("TARGET_ARCH") != -1) {\r
+                        if(aflag == true){\r
+                            if(textLine.trim().charAt(0) == '#'){\r
+                                if(ParseParameter.astr.length() > ParseParameter.length) {\r
+                                    bw.write(ParseParameter.astr);\r
+                                    bw.newLine();\r
+                                    aflag = false;\r
+                                }\r
+                                continue;\r
+                            }\r
+                            if(ParseParameter.astr.length() > ParseParameter.length) {\r
+                                bw.write(ParseParameter.astr);\r
+                            } else {\r
+                                bw.write(textLine);\r
+                            }\r
+                            bw.newLine();\r
+                            aflag = false;\r
+                        }\r
+                    } else if (textLine.indexOf("TARGET") != -1) {\r
+                        if(tflag == true){\r
+                            if(textLine.trim().charAt(0) == '#'){\r
+                                if(ParseParameter.tstr.length() > ParseParameter.length) {\r
+                                    bw.write(ParseParameter.tstr);\r
+                                    bw.newLine();\r
+                                    tflag = false;\r
+                                }\r
+                                continue;\r
+                            }\r
+                            if(ParseParameter.tstr.length() > ParseParameter.length) {\r
+                                bw.write(ParseParameter.tstr);\r
+                            } else {\r
+                                bw.write(textLine);\r
+                            }\r
+                            bw.newLine();\r
+                            tflag = false;\r
+                        }\r
+                    } else if (textLine.indexOf("TOOL_CHAIN_CONF") != -1) {\r
+                        if(cflag == true){\r
+                            if(textLine.trim().charAt(0) == '#'){\r
+                                if(ParseParameter.cstr.length() > ParseParameter.length) {\r
+                                    bw.write(ParseParameter.cstr);\r
+                                    bw.newLine();\r
+                                    cflag = false;\r
+                                }\r
+                                continue;\r
+                            }\r
+                            if(ParseParameter.cstr.length() > ParseParameter.length) {\r
+                                bw.write(ParseParameter.cstr);\r
+                            } else {\r
+                                bw.write(textLine);\r
+                            }\r
+                            bw.newLine();\r
+                            cflag = false;\r
+                        }\r
+                    } else if (textLine.indexOf("TOOL_CHAIN_TAG") != -1) {\r
+                        if(nflag == true){\r
+                            if(textLine.trim().charAt(0) == '#'){\r
+                                if(ParseParameter.nstr.length() > ParseParameter.length) {\r
+                                    bw.write(ParseParameter.nstr);\r
+                                    bw.newLine();\r
+                                    nflag = false;\r
+                                }\r
+                                continue;\r
+                            }\r
+                            if(ParseParameter.nstr.length() > ParseParameter.length) {\r
+                                bw.write(ParseParameter.nstr);\r
+                            } else {\r
+                                bw.write(textLine);\r
+                            }\r
+                            bw.newLine();\r
+                            nflag = false;\r
+                        }\r
+                    } else if (textLine.indexOf("MAX_CONCURRENT_THREAD_NUMBER") != -1) {\r
+                        if(mflag == true){\r
+                            if(textLine.trim().charAt(0) == '#'){\r
+                                if(ParseParameter.mstr.length() > ParseParameter.length) {\r
+                                    bw.write(ParseParameter.mstr);\r
+                                    bw.newLine();\r
+                                    mflag = false;\r
+                                }\r
+                                continue;\r
+                            }\r
+                            if(ParseParameter.mstr.length() > ParseParameter.length) {\r
+                                bw.write(ParseParameter.mstr);\r
+                            } else {\r
+                                bw.write(textLine);\r
+                            }\r
+                            bw.newLine();\r
+                            mflag = false;\r
+                        }\r
+                    }else if (textLine.indexOf("MULTIPLE_THREAD") != -1) {\r
+                        if(meflag == true){\r
+                            if(textLine.trim().charAt(0) == '#'){\r
+                                if(ParseParameter.mestr.length() > ParseParameter.length) {\r
+                                    bw.write(ParseParameter.mestr);\r
+                                    bw.newLine();\r
+                                    meflag = false;\r
+                                }\r
+                                continue;\r
+                            }\r
+                            if(ParseParameter.mestr.length() > ParseParameter.length) {\r
+                                bw.write(ParseParameter.mestr);\r
+                            } else {\r
+                                bw.write(textLine);\r
+                            }\r
+                            bw.newLine();\r
+                            meflag = false;\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+            //\r
+            //user maybe delete the line *ACTIVE_PLATFORM*=*\r
+            //\r
+            if( (pflag == true) && (ParseParameter.pstr.length() > ParseParameter.length) ){\r
+                bw.write(ParseParameter.pstr);\r
+                bw.newLine();\r
+            } else if ( (tflag == true) && (ParseParameter.tstr.length() > ParseParameter.length) ){\r
+                bw.write(ParseParameter.tstr);\r
+                bw.newLine();\r
+            } else if ( (aflag == true) && (ParseParameter.astr.length() > ParseParameter.length) ){\r
+                bw.write(ParseParameter.astr);\r
+                bw.newLine();\r
+            } else if ( (cflag == true) && (ParseParameter.cstr.length() > ParseParameter.length) ){\r
+                bw.write(ParseParameter.cstr);\r
+                bw.newLine();\r
+            } else if ( (nflag == true) && (ParseParameter.nstr.length() > ParseParameter.length) ){\r
+                bw.write(ParseParameter.nstr);\r
+                bw.newLine();\r
+            } else if ( (meflag == true) && (ParseParameter.mestr.length() > ParseParameter.length) ){\r
+                bw.write(ParseParameter.mestr);\r
+                bw.newLine();\r
+            } else if ( (mflag == true) && (ParseParameter.mstr.length() > ParseParameter.length) ){\r
+                bw.write(ParseParameter.mstr);\r
+                bw.newLine();\r
+            }\r
+        } catch (IOException e) {\r
+            System.out.println("\n#  read or write file error!");\r
+            return false;\r
+        }\r
+\r
+        try {\r
+            br.close();\r
+            bw.close();\r
+        } catch (IOException e) {\r
+            System.out\r
+                    .println("\n#  close BufferedReader&BufferedWriter error");\r
+            return false;\r
+        }\r
+\r
+        if (Fd.delete() == false) {\r
+            System.out.println("\n#  delete file failed !");\r
+            return false;\r
+        }\r
+        if (TempFd.renameTo(Fd) == false) {\r
+            System.out.println("\n#  rename file failed !");\r
+            return false;\r
+        }\r
+\r
+        return true;\r
+    }\r
+\r
+    /**\r
+     * according to user's input args, write the file directly\r
+     * @param File fd : the File of the target file\r
+     * @return true or false\r
+     **/\r
+    private static boolean writeFile(File fd) {\r
+\r
+        if (fd.canWrite() != true)\r
+            return false;\r
+\r
+        FileOutputStream outputFile = null;\r
+        try {\r
+            outputFile = new FileOutputStream(fd);\r
+        } catch (FileNotFoundException e) {\r
+            System.out\r
+                    .println("\n#  can't find the file when open the output stream !");\r
+            return false;\r
+        }\r
+        FileChannel outputChannel = outputFile.getChannel();\r
+\r
+        ByteBuffer[] buffers = new ByteBuffer[7];\r
+        buffers[0] = ByteBuffer.allocate(ParseParameter.pstr.toString().length());\r
+        buffers[1] = ByteBuffer.allocate(ParseParameter.tstr.toString().length());\r
+        buffers[2] = ByteBuffer.allocate(ParseParameter.astr.toString().length());\r
+        buffers[3] = ByteBuffer.allocate(ParseParameter.cstr.toString().length());\r
+        buffers[4] = ByteBuffer.allocate(ParseParameter.nstr.toString().length());\r
+        buffers[5] = ByteBuffer.allocate(ParseParameter.mestr.toString().length());\r
+        buffers[6] = ByteBuffer.allocate(ParseParameter.mstr.toString().length());\r
+\r
+        buffers[0].put(ParseParameter.pstr.toString().getBytes()).flip();\r
+        buffers[1].put(ParseParameter.tstr.toString().getBytes()).flip();\r
+        buffers[2].put(ParseParameter.astr.toString().getBytes()).flip();\r
+        buffers[3].put(ParseParameter.cstr.toString().getBytes()).flip();\r
+        buffers[4].put(ParseParameter.nstr.toString().getBytes()).flip();\r
+        buffers[5].put(ParseParameter.mestr.toString().getBytes()).flip();\r
+        buffers[6].put(ParseParameter.mstr.toString().getBytes()).flip();\r
+\r
+        try {\r
+            ByteBuffer bufofCP = ByteBuffer.allocate(Copyright.length());\r
+            bufofCP.put(Copyright.getBytes()).flip();\r
+            outputChannel.write(bufofCP);\r
+            \r
+            ByteBuffer bufofFI = ByteBuffer.allocate(Fileinfo.length());\r
+            bufofFI.put(Fileinfo.getBytes()).flip();\r
+            outputChannel.write(bufofFI);\r
+            \r
+            ByteBuffer buffer0 = ByteBuffer.allocate(pusage.length());\r
+            buffer0.put(pusage.getBytes()).flip();\r
+            outputChannel.write(buffer0);\r
+            outputChannel.write(buffers[0]);\r
+            \r
+            ByteBuffer buffer1 = ByteBuffer.allocate(tusage.length());\r
+            buffer1.put(tusage.getBytes()).flip();\r
+            outputChannel.write(buffer1);\r
+            outputChannel.write(buffers[1]);\r
+            \r
+            ByteBuffer buffer2 = ByteBuffer.allocate(ausage.length());\r
+            buffer2.put(ausage.getBytes()).flip();\r
+            outputChannel.write(buffer2);\r
+            outputChannel.write(buffers[2]);\r
+            \r
+            ByteBuffer buffer3 = ByteBuffer.allocate(cusage.length());\r
+            buffer3.put(cusage.getBytes()).flip();\r
+            outputChannel.write(buffer3);\r
+            outputChannel.write(buffers[3]);\r
+            \r
+            ByteBuffer buffer4 = ByteBuffer.allocate(nusage.length());\r
+            buffer4.put(nusage.getBytes()).flip();\r
+            outputChannel.write(buffer4);\r
+            outputChannel.write(buffers[4]);\r
+            \r
+            ByteBuffer buffer5 = ByteBuffer.allocate(meusage.length());\r
+            buffer4.put(meusage.getBytes()).flip();\r
+            outputChannel.write(buffer5);\r
+            outputChannel.write(buffers[5]);\r
+            \r
+            ByteBuffer buffer6 = ByteBuffer.allocate(musage.length());\r
+            buffer4.put(musage.getBytes()).flip();\r
+            outputChannel.write(buffer6);\r
+            outputChannel.write(buffers[6]);\r
+            \r
+            outputFile.close();\r
+        } catch (IOException e) {\r
+            System.out.println("\n# The operations of file failed !");\r
+            return false;\r
+        }\r
+        return true;\r
+    }\r
+\r
+    ///\r
+    /// point to target.txttmp, a temp file, which is created and deleted during the tool's runtime.\r
+    ///\r
+    private static File TempFd;\r
+    \r
+    ///\r
+    /// point to target.txt.\r
+    ///\r
+    private static File Fd;\r
+    \r
+    ///\r
+    /// when the flag is true, the corresponding str should be add at the end of file.\r
+    ///\r
+    private static boolean pflag = true;\r
+    private static boolean tflag = true;\r
+    private static boolean aflag = true;\r
+    private static boolean cflag = true;\r
+    private static boolean nflag = true;\r
+    private static boolean mflag = true;\r
+    private static boolean meflag = true;\r
+\r
+    private static final String Copyright = "#\n"\r
+            + "#  Copyright (c) 2006, Intel Corporation\n"\r
+            + "#\n"\r
+            + "#  All rights reserved. This program and the accompanying materials\n"\r
+            + "#  are licensed and made available under the terms and conditions of the BSD License\n"\r
+            + "#  which accompanies this distribution.  The full text of the license may be found at\n"\r
+            + "#  http://opensource.org/licenses/bsd-license.php\n"\r
+            + "\n"\r
+            + "#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN \"AS IS\" BASIS,\n"\r
+            + "#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\n";\r
+\r
+    private static final String Fileinfo = "#\n"\r
+            + "#  Filename: target.template\n"\r
+            + "#\n"\r
+            + "#  ALL Paths are Relative to WORKSPACE\n"\r
+            + "\n"\r
+            + "#  Separate multiple LIST entries with a SINGLE SPACE character, do not use comma characters.\n"\r
+            + "#  Un-set an option by either commenting out the line, or not setting a value.\n";\r
+\r
+    private static final String pusage = "#\n"\r
+            + "#  PROPERTY              Type       Use         Description\n"\r
+            + "#  ----------------      --------   --------    -----------------------------------------------------------\n"\r
+            + "#  ACTIVE_PLATFORM       Filename   Recommended Specify the WORKSPACE relative Path and Filename\n"\r
+            + "#                                               of the platform FPD file that will be used for the build\n"\r
+            + "#                                               This line is required if and only if the current working\n"\r
+            + "#                                               directory does not contain one or more FPD files.\n";\r
+\r
+    private static final String tusage = "\n\n"\r
+            + "#  TARGET                List       Optional    Zero or more of the following: DEBUG, RELEASE, \n"\r
+            + "#                                               UserDefined; separated by a space character.  \n"\r
+            + "#                                               If the line is missing or no value is specified, all\n"\r
+            + "#                                               valid targets specified in the FPD file will attempt \n"\r
+            + "#                                               to be built.  The following line will build all platform\n"\r
+            + "#                                               targets.\n";\r
+\r
+    private static final String ausage = "\n\n"\r
+            + "#  TARGET_ARCH           List       Optional    What kind of architecture is the binary being target for.\n"\r
+            + "#                                               One, or more, of the following, IA32, IA64, X64, EBC or ARM.\n"\r
+            + "#                                               Multiple values can be specified on a single line, using \n"\r
+            + "#                                               space charaters to separate the values.  These are used \n"\r
+            + "#                                               during the parsing of an FPD file, restricting the build\n"\r
+            + "#                                               output target(s.)\n"\r
+            + "#                                               The Build Target ARCH is determined by a logical AND of:\n"\r
+            + "#                                               FPD BuildOptions: <SupportedArchitectures> tag\n"\r
+            + "#                                               If not specified, then all valid architectures specified \n"\r
+            + "#                                               in the FPD file, for which tools are available, will be \n"\r
+            + "#                                               built.\n";\r
+\r
+    private static final String cusage = "\n\n"\r
+            + "#  TOOL_DEFINITION_FILE  Filename  Optional   Specify the name of the filename to use for specifying \n"\r
+            + "#                                             the tools to use for the build.  If not specified, \n"\r
+            + "#                                             tools_def.txt will be used for the build.  This file \n"\r
+            + "#                                             MUST be located in the WORKSPACE/Tools/Conf directory.\n";\r
+\r
+    private static final String nusage = "\n\n"\r
+            + "#  TAGNAME               List      Optional   Specify the name(s) of the tools_def.txt TagName to use.\n"\r
+            + "#                                             If not specified, all applicable TagName tools will be \n"\r
+            + "#                                             used for the build.  The list uses space character separation.\n";\r
+    \r
+    private static final String musage = "\n\n"\r
+            + "#  MULTIPLE_THREAD       FLAG      Optional   Flag to enable multi-thread build. If not specified, default\n"\r
+            + "#                                             is \"Disable\". If your computer is multi-core or multiple CPUs,\n" \r
+            + "#                                             enabling this feature will bring much benefit. For multi-thread\n" \r
+            + "#                                             built, the log will write to ${BUILD_DIR}/build.log.\n" \r
+            + "#                                             This feature is only for PLATFORM build, and clean, cleanall or\n"\r
+            + "#                                             stand-alone module build is still using the normal way.\n";\r
+    private static final String meusage = "\n\n"\r
+            + "# MAX_CONCURRENT_THREAD_NUMBER  NUMBER  Optional  The number of concurrent threads. Default is 2. Recommend to\n" \r
+            + "#                                                 set this value to one more than the number of your compurter\n"\r
+            + "#                                                 cores or CPUs.\n";\r
+}\r