diff --git a/BaseTools/Scripts/SetVisualStudio.bat b/BaseTools/Scripts/SetVisualStudio.bat new file mode 100644 index 0000000000..a302a83596 --- /dev/null +++ b/BaseTools/Scripts/SetVisualStudio.bat @@ -0,0 +1,103 @@ +@REM @file +@REM Windows batch file to set up the Microsoft Visual Studio environment +@REM +@REM This script is used to set up one of the Microsoft Visual Studio +@REM environments, VS2008x86, VS2010x86, VS2012x86 or VS2013x86 for +@REM building the Nt32Pkg/Nt32Pkg.dsc emulation environment to run on +@REM an X64 version of Windows. +@REM The system environment variables in this script are set by the +@rem Edk2Setup.bat script (that will be renamed to edksetup.bat). +@REM +@REM This script can also be used to build the Win32 binaries +@REM +@REM Copyright (c) 2014, Intel Corporation. All rights reserved.
+@REM This program and the accompanying materials +@REM are licensed and made available under the terms and conditions of the BSD License +@REM which accompanies this distribution. The full text of the license may be found at +@REM http://opensource.org/licenses/bsd-license.php +@REM +@REM THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +@REM WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +@REM +@echo off +@if defined NT32_X64 @goto CheckLatest +@if "%REBUILD_TOOLS%"=="TRUE" @goto RebuildTools + +:CheckLatest +echo. +@if defined VS120COMNTOOLS ( + @set "COMMONTOOLSx64=C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64" + @goto SetVs +) + +@if defined VS110COMNTOOLS ( + @set "COMMONTOOLSx64=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64" + @goto SetVs +) + +@if defined VS100COMNTOOLS ( + @set "COMMONTOOLSx64=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64" + @goto SetVs +) + +@if defined VS90COMNTOOLS ( + @set "COMMONTOOLSx64=C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\x86_amd64" + @goto SetVs +) +@echo. +@echo No version of Microsoft Visual Studio was found on this system +@echo. +@exit /B 1 + +@REM Set up the X64 environment for building Nt32Pkg/Nt32Pkg.dsc to run on an X64 platform +:SetVs +if exist "%COMMONTOOLSx64%\vcvarsx86_amd64.bat" ( + @call "%COMMONTOOLSx64%\vcvarsx86_amd64.bat" + @if errorlevel 1 ( + @echo. ERROR setting Microsoft Visual Studio %1 + @set COMMONTOOLSx64= + @exit /B 1 + ) +) +if not exist "%COMMONTOOLSx64%\vcvarsx86_amd64.bat" ( + @echo ERROR : This script does not exist: "%COMMONTOOLSx64%\vcvarsx86_amd64.bat" + @set COMMONTOOLSx64= + @exit /B 1 +) +@set COMMONTOOLSx64= +@goto End + +:RebuildTools +@call python "%WORKSPACE%\BaseTools\Scripts\UpdateBuildVersions.py" +@set "BIN_DIR=%EDK_TOOLS_PATH%\Bin\Win32" +if not exist "%BIN_DIR%" @mkdir "%BIN_DIR%" +@echo Removing temporary and binary files +@cd "%BASE_TOOLS_PATH%" +@call nmake cleanall +@echo Rebuilding the EDK II BaseTools +@cd "%BASE_TOOLS_PATH%\Source\C" +@call nmake -nologo -a -f Makefile +@if errorlevel 1 ( +@echo Error building the C-based BaseTools +@cd "%WORKSPACE%" +@exit /B1 +) +@cd %BASE_TOOLS_PATH%\Source\Python +@call nmake -nologo -a -f Makefile +@if errorlevel 1 ( +@echo Error building the Python-based BaseTools +@cd %WORKSPACE% +@exit /B1 +) +@cd %WORKSPACE% + +@goto End + +:VersionNotFound +@echo. +@echo This Microsoft Visual Studio version is in not installed on this system: %1 +@echo. +@exit /B 1 + +:End +@exit /B 0 diff --git a/BaseTools/Scripts/ShowEnvironment.bat b/BaseTools/Scripts/ShowEnvironment.bat new file mode 100644 index 0000000000..c4613e1170 --- /dev/null +++ b/BaseTools/Scripts/ShowEnvironment.bat @@ -0,0 +1,207 @@ +@REM @file +@REM Windows batch file to display the Windows environment +@REM +@REM This script will be used to show the current EDK II build environment. +@REM it may be called by the Edk2Setup.bat (that will be renamed to edksetup.bat) or +@REM run as stand-alone application. +@REM +@REM Copyright (c) 2014, Intel Corporation. All rights reserved.
+@REM This program and the accompanying materials +@REM are licensed and made available under the terms and conditions of the BSD License +@REM which accompanies this distribution. The full text of the license may be found at +@REM http://opensource.org/licenses/bsd-license.php +@REM +@REM THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +@REM WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +@REM +@echo off +@set SE_SVN_REVISION=$Revision: 8 $ +@set SE_VERSION=0.7.0. +@if "%SCRIPT%"=="EDKSETUP_BAT" goto SkipCmdlineArgumentCheck + +:parse_cmd_line +@if /I "%1"=="-h" @goto Usage +@if /I "%1"=="--help" @goto Usage +@if /I "%1"=="/?" @goto Usage +@if /I "%1"=="-v" @goto Version +@if /I "%1"=="--version" @goto Version + +:Usage +@echo Usage: ShowEnvironment.bat [Options] +@echo Copyright(c) 2014, Intel Corporation. All rights reserved. +@echo. +@echo Options: +@echo --help, -h Print this help screen and exit +@echo --version, -v Print this tool's version and exit +@echo. +@goto End + +:Version +@echo ShowEnvironment.bat Version: %SE_VERSION%%SE_SVN_REVISION:~11,-1% +@echo Copyright(c) 2014, Intel Corporation. All rights reserved. + +:SkipCmdlineArgumentCheck +if defined SRC_CONF @goto SetEnv + +@echo. +@echo ############################################################################# +@if defined WORKSPACE @echo WORKSPACE = %WORKSPACE% +@if not defined WORKSPACE @echo WORKSPACE = Not Set +@if defined EDK_TOOLS_PATH @echo EDK_TOOLS_PATH = %EDK_TOOLS_PATH% +@if not defined EDK_TOOLS_PATH @echo EDK_TOOLS_PATH = Not Set +@if defined BASE_TOOLS_PATH @echo BASE_TOOLS_PATH = %BASE_TOOLS_PATH% +@if defined PYTHON_FREEZER_PATH @echo PYTHON_FREEZER_PATH = %PYTHON_FREEZER_PATH% +@if "%NT32PKG%"=="TRUE" ( + @echo. + @echo NOTE: Please configure your build to use the following TOOL_CHAIN_TAG + @echo when building NT32Pkg/Nt32Pkg.dsc + @if defined VCINSTALLDIR @call :CheckVsVer + @set TEST_VS= +) +@if defined HIDE_PATH goto End + + +@echo ############################## PATH ######################################### +@setlocal DisableDelayedExpansion +@set "var=%PATH%" +@set "var=%var:"=""%" +@set "var=%var:^=^^%" +@set "var=%var:&=^&%" +@set "var=%var:|=^|%" +@set "var=%var:<=^<%" +@set "var=%var:>=^>%" +@set "var=%var:;=^;^;%" +@set var=%var:""="% +@set "var=%var:"=""Q%" +@set "var=%var:;;="S"S%" +@set "var=%var:^;^;=;%" +@set "var=%var:""="%" +@setlocal EnableDelayedExpansion +@set "var=!var:"Q=!" +@for %%a in ("!var:"S"S=";"!") do ( + @if "!!"=="" endlocal + @if %%a neq "" echo %%~a +) +@goto End + +:CheckVsVer +@set "TEST_VS=C:\Program Files (x86)\Microsoft Visual Studio 9.0\" +@if "%VSINSTALLDIR%"=="%TEST_VS%" ( + @echo TOOL_CHAIN_TAG = VS2008x86 + @goto :EOF +) +@set "TEST_VS=C:\Program Files\Microsoft Visual Studio 9.0\" +@if "%VSINSTALLDIR%"=="%TEST_VS%" ( + @echo TOOL_CHAIN_TAG = VS2008 + @goto :EOF +) + +@set "TEST_VS=C:\Program Files (x86)\Microsoft Visual Studio 10.0\" +@if "%VSINSTALLDIR%"=="%TEST_VS%" ( + @echo TOOL_CHAIN_TAG = VS2010x86 + @goto :EOF +) +@set "TEST_VS=C:\Program Files\Microsoft Visual Studio 10.0\" +@if "%VSINSTALLDIR%"=="%TEST_VS%" ( + @echo TOOL_CHAIN_TAG = VS2010 + @goto :EOF +) + +@set "TEST_VS=C:\Program Files (x86)\Microsoft Visual Studio 11.0\" +@if "%VSINSTALLDIR%"=="%TEST_VS%" ( + @echo TOOL_CHAIN_TAG = VS2012x86 + @goto :EOF +) +@set "TEST_VS=C:\Program Files\Microsoft Visual Studio 11.0\" +@if "%VSINSTALLDIR%"=="%TEST_VS%" ( + @echo TOOL_CHAIN_TAG = VS2012 + @goto :EOF +) + +@set "TEST_VS=C:\Program Files (x86)\Microsoft Visual Studio 12.0\" +@if "%VSINSTALLDIR%"=="%TEST_VS%" ( + @echo TOOL_CHAIN_TAG = VS2013x86 + @goto :EOF +) +@set "TEST_VS=C:\Program Files\Microsoft Visual Studio 12.0\" +@if "%VSINSTALLDIR%"=="%TEST_VS%" ( + @echo TOOL_CHAIN_TAG = VS2013 + @goto :EOF +) +@goto :EOF + +:SetEnv +@set FIRST_COPY=FALSE +@set MISSING_TARGET_TEMPLATE=FALSE +@set MISSING_TOOLS_DEF_TEMPLATE=FALSE +@set MISSING_BUILD_RULE_TEMPLATE=FALSE +@if not exist "%SRC_CONF%\target.template" @set MISSING_TARGET_TEMPLATE=TRUE +@if not exist "%SRC_CONF%\tools_def.template" @set MISSING_TOOLS_DEF_TEMPLATE=TRUE +@if not exist "%SRC_CONF%\build_rule.template" @set MISSING_BUILD_RULE_TEMPLATE=TRUE + +@if not exist "%WORKSPACE%\Conf\target.txt" ( + @if "%MISSING_TARGET_TEMPLATE%"=="TRUE" @goto MissingTemplates + @echo copying ... target.template to %WORKSPACE%\Conf\target.txt + @copy /Y "%SRC_CONF%\target.template" "%WORKSPACE%\Conf\target.txt" > nul + @set FIRST_COPY=TRUE +) +@if not exist "%WORKSPACE%\Conf\tools_def.txt" ( + @if "%MISSING_TOOLS_DEF_TEMPLATE%"=="TRUE" @goto MissingTemplates + @echo copying ... tools_def.template to %WORKSPACE%\Conf\tools_def.txt + @copy /Y "%SRC_CONF%\tools_def.template" "%WORKSPACE%\Conf\tools_def.txt" > nul + @set FIRST_COPY=TRUE +) +@if not exist "%WORKSPACE%\Conf\build_rule.txt" ( + @if "%MISSING_BUILD_RULE_TEMPLATE%"=="TRUE" @goto MissingTemplates + @echo copying ... build_rule.template to %WORKSPACE%\Conf\build_rule.txt + @copy /Y "%SRC_CONF%\build_rule.template" "%WORKSPACE%\Conf\build_rule.txt" > nul + @set FIRST_COPY=TRUE +) + +@if "%FIRST_COPY%"=="TRUE" @goto End +@if not "%RECONFIG%"=="TRUE" @goto End + +@if "%RECONFIG%"=="TRUE" ( + @echo. + @echo Over-writing the files in the WORKSPACE\Conf directory + @echo using the default template files + @echo. + @if "%MISSING_TARGET_TEMPLATE%"=="TRUE" @goto MissingTemplates + @echo over-write ... target.template to %WORKSPACE%\Conf\target.txt + @copy /Y "%SRC_CONF%\target.template" "%WORKSPACE%\Conf\target.txt" > nul + + @if "%MISSING_TOOLS_DEF_TEMPLATE%"=="TRUE" @goto MissingTemplates + @echo over-write ... tools_def.template to %WORKSPACE%\Conf\tools_def.txt + @copy /Y "%SRC_CONF%\tools_def.template" "%WORKSPACE%\Conf\tools_def.txt" > nul + + @if "%MISSING_BUILD_RULE_TEMPLATE%"=="TRUE" @goto MissingTemplates + @echo over-write ... build_rule.template to %WORKSPACE%\Conf\build_rule.txt + @copy /Y "%SRC_CONF%\build_rule.template" "%WORKSPACE%\Conf\build_rule.txt" > nul + @goto End +) + +:MissingTemplates +@echo. +@if "%RECONFIG%"=="TRUE" @echo ERROR : Reconfig failed +@if "%MISSING_TARGET_TEMPLATE%"=="TRUE" @echo ERROR : Unable to locate: "%SRC_CONF%\target.template" +@if "%MISSING_TOOLS_DEF_TEMPLATE%"=="TRUE" @echo ERROR : Unable to locate: "%SRC_CONF%\tools_def.template" +@if "%MISSING_BUILD_RULE_TEMPLATE%"=="TRUE" @echo ERROR : Unable to locate: "%SRC_CONF%\build_rule.template" +@echo. +@set MISSING_TARGET_TEMPLATE= +@set MISSING_TOOLS_DEF_TEMPLATE= +@set MISSING_BUILD_RULE_TEMPLATE= +@set FIRST_COPY= +@set SE_VERSION= +@set SE_SVN_REVISION= +@if not "%SCRIPT%"=="EDKSETUP_BAT" @echo on +exit /B 1 + +:End +@set MISSING_TARGET_TEMPLATE= +@set MISSING_TOOLS_DEF_TEMPLATE= +@set MISSING_BUILD_RULE_TEMPLATE= +@set FIRST_COPY= +@set SE_VERSION= +@set SE_SVN_REVISION= +@if not "%SCRIPT%"=="EDKSETUP_BAT" @echo on +exit /B 0 diff --git a/BaseTools/Scripts/UpdateBuildVersions.py b/BaseTools/Scripts/UpdateBuildVersions.py new file mode 100644 index 0000000000..e9c069724e --- /dev/null +++ b/BaseTools/Scripts/UpdateBuildVersions.py @@ -0,0 +1,400 @@ +## @file +# Update build revisions of the tools when performing a developer build +# +# This script will modife the C/Include/Common/BuildVersion.h file and the two +# Python scripts, Python/Common/BuildVersion.py and Python/UPT/BuildVersion.py. +# If SVN is available, the tool will obtain the current checked out version of +# the source tree for including the the --version commands. + +# Copyright (c) 2014, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +## +""" This program will update the BuildVersion.py and BuildVersion.h files used to set a tool's version value """ +from __future__ import absolute_import + +import os +import shlex +import subprocess +import sys + +from argparse import ArgumentParser, SUPPRESS +from tempfile import NamedTemporaryFile +from types import IntType, ListType + + +SYS_ENV_ERR = "ERROR : %s system environment variable must be set prior to running this tool.\n" + +__execname__ = "UpdateBuildVersions.py" +SVN_REVISION = "$Revision: 3 $" +SVN_REVISION = SVN_REVISION.replace("$Revision:", "").replace("$", "").strip() +__copyright__ = "Copyright (c) 2014, Intel Corporation. All rights reserved." +VERSION_NUMBER = "0.7.0" +__version__ = "Version %s.%s" % (VERSION_NUMBER, SVN_REVISION) + + +def ParseOptions(): + """ + Parse the command-line options. + The options for this tool will be passed along to the MkBinPkg tool. + """ + parser = ArgumentParser( + usage=("%s [options]" % __execname__), + description=__copyright__, + conflict_handler='resolve') + + # Standard Tool Options + parser.add_argument("--version", action="version", + version=__execname__ + " " + __version__) + parser.add_argument("-s", "--silent", action="store_true", + dest="silent", + help="All output will be disabled, pass/fail determined by the exit code") + parser.add_argument("-v", "--verbose", action="store_true", + dest="verbose", + help="Enable verbose output") + # Tool specific options + parser.add_argument("--revert", action="store_true", + dest="REVERT", default=False, + help="Revert the BuildVersion files only") + parser.add_argument("--svn-test", action="store_true", + dest="TEST_SVN", default=False, + help="Test if the svn command is available") + parser.add_argument("--svnFlag", action="store_true", + dest="HAVE_SVN", default=False, + help=SUPPRESS) + + return(parser.parse_args()) + + +def ShellCommandResults(CmdLine, Opt): + """ Execute the comand, returning the output content """ + file_list = NamedTemporaryFile(delete=False) + filename = file_list.name + Results = [] + + returnValue = 0 + try: + subprocess.check_call(args=shlex.split(CmdLine), stderr=subprocess.STDOUT, stdout=file_list) + except subprocess.CalledProcessError as err_val: + file_list.close() + if not Opt.silent: + sys.stderr.write("ERROR : %d : %s\n" % (err_val.returncode, err_val.__str__())) + if os.path.exists(filename): + sys.stderr.write(" : Partial results may be in this file: %s\n" % filename) + sys.stderr.flush() + returnValue = err_val.returncode + + except IOError as (errno, strerror): + file_list.close() + if not Opt.silent: + sys.stderr.write("I/O ERROR : %s : %s\n" % (str(errno), strerror)) + sys.stderr.write("ERROR : this command failed : %s\n" % CmdLine) + if os.path.exists(filename): + sys.stderr.write(" : Partial results may be in this file: %s\n" % filename) + sys.stderr.flush() + returnValue = errno + + except OSError as (errno, strerror): + file_list.close() + if not Opt.silent: + sys.stderr.write("OS ERROR : %s : %s\n" % (str(errno), strerror)) + sys.stderr.write("ERROR : this command failed : %s\n" % CmdLine) + if os.path.exists(filename): + sys.stderr.write(" : Partial results may be in this file: %s\n" % filename) + sys.stderr.flush() + returnValue = errno + + except KeyboardInterrupt: + file_list.close() + if not Opt.silent: + sys.stderr.write("ERROR : Command terminated by user : %s\n" % CmdLine) + if os.path.exists(filename): + sys.stderr.write(" : Partial results may be in this file: %s\n" % filename) + sys.stderr.flush() + returnValue = 1 + + finally: + if not file_list.closed: + file_list.flush() + os.fsync(file_list.fileno()) + file_list.close() + + if os.path.exists(filename): + fd_ = open(filename, 'r') + Results = fd_.readlines() + fd_.close() + os.unlink(filename) + + if returnValue > 0: + return returnValue + + return Results + + +def UpdateBuildVersionPython(Rev, UserModified, opts): + """ This routine will update the BuildVersion.h files in the C source tree """ + for SubDir in ["Common", "UPT"]: + PyPath = os.path.join(os.environ['BASE_TOOLS_PATH'], "Source", "Python", SubDir) + BuildVersionPy = os.path.join(PyPath, "BuildVersion.py") + fd_ = open(os.path.normpath(BuildVersionPy), 'r') + contents = fd_.readlines() + fd_.close() + if opts.HAVE_SVN is False: + BuildVersionOrig = os.path.join(PyPath, "orig_BuildVersion.py") + fd_ = open (BuildVersionOrig, 'w') + for line in contents: + fd_.write(line) + fd_.flush() + fd_.close() + new_content = [] + for line in contents: + if line.strip().startswith("gBUILD_VERSION"): + new_line = "gBUILD_VERSION = \"Developer Build based on Revision: %s\"" % Rev + if UserModified: + new_line = "gBUILD_VERSION = \"Developer Build based on Revision: %s with Modified Sources\"" % Rev + new_content.append(new_line) + continue + new_content.append(line) + + fd_ = open(os.path.normpath(BuildVersionPy), 'w') + for line in new_content: + fd_.write(line) + fd_.close() + + +def UpdateBuildVersionH(Rev, UserModified, opts): + """ This routine will update the BuildVersion.h files in the C source tree """ + CPath = os.path.join(os.environ['BASE_TOOLS_PATH'], "Source", "C", "Include", "Common") + BuildVersionH = os.path.join(CPath, "BuildVersion.h") + fd_ = open(os.path.normpath(BuildVersionH), 'r') + contents = fd_.readlines() + fd_.close() + if opts.HAVE_SVN is False: + BuildVersionOrig = os.path.join(CPath, "orig_BuildVersion.h") + fd_ = open(BuildVersionOrig, 'w') + for line in contents: + fd_.write(line) + fd_.flush() + fd_.close() + + new_content = [] + for line in contents: + if line.strip().startswith("#define"): + new_line = "#define __BUILD_VERSION \"Developer Build based on Revision: %s\"" % Rev + if UserModified: + new_line = "#define __BUILD_VERSION \"Developer Build based on Revision: %s with Modified Sources\"" % \ + Rev + new_content.append(new_line) + continue + new_content.append(line) + + fd_ = open(os.path.normpath(BuildVersionH), 'w') + for line in new_content: + fd_.write(line) + fd_.close() + + +def RevertCmd(Filename, Opt): + """ This is the shell command that does the SVN revert """ + CmdLine = "svn revert %s" % Filename.replace("\\", "/").strip() + try: + subprocess.check_output(args=shlex.split(CmdLine)) + except subprocess.CalledProcessError as err_val: + if not Opt.silent: + sys.stderr.write("Subprocess ERROR : %s\n" % err_val) + sys.stderr.flush() + + except IOError as (errno, strerror): + if not Opt.silent: + sys.stderr.write("I/O ERROR : %d : %s\n" % (str(errno), strerror)) + sys.stderr.write("ERROR : this command failed : %s\n" % CmdLine) + sys.stderr.flush() + + except OSError as (errno, strerror): + if not Opt.silent: + sys.stderr.write("OS ERROR : %d : %s\n" % (str(errno), strerror)) + sys.stderr.write("ERROR : this command failed : %s\n" % CmdLine) + sys.stderr.flush() + + except KeyboardInterrupt: + if not Opt.silent: + sys.stderr.write("ERROR : Command terminated by user : %s\n" % CmdLine) + sys.stderr.flush() + + if Opt.verbose: + sys.stdout.write("Reverted this file: %s\n" % Filename) + sys.stdout.flush() + + +def GetSvnRevision(opts): + """ Get the current revision of the BaseTools/Source tree, and check if any of the files have been modified """ + Revision = "Unknown" + Modified = False + + if opts.HAVE_SVN is False: + sys.stderr.write("WARNING: the svn command-line tool is not available.\n") + return (Revision, Modified) + + SrcPath = os.path.join(os.environ['BASE_TOOLS_PATH'], "Source") + # Check if there are modified files. + Cwd = os.getcwd() + os.chdir(SrcPath) + + StatusCmd = "svn st -v --depth infinity --non-interactive" + contents = ShellCommandResults(StatusCmd, opts) + os.chdir(Cwd) + if type(contents) is ListType: + for line in contents: + if line.startswith("M "): + Modified = True + break + + # Get the repository revision of BaseTools/Source + InfoCmd = "svn info %s" % SrcPath.replace("\\", "/").strip() + Revision = 0 + contents = ShellCommandResults(InfoCmd, opts) + if type(contents) is IntType: + return 0, Modified + for line in contents: + line = line.strip() + if line.startswith("Revision:"): + Revision = line.replace("Revision:", "").strip() + break + + return (Revision, Modified) + + +def CheckSvn(opts): + """ + This routine will return True if an svn --version command succeeds, or False if it fails. + If it failed, SVN is not available. + """ + OriginalSilent = opts.silent + opts.silent = True + VerCmd = "svn --version" + contents = ShellCommandResults(VerCmd, opts) + opts.silent = OriginalSilent + if type(contents) is IntType: + if opts.verbose: + sys.stdout.write("SVN does not appear to be available.\n") + sys.stdout.flush() + return False + + if opts.verbose: + sys.stdout.write("Found %s" % contents[0]) + sys.stdout.flush() + return True + + +def CopyOrig(Src, Dest, Opt): + """ Overwrite the Dest File with the Src File content """ + try: + fd_ = open(Src, 'r') + contents = fd_.readlines() + fd_.close() + fd_ = open(Dest, 'w') + for line in contents: + fd_.write(line) + fd_.flush() + fd_.close() + except IOError: + if not Opt.silent: + sys.stderr.write("Unable to restore this file: %s\n" % Dest) + sys.stderr.flush() + return 1 + + os.remove(Src) + if Opt.verbose: + sys.stdout.write("Restored this file: %s\n" % Src) + sys.stdout.flush() + + return 0 + + +def CheckOriginals(Opts): + """ + If SVN was not available, then the tools may have made copies of the original BuildVersion.* files using + orig_BuildVersion.* for the name. If they exist, replace the existing BuildVersion.* file with the corresponding + orig_BuildVersion.* file. + Returns 0 if this succeeds, or 1 if the copy function fails. It will also return 0 if the orig_BuildVersion.* file + does not exist. + """ + CPath = os.path.join(os.environ['BASE_TOOLS_PATH'], "Source", "C", "Include", "Common") + BuildVersionH = os.path.join(CPath, "BuildVersion.h") + OrigBuildVersionH = os.path.join(CPath, "orig_BuildVersion.h") + if not os.path.exists(OrigBuildVersionH): + return 0 + if CopyOrig(OrigBuildVersionH, BuildVersionH, Opts): + return 1 + for SubDir in ["Common", "UPT"]: + PyPath = os.path.join(os.environ['BASE_TOOLS_PATH'], "Source", "Python", SubDir) + BuildVersionPy = os.path.join(PyPath, "BuildVersion.h") + OrigBuildVersionPy = os.path.join(PyPath, "orig_BuildVersion.h") + if not os.path.exists(OrigBuildVersionPy): + return 0 + if CopyOrig(OrigBuildVersionPy, BuildVersionPy, Opts): + return 1 + + return 0 + + +def RevertBuildVersionFiles(opts): + """ + This routine will attempt to perform an SVN --revert on each of the BuildVersion.* files + """ + if not opts.HAVE_SVN: + if CheckOriginals(opts): + return 1 + return 0 + # SVN is available + BuildVersionH = os.path.join(os.environ['BASE_TOOLS_PATH'], "Source", "C", "Include", "Common", "BuildVersion.h") + RevertCmd(BuildVersionH, opts) + for SubDir in ["Common", "UPT"]: + BuildVersionPy = os.path.join(os.environ['BASE_TOOLS_PATH'], "Source", "Python", SubDir, "BuildVersion.py") + RevertCmd(BuildVersionPy, opts) + +def UpdateRevisionFiles(): + """ Main routine that will update the BuildVersion.py and BuildVersion.h files.""" + options = ParseOptions() + # Check the working environment + if "WORKSPACE" not in os.environ.keys(): + sys.stderr.write(SYS_ENV_ERR % 'WORKSPACE') + return 1 + if 'BASE_TOOLS_PATH' not in os.environ.keys(): + sys.stderr.write(SYS_ENV_ERR % 'BASE_TOOLS_PATH') + return 1 + if not os.path.exists(os.environ['BASE_TOOLS_PATH']): + sys.stderr.write("Unable to locate the %s directory." % os.environ['BASE_TOOLS_PATH']) + return 1 + + + options.HAVE_SVN = CheckSvn(options) + if options.TEST_SVN: + return (not options.HAVE_SVN) + # done processing the option, now use the option.HAVE_SVN as a flag. True = Have it, False = Don't have it. + if options.REVERT: + # Just revert the tools an exit + RevertBuildVersionFiles(options) + else: + # Revert any changes in the BuildVersion.* files before setting them again. + RevertBuildVersionFiles(options) + Revision, Modified = GetSvnRevision(options) + if options.verbose: + sys.stdout.write("Revision: %s is Modified: %s\n" % (Revision, Modified)) + sys.stdout.flush() + UpdateBuildVersionH(Revision, Modified, options) + UpdateBuildVersionPython(Revision, Modified, options) + + return 0 + + +if __name__ == "__main__": + sys.exit(UpdateRevisionFiles()) + + diff --git a/Edk2Setup.bat b/Edk2Setup.bat new file mode 100644 index 0000000000..bdf85c221f --- /dev/null +++ b/Edk2Setup.bat @@ -0,0 +1,475 @@ +@REM @file +@REM Windows batch file, Edk2Setup.bat, to set up an EDK II build environment +@REM +@REM This script will be renamed to edksetup.bat after initial testing and +@REM acceptance by the open source community. +@REM +@REM This script will set the following system environment variables: +@REM WORKSPACE, EDK_TOOLS_PATH, PATH +@REM If rebuilding the tools: +@REM BASE_TOOLS_PATH, PYTHON_FREEZER_PATH, PYTHONPATH +@REM It will also create a Conf/target.txt, tools_def.txt and build_rule.txt files +@REM if they do not exist +@REM If the reset flag is set, all environment variables will be reset and +@REM the Conf/target.txt, tools_def.txt and build_rule.txt files will be overwritten +@REM +@REM Three other scripts, located in the BaseTools\Scripts directory, may be called +@REM by this script. +@REM SetVisualStudio.bat - will set the Visual Studio environment based on the --vs* flags +@REM it is also used to build the Win32 binaries, calling nmake +@REM using the WORKSPACE\BaseTools\Makefile +@REM ShowEnvironment.bat - will display the current EDK II Build environment +@REM UpdateBuildVersions.py - script is called prior to building the EDK II BaseTools from +@REM Sources. This tool will modify the BuildVersion.* files so that +@REM when the tools get built, they will have a custom version entry +@REM similar to the following: +@REM e:\edk2>build --version +@REM build.exe Version 0.51 Developer Build based on Revision: 15668 +@REM +@REM Copyright (c) 2014, Intel Corporation. All rights reserved.
+@REM This program and the accompanying materials +@REM are licensed and made available under the terms and conditions of the BSD License +@REM which accompanies this distribution. The full text of the license may be found at +@REM http://opensource.org/licenses/bsd-license.php +@REM +@REM THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +@REM WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +@REM +@REM +@REM usage: +@REM Edk2Setup.bat [--help | -h] [-v | --version] [-r | --reset] +@REM [--reconfig] [--edk-tools-path DirName] +@REM [--pull [Directory]| --rebuild [Directory]] +@REM [--nt32 [X64]] + +@REM ############################################################## +@REM # You should not have to modify anything below this line +@REM # +@echo off +@set SCRIPT_NAME=%0 +@set SCRIPT_VERSION=0.9.0. +@set SVN_REVISION=$Revision: 8 $ +@set RESET_ENVIRONMENT=FALSE +@set NT32PKG=FALSE +@set NT32_64=FALSE +@set BUILD_TOOLS_WITH= +@set LOCATION= +@set REBUILD_TOOLS= +@set SVN_PULL= +@set SRC_CONF= +@set ARGUMENT= +@set SCRIPT=EDKSETUP_BAT + +@if not defined ORIGINAL_PATH set "ORIGINAL_PATH=%PATH%" +@REM Always set the WORKSPACE environment variable to the current directory +@set "WORKSPACE=%CD%" +@if exist "%WORKSPACE%\BaseTools" @set "BASE_TOOLS_PATH=%WORKSPACE%\BaseTools" +@if not exist "%WORKSPACE%\Conf" @mkdir "%WORKSPACE%\Conf" + +@@if not defined EDK_TOOLS_PATH @set "EDK_TOOLS_PATH=%WORKSPACE%\BaseTools" +@rem @set "PATH=%WORKSPACE%\BaseTools\Bin\Win32;%PATH%" +@rem @set WORKSPACE_TOOLS_PATH=%WORKSPACE%\BaseTools +@rem ) + +@REM Keep the existing EDK_TOOLS_PATH value, the --reset flag will set it +@REM back to WORKSPACE\BaseTools while the --location DIRECTORY flag will +@REM still take precedence if the location option follows the reset option +@REM on the command line. +@if defined EDK_TOOLS_PATH @set "LOCATION=%EDK_TOOLS_PATH%" + +:parse_cmd_line +@if "%1"=="" @goto MainRoutine +@if /I "%1"=="-h" @goto Usage +@if /I "%1"=="--help" @goto Usage +@if /I "%1"=="/?" @goto Usage +@if /I "%1"=="--version" @goto Version + +@REM These options will reset the system environment +@if /I "%1"=="-r" ( + @setlocal EnableDelayedExpansion + @set "WORKSPACE=%CD%" + @set "EDK_TOOLS_PATH=%CD%\BaseTools" + @set "LOCATION=!EDK_TOOLS_PATH!" + @endlocal + @shift + @goto parse_cmd_line +) +@if /I "%1"=="--reset" ( + @set "WORKSPACE=%CD%" + @set "EDK_TOOLS_PATH=%WORKSPACE%\BaseTools" + @set "LOCATION=%WORKSPACE%\BaseTools" + @shift + @goto parse_cmd_line +) + +@REM This option is used to overwrite the Conf/*.txt files with the +@REM WORKSPACE\BaseTools\Conf\*.template files. +@if /I "%1"=="--reconfig" ( + @set RECONFIG=TRUE + @shift + @goto parse_cmd_line +) + +@REM This option can be used to set the EDK_TOOLS_PATH containing the Win32 binaries to an +@REM alternate directory +@if /I "%1"=="--edk-tools-path" ( + @setlocal EnableDelayedExpansion + @set ARGUMENT=%2 + @if "!ARGUMENT:~0,2!"=="--" ( + @echo. + @echo ERROR : The --edk-tools-path flag requires an argument + @echo. + @endlocal + @goto Usage + ) + @endlocal + @set "LOCATION=%WORKSPACE%\%2" + @shift + @shift + @goto parse_cmd_line +) + +@REM Force pulling updated (or checkout if they do not exist) from SVN for the BaseTools\Bin\Win32 directory +@REM or the directory pointed to by the --location option +@if /I "%1"=="--pull" ( + @if "%REBUILD_TOOLS%"=="TRUE" ( + @echo. + @echo ERROR: The --pull option may not be used with the --rebuild option + @shift + @goto ExitFailure + ) + @set SVN_PULL=TRUE + @setlocal EnableDelayedExpansion + @set ARGUMENT=%2 + @if not "!ARGUMENT:~0,2!"=="--" ( + @endlocal + @set "LOCATION=%2" + @shift + ) + @shift + @goto parse_cmd_line +) + +@REM This options forces rebuilding the tools (provided the required tools are available +@if /I "%1"=="--rebuild" ( + @if "%SVN_PULL%"=="TRUE" ( + @echo. + @echo ERROR: The --reset option may not be used with the --pull option + @shift + @goto ExitFailure + ) + @set REBUILD_TOOLS=TRUE + @setlocal EnableDelayedExpansion + @set ARGUMENT=%2 + @if not "!ARGUMENT:~0,2!"=="--" ( + @endlocal + @set "LOCATION=%2" + @shift + ) + @shift + goto parse_cmd_line +) + +@REM This option will try to set the compiler environment for building Nt32Pkg/Nt32Pkg.dsc +@REM If the compiler environment is already installed, then no additional work is required. +@if /I "%1"=="--nt32" ( + @set NT32PKG=TRUE + @if not defined BUILD_TOOLS_WITH ( + @set BUILD_TOOLS_WITH=Latest + ) + @REM This option will try to set the environment for building the Nt32Pkg/Nt32Pkg; on a 64-bit + @REM Windows OS + @if /I "%2"=="X64" ( + @set NT32_64=TRUE + @shift + ) + @shift + @goto parse_cmd_line +) + +@if not "%1"=="" goto UnknownOptionOrArgument +@goto MainRoutine + +:Usage +@echo Usage: %SCRIPT_NAME% [Options] +@echo Copyright(c) 2014, Intel Corporation. All rights reserved. +@echo. +@echo The system environment variable, WORKSPACE, is always set to the current +@echo working directory. +@echo. +@echo Options: +@echo --help, -h Print this help screen and exit. +@echo. +@echo --version Print this script's version and exit. +@echo. +@echo --reset, -r Reset the EDK_TOOLS_PATH and PATH system environment +@echo variables. The EDK_TOOLS_PATH default is +@echo WORKSPACE\BaseTools, however, it may be overridden by +@echo arguments given to the --edk-tools-path, --pull and/or +@echo --rebuild options. +@echo Once set, the EDK_TOOLS_PATH environment variable reset +@echo by opening up a new command prompt window or through one +@echo of the options provided by this tool +@echo. +@echo --reconfig Overwrite the WORKSPACE/Conf/*.txt files with the +@echo template files from the BaseTools/Conf directory. +@echo. +@echo --edk-tools-path DIRECTORY +@echo This option sets the EDK_TOOLS_PATH to the DIRECTORY +@echo value instead of the default (WORKSPACE\BaseTools). +@echo. +@echo --nt32 [X64] If a compiler tool chain is not available in the +@echo environment, call a script to attempt to set one up. +@echo This flag is only required if building the +@echo Nt32Pkg/Nt32Pkg.dsc system emulator. +@echo If the X64 argument is set, and a compiler tool chain is +@echo not available, attempt to set up a tool chain that will +@echo create X64 binaries. Setting these two options have the +@echo potential side effect of changing tool chains used for a +@echo rebuild. +@echo. +@pause +@echo. +@echo --pull [DIRECTORY] Get the EDK II BaseTools binaries from source control +@echo (must not be used with --rebuild). +@echo If the optional DIRECTORY argument is specified, the tool +@echo sets EDK_TOOLS_PATH to DIRECTORY. +@echo If the DIRECTORY argument is not specified, the tools are +@echo placed in the directory tree pointed to by the current +@echo EDK_TOOLS_PATH environment variable. If the binaries +@echo cannot be obtained from source control, the +@echo EDK_TOOLS_PATH will be set to the default, +@echo WORKSPACE\BaseTools directory. +@echo. +@echo --rebuild [DIRECTORY] +@echo Force Rebuilding the EDK II BaseTools from source +@echo (must not be used with --pull). +@echo NOTE: The build will use whatever compiler tool set +@echo is available in the environment prior to +@echo running edksetup.bat. +@echo If the optional DIRECTORY argument is specified, the tool +@echo sets EDK_TOOLS_PATH to DIRECTORY. Tools binaries will be +@echo placed in the appropriate subdirectory in the +@echo EDK_TOOLS_PATH directory. If the build fails, the +@echo EDK_TOOLS_PATH will be set to the default, +@echo WORKSPACE\BaseTools directory. +@goto ExitSuccess + +:Version +@echo %SCRIPT_NAME% Version: %SCRIPT_VERSION%%SVN_REVISION:~11,-1% +@echo Copyright(c) 2014, Intel Corporation. All rights reserved. +@set HIDE_PATH=TRUE +@call "%WORKSPACE%\BaseTools\Scripts\ShowEnvironment.bat" +@set HIDE_PATH= +@goto ExitSuccess + +:UnknownOptionOrArgument +@echo. ERROR : This argument is not valid: %1 +@echo. +@goto ExitFailure + +:NoVisualStudio +@echo ERROR : Unable to determine if a compiler tool chain has been enabled in this +@echo command-prompt window. Rebuilding of the tools with this script is not +@echo possible. +@echo Refer to the BaseTools\BuildNotes.txt for directions for building +@echo the BaseTools binaries. +@echo. +@goto ExitFailure + +:NoPython +@echo ERROR : Unable to rebuild the BaseTools binaries, python does not appear to be +@echo installed. If python is installed, please set the environment +@echo variable, PYTHONHOME to the Path to the python.exe, for example, +@echo if python.exe is located in the C:\Python27 directory, then: +@echo set PYTHONHOME=C:\Python27 +@echo. +@goto ExitFailure + +:BadPython +@echo ERROR : Unable to rebuild the BaseTools binaries, python does not appear to be +@echo installed. +@echo The python executable was not found in the PYTHONHOME: %PYTHONHOME% +@echo If python is installed, please set the environment variable, PYTHONHOME +@echo to the Path that contains python.exe, for example, if python.exe is +@echo located in the C:\Python27 directory, then: +@echo set PYTHONHOME=C:\Python27 +@echo. +@goto ExitFailure + +:NoCxFreeze +@echo ERROR : Unable to locate cx_Freeze 4.2.3. The cxfreeze.bat file must be located +@echo in the %PYTHONHOME%\Scripts directoryin order to rebuild the BaseTools +@echo binaries. +@echo. +@goto ExitFailure + +:NoBaseTools +@echo ERROR: Unable to locate the BaseTools directory containing the Source tree +@echo. +@goto ExitFailure + +@REM ######################################################################################### +@REM MAIN ROUTINE +@REM Set up the Build System environment +@REM ######################################################################################### +:MainRoutine +@if defined LOCATION @set "EDK_TOOLS_PATH=%LOCATION%" +@REM SET the EDK_TOOLS_PATH. +@if not exist "%EDK_TOOLS_PATH%" ( + @mkdir %EDK_TOOLS_PATH% +) + +@REM Set up the path to include the EDK_TOOLS_PATH\Bin\Win32 directory; this test determines +@REM whether the path is in the workspace or a fully qualified path that may be outside of +@REM the workspace +@if exist "%WORKSPACE%\%EDK_TOOLS_PATH%" @set "EDK_TOOLS_PATH=%WORKSPACE%\%EDK_TOOLS_PATH%" + +@if defined REBUILD_TOOLS goto SetConf +@if defined SVN_PULL goto SetConf +@if not exist "%EDK_TOOLS_PATH%\Bin\Win32\build.exe" ( + @echo ERROR : %EDK_TOOLS_PATH%\Bin\Win32\build.exe does not exist + @echo Re-run this script using --reset, --pull or --rebuild + @echo. + @goto ExitFailure +) +@echo. +@echo Rebuilding of the tools is not required. Binaries of the latest, +@echo tested versions of the tools have been tested and included in the +@echo EDK II repository. +@echo. +@echo If you really want to build the tools, use the --rebuild option. +@echo. +@if not defined CYGWIN_HOME @echo "!!! WARNING !!! No CYGWIN_HOME set, gcc build may not be used !!!" +@if not defined CYGWIN_HOME @echo. +@REM Make sure the WORKSPACE\Conf directory contains the required text files that will be +@REM copied or replaced from the WORKSPACE\BaseTools\Conf directories' template files. +:SetConf +@if not exist "%EDK_TOOLS_PATH%\Conf" ( + @if exist "%WORKSPACE%\BaseTools\Conf" ( + @set "SRC_CONF=%WORKSPACE%\BaseTools\Conf" + ) +) else ( + @set "SRC_CONF=%EDK_TOOLS_PATH%\Conf" +) +@if not defined SRC_CONF ( + @echo ERROR : Unable to locate the BaseTools directory tree + @goto ExitFailure +) + +@REM The script will test to see if the files exist, and also use the RESET_ENVIRONMENT flag +@REM to overwrite the WORKSPACE\Conf *.txt files. +@call "%WORKSPACE%\BaseTools\Scripts\ShowEnvironment.bat" +@if errorlevel 1 ( + @echo Unable to copy the template files from "%SRC_CONF%" to "%WORKSPACE%\Conf" + @goto ExitFailure +) +@set SRC_CONF= + +@REM Set up Visual Studio if required to build the Nt32Pkg/Nt32Pkg.dsc emulator +@if "%NT32PKG%"=="TRUE" ( + @if not defined VSINSTALLDIR @set "PATH=%ORIGINAL_PATH%" + @if not defined NT32_X64 @call "%WORKSPACE%\BaseTools\get_vsvars.bat" + @if defined NT32_X64 call "%WORKSPACE%\BaseTools\Scripts\SetVisualStudio.bat + @set NT32_X64= +) +@if "%NT32PKG%"=="TRUE" ( + @if not defined VS_PATH set "VS_PATH=%PATH%" +) +@if defined VS_PATH @set "PATH=%VS_PATH%" +@if not defined VS_PATH @set "PATH=%ORIGINAL_PATH%" +@set "PATH=%EDK_TOOLS_PATH%\Bin\Win32;%PATH%" + +@if "%REBUILD_TOOLS%"=="TRUE" @goto Rebuild +@if "%SVN_PULL%"== "TRUE" ( + if defined PYTHONHOME ( + @REM Use the python script if possible to test is the svn command is available, if it fails, the user may be + @REM able to rebuild the Win32 binaries + @call "%WORKSPACE%\BaseTools\Scripts\UpdateBuildVersions.py" --svn-test -v + @if errorlevel 1 ( + @echo ERROR : The command-line svn tool is not available and the Win32 binaries do not exist + @echo Please re-run this script again with the --rebuild option to attempt to build + @echo the binaries + @echo. + @goto ExitFailure + ) + @if exist %EDK_TOOLS_PATH%\Bin\Win32 @rmdir /S /Q %EDK_TOOLS_PATH%\Bin\Win32 + @call svn co https://svn.code.sf.net/p/edk2-toolbinaries/code/trunk/Win32 "%EDK_TOOLS_PATH%\Bin\Win32" + ) else ( + @call svn co https://svn.code.sf.net/p/edk2-toolbinaries/code/trunk/Win32 "%EDK_TOOLS_PATH%\Bin\Win32" + @if errorlevel 1 ( + @echo ERROR : The command-line svn tool is not available and the Win32 binaries do not exist + @echo Python does not appear to be available either. This script cannot be used to + @echo build the Win32 binaries or to obtain them from this repository: + @echo https://svn.code.sf.net/p/edk2-toolbinaries/code/trunk/Win32 + @goto ExitFailure + ) + ) + @goto ShowAndExit +) + +@if not "%REBUILD_TOOLS%"=="TRUE" @goto ShowAndExit + +@REM The following code is used to rebuild the Win32 BaseTools binaries - check that required tools are available +:Rebuild +@if not defined BASE_TOOLS_PATH @set "BASE_TOOLS_PATH=%WORKSPACE%\BaseTools" +@if not exist "%BASE_TOOLS_PATH%\Source" @goto NoBaseTools +@endlocal +@if not defined VCINSTALLDIR @goto NoVisualStudio +@if not defined PYTHONHOME @goto NoPython +@if not exist "%PYTHONHOME%\python.exe" @goto BadPython +@REM python.exe has been located, now make sure it's in the PATH +@call python --version > nul 2>&1 +@if errorlevel 1 @set "PATH=%PYTHONHOME%\python.exe;%PATH%" +@if not defined PYTHON_FREEZER_PATH ( + @if not exist %PYTHONHOME%\Scripts\cxfreeze.bat @goto NoCxFreeze + @set PYTHON_FREEZER_PATH=%PYTHONHOME%\Scripts +) +@call "%WORKSPACE%\BaseTools\Scripts\SetVisualStudio.bat" +@if errorlevel 1 @goto ExitFailure + +:ShowAndExit +@call "%WORKSPACE%\BaseTools\Scripts\ShowEnvironment.bat" + +@REM ######################################################################################### +@REM EXIT ROUTINES +@REM ######################################################################################### +:ExitSuccess +@set SCRIPT_NAME= +@set SCRIPT_VERSION= +@set SVN_REVISION= +@set RESET_ENVIRONMENT= +@set RECONFIG= +@set NT32PKG= +@set NT32_64= +@set BUILD_TOOLS_WITH= +@set LOCATION= +@set REBUILD_TOOLS= +@set SVN_PULL= +@set SRC_CONF= +@set ARGUMENT= +@set SCRIPT= +@set LIST_VS_VERSIONS= +@set PYTHON_FREEZER_PATH= +@echo on +@exit /B 0 + +:ExitFailure +@set SCRIPT_NAME= +@set SCRIPT_VERSION= +@set SVN_REVISION= +@set RESET_ENVIRONMENT= +@set RECONFIG= +@set NT32PKG= +@set NT32_64= +@set BUILD_TOOLS_WITH= +@set LOCATION= +@set REBUILD_TOOLS= +@set SVN_PULL= +@set SRC_CONF= +@set ARGUMENT= +@set SCRIPT= +@set LIST_VS_VERSIONS= +@set PYTHON_FREEZER_PATH= +@echo on +@exit /B 1