diff options
Diffstat (limited to 'BaseTools')
-rw-r--r-- | BaseTools/BuildEnv | 264 | ||||
-rwxr-xr-x | BaseTools/BuildEnv.py | 287 |
2 files changed, 243 insertions, 308 deletions
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() { -# -# First, we run a python tool that will ask the user to configure -# the environment in a (relatively) user friendly manner. -# -python ./BaseTools/BuildEnv.py $* + # + # 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 + +} # -# The python tool will write ./Conf/BuildEnv.sh to actually configure -# the environment. +# Run the main function # -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()
-
|