Hess, The patch looks good to me. Reviewed-by: Yingke Liu <yingke.d....@intel.com>
Dennis -----Original Message----- From: Chen, Hesheng Sent: Wednesday, August 20, 2014 3:31 PM To: Jordan Justen; edk2-devel@lists.sourceforge.net; Liu, Yingke D Subject: RE: [edk2] [PATCH] BaseTools: Revert r15816 and r15831 to fix !if in .fdf Justen and Dennis, I have merged these two patches together, many thanks to Dennis for the issue catching. This patch is going to: 1. Fix a bug in GenFds for wrongly handling '"' of command line parameter. 2. Provide different input parameter mode for different OS. For Linux, using a list. For Windows, using a string. 3. Remove 3 un-existing function calling. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hess Chen <hesheng.c...@intel.com> Best Regards, Chen, Hess Intel China Software Center Tel: +86-21-6116-6740 Email: hesheng.c...@intel.com -----Original Message----- From: Jordan Justen [mailto:jljus...@gmail.com] Sent: Wednesday, August 20, 2014 14:00 PM To: edk2-devel@lists.sourceforge.net; Liu, Yingke D; Chen, Hesheng Subject: Re: [edk2] [PATCH] BaseTools: Revert r15816 and r15831 to fix !if in .fdf On Tue, Aug 19, 2014 at 9:50 PM, Liu, Yingke D <yingke.d....@intel.com> wrote: > Hi Jordan, > > The issue has been root caused. Ah. Good to hear. So, will you be posting this patch for review with a commit message? https://github.com/tianocore/tianocore.github.io/wiki/Commit-Message-Format Thanks Dennis and Hess! -Jordan > Before retiring top level makefile, the GenFds command was executed by make > fds, but after the change, we call GenFds command directly. The -D option > passed to Genfds is encapsulated by quotes which is remove automatically by > shell, that's why building on windows is ok, but in Linux we split the > command into sequence, the quotes are not removed if calling Genfds command > directly instead of 'make fds'. > > The following change will fix the issue: > > Index: GenFds.py > =================================================================== > --- GenFds.py (revision 15842) > +++ GenFds.py (working copy) > @@ -157,7 +157,7 @@ > > if Options.Macros: > for Pair in Options.Macros: > - Pair.strip('"') > + Pair = Pair.strip('"') > List = Pair.split('=') > if len(List) == 2: > if List[0].strip() == "EFI_SOURCE":Pair = > Pair.strip('"') > > Dennis > > -----Original Message----- > From: Jordan Justen [mailto:jordan.l.jus...@intel.com] > Sent: Wednesday, August 20, 2014 11:10 AM > To: Chen, Hesheng; edk2-devel@lists.sourceforge.net > Subject: Re: [edk2] [PATCH] BaseTools: Revert r15816 and r15831 to fix > !if in .fdf > > On 2014-08-19 19:07:26, Chen, Hesheng wrote: >> Hello Jordan and all, >> I think we should not revert the patch since only when problem >> happens then we can fix them. > > I do agree with this up to a point. It is nice to keep something in place and > fix it quickly if possible. > > But, if we are keeping people from being able to work for a few days, then we > should also consider reverting the feature temporarily and integrating it > again after more testing. > >> I will try my best to provide responses quickly. >> Actually I have root caused the issue: there is a difference mode >> between Linux and Windows for handling popen() parameter. By my test >> only a list (first item is the command line itself) works well on >> Linux and only a string works well on Windows (using a list will lose >> some parameters). So here is the patch to provide different mode for >> different OS. > > I tried the patch, and it does not help the '!if' issue. I think > build.py.patch will only change the behavior on Windows, but I am not testing > it on Windows. > > I did not verify that adding a '!else' helps, like Olivier mentioned, > but I do note that my failure case involves an !if without a !else. > (OvmfPkg/OvmfPkgX64.fdf, CSM_ENABLE) > >> This patch can also fix the issue of KeyError: 'WORKSPACE' > > I don't know if I reproduced this issue. Does it cause the build to stop? > > -Jordan > >> -----Original Message----- >> From: Justen, Jordan L >> Sent: Wednesday, August 20, 2014 3:48 AM >> To: edk2-devel@lists.sourceforge.net >> Cc: Justen, Jordan L; Chen, Hesheng >> Subject: [PATCH] BaseTools: Revert r15816 and r15831 to fix !if in >> .fdf >> >> r15816: "This patch is going to retire the top level makefile on BaseTools >> for supporting a pure binary build without any complier." >> >> r15831: "This patch is going to fix a build failure (running of >> GenFds) in Linux system caused by patch at r15816." >> >> Something in these changes causes !if processing to not work correctly. >> Reverting these changes appears to fix it. >> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com> >> Cc: Hess Chen <hesheng.c...@intel.com> >> --- >> Hess, >> >> I think I should revert these changes. Can you investigate the !if >> processing bug, and resubmit the patch? >> >> Olivier mentioned that !if may only work if !endif is present. Perhaps that >> can help debug it. >> >> BaseTools/Source/Python/AutoGen/AutoGen.py | 30 ++--- >> BaseTools/Source/Python/AutoGen/GenMake.py | 96 ++++++++++++++- >> BaseTools/Source/Python/build/build.py | 181 >> ++--------------------------- >> 3 files changed, 116 insertions(+), 191 deletions(-) >> >> diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py >> b/BaseTools/Source/Python/AutoGen/AutoGen.py >> index 36e4347..c466257 100644 >> --- a/BaseTools/Source/Python/AutoGen/AutoGen.py >> +++ b/BaseTools/Source/Python/AutoGen/AutoGen.py >> @@ -655,8 +655,6 @@ class WorkspaceAutoGen(AutoGen): >> ) >> Count += 1 >> >> - def _GenFdsCommand(self): >> - return >> (GenMake.TopLevelMakefile(self)._TEMPLATE_.Replace(GenMake.TopLevelMakefile(self)._TemplateDict)).strip() >> >> ## Create makefile for the platform and modules in it >> # >> @@ -664,6 +662,15 @@ class WorkspaceAutoGen(AutoGen): >> # modules will be created as well >> # >> def CreateMakeFile(self, CreateDepsMakeFile=False): >> + # create makefile for platform >> + Makefile = GenMake.TopLevelMakefile(self) >> + if Makefile.Generate(): >> + EdkLogger.debug(EdkLogger.DEBUG_9, "Generated makefile for >> platform [%s] %s\n" % >> + (self.MetaFile, self.ArchList)) >> + else: >> + EdkLogger.debug(EdkLogger.DEBUG_9, "Skipped the generation of >> makefile for platform [%s] %s\n" % >> + (self.MetaFile, self.ArchList)) >> + >> if CreateDepsMakeFile: >> for Pa in self.AutoGenObjectList: >> Pa.CreateMakeFile(CreateDepsMakeFile) >> @@ -698,7 +705,6 @@ class WorkspaceAutoGen(AutoGen): >> FvDir = property(_GetFvDir) >> MakeFileDir = property(_GetMakeFileDir) >> BuildCommand = property(_GetBuildCommand) >> - GenFdsCommand = property(_GenFdsCommand) >> >> ## AutoGen class for platform >> # >> @@ -795,9 +801,6 @@ class PlatformAutoGen(AutoGen): >> self._LibraryAutoGenList = None >> self._BuildCommand = None >> >> - # get library/modules for build >> - self.LibraryBuildDirectoryList = [] >> - self.ModuleBuildDirectoryList = [] >> # get the original module/package/platform objects >> self.BuildDatabase = Workspace.BuildDatabase >> return True >> @@ -824,10 +827,6 @@ class PlatformAutoGen(AutoGen): >> # don't do this twice >> self.IsCodeFileCreated = True >> >> - ## Generate Fds Command >> - def _GenFdsCommand(self): >> - return self.Workspace.GenFdsCommand >> - >> ## Create makefile for the platform and mdoules in it >> # >> # @param CreateModuleMakeFile Flag indicating if the makefile >> for >> @@ -845,11 +844,14 @@ class PlatformAutoGen(AutoGen): >> if self.IsMakeFileCreated: >> return >> >> - # create library/module build dirs for platform >> + # create makefile for platform >> Makefile = GenMake.PlatformMakefile(self) >> - self.LibraryBuildDirectoryList = >> Makefile.GetLibraryBuildDirectoryList() >> - self.ModuleBuildDirectoryList = >> Makefile.GetModuleBuildDirectoryList() >> - >> + if Makefile.Generate(): >> + EdkLogger.debug(EdkLogger.DEBUG_9, "Generated makefile for >> platform [%s] [%s]\n" % >> + (self.MetaFile, self.Arch)) >> + else: >> + EdkLogger.debug(EdkLogger.DEBUG_9, "Skipped the generation of >> makefile for platform [%s] [%s]\n" % >> + (self.MetaFile, self.Arch)) >> self.IsMakeFileCreated = True >> >> ## Deal with Shared FixedAtBuild Pcds diff --git >> a/BaseTools/Source/Python/AutoGen/GenMake.py >> b/BaseTools/Source/Python/AutoGen/GenMake.py >> index 0ad368a..64eedfa 100644 >> --- a/BaseTools/Source/Python/AutoGen/GenMake.py >> +++ b/BaseTools/Source/Python/AutoGen/GenMake.py >> @@ -1105,7 +1105,6 @@ cleanlib: >> self.IntermediateDirectoryList = [] >> self.ModuleBuildDirectoryList = [] >> self.LibraryBuildDirectoryList = [] >> - self.LibraryMakeCommandList = [] >> >> # Compose a dict object containing information used to do replacement >> in template >> def _CreateTemplateDict(self): >> @@ -1129,7 +1128,6 @@ cleanlib: >> Command = self._MAKE_TEMPLATE_[self._FileType] % >> {"file":Makefile} >> LibraryMakefileList.append(Makefile) >> LibraryMakeCommandList.append(Command) >> - self.LibraryMakeCommandList = LibraryMakeCommandList >> >> ModuleMakefileList = [] >> ModuleMakeCommandList = [] >> @@ -1200,7 +1198,99 @@ cleanlib: >> # >> class TopLevelMakefile(BuildFile): >> ## template used to generate toplevel makefile >> - _TEMPLATE_ = TemplateString('''${BEGIN} GenFds -f ${fdf_file} -o >> ${platform_build_directory} -t ${toolchain_tag} -b ${build_target} -p >> ${active_platform} -a ${build_architecture_list} >> ${extra_options}${END}${BEGIN} -r ${fd} ${END}${BEGIN} -i ${fv} >> ${END}${BEGIN} -C ${cap} ${END}${BEGIN} -D ${macro} ${END}''') >> + _TEMPLATE_ = TemplateString('''\ ${makefile_header} >> + >> +# >> +# Platform Macro Definition >> +# >> +PLATFORM_NAME = ${platform_name} >> +PLATFORM_GUID = ${platform_guid} >> +PLATFORM_VERSION = ${platform_version} >> + >> +# >> +# Build Configuration Macro Definition # TOOLCHAIN = >> +${toolchain_tag} TOOLCHAIN_TAG = ${toolchain_tag} TARGET = >> +${build_target} >> + >> +# >> +# Build Directory Macro Definition >> +# >> +BUILD_DIR = ${platform_build_directory} FV_DIR = >> +${platform_build_directory}${separator}FV >> + >> +# >> +# Shell Command Macro >> +# >> +${BEGIN}${shell_command_code} = ${shell_command} ${END} >> + >> +MAKE = ${make_path} >> +MAKE_FILE = ${makefile_path} >> + >> +# >> +# Default target >> +# >> +all: modules fds >> + >> +# >> +# Initialization target: print build information and create >> +necessary directories # >> +init: >> + -@ >> + ${BEGIN}-@${create_directory_command} >> + ${END} >> +# >> +# library build target >> +# >> +libraries: init >> +${BEGIN} @cd $(BUILD_DIR)${separator}${arch} && "$(MAKE)" >> +$(MAKE_FLAGS) libraries ${END} @cd $(BUILD_DIR) >> + >> +# >> +# module build target >> +# >> +modules: init >> +${BEGIN} @cd $(BUILD_DIR)${separator}${arch} && "$(MAKE)" >> +$(MAKE_FLAGS) modules ${END} @cd $(BUILD_DIR) >> + >> +# >> +# Flash Device Image Target >> +# >> +fds: init >> + -@cd $(FV_DIR) >> +${BEGIN} GenFds -f ${fdf_file} -o $(BUILD_DIR) -t $(TOOLCHAIN) -b >> +$(TARGET) -p ${active_platform} -a ${build_architecture_list} >> +${extra_options}${END}${BEGIN} -r ${fd} ${END}${BEGIN} -i ${fv} >> +${END}${BEGIN} -C ${cap} ${END}${BEGIN} -D ${macro} ${END} >> + >> +# >> +# run command for emulator platform only # >> +run: >> + cd $(BUILD_DIR)${separator}IA32 && ".${separator}SecMain" >> + cd $(BUILD_DIR) >> + >> +# >> +# Clean intermediate files >> +# >> +clean: >> +${BEGIN} -@${sub_build_command} clean >> +${END} @cd $(BUILD_DIR) >> + >> +# >> +# Clean all generated files except to makefile # >> +cleanall: >> +${BEGIN} ${cleanall_command} >> +${END} >> + >> +# >> +# Clean all library files >> +# >> +cleanlib: >> +${BEGIN} -@${sub_build_command} cleanlib ${END} @cd $(BUILD_DIR)\n >> +''') >> >> ## Constructor of TopLevelMakefile >> # >> diff --git a/BaseTools/Source/Python/build/build.py >> b/BaseTools/Source/Python/build/build.py >> index 85ee998..bd43f2c 100644 >> --- a/BaseTools/Source/Python/build/build.py >> +++ b/BaseTools/Source/Python/build/build.py >> @@ -245,14 +245,7 @@ def LaunchCommand(Command, WorkingDir): >> # if working directory doesn't exist, Popen() will raise an exception >> if not os.path.isdir(WorkingDir): >> EdkLogger.error("build", FILE_NOT_FOUND, >> ExtraData=WorkingDir) >> - >> - # Command is used as the first Argument in following Popen(). >> - # It could be a string or sequence. We find that if command is a string >> in following Popen(), >> - # ubuntu may fail with an error message that the command is not found. >> - # So here we may need convert command from string to list instance. >> - if not isinstance(Command, list): >> - Command = Command.split() >> - >> + >> Proc = None >> EndOfProcedure = None >> try: >> @@ -873,136 +866,7 @@ class Build(): >> # @param CreateDepModuleMakeFile Flag used to indicate creating >> makefile >> # for dependent modules/Libraries >> # >> - def _BuildPa(self, Target, AutoGenObject, CreateDepsCodeFile=True, >> CreateDepsMakeFile=True, BuildModule=False): >> - if AutoGenObject == None: >> - return False >> - >> - # skip file generation for cleanxxx targets, run and fds target >> - if Target not in ['clean', 'cleanlib', 'cleanall', 'run', 'fds']: >> - # for target which must generate AutoGen code and makefile >> - if not self.SkipAutoGen or Target == 'genc': >> - self.Progress.Start("Generating code") >> - AutoGenObject.CreateCodeFile(CreateDepsCodeFile) >> - self.Progress.Stop("done!") >> - if Target == "genc": >> - return True >> - >> - if not self.SkipAutoGen or Target == 'genmake': >> - self.Progress.Start("Generating makefile") >> - AutoGenObject.CreateMakeFile(CreateDepsMakeFile) >> - self.Progress.Stop("done!") >> - if Target == "genmake": >> - return True >> - else: >> - # always recreate top/platform makefile when clean, just in >> case of inconsistency >> - AutoGenObject.CreateCodeFile(False) >> - AutoGenObject.CreateMakeFile(False) >> - >> - if EdkLogger.GetLevel() == EdkLogger.QUIET: >> - EdkLogger.quiet("Building ... %s" % repr(AutoGenObject)) >> - >> - BuildCommand = AutoGenObject.BuildCommand >> - if BuildCommand == None or len(BuildCommand) == 0: >> - EdkLogger.error("build", OPTION_MISSING, >> - "No build command found for this module. " >> - "Please check your setting of >> %s_%s_%s_MAKE_PATH in Conf/tools_def.txt file." % >> - (AutoGenObject.BuildTarget, >> AutoGenObject.ToolChain, AutoGenObject.Arch), >> - ExtraData=str(AutoGenObject)) >> - >> - makefile = >> GenMake.BuildFile(AutoGenObject)._FILE_NAME_[GenMake.gMakeType] >> - >> - # genfds >> - if Target == 'fds': >> - LaunchCommand(AutoGenObject.GenFdsCommand, >> AutoGenObject.MakeFileDir) >> - return True >> - >> - # run >> - if Target == 'run': >> - RunDir = os.path.normpath(os.path.join(AutoGenObject.BuildDir, >> 'IA32')) >> - Command = '.\SecMain' >> - os.chdir(RunDir) >> - LaunchCommand(Command, RunDir) >> - return True >> - >> - # build modules >> - if BuildModule: >> - BuildCommand = BuildCommand + [Target] >> - LaunchCommand(BuildCommand, AutoGenObject.MakeFileDir) >> - self.CreateAsBuiltInf() >> - return True >> - >> - # build library >> - if Target == 'libraries': >> - for Lib in AutoGenObject.LibraryBuildDirectoryList: >> - NewBuildCommand = BuildCommand + ['-f', >> os.path.normpath(os.path.join(Lib, makefile)), 'pbuild'] >> - LaunchCommand(NewBuildCommand, AutoGenObject.MakeFileDir) >> - return True >> - >> - # build module >> - if Target == 'modules': >> - for Lib in AutoGenObject.LibraryBuildDirectoryList: >> - NewBuildCommand = BuildCommand + ['-f', >> os.path.normpath(os.path.join(Lib, makefile)), 'pbuild'] >> - LaunchCommand(NewBuildCommand, AutoGenObject.MakeFileDir) >> - for Mod in AutoGenObject.ModuleBuildDirectoryList: >> - NewBuildCommand = BuildCommand + ['-f', >> os.path.normpath(os.path.join(Mod, makefile)), 'pbuild'] >> - LaunchCommand(NewBuildCommand, AutoGenObject.MakeFileDir) >> - self.CreateAsBuiltInf() >> - return True >> - >> - # cleanlib >> - if Target == 'cleanlib': >> - for Lib in AutoGenObject.LibraryBuildDirectoryList: >> - LibMakefile = os.path.normpath(os.path.join(Lib, makefile)) >> - if os.path.exists(LibMakefile): >> - NewBuildCommand = BuildCommand + ['-f', LibMakefile, >> 'cleanall'] >> - LaunchCommand(NewBuildCommand, >> AutoGenObject.MakeFileDir) >> - return True >> - >> - # clean >> - if Target == 'clean': >> - for Mod in AutoGenObject.ModuleBuildDirectoryList: >> - ModMakefile = os.path.normpath(os.path.join(Mod, makefile)) >> - if os.path.exists(ModMakefile): >> - NewBuildCommand = BuildCommand + ['-f', ModMakefile, >> 'cleanall'] >> - LaunchCommand(NewBuildCommand, >> AutoGenObject.MakeFileDir) >> - for Lib in AutoGenObject.LibraryBuildDirectoryList: >> - LibMakefile = os.path.normpath(os.path.join(Lib, makefile)) >> - if os.path.exists(LibMakefile): >> - NewBuildCommand = BuildCommand + ['-f', LibMakefile, >> 'cleanall'] >> - LaunchCommand(NewBuildCommand, >> AutoGenObject.MakeFileDir) >> - return True >> - >> - # cleanall >> - if Target == 'cleanall': >> - try: >> - #os.rmdir(AutoGenObject.BuildDir) >> - RemoveDirectory(AutoGenObject.BuildDir, True) >> - # >> - # First should close DB. >> - # >> - self.Db.Close() >> - RemoveDirectory(os.path.dirname(GlobalData.gDatabasePath), >> True) >> - except WindowsError, X: >> - EdkLogger.error("build", FILE_DELETE_FAILURE, >> ExtraData=str(X)) >> - return True >> - >> - ## Build a module or platform >> - # >> - # Create autogen code and makefile for a module or platform, and the >> launch >> - # "make" command to build it >> - # >> - # @param Target The target of build command >> - # @param Platform The platform file >> - # @param Module The module file >> - # @param BuildTarget The name of build target, one >> of "DEBUG", "RELEASE" >> - # @param ToolChain The name of toolchain to build >> - # @param Arch The arch of the module/platform >> - # @param CreateDepModuleCodeFile Flag used to indicate creating >> code >> - # for dependent modules/Libraries >> - # @param CreateDepModuleMakeFile Flag used to indicate creating >> makefile >> - # for dependent modules/Libraries >> - # >> - def _Build(self, Target, AutoGenObject, CreateDepsCodeFile=True, >> CreateDepsMakeFile=True, BuildModule=False): >> + def _Build(self, Target, AutoGenObject, CreateDepsCodeFile=True, >> CreateDepsMakeFile=True): >> if AutoGenObject == None: >> return False >> >> @@ -1019,7 +883,7 @@ class Build(): >> if not self.SkipAutoGen or Target == 'genmake': >> self.Progress.Start("Generating makefile") >> AutoGenObject.CreateMakeFile(CreateDepsMakeFile) >> - #AutoGenObject.CreateAsBuiltInf() >> + AutoGenObject.CreateAsBuiltInf() >> self.Progress.Stop("done!") >> if Target == "genmake": >> return True >> @@ -1039,34 +903,8 @@ class Build(): >> (AutoGenObject.BuildTarget, >> AutoGenObject.ToolChain, AutoGenObject.Arch), >> ExtraData=str(AutoGenObject)) >> >> - # genfds >> - if Target == 'fds': >> - LaunchCommand(AutoGenObject.GenFdsCommand, >> AutoGenObject.MakeFileDir) >> - return True >> - >> - # run >> - if Target == 'run': >> - RunDir = os.path.normpath(os.path.join(AutoGenObject.BuildDir, >> 'IA32')) >> - Command = '.\SecMain' >> - os.chdir(RunDir) >> - LaunchCommand(Command, RunDir) >> - return True >> - >> - # build modules >> BuildCommand = BuildCommand + [Target] >> - if BuildModule: >> - LaunchCommand(BuildCommand, AutoGenObject.MakeFileDir) >> - self.CreateAsBuiltInf() >> - return True >> - >> - # build library >> - if Target == 'libraries': >> - pass >> - >> - # not build modules >> - >> - >> - # cleanall >> + LaunchCommand(BuildCommand, AutoGenObject.MakeFileDir) >> if Target == 'cleanall': >> try: >> #os.rmdir(AutoGenObject.BuildDir) @@ -1406,10 +1244,7 @@ >> class Build(): >> self.LoadFixAddress = Wa.Platform.LoadFixAddress >> self.BuildReport.AddPlatformReport(Wa) >> self.Progress.Stop("done!") >> - for Arch in Wa.ArchList: >> - GlobalData.gGlobalDefines['ARCH'] = Arch >> - Pa = PlatformAutoGen(Wa, self.PlatformFile, >> BuildTarget, ToolChain, Arch) >> - self._BuildPa(self.Target, Pa) >> + self._Build(self.Target, Wa) >> >> # Create MAP file when Load Fix Address is enabled. >> if self.Target in ["", "all", "fds"]: >> @@ -1492,8 +1327,7 @@ class Build(): >> Ma = ModuleAutoGen(Wa, self.ModuleFile, BuildTarget, >> ToolChain, Arch, self.PlatformFile) >> if Ma == None: continue >> MaList.append(Ma) >> - if not Ma.IsBinaryModule: >> - self._Build(self.Target, Ma, BuildModule=True) >> + self._Build(self.Target, Ma) >> >> self.BuildReport.AddPlatformReport(Wa, MaList) >> if MaList == []: >> @@ -1674,8 +1508,7 @@ class Build(): >> # >> # Generate FD image if there's a FDF file found >> # >> - LaunchCommand(Wa.GenFdsCommand, os.getcwd()) >> - >> + LaunchCommand(Wa.BuildCommand + ["fds"], >> + Wa.MakeFileDir) >> # >> # Create MAP file for all platform FVs after GenFds. >> # >> -- >> 2.1.0 > > ---------------------------------------------------------------------- > -------- > Slashdot TV. > Video for Nerds. Stuff that matters. > http://tv.slashdot.org/ > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/edk2-devel > > ---------------------------------------------------------------------- > -------- > Slashdot TV. > Video for Nerds. Stuff that matters. > http://tv.slashdot.org/ > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ Slashdot TV. Video for Nerds. Stuff that matters. http://tv.slashdot.org/ _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel