%PDF- %PDF-
Direktori : /home/waritko/build/Bento4/Scripts/ |
Current File : //home/waritko/build/Bento4/Scripts/SdkPackager.py |
#! /usr/bin/python ######################################################################## # # Packaging Script for the Bento4 SDK # # Original author: Gilles Boccon-Gibod # # Copyright (c) 2009-2013 by Axiomatic Systems, LLC. All rights reserved. # ####################################################################### import sys import os import shutil import glob import datetime import fnmatch import zipfile import re import platform ############################################################# # GetVersion ############################################################# def GetVersion(): f = open(BENTO4_HOME+'/Source/C++/Core/Ap4Version.h') lines = f.readlines() f.close() for line in lines: m = re.match(r'.*AP4_VERSION_STRING *"([0-9]*)\.([0-9]*)\.([0-9]*).*"', line) if m: return m.group(1) + '-' + m.group(2) + '-' + m.group(3) return '0-0-0' ############################################################# # GetSdkRevision ############################################################# def GetSdkRevision(): cmd = 'git status --porcelain -b' lines = os.popen(cmd).readlines() if not lines[0].startswith('## master'): print 'ERROR: not on master branch' return None if len(lines) > 1: print 'ERROR: git status not empty' print ''.join(lines) return None cmd = 'git tag --contains HEAD' tags = os.popen(cmd).readlines() if len(tags) != 1: print 'ERROR: expected exactly one tag for HEAD, found', len(tags), ':', tags return None version = tags[0].strip() sep = version.find('-') if sep < 0: print 'ERROR: unrecognized version string format:', version return version[sep+1:] ############################################################# # File Copy ############################################################# def CopyFiles(file_patterns, configs=[''], rename_map={}): for config in configs: for (source,pattern,dest) in file_patterns: source_dir = BENTO4_HOME+'/'+source+'/'+config file_list = [os.path.join(source_dir, file) for file in fnmatch.filter(os.listdir(source_dir), pattern)] for file in file_list: dest_dir = SDK_ROOT+'/'+dest+'/'+config if not os.path.exists(dest_dir): os.makedirs(dest_dir) filename = os.path.basename(file) if rename_map.has_key(filename): dest_name = dest_dir+'/'+rename_map[filename] else: dest_name = dest_dir print 'COPY: '+file+' -> '+dest_name shutil.copy2(file, dest_name) ############################################################# # ZIP support ############################################################# def ZipDir(top, archive, dir) : #print 'ZIP: ',top,dir entries = os.listdir(top) for entry in entries: path = os.path.join(top, entry) if os.path.isdir(path): ZipDir(path, archive, os.path.join(dir, entry)) else: zip_name = os.path.join(dir, entry) #print 'ZIP: adding '+path+' as '+zip_name archive.write(path, zip_name) def ZipIt(basename, dir) : path = basename+'/'+dir zip_filename = path+'.zip' print 'ZIP: '+path+' -> '+zip_filename if os.path.exists(zip_filename): os.remove(zip_filename) archive = zipfile.ZipFile(zip_filename, "w", zipfile.ZIP_DEFLATED) if os.path.isdir(path): ZipDir(path, archive, dir) else: archive.write(path) archive.close() ############################################################# # Main ############################################################# # parse the command line if len(sys.argv) > 1: SDK_TARGET = sys.argv[1] else: SDK_TARGET = None if len(sys.argv) > 2: BENTO4_HOME = sys.argv[1] else: script_dir = os.path.abspath(os.path.dirname(__file__)) BENTO4_HOME = os.path.join(script_dir,'..') # ensure that BENTO4_HOME has been set and exists if not os.path.exists(BENTO4_HOME) : print 'ERROR: BENTO4_HOME ('+BENTO4_HOME+') does not exist' sys.exit(1) else : print 'BENTO4_HOME = ' + BENTO4_HOME # compute the target if it is not specified if SDK_TARGET is None: targets_dir = BENTO4_HOME+'/Build/Targets' targets_dirs = os.listdir(targets_dir) target_platforms = [x for x in targets_dirs if os.path.exists(targets_dir +'/'+x+'/Config.scons')] platform_id = sys.platform if platform.system() == 'Linux': if (platform.machine() == 'i386' or platform.machine() == 'i486' or platform.machine() == 'i586' or platform.machine() == 'i686'): platform_id = 'linux-i386' if (platform.machine() == 'x86_64'): platform_id = 'linux-x86_64' if (platform.machine().startswith('arm')): platform_id = 'linux-arm' platform_to_target_map = { 'linux-i386' : 'x86-unknown-linux', 'linux-x86_64': 'x86_64-unknown-linux', 'linux2' : 'x86-unknown-linux', 'win32' : 'x86-microsoft-win32-vs2010', 'darwin' : 'universal-apple-macosx' } if platform_to_target_map.has_key(platform_id): SDK_TARGET = platform_to_target_map[platform_id] else: print 'ERROR: SDK_TARGET is not set and cannot be detected' sys.exit(1) print "TARGET = " + SDK_TARGET BENTO4_VERSION = GetVersion() # compute paths SDK_REVISION = GetSdkRevision() if SDK_REVISION is None: sys.exit(1) SDK_NAME='Bento4-SDK-'+BENTO4_VERSION+'-'+SDK_REVISION+'.'+SDK_TARGET SDK_BUILD_ROOT=BENTO4_HOME+'/SDK' SDK_ROOT=SDK_BUILD_ROOT+'/'+SDK_NAME SDK_TARGET_DIR='Build/Targets/'+SDK_TARGET SDK_TARGET_ROOT=BENTO4_HOME+'/'+SDK_TARGET_DIR # special case for Xcode builds if SDK_TARGET == 'universal-apple-macosx': SDK_TARGET_DIR='Build/Targets/universal-apple-macosx/build' print SDK_NAME # remove any previous SDK directory if os.path.exists(SDK_ROOT): shutil.rmtree(SDK_ROOT) # copy headers, docs and utils misc_files = [ ('Source/C++/Core','*.h','include'), ('Source/C++/Adapters','*.h','include'), ('Source/C++/CApi','*.h','include'), ('Source/C++/Codecs','*.h','include'), ('Source/C++/MetaData','*.h','include'), ('Source/C++/Crypto','*.h','include'), ('Documents','*.txt','docs'), ('Documents/Doxygen','*.chm','docs'), ('Documents/Doxygen','*.zip','docs'), ('Documents/SDK','*.doc','docs'), ('Documents/SDK','*.pdf','docs'), ('Source/Python/utils', '*.py', 'utils') ] CopyFiles(misc_files) if SDK_TARGET == 'universal-apple-macosx': script_bin_dir = 'macosx' elif SDK_TARGET.startswith('x86-microsoft-win32'): script_bin_dir = 'win32' elif SDK_TARGET == 'x86-unknown-linux': script_bin_dir = 'linux-x86' elif SDK_TARGET == 'x86-unknown-linux': script_bin_dir = 'linux-x86_64' else: script_bin_dir = None # binaries bin_in = SDK_TARGET_DIR+'/Release' bin_files = [ (bin_in,'mp4*.exe','bin'), (bin_in,'aac2mp4.exe','bin'), (bin_in,'mp42aac','bin'), (bin_in,'mp42avc','bin'), (bin_in,'mp42hevc','bin'), (bin_in,'mp4dcfpackager','bin'), (bin_in,'mp4decrypt','bin'), (bin_in,'mp4dump','bin'), (bin_in,'mp4edit','bin'), (bin_in,'mp4encrypt','bin'), (bin_in,'mp4extract','bin'), (bin_in,'mp4fragment','bin'), (bin_in,'mp4split','bin'), (bin_in,'mp4compact','bin'), (bin_in,'mp4info','bin'), (bin_in,'mp4rtphintinfo','bin'), (bin_in,'mp4tag','bin'), (bin_in,'mp4mux','bin'), (bin_in,'aac2mp4','bin'), (bin_in,'mp42ts','bin'), (bin_in,'mp42hls','bin'), (bin_in,'mp4iframeindex','bin'), (bin_in,'*.a','lib'), (bin_in,'*.dll','bin'), (bin_in,'*.dylib','bin'), (bin_in,'*.so','bin') ] CopyFiles(bin_files) # wrappers if '-microsoft-' in SDK_TARGET: wrapper_files = [ ('Source/Python/wrappers', 'mp4dash.bat','bin'), ('Source/Python/wrappers', 'mp4dashclone.bat','bin'), ('Source/Python/wrappers', 'mp4hls.bat','bin') ] else: wrapper_files = [ ('Source/Python/wrappers', 'mp4dash','bin'), ('Source/Python/wrappers', 'mp4dashclone','bin'), ('Source/Python/wrappers', 'mp4hls','bin') ] CopyFiles(wrapper_files) # remove any previous zip file ZipIt(SDK_BUILD_ROOT, SDK_NAME)