diff --git a/BaseTools/BuildEnv b/BaseTools/BuildEnv index 08a84d4352..8e7343a73b 100644 --- a/BaseTools/BuildEnv +++ b/BaseTools/BuildEnv @@ -8,32 +8,254 @@ # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# # Setup the environment for unix-like systems running a bash-like shell. # This file must be "sourced" not merely executed. For example: ". edksetup.sh" +# -if [ ! -e ./BaseTools/BuildEnv.py ] -then - echo Run this script from the base of your tree. For example: - echo " cd /Path/To/Edk/Root" - echo " . BaseTools/BuildEnv" - return -fi +SetWorkspace() { + + # + # If WORKSPACE is already set, then we can return right now + # + if [ -n "$WORKSPACE" ] + then + return 0 + fi + + if [ ! ${BASH_SOURCE[0]} -ef ./BaseTools/BuildEnv ] + then + echo Run this script from the base of your tree. For example: + echo " cd /Path/To/Edk/Root" + echo " . BaseTools/BuildEnv" + return -1 + fi + + # + # Set $WORKSPACE + # + export WORKSPACE=`pwd` + + return 0 + +} + +RestorePreviousConfiguration() { + # + # Restore previous configuration + # + PREVIOUS_CONF_FILE=Conf/BuildEnv.sh2 + if [ -e $PREVIOUS_CONF_FILE ] + then + echo Loading previous configuration from \$WORKSPACE/$PREVIOUS_CONF_FILE + . $WORKSPACE/$PREVIOUS_CONF_FILE + fi +} + +GenerateShellCodeToSetVariable() { + VARIABLE=$1 + OUTPUT_FILE=$2 + VAR_VALUE="echo \${${VARIABLE}}" + VAR_VALUE=`eval $VAR_VALUE` + echo "if [ -z \"\$${VARIABLE}\" ]" >> $OUTPUT_FILE + echo "then" >> $OUTPUT_FILE + echo " export ${VARIABLE}=${VAR_VALUE}" >> $OUTPUT_FILE + echo "fi" >> $OUTPUT_FILE +} + +GenerateShellCodeToUpdatePath() { + OUTPUT_FILE=$1 + echo "if [ -e $EDK_TOOLS_PATH_BIN ]" >> $OUTPUT_FILE + echo "then" >> $OUTPUT_FILE + echo " if [ "\${PATH/$EDK_TOOLS_PATH_BIN/}" == "\$PATH" ]" >> $OUTPUT_FILE + echo " then" >> $OUTPUT_FILE + echo " export PATH=$EDK_TOOLS_PATH_BIN:\$PATH" >> $OUTPUT_FILE + echo " fi" >> $OUTPUT_FILE + echo "fi" >> $OUTPUT_FILE +} + +StoreCurrentConfiguration() { + # + # Write configuration to a shell script to allow for configuration to be + # easily reloaded. + # + OUTPUT_FILE=Conf/BuildEnv.sh2 + #echo Storing current configuration into \$WORKSPACE/$OUTPUT_FILE + OUTPUT_FILE=$WORKSPACE/$OUTPUT_FILE + echo "# Auto-generated by ${BASH_SOURCE[0]}" > $OUTPUT_FILE + GenerateShellCodeToSetVariable WORKSPACE $OUTPUT_FILE + GenerateShellCodeToSetVariable EDK_TOOLS_PATH $OUTPUT_FILE + GenerateShellCodeToUpdatePath $OUTPUT_FILE +} + +SetEdkToolsPath() { + + # + # If EDK_TOOLS_PATH is already set, then we can return right now + # + if [ -n "$EDK_TOOLS_PATH" ] + then + return 0 + fi + + # + # Figure out a uniq directory name from the uname command + # + UNAME_DIRNAME=`uname -sm` + UNAME_DIRNAME=${UNAME_DIRNAME// /-} + UNAME_DIRNAME=${UNAME_DIRNAME//\//-} + + # + # Try $WORKSPACE/Conf/EdkTools + # + if [ -e $WORKSPACE/Conf/EdkTools ] + then + export EDK_TOOLS_PATH=$WORKSPACE/Conf/EdkTools + return 0 + fi + + # + # Try $WORKSPACE/Conf/BaseToolsSource + # + if [ -e $WORKSPACE/Conf/BaseToolsSource ] + then + export EDK_TOOLS_PATH=$WORKSPACE/Conf/BaseToolsSource + return 0 + fi + + # + # Try $WORKSPACE/BaseTools/Bin/$UNAME_DIRNAME + # + if [ -e $WORKSPACE/BaseTools/Bin/$UNAME_DIRNAME ] + then + export EDK_TOOLS_PATH=$WORKSPACE/BaseTools + return 0 + fi + + echo "Unable to determine EDK_TOOLS_PATH" + echo + echo "You may need to download the 'BaseTools' from buildtools.tianocore.org." + echo "After downloading, either create a symbolic link to the source at" + echo "\$WORKSPACE/Conf/BaseToolsSource, or set the EDK_TOOLS_PATH environment" + echo "variable." + +} + +GetBaseToolsBinSubDir() { + # + # Figure out a uniq directory name from the uname command + # + UNAME_DIRNAME=`uname -sm` + UNAME_DIRNAME=${UNAME_DIRNAME// /-} + UNAME_DIRNAME=${UNAME_DIRNAME//\//-} + echo $UNAME_DIRNAME +} + +GetEdkToolsPathBinDirectory() { + # + # Figure out a uniq directory name from the uname command + # + BIN_SUB_DIR=`GetBaseToolsBinSubDir` + + if [ -e $EDK_TOOLS_PATH/PseudoBin/$BIN_SUB_DIR ] + then + EDK_TOOLS_PATH_BIN=$EDK_TOOLS_PATH/PseudoBin/$BIN_SUB_DIR + else + EDK_TOOLS_PATH_BIN=$EDK_TOOLS_PATH/Bin/$BIN_SUB_DIR + fi + + echo $EDK_TOOLS_PATH_BIN +} + +AddEdkToolsToPath() { + + # + # If EDK_TOOLS_PATH is not set, then we cannot update PATH + # + if [ -z "$EDK_TOOLS_PATH" ] + then + return -1 + fi + + EDK_TOOLS_PATH_BIN=`GetEdkToolsPathBinDirectory` + + if [ ! -e $EDK_TOOLS_PATH_BIN ] + then + echo "Unable to find expected bin path under \$EDK_TOOLS_PATH!" + echo "> $EDK_TOOLS_PATH_BIN" + return -1 + fi + + if [ "${PATH/$EDK_TOOLS_PATH_BIN/}" == "$PATH" ] + then + export PATH=$EDK_TOOLS_PATH_BIN:$PATH + return 0 + fi + +} + +CopySingleTemplateFile() { + + SRC_FILENAME=BaseTools/Conf/$1.template + DST_FILENAME=Conf/$1.txt + + if [ -e $WORKSPACE/$DST_FILENAME ] + then + return + fi + + echo "Copying \$WORKSPACE/$SRC_FILENAME" + echo " to \$WORKSPACE/$DST_FILENAME" + SRC_FILENAME=$WORKSPACE/$SRC_FILENAME + DST_FILENAME=$WORKSPACE/$DST_FILENAME + cp $SRC_FILENAME $DST_FILENAME + +} + +CopyTemplateFiles() { + + CopySingleTemplateFile build_rule + CopySingleTemplateFile FrameworkDatabase + CopySingleTemplateFile tools_def + CopySingleTemplateFile target + +} + +ScriptMain() { + + SetWorkspace + if [ -z $WORKSPACE ] + then + echo "Failure setting WORKSPACE" + return -1 + fi + + RestorePreviousConfiguration + + SetEdkToolsPath + if [ -z $EDK_TOOLS_PATH ] + then + return -1 + fi + + AddEdkToolsToPath + if [ $? -ne 0 ] + then + echo "Failure adding EDK Tools into PATH!" + return -1 + fi + + StoreCurrentConfiguration + + echo WORKSPACE: $WORKSPACE + echo EDK_TOOLS_PATH: $EDK_TOOLS_PATH + + CopyTemplateFiles + +} # -# First, we run a python tool that will ask the user to configure -# the environment in a (relatively) user friendly manner. +# Run the main function # -python ./BaseTools/BuildEnv.py $* - -# -# The python tool will write ./Conf/BuildEnv.sh to actually configure -# the environment. -# -if [ -e ./Conf/BuildEnv.sh ] -then - . ./Conf/BuildEnv.sh -else - echo There was a failure while trying to setup the environment! -fi - +ScriptMain diff --git a/BaseTools/BuildEnv.py b/BaseTools/BuildEnv.py deleted file mode 100755 index b065861d2b..0000000000 --- a/BaseTools/BuildEnv.py +++ /dev/null @@ -1,287 +0,0 @@ -## @file BuildEnv.py -# Initialize Environment for building -# -# Copyright (c) 2007, 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. -# - -## -# Import Modules -# -import os -import os.path -import pickle -import shutil -import sys - -from optparse import OptionParser - -# Version and Copyright -VersionNumber = "0.01" -__version__ = "%prog Version " + VersionNumber -__copyright__ = "Copyright (c) 2007, Intel Corporation All rights reserved." - -class SetupBuildEnvironmentApp: - - def __init__(self): - (self.Opt, self.Args) = self.ProcessCommandLine() - self.SetupDefaults() - self.DetermineEnvironment() - self.DeleteEnvironmentConfigurationScript() - self.CopyTemplates() - self.WriteEnvironmentConfigurationScript() - - def SetupDefaults(self): - self.itemsToConfigure = ( - 'compiler', - #'compiler-prefix', - 'templates', - ) - - self.defaults = { - 'compiler': { - 'options': ('gcc', 'icc'), - 'default': 'gcc', - }, - 'compiler-prefix': { - 'options': ('/usr/bin', '/usr/bin/x86_64-pc-mingw32-'), - 'freeform': True, - }, - 'templates': { - 'description': 'templates and Conf directory', - 'options': ( - 'copy once (no-overwrite)', - 'copy with overwrite', - 'symlink to templates', - 'do nothing', - ), - 'default': 'copy once (no-overwrite)', - }, - } - - def ProcessCommandLine(self): - Parser = OptionParser(description=__copyright__,version=__version__,prog="BaseTools/BuildEnv") - Parser.add_option("-q", "--quiet", action="store_true", type=None, help="Disable all messages except FATAL ERRORS.") - Parser.add_option("-v", "--verbose", action="store_true", type=None, help="Turn on verbose output with informational messages printed, "\ - "including library instances selected, final dependency expression, "\ - "and warning messages, etc.") - Parser.add_option("-d", "--debug", action="store", type="int", help="Enable debug messages at specified level.") - - if os.environ.has_key('WORKSPACE'): - default = os.environ['WORKSPACE'] - else: - default = os.getcwd() - Parser.add_option("--workspace", action="store", type="string", help="Base director of tree to configure", default=default) - - (Opt, Args)=Parser.parse_args() - Parser.print_version() - - return (Opt, Args) - - def DetermineEnvironment(self): - confFilename = os.path.join(os.path.expanduser('~'), '.edk-build-env.pickle') - try: - confFile = open(confFilename, 'r') - conf = pickle.load(confFile) - confFile.close() - except Exception: - conf = {} - self.conf = conf - - for item in self.itemsToConfigure: - if not conf.has_key(item): - self.AskForValueOfOption(item) - - while True: - self.SummarizeCurrentState() - - if not self.Opt.quiet: - response = raw_input('Would you like to change anything? (default=no): ') - response = response.strip() - else: - response = '' - - if response.lower() in ('', 'n', 'no'): - break - - for item in self.itemsToConfigure: - self.AskForValueOfOption(item) - - confFile = open(confFilename, 'w') - pickle.dump(conf, confFile) - confFile.close() - - def AskForValueOfOption(self, option): - - options = self.defaults[option]['options'] - - if self.defaults[option].has_key('default'): - default = self.defaults[option]['default'] - else: - default = None - - if self.defaults[option].has_key('freeform'): - freeform = self.defaults[option]['freeform'] - else: - freeform = False - - if self.defaults[option].has_key('description'): - description = self.defaults[option]['description'] - else: - description = option - - conf = self.conf - if conf.has_key(option): - default = conf[option] - options = list(options) # in case options came in as a tuple - assert((default == '') or (default is None) or ('' not in options)) - if (default is not None) and (default not in options): - options.append(default) - if (freeform and ('' not in options)): - options.append('') - options.sort() - while True: - print - if len(options) > 0: - print 'Options for', description - for i in range(len(options)): - print ' %d.' % (i + 1), - if options[i] != '': - print options[i], - else: - print '(empty string)', - if options[i] == default: - print '(default)' - else: - print - - if len(options) > 0: - prompt = 'Select number or type value: ' - else: - prompt = 'Type value: ' - response = raw_input(prompt) - response = response.strip() - - if response.isdigit(): - response = int(response) - if response > len(options): - print 'ERROR: Invalid number selection!' - continue - response = options[response - 1] - elif (response == '') and (default is not None): - response = default - - if (not freeform) and (response not in options): - print 'ERROR: Invalid selection! (must be from list)' - continue - - break - - conf[option] = response - print 'Using', conf[option], 'for', description - - def SummarizeCurrentState(self): - print - print 'Current configuration:' - conf = self.conf - for item in self.itemsToConfigure: - value = conf[item] - if value == '': value = '(empty string)' - print ' ', item, '->', value - - def CopyTemplates(self): - todo = self.conf['templates'] - workspace = os.path.realpath(self.Opt.workspace) - templatesDir = \ - os.path.join(workspace, 'BaseTools', 'Conf') - confDir = \ - os.path.join(workspace, 'Conf') - print - print 'Templates & Conf directory' - print ' Templates dir:', self.RelativeToWorkspace(templatesDir) - for filename in os.listdir(templatesDir): - if not filename.endswith('.template'): continue - - srcFilename = os.path.join(templatesDir, filename) - destFilename = os.path.join(confDir, filename[:-len('template')] + 'txt') - print ' ', self.RelativeToWorkspace(destFilename), - - if todo == 'copy once (no-overwrite)': - if os.path.exists(destFilename): - print '[skipped, already exists]' - else: - shutil.copy(srcFilename, destFilename) - print '[copied]' - elif todo == 'copy with overwrite': - overwrite = '' - if os.path.exists(destFilename): - os.remove(destFilename) - overwrite = ', overwritten' - shutil.copy(srcFilename, destFilename) - print '[copied' + overwrite + ']' - elif todo == 'symlink to templates': - if os.path.islink(destFilename) or os.path.exists(destFilename): - if not os.path.islink(destFilename): - raise Exception, '%s is not a symlink! (remove file if you want to start using symlinks)' % \ - (self.RelativeToWorkspace(destFilename)) - os.remove(destFilename) - os.symlink(os.path.join('..', self.RelativeToWorkspace(srcFilename)), destFilename) - print '[symlinked]' - elif todo == 'do nothing': - print '[skipped by user request]' - else: - raise Exception, 'Unknown action for templates&conf: %s' % todo - - def DeleteEnvironmentConfigurationScript(self): - workspace = os.path.realpath(self.Opt.workspace) - scriptFilename = os.path.join(workspace, 'Conf', 'BuildEnv.sh') - if os.path.exists(scriptFilename): - os.remove(scriptFilename) - - def WriteEnvironmentConfigurationScript(self): - workspace = os.path.realpath(self.Opt.workspace) - scriptFilename = os.path.join(workspace, 'Conf', 'BuildEnv.sh') - print - print 'Storing environment configuration into', - print self.RelativeToWorkspace(scriptFilename) - script = open(scriptFilename, 'w') - - print >> script, 'export WORKSPACE="%s"' % workspace - print >> script, 'export TOOLCHAIN="%s"' % self.conf['compiler'] - #print >> script, 'export COMPILER_SUITE_PATH_PREFIX="%s"' % self.conf['compiler-prefix'] - - EDK_TOOLS_PATH = os.path.join(workspace, 'BaseTools') - print >> script, 'if [ $EDK_TOOLS_PATH=="" ]' - print >> script, 'then' - print >> script, ' export EDK_TOOLS_PATH="%s"' % EDK_TOOLS_PATH - print >> script, 'fi' - - # - # Change PATH variable - # - newPath = os.environ['PATH'].split(os.path.pathsep) - binDir = \ - os.path.join(workspace, 'BaseTools', 'Bin', sys.platform.title()) - if binDir not in newPath: - newPath.append(binDir) - newPath = os.path.pathsep.join(newPath) - print >> script, 'export PATH=%s' % newPath - - script.close() - - def RelativeToWorkspace(self, path): - workspace = os.path.realpath(self.Opt.workspace) - for prefix in (workspace + os.path.sep, workspace): - if path.startswith(prefix): - return path[len(prefix):] - -if __name__ == '__main__': - SetupBuildEnvironmentApp() -