Merge viewer64

master
Ansariel 2017-10-11 17:49:03 +02:00
commit 8d0d93e8d4
3 changed files with 253 additions and 261 deletions

View File

@ -3443,9 +3443,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>0d65bb763808feffb6308914aa53272b</string>
<string>804779ac7a80500a7634f05f906cf7a7</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8942/38652/viewer_manager-1.0.508931-darwin64-508931.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9534/44332/viewer_manager-1.0.509523-darwin64-509523.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
@ -3467,9 +3467,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>c235c6ef33f52b0130808fe57710fe35</string>
<string>4ef7c2406fb3ec167e8422b1e1c5b540</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8943/38658/viewer_manager-1.0.508931-windows-508931.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9535/44338/viewer_manager-1.0.509523-windows-509523.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -3480,7 +3480,7 @@
<key>source_type</key>
<string>hg</string>
<key>version</key>
<string>1.0.508931</string>
<string>1.0.509523</string>
</map>
<key>vlc-bin</key>
<map>

View File

@ -381,12 +381,30 @@ class LLManifest(object):
self.excludes.append(glob)
def prefix(self, src='', build=None, dst=None):
""" Pushes a prefix onto the stack. Until end_prefix is
called, all relevant method calls (esp. to path()) will prefix
paths with the entire prefix stack. Source and destination
prefixes can be different, though if only one is provided they
are both equal. To specify a no-op, use an empty string, not
None."""
"""
Usage:
with self.prefix(...args as described...):
self.path(...)
For the duration of the 'with' block, pushes a prefix onto the stack.
Within that block, all relevant method calls (esp. to path()) will
prefix paths with the entire prefix stack. Source and destination
prefixes can be different, though if only one is provided they are
both equal. To specify a no-op, use an empty string, not None.
Also supports the older (pre-Python-2.5) syntax:
if self.prefix(...args as described...):
self.path(...)
self.end_prefix(...)
Before the arrival of the 'with' statement, one was required to code
self.prefix() and self.end_prefix() in matching pairs to push and to
pop the prefix stacks, respectively. The older prefix() method
returned True specifically so that the caller could indent the
relevant block of code with 'if', just for aesthetic purposes.
"""
if dst is None:
dst = src
if build is None:
@ -395,7 +413,57 @@ class LLManifest(object):
self.artwork_prefix.append(src)
self.build_prefix.append(build)
self.dst_prefix.append(dst)
return True # so that you can wrap it in an if to get indentation
# The above code is unchanged from the original implementation. What's
# new is the return value. We're going to return an instance of
# PrefixManager that binds this LLManifest instance and Does The Right
# Thing on exit.
return self.PrefixManager(self)
class PrefixManager(object):
def __init__(self, manifest):
self.manifest = manifest
# stack attributes we manage in this LLManifest (sub)class
# instance
stacks = ("src_prefix", "artwork_prefix", "build_prefix", "dst_prefix")
# If the caller wrote:
# with self.prefix(...):
# as intended, then bind the state of each prefix stack as it was
# just BEFORE the call to prefix(). Since prefix() appended an
# entry to each prefix stack, capture len()-1.
self.prevlen = { stack: len(getattr(self.manifest, stack)) - 1
for stack in stacks }
def __nonzero__(self):
# If the caller wrote:
# if self.prefix(...):
# then a value of this class had better evaluate as 'True'.
return True
def __enter__(self):
# nobody uses 'with self.prefix(...) as variable:'
return None
def __exit__(self, type, value, traceback):
# First, if the 'with' block raised an exception, just propagate.
# Do NOT swallow it.
if type is not None:
return False
# Okay, 'with' block completed successfully. Restore previous
# state of each of the prefix stacks in self.stacks.
# Note that we do NOT simply call pop() on them as end_prefix()
# does. This is to cope with the possibility that the coder
# changed 'if self.prefix(...):' to 'with self.prefix(...):' yet
# forgot to remove the self.end_prefix(...) call at the bottom of
# the block. In that case, calling pop() again would be Bad! But
# if we restore the length of each stack to what it was before the
# current prefix() block, it doesn't matter whether end_prefix()
# was called or not.
for stack, prevlen in self.prevlen.items():
# find the attribute in 'self.manifest' named by 'stack', and
# truncate that list back to 'prevlen'
del getattr(self.manifest, stack)[prevlen:]
def end_prefix(self, descr=None):
"""Pops a prefix off the stack. If given an argument, checks

View File

@ -68,17 +68,15 @@ class ViewerManifest(LLManifest,FSViewerManifest):
self.path(src="../../etc/message.xml", dst="app_settings/message.xml")
# <FS:LO> Copy dictionaries to a place where the viewer can find them if ran from visual studio
if self.prefix(src="app_settings"):
with self.prefix(src="app_settings"):
# ... and the included spell checking dictionaries
pkgdir = os.path.join(self.args['build'], os.pardir, 'packages')
if self.prefix(src=pkgdir,dst=""):
with self.prefix(src=pkgdir,dst=""):
self.path("dictionaries")
self.end_prefix(pkgdir)
self.end_prefix("app_settings")
# </FS:LO>
if self.is_packaging_viewer():
if self.prefix(src="app_settings"):
with self.prefix(src="app_settings"):
self.exclude("logcontrol.xml")
self.exclude("logcontrol-dev.xml")
self.path("*.pem")
@ -102,9 +100,8 @@ class ViewerManifest(LLManifest,FSViewerManifest):
# <FS:LO> Copy dictionaries to a place where the viewer can find them if ran from visual studio
# ... and the included spell checking dictionaries
# pkgdir = os.path.join(self.args['build'], os.pardir, 'packages')
# if self.prefix(src=pkgdir,dst=""):
# with self.prefix(src=pkgdir,dst=""):
# self.path("dictionaries")
# self.end_prefix(pkgdir)
# </FS:LO>
# include the entire beams directory
self.path("beams")
@ -151,56 +148,50 @@ class ViewerManifest(LLManifest,FSViewerManifest):
"settings_install.xml",
src="environment")
self.end_prefix("app_settings")
if self.prefix(src="character"):
with self.prefix(src="character"):
self.path("*.llm")
self.path("*.xml")
self.path("*.tga")
self.end_prefix("character")
# Include our fonts
if self.prefix(src="fonts"):
with self.prefix(src="fonts"):
self.path("*.ttf")
self.path("*.txt")
self.path("*.xml")
self.end_prefix("fonts")
# <FS:AO> Include firestorm resources
if self.prefix(src="fs_resources"):
with self.prefix(src="fs_resources"):
self.path("*.txt")
self.path("*.lsl")
self.path("*.lsltxt")
self.end_prefix("fs_resources");
# skins
if self.prefix(src="skins"):
with self.prefix(src="skins"):
self.path("skins.xml")
# include the entire textures directory recursively
if self.prefix(src="*/textures"):
self.path("*/*.tga")
self.path("*/*.j2c")
self.path("*/*.jpg")
self.path("*/*.png")
self.path("*.tga")
self.path("*.j2c")
self.path("*.jpg")
self.path("*.png")
self.path("textures.xml")
self.end_prefix("*/textures")
self.path("*/xui/*/*.xml")
self.path("*/xui/*/widgets/*.xml")
self.path("*/themes/*/colors.xml")
if self.prefix(src="*/themes/*/textures"):
self.path("*/*.tga")
self.path("*/*.j2c")
self.path("*/*.jpg")
self.path("*/*.png")
self.path("*.tga")
self.path("*.j2c")
self.path("*.jpg")
self.path("*.png")
self.end_prefix("*/themes/*/textures")
# include the entire textures directory recursively
with self.prefix(src="*/textures"):
self.path("*/*.tga")
self.path("*/*.j2c")
self.path("*/*.jpg")
self.path("*/*.png")
self.path("*.tga")
self.path("*.j2c")
self.path("*.jpg")
self.path("*.png")
self.path("textures.xml")
self.path("*/xui/*/*.xml")
self.path("*/xui/*/widgets/*.xml")
self.path("*/themes/*/colors.xml")
with self.prefix(src="*/themes/*/textures"):
self.path("*/*.tga")
self.path("*/*.j2c")
self.path("*/*.jpg")
self.path("*/*.png")
self.path("*.tga")
self.path("*.j2c")
self.path("*.jpg")
self.path("*.png")
self.path("*/*.xml")
# Local HTML files (e.g. loading screen)
@ -210,19 +201,16 @@ class ViewerManifest(LLManifest,FSViewerManifest):
# we're wrong, a user actually does have the relevant
# files; s/he just needs to rename every html.old
# directory back to html to recover them.
if self.prefix(src="*/html", dst="*/html.old"):
with self.prefix(src="*/html", dst="*/html.old"):
self.path("*.png")
self.path("*/*/*.html")
self.path("*/*/*.gif")
self.end_prefix("*/html")
self.end_prefix("skins")
# local_assets dir (for pre-cached textures)
if self.prefix(src="local_assets"):
with self.prefix(src="local_assets"):
self.path("*.j2c")
self.path("*.tga")
self.end_prefix("local_assets")
# File in the newview/ directory
self.path("gpu_table.txt")
@ -424,28 +412,27 @@ class WindowsManifest(ViewerManifest):
# <FS:Ansariel> Remove VMP
# include the compiled launcher scripts so that it gets included in the file_list
#self.path(src='%s/apply_update.exe' % vmpdir, dst="apply_update.exe")
#self.path(src='%s/download_update.exe' % vmpdir, dst="download_update.exe")
#self.path(src='%s/SL_Launcher.exe' % vmpdir, dst="SL_Launcher.exe")
#self.path(src='%s/update_manager.exe' % vmpdir, dst="update_manager.exe")
#IUM is not normally executed directly, just imported. No exe needed.
#self.path2basename(vmpdir,"InstallerUserMessage.py")
#with self.prefix(src=self.icon_path(), dst="vmp_icons"):
# self.path("secondlife.ico")
#VMP Tkinter icons
#if self.prefix("vmp_icons"):
#with self.prefix("vmp_icons"):
# self.path("*.png")
# self.path("*.gif")
# self.end_prefix("vmp_icons")
#before, we only needed llbase at build time. With VMP, we need it at run time.
#llbase_path = os.path.join(self.get_dst_prefix(),'llbase')
#if not os.path.exists(llbase_path):
# os.makedirs(llbase_path)
#if self.prefix(dst="llbase"):
#with self.prefix(dst="llbase"):
# self.path2basename(llbasedir,"*.py")
# self.path2basename(llbasedir,"_cllsd.so")
# self.end_prefix()
# </FS:Ansariel> Remove VMP
# Plugin host application
@ -454,7 +441,7 @@ class WindowsManifest(ViewerManifest):
"slplugin.exe")
# Get shared libs from the shared libs staging directory
if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']),
with self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']),
dst=""):
# Get llcommon and deps. If missing assume static linkage and continue.
@ -533,7 +520,6 @@ class WindowsManifest(ViewerManifest):
except:
print "Skipping libtcmalloc_minimal.dll"
self.end_prefix()
self.path(src="licenses-win32.txt", dst="licenses.txt")
self.path("featuretable.txt")
@ -541,29 +527,25 @@ class WindowsManifest(ViewerManifest):
self.path("VivoxAUP.txt")
# Media plugins - CEF
if self.prefix(src='../media_plugins/cef/%s' % self.args['configuration'], dst="llplugin"):
with self.prefix(src='../media_plugins/cef/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_cef.dll")
self.end_prefix()
# Media plugins - LibVLC
if self.prefix(src='../media_plugins/libvlc/%s' % self.args['configuration'], dst="llplugin"):
with self.prefix(src='../media_plugins/libvlc/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_libvlc.dll")
self.end_prefix()
# Media plugins - Example (useful for debugging - not shipped with release viewer)
if self.channel_type() != 'release':
if self.prefix(src='../media_plugins/example/%s' % self.args['configuration'], dst="llplugin"):
with self.prefix(src='../media_plugins/example/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_example.dll")
self.end_prefix()
# Media plugins - GStreamer
if self.prefix(src='../media_plugins/gstreamer10/%s' % self.args['configuration'], dst="llplugin"):
with self.prefix(src='../media_plugins/gstreamer10/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_gstreamer10.dll")
self.end_prefix()
# CEF runtime files - debug
if self.args['configuration'].lower() == 'debug':
if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'debug'), dst="llplugin"):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'debug'), dst="llplugin"):
self.path("chrome_elf.dll")
self.path("d3dcompiler_43.dll")
self.path("d3dcompiler_47.dll")
@ -574,10 +556,9 @@ class WindowsManifest(ViewerManifest):
self.path("natives_blob.bin")
self.path("snapshot_blob.bin")
self.path("widevinecdmadapter.dll")
self.end_prefix()
else:
# CEF runtime files - not debug (release, relwithdebinfo etc.)
if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"):
self.path("chrome_elf.dll")
self.path("d3dcompiler_43.dll")
self.path("d3dcompiler_47.dll")
@ -588,25 +569,22 @@ class WindowsManifest(ViewerManifest):
self.path("natives_blob.bin")
self.path("snapshot_blob.bin")
self.path("widevinecdmadapter.dll")
self.end_prefix()
# MSVC DLLs needed for CEF and have to be in same directory as plugin
if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', 'Release'), dst="llplugin"):
with self.prefix(src=os.path.join(os.pardir, 'sharedlibs', 'Release'), dst="llplugin"):
self.path("msvcp120.dll")
self.path("msvcr120.dll")
self.end_prefix()
# CEF files common to all configurations
if self.prefix(src=os.path.join(os.pardir, 'packages', 'resources'), dst="llplugin"):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'resources'), dst="llplugin"):
self.path("cef.pak")
self.path("cef_100_percent.pak")
self.path("cef_200_percent.pak")
self.path("cef_extensions.pak")
self.path("devtools_resources.pak")
self.path("icudtl.dat")
self.end_prefix()
if self.prefix(src=os.path.join(os.pardir, 'packages', 'resources', 'locales'), dst=os.path.join('llplugin', 'locales')):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'resources', 'locales'), dst=os.path.join('llplugin', 'locales')):
self.path("am.pak")
self.path("ar.pak")
self.path("bg.pak")
@ -660,13 +638,11 @@ class WindowsManifest(ViewerManifest):
self.path("vi.pak")
self.path("zh-CN.pak")
self.path("zh-TW.pak")
self.end_prefix()
if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"):
self.path("libvlc.dll")
self.path("libvlccore.dll")
self.path("plugins/")
self.end_prefix()
# pull in the crash logger and updater from other projects
# tag:"crash-logger" here as a cue to the exporter
@ -675,14 +651,12 @@ class WindowsManifest(ViewerManifest):
if (self.address_size == 64):
if self.prefix(src=os.path.join(os.pardir, '..', 'indra', 'newview', 'installers', 'windows_x64'), dst="llplugin"):
with self.prefix(src=os.path.join(os.pardir, '..', 'indra', 'newview', 'installers', 'windows_x64'), dst="llplugin"):
self.path("msvcp120.dll")
self.path("msvcr120.dll")
self.end_prefix()
if self.prefix(src=os.path.join(os.pardir, '..', 'indra', 'newview', 'installers', 'windows_x64'), dst=""):
with self.prefix(src=os.path.join(os.pardir, '..', 'indra', 'newview', 'installers', 'windows_x64'), dst=""):
self.path("msvcp120.dll")
self.path("msvcr120.dll")
self.end_prefix()
if not self.is_packaging_viewer():
self.package_file = "copied_deps"
@ -806,10 +780,8 @@ class WindowsManifest(ViewerManifest):
# note that the enclosing setup exe is signed later, after the makensis makes it.
# Unlike the viewer binary, the VMP filenames are invariant with respect to version, os, etc.
#for exe in (
# "apply_update.exe",
# "download_update.exe",
# "SL_Launcher.exe",
# "update_manager.exe",
# ):
# self.sign(exe)
@ -895,7 +867,7 @@ class DarwinManifest(ViewerManifest):
chardetdir = os.path.join(pkgdir, "lib", "python", "chardet")
idnadir = os.path.join(pkgdir, "lib", "python", "idna")
if self.prefix(src="", dst="Contents"): # everything goes in Contents
with self.prefix(src="", dst="Contents"): # everything goes in Contents
self.path("Info.plist", dst="Info.plist")
# copy additional libs in <bundle>/Contents/MacOS/
@ -903,7 +875,7 @@ class DarwinManifest(ViewerManifest):
self.path(os.path.join(relpkgdir, "libhunspell-1.3.0.dylib"), dst="Resources/libhunspell-1.3.0.dylib")
# <FS:Ansariel> Remove VMP
#if self.prefix(dst="MacOS"):
#with self.prefix(dst="MacOS"):
# #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322, SL-323
# self.path2basename(vmpdir,"SL_Launcher")
# self.path2basename(vmpdir,"*.py")
@ -911,56 +883,48 @@ class DarwinManifest(ViewerManifest):
# certifi_path = os.path.join(self.get_dst_prefix(),'certifi')
# if not os.path.exists(certifi_path):
# os.makedirs(certifi_path)
# if self.prefix(dst="certifi"):
# with self.prefix(dst="certifi"):
# self.path2basename(os.path.join(vmpdir,"certifi"),"*")
# self.end_prefix()
# # llbase provides our llrest service layer and llsd decoding
# llbase_path = os.path.join(self.get_dst_prefix(),'llbase')
# if not os.path.exists(llbase_path):
# os.makedirs(llbase_path)
# if self.prefix(dst="llbase"):
# with self.prefix(dst="llbase"):
# self.path2basename(llbasedir,"*.py")
# self.path2basename(llbasedir,"_cllsd.so")
# self.end_prefix()
# #requests module needed by llbase/llrest.py
# #this is only needed on POSIX, because in Windows we compile it into the EXE
# requests_path = os.path.join(self.get_dst_prefix(),'requests')
# if not os.path.exists(requests_path):
# os.makedirs(requests_path)
# if self.prefix(dst="requests"):
# with self.prefix(dst="requests"):
# self.path2basename(requestsdir,"*")
# self.end_prefix()
# urllib3_path = os.path.join(self.get_dst_prefix(),'urllib3')
# if not os.path.exists(urllib3_path):
# os.makedirs(urllib3_path)
# if self.prefix(dst="urllib3"):
# with self.prefix(dst="urllib3"):
# self.path2basename(urllib3dir,"*")
# self.end_prefix()
# chardet_path = os.path.join(self.get_dst_prefix(),'chardet')
# if not os.path.exists(chardet_path):
# os.makedirs(chardet_path)
# if self.prefix(dst="chardet"):
# with self.prefix(dst="chardet"):
# self.path2basename(chardetdir,"*")
# self.end_prefix()
# idna_path = os.path.join(self.get_dst_prefix(),'idna')
# if not os.path.exists(idna_path):
# os.makedirs(idna_path)
# if self.prefix(dst="idna"):
# with self.prefix(dst="idna"):
# self.path2basename(idnadir,"*")
# self.end_prefix()
# self.end_prefix()
# </FS:Ansariel> Remove VMP
# Growl Frameworks
self.path("../packages/Frameworks/Growl", dst="Frameworks/Growl")
# most everything goes in the Resources directory
if self.prefix(src="", dst="Resources"):
with self.prefix(src="", dst="Resources"):
super(DarwinManifest, self).construct()
if self.prefix("cursors_mac"):
with self.prefix("cursors_mac"):
self.path("*.tif")
self.end_prefix("cursors_mac")
self.path("licenses-mac.txt", dst="licenses.txt")
self.path("featuretable_mac.txt")
@ -968,16 +932,17 @@ class DarwinManifest(ViewerManifest):
self.path("ca-bundle.crt")
icon_path = self.icon_path()
if self.prefix(src=icon_path, dst="") :
with self.prefix(src=icon_path, dst="") :
self.path("firestorm_icon.icns")
self.end_prefix(icon_path)
# <FS:Ansariel> Remove VMP
#with self.prefix(src=icon_path, dst="vmp_icons"):
# self.path("secondlife.ico")
#VMP Tkinter icons
# <FS:Ansariel> Remove VMP
#if self.prefix("vmp_icons"):
#with self.prefix("vmp_icons"):
# self.path("*.png")
# self.path("*.gif")
# self.end_prefix("vmp_icons")
# <FS:Ansariel> Remove VMP
self.path("Firestorm.nib")
@ -1090,18 +1055,15 @@ class DarwinManifest(ViewerManifest):
#<FS:TS> Moved from the x86_64 specific version because code
# below that does symlinking and path fixup depends on it.
if(self.prefix(src="../packages/bin_x86", dst="")):
with self.prefix(src="../packages/bin_x86", dst=""):
self.path("SLPlugin.app", "SLPlugin.app")
if self.prefix(src = "llplugin", dst="llplugin"):
with self.prefix(src = "llplugin", dst="llplugin"):
self.path("media_plugin_quicktime.dylib", "media_plugin_quicktime.dylib")
self.path("media_plugin_cef.dylib", "media_plugin_cef.dylib")
self.end_prefix("llplugin")
self.end_prefix();
# Dullahan helper apps go inside SLPlugin.app
if self.prefix(src="", dst="SLPlugin.app/Contents/Frameworks"):
with self.prefix(src="", dst="SLPlugin.app/Contents/Frameworks"):
helperappfile = 'DullahanHelper.app'
self.path2basename(relpkgdir, helperappfile)
@ -1117,15 +1079,14 @@ class DarwinManifest(ViewerManifest):
self.dst_path_of('DullahanHelper.app/Contents/MacOS/'
'Frameworks/Chromium Embedded Framework.framework')
self.end_prefix()
helperexecutablepath = self.dst_path_of('SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper')
self.run_command('install_name_tool -change '
'"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" '
'"@executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % helperexecutablepath)
helperexecutablepath = self.dst_path_of('SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper')
self.run_command('install_name_tool -change '
'"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" '
'"@executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % helperexecutablepath)
# SLPlugin plugins
if self.prefix(src="", dst="llplugin"):
with self.prefix(src="", dst="llplugin"):
self.path2basename("../media_plugins/cef/" + self.args['configuration'],
"media_plugin_cef.dylib")
@ -1134,79 +1095,72 @@ class DarwinManifest(ViewerManifest):
"media_plugin_libvlc.dylib")
# copy LibVLC dynamic libraries
if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release' ), dst="lib"):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release' ), dst="lib"):
self.path( "libvlc*.dylib*" )
self.end_prefix()
# copy LibVLC plugins folder
if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release', 'plugins' ), dst="lib"):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release', 'plugins' ), dst="lib"):
self.path( "*.dylib" )
self.path( "plugins.dat" )
self.end_prefix()
self.end_prefix("llplugin")
# do this install_name_tool *after* media plugin is copied over
dylibexecutablepath = self.dst_path_of('llplugin/media_plugin_cef.dylib')
self.run_command('install_name_tool -change '
'"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" '
'"@executable_path/../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % dylibexecutablepath)
# do this install_name_tool *after* media plugin is copied over
dylibexecutablepath = self.dst_path_of('llplugin/media_plugin_cef.dylib')
self.run_command('install_name_tool -change '
'"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" '
'"@executable_path/../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % dylibexecutablepath)
self.end_prefix("Resources")
#<FS:TS> Copy in prebuilt framework if it's there
if self.prefix(src="../packages/bin_x86/Frameworks", dst="Frameworks"):
with self.prefix(src="../packages/bin_x86/Frameworks", dst="Frameworks"):
self.path("Chromium Embedded Framework.framework")
self.end_prefix()
# CEF framework goes inside Second Life.app/Contents/Frameworks
if self.prefix(src="", dst="Frameworks"):
frameworkfile="Chromium Embedded Framework.framework"
self.path2basename(relpkgdir, frameworkfile)
self.end_prefix("Frameworks")
# CEF framework goes inside Second Life.app/Contents/Frameworks
with self.prefix(src="", dst="Frameworks"):
frameworkfile="Chromium Embedded Framework.framework"
self.path2basename(relpkgdir, frameworkfile)
# This code constructs a relative path from the
# target framework folder back to the location of the symlink.
# It needs to be relative so that the symlink still works when
# (as is normal) the user moves the app bundle out of the DMG
# and into the /Applications folder. Note we also call 'raise'
# to terminate the process if we get an error since without
# this symlink, Second Life web media can't possibly work.
# Real Framework folder:
# Second Life.app/Contents/Frameworks/Chromium Embedded Framework.framework/
# Location of symlink and why it's relative
# Second Life.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework/
# Real Frameworks folder, with the symlink inside the bundled SLPlugin.app (and why it's relative)
# <top level>.app/Contents/Frameworks/Chromium Embedded Framework.framework/
# <top level>.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework ->
# It might seem simpler just to create a symlink Frameworks to
# the parent of Chromimum Embedded Framework.framework. But
# that would create a symlink cycle, which breaks our
# packaging step. So make a symlink from Chromium Embedded
# Framework.framework to the directory of the same name, which
# is NOT an ancestor of the symlink.
frameworkpath = os.path.join(os.pardir, os.pardir, os.pardir,
os.pardir, "Frameworks",
"Chromium Embedded Framework.framework")
try:
# from SLPlugin.app/Contents/Frameworks/Chromium Embedded
# Framework.framework back to Second
# Life.app/Contents/Frameworks/Chromium Embedded Framework.framework
origin, target = pluginframeworkpath, frameworkpath
symlinkf(target, origin)
# from SLPlugin.app/Contents/Frameworks/Dullahan
# Helper.app/Contents/MacOS/Frameworks/Chromium Embedded
# Framework.framework back to
# SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework
self.cmakedirs(os.path.dirname(helperframeworkpath))
origin = helperframeworkpath
target = os.path.join(os.pardir, frameworkpath)
symlinkf(target, origin)
except OSError as err:
print "Can't symlink %s -> %s: %s" % (origin, target, err)
raise
# This code constructs a relative path from the
# target framework folder back to the location of the symlink.
# It needs to be relative so that the symlink still works when
# (as is normal) the user moves the app bundle out of the DMG
# and into the /Applications folder. Note we also call 'raise'
# to terminate the process if we get an error since without
# this symlink, Second Life web media can't possibly work.
# Real Framework folder:
# Second Life.app/Contents/Frameworks/Chromium Embedded Framework.framework/
# Location of symlink and why it's relative
# Second Life.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework/
# Real Frameworks folder, with the symlink inside the bundled SLPlugin.app (and why it's relative)
# <top level>.app/Contents/Frameworks/Chromium Embedded Framework.framework/
# <top level>.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework ->
# It might seem simpler just to create a symlink Frameworks to
# the parent of Chromimum Embedded Framework.framework. But
# that would create a symlink cycle, which breaks our
# packaging step. So make a symlink from Chromium Embedded
# Framework.framework to the directory of the same name, which
# is NOT an ancestor of the symlink.
frameworkpath = os.path.join(os.pardir, os.pardir, os.pardir,
os.pardir, "Frameworks",
"Chromium Embedded Framework.framework")
try:
# from SLPlugin.app/Contents/Frameworks/Chromium Embedded
# Framework.framework back to Second
# Life.app/Contents/Frameworks/Chromium Embedded Framework.framework
origin, target = pluginframeworkpath, frameworkpath
symlinkf(target, origin)
# from SLPlugin.app/Contents/Frameworks/Dullahan
# Helper.app/Contents/MacOS/Frameworks/Chromium Embedded
# Framework.framework back to
# SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework
self.cmakedirs(os.path.dirname(helperframeworkpath))
origin = helperframeworkpath
target = os.path.join(os.pardir, frameworkpath)
symlinkf(target, origin)
except OSError as err:
print "Can't symlink %s -> %s: %s" % (origin, target, err)
raise
self.end_prefix("Contents")
# NOTE: the -S argument to strip causes it to keep enough info for
# annotated backtraces (i.e. function names in the crash log). 'strip' with no
@ -1439,22 +1393,20 @@ class LinuxManifest(ViewerManifest):
self.path("licenses-linux.txt","licenses.txt")
self.path("VivoxAUP.txt")
self.path("res/firestorm_icon.png","firestorm_icon.png")
if self.prefix("linux_tools", dst=""):
with self.prefix("linux_tools", dst=""):
self.path("client-readme.txt","README-linux.txt")
self.path("FIRESTORM_DESKTOPINSTALL.txt","FIRESTORM_DESKTOPINSTALL.txt")
self.path("FIRESTORM_DESKTOPINSTALL.txt","FIRESTORM_DESKTOPINSTALL.txt")
self.path("client-readme-voice.txt","README-linux-voice.txt")
self.path("client-readme-joystick.txt","README-linux-joystick.txt")
self.path("wrapper.sh","firestorm")
if self.prefix(src="", dst="etc"):
with self.prefix(src="", dst="etc"):
self.path("handle_secondlifeprotocol.sh")
self.path("register_secondlifeprotocol.sh")
self.path("refresh_desktop_app_entry.sh")
self.path("launch_url.sh")
self.end_prefix("etc")
self.path("install.sh")
self.end_prefix("linux_tools")
if self.prefix(src="", dst="bin"):
with self.prefix(src="", dst="bin"):
self.path("firestorm-bin","do-not-directly-run-firestorm-bin")
self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin")
self.path2basename("../llplugin/slplugin", "SLPlugin")
@ -1465,77 +1417,65 @@ class LinuxManifest(ViewerManifest):
#llbase_path = os.path.join(self.get_dst_prefix(),'llbase')
#if not os.path.exists(llbase_path):
# os.makedirs(llbase_path)
#if self.prefix(dst="llbase"):
#with self.prefix(dst="llbase"):
# self.path2basename("../packages/lib/python/llbase","*.py")
# self.path2basename("../packages/lib/python/llbase","_cllsd.so")
#self.end_prefix("bin")
# </FS:Ansariel> Remove VMP
if self.prefix("res-sdl"):
with self.prefix("res-sdl"):
self.path("*")
# recurse
self.end_prefix("res-sdl")
# Get the icons based on the channel type
icon_path = self.icon_path()
print "DEBUG: icon_path '%s'" % icon_path
if self.prefix(src=icon_path, dst="") :
with self.prefix(src=icon_path, dst="") :
self.path("firestorm_256.png","firestorm_48.png")
if self.prefix(src="",dst="res-sdl") :
with self.prefix(src="",dst="res-sdl") :
self.path("firestorm_256.BMP","ll_icon.BMP")
self.end_prefix("res-sdl")
self.end_prefix(icon_path)
# plugins
if self.prefix(src="", dst="bin/llplugin"):
with self.prefix(src="", dst="bin/llplugin"):
self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so")
self.path("../media_plugins/cef/libmedia_plugin_cef.so", "libmedia_plugin_cef.so" )
self.path("../media_plugins/libvlc/libmedia_plugin_libvlc.so", "libmedia_plugin_libvlc.so")
self.path("../media_plugins/gstreamer10/libmedia_plugin_gstreamer10.so", "libmedia_plugin_gstreamer10.so")
self.end_prefix("bin/llplugin")
if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'vlc', 'plugins'), dst="bin/llplugin/vlc/plugins"):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'vlc', 'plugins'), dst="bin/llplugin/vlc/plugins"):
self.path( "plugins.dat" )
self.path( "*/*.so" )
self.end_prefix()
if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib' ), dst="lib"):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib' ), dst="lib"):
self.path( "libvlc*.so*" )
self.end_prefix()
if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'vlc', 'plugins'), dst="bin/llplugin/vlc/plugins"):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'vlc', 'plugins'), dst="bin/llplugin/vlc/plugins"):
self.path( "plugins.dat" )
self.path( "*/*.so" )
self.end_prefix()
if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib' ), dst="lib"):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib' ), dst="lib"):
self.path( "libvlc*.so*" )
self.end_prefix()
# CEF files
if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release'), dst="lib"):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release'), dst="lib"):
self.path( "libcef.so" )
self.path( "libllceflib.so" )
self.end_prefix()
if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="bin"):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="bin"):
self.path( "chrome-sandbox" )
self.path( "llceflib_host" )
self.path( "natives_blob.bin" )
self.path( "snapshot_blob.bin" )
self.path( "libffmpegsumo.so" )
self.end_prefix()
if self.prefix(src=os.path.join(os.pardir, 'packages', 'resources'), dst="bin"):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'resources'), dst="bin"):
self.path( "cef.pak" )
self.path( "cef_extensions.pak" )
self.path( "cef_100_percent.pak" )
self.path( "cef_200_percent.pak" )
self.path( "devtools_resources.pak" )
self.path( "icudtl.dat" )
self.end_prefix()
if self.prefix(src=os.path.join(os.pardir, 'packages', 'resources', 'locales'), dst=os.path.join('bin', 'locales')):
with self.prefix(src=os.path.join(os.pardir, 'packages', 'resources', 'locales'), dst=os.path.join('bin', 'locales')):
self.path("am.pak")
self.path("ar.pak")
self.path("bg.pak")
@ -1589,7 +1529,6 @@ class LinuxManifest(ViewerManifest):
self.path("vi.pak")
self.path("zh-CN.pak")
self.path("zh-TW.pak")
self.end_prefix()
# llcommon
if not self.path("../llcommon/libllcommon.so", "lib/libllcommon.so"):
@ -1599,7 +1538,7 @@ class LinuxManifest(ViewerManifest):
self.path("ca-bundle.crt")
if self.is_packaging_viewer():
if self.prefix("../packages/lib/release", dst="lib"):
with self.prefix("../packages/lib/release", dst="lib"):
self.path("libapr-1.so*")
self.path("libaprutil-1.so*")
self.path("libboost_context-mt.so*")
@ -1634,7 +1573,6 @@ class LinuxManifest(ViewerManifest):
self.path("libopenal.so*")
#self.path("libnotify.so.1.1.2", "libnotify.so.1") # LO - uncomment when testing libnotify(growl) on linux
self.path("libpangox-1.0.so*")
# KLUDGE: As of 2012-04-11, the 'fontconfig' package installs
# libfontconfig.so.1.4.4, along with symlinks libfontconfig.so.1
# and libfontconfig.so. Before we added support for library-file
@ -1653,7 +1591,6 @@ class LinuxManifest(ViewerManifest):
# previous call did, without having to explicitly state the
# version number.
self.path("libfontconfig.so.*.*")
try:
self.path("libtcmalloc.so*") #formerly called google perf tools
pass
@ -1661,22 +1598,19 @@ class LinuxManifest(ViewerManifest):
print "tcmalloc files not found, skipping"
pass
self.end_prefix("lib")
# Vivox runtimes
# Currentelly, the 32-bit ones will work with a 64-bit client.
with self.prefix(src="../packages/lib/release", dst="bin"):
self.path("SLVoice")
self.path("win32")
# Vivox runtimes
# Currentelly, the 32-bit ones will work with a 64-bit client.
if self.prefix(src="../packages/lib/release", dst="bin"):
self.path("SLVoice")
self.path("win32")
self.end_prefix()
if self.prefix(src="../packages/lib/release", dst="lib"):
self.path("libortp.so")
self.path("libsndfile.so.1")
# <FS:TS> Vivox wants this library even if it's present already in the viewer
self.path("libvivoxoal.so.1")
self.path("libvivoxsdk.so")
self.path("libvivoxplatform.so")
self.end_prefix("lib")
with self.prefix(src="../packages/lib/release", dst="lib"):
self.path("libortp.so")
self.path("libsndfile.so.1")
# <FS:TS> Vivox wants this library even if it's present already in the viewer
self.path("libvivoxoal.so.1")
self.path("libvivoxsdk.so")
self.path("libvivoxplatform.so")
def package_finish(self):
@ -1744,7 +1678,7 @@ class Linux_i686_Manifest(LinuxManifest):
relpkgdir = os.path.join(pkgdir, "lib", "release")
debpkgdir = os.path.join(pkgdir, "lib", "debug")
if self.prefix(relpkgdir, dst="lib"):
with self.prefix(relpkgdir, dst="lib"):
self.path("libapr-1.so")
self.path("libapr-1.so.0")
self.path("libapr-1.so.0.4.5")
@ -1808,22 +1742,19 @@ class Linux_i686_Manifest(LinuxManifest):
print "Skipping libfmodex.so - not found"
pass
self.end_prefix("lib")
# Vivox runtimes
if self.prefix(src=relpkgdir, dst="bin"):
self.path("SLVoice")
self.end_prefix()
if self.prefix(src=relpkgdir, dst="lib"):
self.path("libortp.so")
self.path("libsndfile.so.1")
#self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OpenAL lib
self.path("libvivoxsdk.so")
self.path("libvivoxplatform.so")
self.end_prefix("lib")
# Vivox runtimes
with self.prefix(src=relpkgdir, dst="bin"):
self.path("SLVoice")
with self.prefix(src=relpkgdir, dst="lib"):
self.path("libortp.so")
self.path("libsndfile.so.1")
#self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OpenAL lib
self.path("libvivoxsdk.so")
self.path("libvivoxplatform.so")
self.fs_delete_linux_symbols() # <FS:ND/> Delete old syms
self.strip_binaries()
self.fs_delete_linux_symbols() # <FS:ND/> Delete old syms
self.strip_binaries()
class Linux_x86_64_Manifest(LinuxManifest):
@ -1833,16 +1764,14 @@ class Linux_x86_64_Manifest(LinuxManifest):
super(Linux_x86_64_Manifest, self).construct()
if self.is_packaging_viewer():
if self.prefix("../packages/lib/release", dst="lib"):
with self.prefix("../packages/lib/release", dst="lib"):
self.path("libffi*.so*")
# vivox 32-bit hack.
# one has to extract libopenal.so from the 32-bit openal package, or official LL viewer, and rename it to libopenal32.so
# and place it in the prebuilt lib/release directory
# <FS:TS> No, we don't need to dink with this. A usable library
# is now in the slvoice package, and we need to just use it as is.
# self.path("libopenal32.so", "libvivoxoal.so.1") # vivox's sdk expects this soname
try:
self.path("libfmodex64-*.so")
self.path("libfmodex64.so")
@ -1851,8 +1780,6 @@ class Linux_x86_64_Manifest(LinuxManifest):
print "Skipping libfmodex.so - not found"
pass
self.end_prefix("lib")
self.prefix(src="../packages/lib/release/x64", dst="lib")
try:
self.path("libLeap.so")
@ -1860,17 +1787,14 @@ class Linux_x86_64_Manifest(LinuxManifest):
print "Leap Motion library not found"
self.end_prefix("lib")
if self.prefix(src="", dst="bin"):
with self.prefix(src="", dst="bin"):
self.path2basename("../llplugin/slplugin", "SLPlugin")
self.end_prefix("bin") # support file for valgrind debug tool
# plugins
if self.prefix(src="", dst="bin/llplugin"):
with self.prefix(src="", dst="bin/llplugin"):
self.path2basename("../media_plugins/webkit", "libmedia_plugin_webkit.so")
self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so")
self.end_prefix("bin/llplugin")
self.path("secondlife-i686.supp")
################################################################