-#!/usr/bin/python\r
-#\r
-# Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>\r
-#\r
-# This program and the accompanying materials\r
-# are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution. The full text of the license may be found at\r
-# http://opensource.org/licenses/bsd-license.php\r
-#\r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-#\r
-\r
-import os\r
-import re\r
-import StringIO\r
-import subprocess\r
-import sys\r
-import zipfile\r
-\r
-is_unix = not sys.platform.startswith('win')\r
-\r
-if not is_unix:\r
- print "This script currently only supports unix-like systems"\r
- sys.exit(-1)\r
-\r
-if os.path.exists('OvmfPkgX64.dsc'):\r
- os.chdir('..')\r
-\r
-if not os.path.exists(os.path.join('OvmfPkg', 'OvmfPkgX64.dsc')):\r
- print "OvmfPkg/OvmfPkgX64.dsc doesn't exist"\r
- sys.exit(-1)\r
-\r
-def run_and_capture_output(args, checkExitCode = True):\r
- p = subprocess.Popen(args=args, stdout=subprocess.PIPE)\r
- stdout = p.stdout.read()\r
- ret_code = p.wait()\r
- if checkExitCode:\r
- assert ret_code == 0\r
- return stdout\r
-\r
-gcc_version = run_and_capture_output(args=('gcc', '--version'))\r
-gcc_re = re.compile(r'\s*\S+\s+\([^\)]+?\)\s+(\d+(?:\.\d+)*)(?:\s+.*)?')\r
-mo = gcc_re.match(gcc_version)\r
-if not mo:\r
- print "Unable to find GCC version"\r
- sys.exit(-1)\r
-gcc_version = map(lambda n: int(n), mo.group(1).split('.'))\r
-\r
-if 'TOOLCHAIN' in os.environ:\r
- TOOLCHAIN = os.environ['TOOLCHAIN']\r
-else:\r
- assert(gcc_version[0] == 4)\r
- minor = max(4, min(7, gcc_version[1]))\r
- TOOLCHAIN = 'GCC4' + str(minor)\r
-\r
-def git_based_version():\r
- dir = os.getcwd()\r
- if not os.path.exists('.git'):\r
- os.chdir('OvmfPkg')\r
- stdout = run_and_capture_output(args=('git', 'log',\r
- '-n', '1',\r
- '--abbrev-commit'))\r
- regex = re.compile(r'^\s*git-svn-id:\s+\S+@(\d+)\s+[0-9a-f\-]+$',\r
- re.MULTILINE)\r
- mo = regex.search(stdout)\r
- if mo:\r
- version = 'r' + mo.group(1)\r
- else:\r
- version = stdout.split(None, 3)[1]\r
- os.chdir(dir)\r
- return version\r
-\r
-def svn_info():\r
- dir = os.getcwd()\r
- os.chdir('OvmfPkg')\r
- stdout = run_and_capture_output(args=('svn', 'info'))\r
- os.chdir(dir)\r
- return stdout\r
-\r
-def svn_based_version():\r
- buf = svn_info()\r
- revision_re = re.compile('^Revision\:\s*([\da-f]+)$', re.MULTILINE)\r
- mo = revision_re.search(buf)\r
- assert(mo is not None)\r
- return 'r' + mo.group(1)\r
-\r
-def get_revision():\r
- if os.path.exists(os.path.join('OvmfPkg', '.svn')):\r
- return svn_based_version()\r
- else:\r
- return git_based_version()\r
-\r
-revision = get_revision()\r
-\r
-newline_re = re.compile(r'(\n|\r\n|\r(?!\n))', re.MULTILINE)\r
-def to_dos_text(str):\r
- return newline_re.sub('\r\n', str)\r
-\r
-def gen_build_info():\r
- distro = run_and_capture_output(args=('lsb_release', '-sd')).strip()\r
-\r
- machine = run_and_capture_output(args=('uname', '-m')).strip()\r
-\r
- gcc_version_str = '.'.join(map(lambda v: str(v), gcc_version))\r
-\r
- ld_version = run_and_capture_output(args=('ld', '--version'))\r
- ld_version = ld_version.split('\n')[0].split()[-1]\r
-\r
- iasl_version = run_and_capture_output(args=('iasl'), checkExitCode=False)\r
- iasl_version = filter(lambda s: s.find(' version ') >= 0, iasl_version.split('\n'))[0]\r
- iasl_version = iasl_version.split(' version ')[1].strip()\r
-\r
- sb = StringIO.StringIO()\r
- print >> sb, 'edk2: ', revision\r
- print >> sb, 'compiler: GCC', gcc_version_str, '(' + TOOLCHAIN + ')'\r
- print >> sb, 'binutils:', ld_version\r
- print >> sb, 'iasl: ', iasl_version\r
- print >> sb, 'system: ', distro, machine.replace('_', '-')\r
- return to_dos_text(sb.getvalue())\r
-\r
-def read_file(filename):\r
- f = open(filename)\r
- d = f.read()\r
- f.close()\r
- return d\r
-\r
-LICENSE = to_dos_text(\r
-'''This OVMF binary release is built from source code licensed under\r
-the BSD open source license. The BSD license is documented at\r
-http://opensource.org/licenses/bsd-license.php, and a copy is\r
-shown below.\r
-\r
-One sub-component of the OVMF project is a FAT filesystem driver. The FAT\r
-filesystem driver code is also BSD licensed, but the code license contains\r
-one additional term. This license can be found at\r
-https://github.com/tianocore/tianocore.github.io/wiki/Edk2-fat-driver\r
-and a copy is shown below (following the normal BSD license).\r
-\r
-=== BSD license: START ===\r
-\r
-''')\r
-\r
-LICENSE += read_file(os.path.join('MdePkg', 'License.txt'))\r
-\r
-LICENSE += to_dos_text(\r
-'''\r
-=== BSD license: END ===\r
-\r
-=== FAT filesystem driver license: START ===\r
-\r
-''')\r
-\r
-LICENSE += read_file(os.path.join('FatBinPkg', 'License.txt'))\r
-\r
-LICENSE += to_dos_text(\r
-'''\r
-=== FAT filesystem driver license: END ===\r
-''')\r
-\r
-def build(arch):\r
- args = (\r
- 'OvmfPkg/build.sh',\r
- '-t', TOOLCHAIN,\r
- '-a', arch,\r
- '-b', 'RELEASE'\r
- )\r
- logname = 'build-%s.log' % arch\r
- build_log = open(logname, 'w')\r
- print 'Building OVMF for', arch, '(%s)' % logname, '...',\r
- sys.stdout.flush()\r
- p = subprocess.Popen(args=args, stdout=build_log, stderr=build_log)\r
- ret_code = p.wait()\r
- if ret_code == 0:\r
- print '[done]'\r
- else:\r
- print '[error 0x%x]' % ret_code\r
- return ret_code\r
-\r
-def create_zip(arch):\r
- global build_info\r
- filename = 'OVMF-%s-%s.zip' % (arch, revision)\r
- print 'Creating', filename, '...',\r
- sys.stdout.flush()\r
- if os.path.exists(filename):\r
- os.remove(filename)\r
- zipf = zipfile.ZipFile(filename, 'w', zipfile.ZIP_DEFLATED)\r
-\r
- zipf.writestr('BUILD_INFO', build_info)\r
- zipf.writestr('LICENSE', LICENSE)\r
- zipf.write(os.path.join('OvmfPkg', 'README'), 'README')\r
- FV_DIR = os.path.join(\r
- 'Build',\r
- 'Ovmf' + arch.title(),\r
- 'RELEASE_' + TOOLCHAIN,\r
- 'FV'\r
- )\r
- zipf.write(os.path.join(FV_DIR, 'OVMF.fd'), 'OVMF.fd')\r
- zipf.close()\r
- print '[done]'\r
-\r
-build_info = gen_build_info()\r
-build('IA32')\r
-build('X64')\r
-create_zip('IA32')\r
-create_zip('X64')\r
-\r
-\r