This script builds OVMF IA32 and X64, and packages both versions for release. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11337 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			241 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			241 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/python
 | 
						|
#
 | 
						|
# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
 | 
						|
#
 | 
						|
# 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.
 | 
						|
#
 | 
						|
 | 
						|
release_type = 'alpha'
 | 
						|
 | 
						|
import os
 | 
						|
import re
 | 
						|
import StringIO
 | 
						|
import subprocess
 | 
						|
import sys
 | 
						|
import zipfile
 | 
						|
 | 
						|
is_unix = not sys.platform.startswith('win')
 | 
						|
 | 
						|
if not is_unix:
 | 
						|
    print "This script currently only supports unix-like systems"
 | 
						|
    sys.exit(-1)
 | 
						|
 | 
						|
if os.path.exists('OvmfPkgX64.dsc'):
 | 
						|
    os.chdir('..')
 | 
						|
 | 
						|
if not os.path.exists(os.path.join('OvmfPkg', 'OvmfPkgX64.dsc')):
 | 
						|
    print "OvmfPkg/OvmfPkgX64.dsc doesn't exist"
 | 
						|
    sys.exit(-1)
 | 
						|
 | 
						|
if 'TOOLCHAIN' in os.environ:
 | 
						|
    TOOLCHAIN = os.environ['TOOLCHAIN']
 | 
						|
else:
 | 
						|
    TOOLCHAIN = 'GCC44'
 | 
						|
 | 
						|
def run_and_capture_output(args, checkExitCode = True):
 | 
						|
    p = subprocess.Popen(args=args, stdout=subprocess.PIPE)
 | 
						|
    stdout = p.stdout.read()
 | 
						|
    ret_code = p.wait()
 | 
						|
    if checkExitCode:
 | 
						|
        assert ret_code == 0
 | 
						|
    return stdout
 | 
						|
 | 
						|
def git_svn_info():
 | 
						|
    dir = os.getcwd()
 | 
						|
    os.chdir('OvmfPkg')
 | 
						|
    stdout = run_and_capture_output(args=('git', 'svn', 'info'))
 | 
						|
    os.chdir(dir)
 | 
						|
    return stdout
 | 
						|
 | 
						|
def svn_info():
 | 
						|
    dir = os.getcwd()
 | 
						|
    os.chdir('OvmfPkg')
 | 
						|
    stdout = run_and_capture_output(args=('svn', 'info'))
 | 
						|
    os.chdir(dir)
 | 
						|
    return stdout
 | 
						|
 | 
						|
def get_svn_info_output():
 | 
						|
    if os.path.exists(os.path.join('OvmfPkg', '.svn')):
 | 
						|
        return svn_info()
 | 
						|
    else:
 | 
						|
        return git_svn_info()
 | 
						|
 | 
						|
def get_revision():
 | 
						|
    buf = get_svn_info_output()
 | 
						|
    revision_re = re.compile('^Revision\:\s*(\d+)$', re.MULTILINE)
 | 
						|
    mo = revision_re.search(buf)
 | 
						|
    if mo is not None:
 | 
						|
        return int(mo.group(1))
 | 
						|
 | 
						|
revision = get_revision()
 | 
						|
 | 
						|
newline_re = re.compile(r'(\n|\r\n|\r(?!\n))', re.MULTILINE)
 | 
						|
def to_dos_text(str):
 | 
						|
    return newline_re.sub('\r\n', str)
 | 
						|
 | 
						|
def gen_build_info():
 | 
						|
    distro = run_and_capture_output(args=('lsb_release', '-sd')).strip()
 | 
						|
 | 
						|
    machine = run_and_capture_output(args=('uname', '-m')).strip()
 | 
						|
 | 
						|
    gcc_version = run_and_capture_output(args=('gcc', '--version'))
 | 
						|
    gcc_version = gcc_version.split('\n')[0].split()[-1]
 | 
						|
 | 
						|
    ld_version = run_and_capture_output(args=('ld', '--version'))
 | 
						|
    ld_version = ld_version.split('\n')[0].split()[-1]
 | 
						|
 | 
						|
    iasl_version = run_and_capture_output(args=('iasl'), checkExitCode=False)
 | 
						|
    iasl_version = filter(lambda s: s.find(' version ') >= 0, iasl_version.split('\n'))[0]
 | 
						|
    iasl_version = iasl_version.split(' version ')[1].strip()
 | 
						|
 | 
						|
    sb = StringIO.StringIO()
 | 
						|
    print >> sb, 'edk2:    ', 'r%d' % revision
 | 
						|
    print >> sb, 'compiler: GCC', gcc_version
 | 
						|
    print >> sb, 'binutils:', ld_version
 | 
						|
    print >> sb, 'iasl:    ', iasl_version
 | 
						|
    print >> sb, 'system:  ', distro, machine.replace('_', '-')
 | 
						|
    return to_dos_text(sb.getvalue())
 | 
						|
 | 
						|
LICENSE = to_dos_text(
 | 
						|
'''This OVMF binary release is built from source code licensed under
 | 
						|
the BSD open source license.  The BSD license is documented at
 | 
						|
http://opensource.org/licenses/bsd-license.php, and a copy is
 | 
						|
shown below.
 | 
						|
 | 
						|
One sub-component of the OVMF project is a FAT filesystem driver.  The FAT
 | 
						|
filesystem driver code is also BSD licensed, but the code license contains
 | 
						|
one additional term.  This license can be found at
 | 
						|
http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=Edk2-fat-driver,
 | 
						|
and a copy is shown below (following the normal BSD license).
 | 
						|
 | 
						|
=== BSD license: START ===
 | 
						|
 | 
						|
Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
 | 
						|
 | 
						|
Redistribution and use in source and binary forms, with or without
 | 
						|
modification, are permitted provided that the following conditions
 | 
						|
are met:
 | 
						|
 | 
						|
* Redistributions of source code must retain the above copyright
 | 
						|
  notice, this list of conditions and the following disclaimer.
 | 
						|
* Redistributions in binary form must reproduce the above copyright
 | 
						|
  notice, this list of conditions and the following disclaimer in
 | 
						|
  the documentation and/or other materials provided with the
 | 
						|
  distribution.
 | 
						|
* Neither the name of the Intel Corporation nor the names of its
 | 
						|
  contributors may be used to endorse or promote products derived
 | 
						|
  from this software without specific prior written permission.
 | 
						|
 | 
						|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
						|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
						|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 | 
						|
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 | 
						|
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
						|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 | 
						|
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
						|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
						|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
						|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 | 
						|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
						|
POSSIBILITY OF SUCH DAMAGE.
 | 
						|
 | 
						|
=== BSD license: END ===
 | 
						|
 | 
						|
=== FAT filesystem driver license: START ===
 | 
						|
 | 
						|
Copyright (c) 2004, Intel Corporation. All rights reserved.
 | 
						|
 | 
						|
Redistribution and use in source and binary forms, with or without
 | 
						|
modification, are permitted provided that the following conditions
 | 
						|
are met:
 | 
						|
 | 
						|
* Redistributions of source code must retain the above copyright
 | 
						|
  notice, this list of conditions and the following disclaimer.
 | 
						|
* Redistributions in binary form must reproduce the above copyright
 | 
						|
  notice, this list of conditions and the following disclaimer in
 | 
						|
  the documentation and/or other materials provided with the
 | 
						|
  distribution.
 | 
						|
* Neither the name of Intel nor the names of its
 | 
						|
  contributors may be used to endorse or promote products derived
 | 
						|
  from this software without specific prior written permission.
 | 
						|
 | 
						|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
						|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
						|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 | 
						|
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 | 
						|
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
						|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 | 
						|
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
						|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
						|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
						|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 | 
						|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
						|
POSSIBILITY OF SUCH DAMAGE.
 | 
						|
 | 
						|
Additional terms:
 | 
						|
In addition to the forgoing, redistribution and use of the code is
 | 
						|
conditioned upon the FAT 32 File System Driver and all derivative
 | 
						|
works thereof being used for and designed only to read and/or write
 | 
						|
to a file system that is directly managed by an Extensible Firmware
 | 
						|
Interface (EFI) implementation or by an emulator of an EFI
 | 
						|
implementation.
 | 
						|
 | 
						|
=== FAT filesystem driver license: END ===
 | 
						|
''')
 | 
						|
 | 
						|
def build(arch):
 | 
						|
    args = (
 | 
						|
        'OvmfPkg/build.sh',
 | 
						|
        '-t', TOOLCHAIN,
 | 
						|
        '-a', arch,
 | 
						|
        '-b', 'RELEASE'
 | 
						|
        )
 | 
						|
    logname = 'build-%s.log' % arch
 | 
						|
    build_log = open(logname, 'w')
 | 
						|
    print 'Building OVMF for', arch, '(%s)' % logname, '...',
 | 
						|
    sys.stdout.flush()
 | 
						|
    p = subprocess.Popen(args=args, stdout=build_log, stderr=build_log)
 | 
						|
    ret_code = p.wait()
 | 
						|
    if ret_code == 0:
 | 
						|
        print '[done]'
 | 
						|
    else:
 | 
						|
        print '[error 0x%x]' % ret_code
 | 
						|
    return ret_code
 | 
						|
 | 
						|
def create_zip(arch):
 | 
						|
    global build_info
 | 
						|
    filename = 'OVMF-%s-r%d-%s.zip' % (arch, revision, release_type)
 | 
						|
    print 'Creating', filename, '...',
 | 
						|
    sys.stdout.flush()
 | 
						|
    if os.path.exists(filename):
 | 
						|
        os.remove(filename)
 | 
						|
    zipf = zipfile.ZipFile(filename, 'w', zipfile.ZIP_DEFLATED)
 | 
						|
 | 
						|
    zipf.writestr('BUILD_INFO', build_info)
 | 
						|
    zipf.writestr('LICENSE', LICENSE)
 | 
						|
    zipf.write(os.path.join('OvmfPkg', 'README'), 'README')
 | 
						|
    FV_DIR = os.path.join(
 | 
						|
        'Build',
 | 
						|
        'Ovmf' + arch.title(),
 | 
						|
        'RELEASE_' + TOOLCHAIN,
 | 
						|
        'FV'
 | 
						|
        )
 | 
						|
    zipf.write(os.path.join(FV_DIR, 'OVMF.fd'), 'OVMF.fd')
 | 
						|
    zipf.write(os.path.join(FV_DIR, 'CirrusLogic5446.rom'), 'CirrusLogic5446.rom')
 | 
						|
    zipf.close()
 | 
						|
    print '[done]'
 | 
						|
 | 
						|
build_info = gen_build_info()
 | 
						|
build('IA32')
 | 
						|
build('X64')
 | 
						|
create_zip('IA32')
 | 
						|
create_zip('X64')
 | 
						|
 | 
						|
 |