+ PrebuildEnvFile = os.path.join(GlobalData.gConfDirectory,'.cache','.PrebuildEnv')\r
+ if os.path.isfile(PrebuildEnvFile):\r
+ os.remove(PrebuildEnvFile)\r
+ if os.path.isfile(self.PlatformBuildPath):\r
+ os.remove(self.PlatformBuildPath)\r
+ if sys.platform == "win32":\r
+ args = ' && '.join((self.Prebuild, 'set > ' + PrebuildEnvFile))\r
+ Process = Popen(args, stdout=PIPE, stderr=PIPE, shell=True)\r
+ else:\r
+ args = ' && '.join((self.Prebuild, 'env > ' + PrebuildEnvFile))\r
+ Process = Popen(args, stdout=PIPE, stderr=PIPE, shell=True)\r
+\r
+ # launch two threads to read the STDOUT and STDERR\r
+ EndOfProcedure = Event()\r
+ EndOfProcedure.clear()\r
+ if Process.stdout:\r
+ StdOutThread = Thread(target=ReadMessage, args=(Process.stdout, EdkLogger.info, EndOfProcedure))\r
+ StdOutThread.setName("STDOUT-Redirector")\r
+ StdOutThread.setDaemon(False)\r
+ StdOutThread.start()\r
+\r
+ if Process.stderr:\r
+ StdErrThread = Thread(target=ReadMessage, args=(Process.stderr, EdkLogger.quiet, EndOfProcedure))\r
+ StdErrThread.setName("STDERR-Redirector")\r
+ StdErrThread.setDaemon(False)\r
+ StdErrThread.start()\r
+ # waiting for program exit\r
+ Process.wait()\r
+\r
+ if Process.stdout:\r
+ StdOutThread.join()\r
+ if Process.stderr:\r
+ StdErrThread.join()\r
+ if Process.returncode != 0 :\r
+ EdkLogger.error("Prebuild", PREBUILD_ERROR, 'Prebuild process is not success!')\r
+\r
+ if os.path.exists(PrebuildEnvFile):\r
+ f = open(PrebuildEnvFile)\r
+ envs = f.readlines()\r
+ f.close()\r
+ envs = itertools.imap(lambda l: l.split('=',1), envs)\r
+ envs = itertools.ifilter(lambda l: len(l) == 2, envs)\r
+ envs = itertools.imap(lambda l: [i.strip() for i in l], envs)\r
+ os.environ.update(dict(envs))\r
+ EdkLogger.info("\n- Prebuild Done -\n")\r
+\r
+ def LaunchPostbuild(self):\r
+ if self.Postbuild:\r
+ EdkLogger.info("\n- Postbuild Start -\n")\r
+ if sys.platform == "win32":\r
+ Process = Popen(self.Postbuild, stdout=PIPE, stderr=PIPE, shell=True)\r
+ else:\r
+ Process = Popen(self.Postbuild, stdout=PIPE, stderr=PIPE, shell=True)\r
+ # launch two threads to read the STDOUT and STDERR\r
+ EndOfProcedure = Event()\r
+ EndOfProcedure.clear()\r
+ if Process.stdout:\r
+ StdOutThread = Thread(target=ReadMessage, args=(Process.stdout, EdkLogger.info, EndOfProcedure))\r
+ StdOutThread.setName("STDOUT-Redirector")\r
+ StdOutThread.setDaemon(False)\r
+ StdOutThread.start()\r
+\r
+ if Process.stderr:\r
+ StdErrThread = Thread(target=ReadMessage, args=(Process.stderr, EdkLogger.quiet, EndOfProcedure))\r
+ StdErrThread.setName("STDERR-Redirector")\r
+ StdErrThread.setDaemon(False)\r
+ StdErrThread.start()\r
+ # waiting for program exit\r
+ Process.wait()\r
+\r
+ if Process.stdout:\r
+ StdOutThread.join()\r
+ if Process.stderr:\r
+ StdErrThread.join()\r
+ if Process.returncode != 0 :\r
+ EdkLogger.error("Postbuild", POSTBUILD_ERROR, 'Postbuild process is not success!')\r
+ EdkLogger.info("\n- Postbuild Done -\n")\r
+ ## Build a module or platform\r
+ #\r
+ # Create autogen code and makefile for a module or platform, and the launch\r
+ # "make" command to build it\r
+ #\r
+ # @param Target The target of build command\r
+ # @param Platform The platform file\r
+ # @param Module The module file\r
+ # @param BuildTarget The name of build target, one of "DEBUG", "RELEASE"\r
+ # @param ToolChain The name of toolchain to build\r
+ # @param Arch The arch of the module/platform\r
+ # @param CreateDepModuleCodeFile Flag used to indicate creating code\r
+ # for dependent modules/Libraries\r
+ # @param CreateDepModuleMakeFile Flag used to indicate creating makefile\r
+ # for dependent modules/Libraries\r
+ #\r
+ def _BuildPa(self, Target, AutoGenObject, CreateDepsCodeFile=True, CreateDepsMakeFile=True, BuildModule=False):\r
+ if AutoGenObject == None:\r
+ return False\r