From e48c70392cffb047c7471221b7c6fcbf32d41d06 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Wed, 30 Mar 2016 11:41:29 -0700 Subject: SL-321: prototype python launcher --- indra/newview/viewer_manifest.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index f7992dba90..60042706e4 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -703,6 +703,8 @@ class Darwin_i386_Manifest(ViewerManifest): if self.prefix(dst="MacOS"): self.path2basename("../viewer_components/updater/scripts/darwin", "*.py") + #this copies over the python wrapper script, see SL-322 + self.path2basename("../viewer_components/manager","SL_Launcher") self.end_prefix() # most everything goes in the Resources directory @@ -885,12 +887,6 @@ class Darwin_i386_Manifest(ViewerManifest): self.run_command('strip -S %(viewer_binary)r' % { 'viewer_binary' : self.dst_path_of('Contents/MacOS/Second Life')}) - def copy_finish(self): - # Force executable permissions to be set for scripts - # see CHOP-223 and http://mercurial.selenic.com/bts/issue1802 - for script in 'Contents/MacOS/update_install.py',: - self.run_command("chmod +x %r" % os.path.join(self.get_dst_prefix(), script)) - def package_finish(self): global CHANNEL_VENDOR_BASE # MBW -- If the mounted volume name changes, it breaks the .DS_Store's background image and icon positioning. @@ -1091,12 +1087,6 @@ class LinuxManifest(ViewerManifest): self.path("featuretable_linux.txt") - def copy_finish(self): - # Force executable permissions to be set for scripts - # see CHOP-223 and http://mercurial.selenic.com/bts/issue1802 - for script in 'secondlife', 'bin/update_install': - self.run_command("chmod +x %r" % os.path.join(self.get_dst_prefix(), script)) - def package_finish(self): installer_name = self.installer_base_name() -- cgit v1.2.3 From c1951b49a6e6f625a4b5894313f98f57443b94c8 Mon Sep 17 00:00:00 2001 From: "coyot@coyot-sager-PC" Date: Thu, 7 Apr 2016 16:04:24 +0100 Subject: SL-321: Changes for VMP Windows Prototype --- indra/newview/viewer_manifest.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 60042706e4..f56dcd3f34 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -338,6 +338,8 @@ class Windows_i686_Manifest(ViewerManifest): if self.is_packaging_viewer(): # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) + # include the compiled launcher script so that it gets included in the file_list + self.path(src='%s/SL_Launcher.exe' % self.args['configuration'], dst="SL_Launcher.exe") # Plugin host application self.path2basename(os.path.join(os.pardir, @@ -611,7 +613,7 @@ class Windows_i686_Manifest(ViewerManifest): substitution_strings['installer_file'] = installer_file version_vars = """ - !define INSTEXE "%(final_exe)s" + !define INSTEXE "SL_Launcher.exe" !define VERSION "%(version_short)s" !define VERSION_LONG "%(version)s" !define VERSION_DASHES "%(version_dashes)s" -- cgit v1.2.3 From b50df60aa180e904aa0733bb60cef91cf9df6ff6 Mon Sep 17 00:00:00 2001 From: callum_linden Date: Thu, 21 Apr 2016 16:13:39 -0700 Subject: DRTVWR-418 remove vestiges of TCMALLOC and GooglePerfTools from the viewer --- indra/newview/viewer_manifest.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 1c77cf805e..22b0e1ffc1 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -378,10 +378,7 @@ class Windows_i686_Manifest(ViewerManifest): print "Skipping fmodex audio library(assuming other audio engine)" # For textures - if self.args['configuration'].lower() == 'debug': - self.path("openjpegd.dll") - else: - self.path("openjpeg.dll") + self.path("openjpeg.dll") # These need to be installed as a SxS assembly, currently a 'private' assembly. # See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx -- cgit v1.2.3 From c68def40b15c3f2a24f9ea6f5703a3513875f608 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Mon, 23 May 2016 10:31:09 -0700 Subject: debug print statement to be removed later --- indra/newview/viewer_manifest.py | 1 + 1 file changed, 1 insertion(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 2c694132ea..d91faddb1a 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -116,6 +116,7 @@ class ViewerManifest(LLManifest): settings_install['CmdLineChannel'] = settings_template['CmdLineChannel'].copy() settings_install['CmdLineChannel']['Value'] = self.channel_with_pkg_suffix() print "Set CmdLineChannel in settings_install.xml to '%s'" % self.channel_with_pkg_suffix() + print "COYOT: channel set or not: %s" % self.channel_with_pkg_suffix() if 'grid' in self.args and self.args['grid']: settings_install['CmdLineGridChoice'] = settings_template['CmdLineGridChoice'].copy() -- cgit v1.2.3 From 9908fcf4ac43537728d1b34e30650735cfb36147 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Wed, 25 May 2016 07:51:58 -0700 Subject: Backed out changeset 9adcab4d611b --- indra/newview/viewer_manifest.py | 1 - 1 file changed, 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index d91faddb1a..2c694132ea 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -116,7 +116,6 @@ class ViewerManifest(LLManifest): settings_install['CmdLineChannel'] = settings_template['CmdLineChannel'].copy() settings_install['CmdLineChannel']['Value'] = self.channel_with_pkg_suffix() print "Set CmdLineChannel in settings_install.xml to '%s'" % self.channel_with_pkg_suffix() - print "COYOT: channel set or not: %s" % self.channel_with_pkg_suffix() if 'grid' in self.args and self.args['grid']: settings_install['CmdLineGridChoice'] = settings_template['CmdLineGridChoice'].copy() -- cgit v1.2.3 From adc67912d097aa032b7e7e76f6e87e8e6c54525e Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Wed, 13 Jul 2016 09:37:53 -0700 Subject: include manager directory in viewer manifest, not CMake --- indra/newview/viewer_manifest.py | 1 + 1 file changed, 1 insertion(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index f476adda4f..9194a2161a 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -714,6 +714,7 @@ class Darwin_i386_Manifest(ViewerManifest): self.path2basename("../viewer_components/updater/scripts/darwin", "*.py") #this copies over the python wrapper script, see SL-322 self.path2basename("../viewer_components/manager","SL_Launcher") + self.path2basename("../viewer_components/manager","*.py") self.end_prefix() # most everything goes in the Resources directory -- cgit v1.2.3 From 68832f56ba09541f01a246574b141e3ab5fb62b8 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Thu, 14 Jul 2016 08:37:23 -0700 Subject: add dependent modules --- indra/newview/viewer_manifest.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 9194a2161a..ac9b8d8ebe 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -712,9 +712,11 @@ class Darwin_i386_Manifest(ViewerManifest): if self.prefix(dst="MacOS"): self.path2basename("../viewer_components/updater/scripts/darwin", "*.py") - #this copies over the python wrapper script, see SL-322 + #this copies over the python wrapper script and associated utilities, see SL-321, SL-322 and SL-323 self.path2basename("../viewer_components/manager","SL_Launcher") self.path2basename("../viewer_components/manager","*.py") + self.path2basename("../viewer_components/manager/base","*py") + self.path2basename("../viewer_components/manager/util","*py") self.end_prefix() # most everything goes in the Resources directory -- cgit v1.2.3 From 4428ee77c29fb2e0af50bf6d650abfeb33329b3f Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Thu, 21 Jul 2016 10:18:58 -0700 Subject: SL-323: make changes to include llbase as an autobuild pkg, undelete files that will be deleted with MAINT-6585 and no need to copy local files in viewer-manifest. --- indra/newview/viewer_manifest.py | 2 -- 1 file changed, 2 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index ac9b8d8ebe..d3ab05b9bd 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -715,8 +715,6 @@ class Darwin_i386_Manifest(ViewerManifest): #this copies over the python wrapper script and associated utilities, see SL-321, SL-322 and SL-323 self.path2basename("../viewer_components/manager","SL_Launcher") self.path2basename("../viewer_components/manager","*.py") - self.path2basename("../viewer_components/manager/base","*py") - self.path2basename("../viewer_components/manager/util","*py") self.end_prefix() # most everything goes in the Resources directory -- cgit v1.2.3 From 1224697a40a469bebd794c5816d6cc9c34e1000a Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Fri, 22 Jul 2016 13:23:59 -0700 Subject: SL-323: Changes to viewer manifest to move llbase to where Launcher can find them --- indra/newview/viewer_manifest.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index d3ab05b9bd..aaad79387f 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -355,7 +355,7 @@ class Windows_i686_Manifest(ViewerManifest): 'llplugin', 'slplugin', self.args['configuration']), "slplugin.exe") - self.path2basename("../viewer_components/updater/scripts/windows", "update_install.bat") + #note, launcher and friends do not need viewer_manifest in Windows as the scripts are compiled into executables # Get shared libs from the shared libs staging directory if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']), dst=""): @@ -712,9 +712,10 @@ class Darwin_i386_Manifest(ViewerManifest): if self.prefix(dst="MacOS"): self.path2basename("../viewer_components/updater/scripts/darwin", "*.py") - #this copies over the python wrapper script and associated utilities, see SL-321, SL-322 and SL-323 + #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323 self.path2basename("../viewer_components/manager","SL_Launcher") self.path2basename("../viewer_components/manager","*.py") + self.path2basename("../../../../../packages/llbase","*") self.end_prefix() # most everything goes in the Resources directory @@ -1067,7 +1068,10 @@ class LinuxManifest(ViewerManifest): self.path("secondlife-bin","do-not-directly-run-secondlife-bin") self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin") self.path2basename("../llplugin/slplugin", "SLPlugin") - self.path2basename("../viewer_components/updater/scripts/linux", "update_install") + #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323 + self.path2basename("../viewer_components/manager","SL_Launcher") + self.path2basename("../viewer_components/manager","*.py") + self.path2basename("../packages/llbase","*") self.end_prefix("bin") if self.prefix("res-sdl"): -- cgit v1.2.3 From f44829f2aefe8c5fae9fba6bb838500719e1067e Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Wed, 27 Jul 2016 15:44:56 -0700 Subject: SL-321: basic launcher/updater integration test fixes --- indra/newview/viewer_manifest.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index aaad79387f..3572b7dba8 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -27,6 +27,7 @@ Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA $/LicenseInfo$ """ import sys +import os import os.path import shutil import errno @@ -702,6 +703,7 @@ class Darwin_i386_Manifest(ViewerManifest): pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") + llbasedir = os.path.join(pkgdir, os.pardir) if self.prefix(src="", dst="Contents"): # everything goes in Contents self.path("Info.plist", dst="Info.plist") @@ -715,8 +717,14 @@ class Darwin_i386_Manifest(ViewerManifest): #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323 self.path2basename("../viewer_components/manager","SL_Launcher") self.path2basename("../viewer_components/manager","*.py") - self.path2basename("../../../../../packages/llbase","*") - self.end_prefix() + 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"): + self.path2basename("../packages/llbase","*.py") + self.path2basename("../packages/llbase","_cllsd.so") + self.end_prefix() + self.end_prefix() # most everything goes in the Resources directory if self.prefix(src="", dst="Resources"): @@ -1071,7 +1079,13 @@ class LinuxManifest(ViewerManifest): #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323 self.path2basename("../viewer_components/manager","SL_Launcher") self.path2basename("../viewer_components/manager","*.py") - self.path2basename("../packages/llbase","*") + 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"): + self.path2basename("../packages/llbase","*.py") + self.path2basename("../packages/llbase","_cllsd.so") + self.end_prefix() self.end_prefix("bin") if self.prefix("res-sdl"): -- cgit v1.2.3 From 7f78051620743a8fb6c3797255f8f12444c3eb5b Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Thu, 28 Jul 2016 11:04:35 -0700 Subject: SL-321: fix viewer_manifest to not run strip on python files in the Linux build --- indra/newview/viewer_manifest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 3572b7dba8..502c054730 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -1155,7 +1155,8 @@ class LinuxManifest(ViewerManifest): def strip_binaries(self): if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer(): print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" - self.run_command(r"find %(d)r/bin %(d)r/lib -type f \! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure + # makes some small assumptions about our packaged dir structure + self.run_command(r"find %(d)r/bin %(d)r/lib -type f \! -name \*.py \! -name SL_Launcher \! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) class Linux_i686_Manifest(LinuxManifest): def construct(self): -- cgit v1.2.3 From 3e55d8c77a21977f4023a82ebef3fed9879247bc Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Wed, 17 Aug 2016 08:20:12 -0700 Subject: SL-323: add icon support for macs, text flow in Tkinter windows --- indra/newview/viewer_manifest.py | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 502c054730..03a727468e 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -767,6 +767,12 @@ class Darwin_i386_Manifest(ViewerManifest): self.path("uk.lproj") self.path("zh-Hans.lproj") + #VMP icons + if self.prefix("vmp_icons"): + self.path("*.png") + self.path("*.gif") + self.end_prefix("vmp_icons") + def path_optional(src, dst): """ For a number of our self.path() calls, not only do we want -- cgit v1.2.3 From 9c5332b301c0e17cd0133944670f79fd485cf7fe Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Mon, 6 Mar 2017 14:43:57 -0800 Subject: SL-321: reintegration of autobuild as package, build changes for mac integration --- indra/newview/viewer_manifest.py | 46 +++++++++++++++------------------------- 1 file changed, 17 insertions(+), 29 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 35d63c33fc..1dc178dcf8 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -223,7 +223,7 @@ class ViewerManifest(LLManifest): return channel_type def channel_variant_app_suffix(self): - # get any part of the compiled channel name after the CHANNEL_VENDOR_BASE + # get any part of the channel name after the CHANNEL_VENDOR_BASE suffix=self.channel_variant() # by ancient convention, we don't use Release in the app name if self.channel_type() == 'release': @@ -346,15 +346,12 @@ class WindowsManifest(ViewerManifest): if self.is_packaging_viewer(): # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) - # include the compiled launcher script so that it gets included in the file_list - self.path(src='%s/SL_Launcher.exe' % self.args['configuration'], dst="SL_Launcher.exe") # Plugin host application self.path2basename(os.path.join(os.pardir, 'llplugin', 'slplugin', self.args['configuration']), "slplugin.exe") - #note, launcher and friends do not need viewer_manifest in Windows as the scripts are compiled into executables # Get shared libs from the shared libs staging directory if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']), dst=""): @@ -709,28 +706,29 @@ class DarwinManifest(ViewerManifest): pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") - llbasedir = os.path.join(pkgdir, os.pardir) + vmpdir = os.path.join(pkgdir, "VMP") + llbasedir = os.path.join(pkgdir, "VMP") if self.prefix(src="", dst="Contents"): # everything goes in Contents self.path("Info.plist", dst="Info.plist") # copy additional libs in /Contents/MacOS/ self.path(os.path.join(relpkgdir, "libndofdev.dylib"), dst="Resources/libndofdev.dylib") - self.path(os.path.join(relpkgdir, "libhunspell-1.3.0.dylib"), dst="Resources/libhunspell-1.3.0.dylib") + self.path(os.path.join(relpkgdir, "libhunspell-1.3.0.dylib"), dst="Resources/libhunspell-1.3.0.dylib") if self.prefix(dst="MacOS"): - self.path2basename("../viewer_components/updater/scripts/darwin", "*.py") #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323 - self.path2basename("../viewer_components/manager","SL_Launcher") - self.path2basename("../viewer_components/manager","*.py") + self.path2basename(vmpdir,"SL_Launcher") + self.path2basename(vmpdir,"*.py") llbase_path = os.path.join(self.get_dst_prefix(),'llbase') if not os.path.exists(llbase_path): os.makedirs(llbase_path) + #before, we only needed llbase at build time. With VMP, we need it at run time. if self.prefix(dst="llbase"): - self.path2basename("../packages/llbase","*.py") - self.path2basename("../packages/llbase","_cllsd.so") + self.path2basename(llbasedir,"*.py") + self.path2basename(llbasedir,"_cllsd.so") self.end_prefix() - self.end_prefix() + self.end_prefix() # most everything goes in the Resources directory if self.prefix(src="", dst="Resources"): @@ -749,6 +747,12 @@ class DarwinManifest(ViewerManifest): self.path("secondlife.icns") self.end_prefix(icon_path) + #VMP Tkinter icons + if self.prefix("vmp_icons"): + self.path("*.png") + self.path("*.gif") + self.end_prefix("vmp_icons") + self.path("SecondLife.nib") # Translations @@ -773,12 +777,6 @@ class DarwinManifest(ViewerManifest): self.path("uk.lproj") self.path("zh-Hans.lproj") - #VMP icons - if self.prefix("vmp_icons"): - self.path("*.png") - self.path("*.gif") - self.end_prefix("vmp_icons") - def path_optional(src, dst): """ For a number of our self.path() calls, not only do we want @@ -1145,17 +1143,7 @@ class LinuxManifest(ViewerManifest): if self.prefix(src="", dst="bin"): self.path("secondlife-bin","do-not-directly-run-secondlife-bin") self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin") - self.path2basename("../llplugin/slplugin", "SLPlugin") - #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323 - self.path2basename("../viewer_components/manager","SL_Launcher") - self.path2basename("../viewer_components/manager","*.py") - 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"): - self.path2basename("../packages/llbase","*.py") - self.path2basename("../packages/llbase","_cllsd.so") - self.end_prefix() + self.path2basename("../llplugin/slplugin", "SLPlugin") self.end_prefix("bin") if self.prefix("res-sdl"): -- cgit v1.2.3 From cf8dc0d97a2a34c038d1bedc5d0fd7a1badbcd86 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Tue, 7 Mar 2017 15:05:42 -0800 Subject: SL-321: reintegration of autobuild as package, build changes for linux and windows integration --- indra/newview/viewer_manifest.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 1dc178dcf8..8c51719031 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -346,6 +346,13 @@ class WindowsManifest(ViewerManifest): if self.is_packaging_viewer(): # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) + # include the compiled launcher scripts so that it gets included in the file_list + self.path(src='%s/apply_update.exe' % self.args['configuration'], dst="apply_update.exe") + self.path(src='%s/download_update.exe' % self.args['configuration'], dst="download_update.exe") + self.path(src='%s/SL_Launcher.exe' % self.args['configuration'], dst="SL_Launcher.exe") + self.path(src='%s/update_manager.exe' % self.args['configuration'], dst="update_manager.exe") + #IUM is not normally executed directly, just imported. No exe needed. + self.path2basename("../viewer_components/manager","InstallerUserMessage.py") # Plugin host application self.path2basename(os.path.join(os.pardir, @@ -677,7 +684,17 @@ class WindowsManifest(ViewerManifest): if not python or python == "${PYTHON}": python = 'python' if os.path.exists(sign_py): + print "about to run signing of: ", self.dst_path_of(installer_file).replace('\\', '\\\\\\\\') self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of(installer_file).replace('\\', '\\\\\\\\'))) + #Unlike the viewer binary, the VMP filenames are invariant with respect to version, os, etc. + print "about to run signing of: ", self.dst_path_of("apply_update.exe").replace('\\', '\\\\\\\\') + self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("apply_update.exe").replace('\\', '\\\\\\\\'))) + print "about to run signing of: ", self.dst_path_of("download_update.exe").replace('\\', '\\\\\\\\') + self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("download_update.exe").replace('\\', '\\\\\\\\'))) + print "about to run signing of: ", self.dst_path_of("SL_Launcher.exe").replace('\\', '\\\\\\\\') + self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("SL_Launcher.exe").replace('\\', '\\\\\\\\'))) + print "about to run signing of: ", self.dst_path_of("update_manager.exe").replace('\\', '\\\\\\\\') + self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("update_manager.exe").replace('\\', '\\\\\\\\'))) else: print "Skipping code signing,", sign_py, "does not exist" self.created_path(self.dst_path_of(installer_file)) @@ -1143,7 +1160,16 @@ class LinuxManifest(ViewerManifest): if self.prefix(src="", dst="bin"): self.path("secondlife-bin","do-not-directly-run-secondlife-bin") self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin") - self.path2basename("../llplugin/slplugin", "SLPlugin") + self.path2basename("../llplugin/slplugin", "SLPlugin") + #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323 + self.path2basename("../viewer_components/manager","SL_Launcher") + self.path2basename("../viewer_components/manager","*.py") + 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"): + self.path2basename("../packages/llbase","*.py") + self.path2basename("../packages/llbase","_cllsd.so") self.end_prefix("bin") if self.prefix("res-sdl"): -- cgit v1.2.3 From c69db33ded0a860060a9702495cfcddc26008d09 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Wed, 8 Mar 2017 12:34:11 -0800 Subject: SL-321: fix windows pathing, add icons --- indra/newview/viewer_manifest.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 8c51719031..4fbdc52e30 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -342,17 +342,23 @@ class WindowsManifest(ViewerManifest): pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") + vmpdir = os.path.join(pkgdir, "VMP") if self.is_packaging_viewer(): # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) # include the compiled launcher scripts so that it gets included in the file_list - self.path(src='%s/apply_update.exe' % self.args['configuration'], dst="apply_update.exe") - self.path(src='%s/download_update.exe' % self.args['configuration'], dst="download_update.exe") - self.path(src='%s/SL_Launcher.exe' % self.args['configuration'], dst="SL_Launcher.exe") - self.path(src='%s/update_manager.exe' % self.args['configuration'], dst="update_manager.exe") + 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("../viewer_components/manager","InstallerUserMessage.py") + self.path2basename(vmpdir,"InstallerUserMessage.py") + #VMP Tkinter icons + if self.prefix("vmp_icons"): + self.path("*.png") + self.path("*.gif") + self.end_prefix("vmp_icons") # Plugin host application self.path2basename(os.path.join(os.pardir, -- cgit v1.2.3 From 2e011225754192cc35af8438d898da55a8596904 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Thu, 9 Mar 2017 10:28:16 -0800 Subject: SL-321: add local llbase support for Windows --- indra/newview/viewer_manifest.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 4fbdc52e30..da641e920c 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -343,23 +343,36 @@ class WindowsManifest(ViewerManifest): relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") vmpdir = os.path.join(pkgdir, "VMP") + llbasedir = os.path.join(pkgdir, "VMP") if self.is_packaging_viewer(): # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) + # 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") + #VMP Tkinter icons if 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"): + self.path2basename(llbasedir,"*.py") + self.path2basename(llbasedir,"_cllsd.so") + self.end_prefix() + # Plugin host application self.path2basename(os.path.join(os.pardir, 'llplugin', 'slplugin', self.args['configuration']), -- cgit v1.2.3 From 8cbaaa364f6bfd01aeb4280689e2f883a5ffed53 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Fri, 10 Mar 2017 09:23:35 -0800 Subject: SL-321: add new VMP package, fix llbase path --- indra/newview/viewer_manifest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index da641e920c..60ee7728ab 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -343,7 +343,7 @@ class WindowsManifest(ViewerManifest): relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") vmpdir = os.path.join(pkgdir, "VMP") - llbasedir = os.path.join(pkgdir, "VMP") + llbasedir = os.path.join(pkgdir, "llbase") if self.is_packaging_viewer(): # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. @@ -743,7 +743,7 @@ class DarwinManifest(ViewerManifest): relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") vmpdir = os.path.join(pkgdir, "VMP") - llbasedir = os.path.join(pkgdir, "VMP") + llbasedir = os.path.join(pkgdir, "llbase") if self.prefix(src="", dst="Contents"): # everything goes in Contents self.path("Info.plist", dst="Info.plist") -- cgit v1.2.3 From 5cb34738574f6dff15a51258dbf4fc43b57099ae Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Tue, 21 Mar 2017 13:58:22 -0700 Subject: SL-321 MAINT-7192: add viewer bitness VMM fetch logic to VMP, including HD Graphcis test --- indra/newview/viewer_manifest.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index af97bb4728..770567f13d 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -121,6 +121,24 @@ class ViewerManifest(LLManifest): settings_install['CmdLineGridChoice']['Value'] = self.grid() print "Set CmdLineGridChoice in settings_install.xml to '%s'" % self.grid() + #do not need to test for existence. If no platform is passed, llmanifest computes a default in get_default_platform + #the choice of value names (lnx, mac, win32, win) is dictated by the VMM API + summary_json_platform = "" + if 'linux' in self.args['platform']: + summary_json_platform = 'lnx' + elif 'darwin' in self.args['platform']: + summary_json_platform = 'mac' + elif 'windows' in self.args['platform']: + #default case + summary_json_platform = 'win' + if 'arch' in self.args and self.args['arch']: + if 'i686' in self.args['arch']: + summary_json_platform = 'win32' + #we really shouldn't be here, something is very wrong at this point + else: + summary_json_platform = 'None' + + # put_in_file(src=) need not be an actual pathname; it # only needs to be non-empty self.put_in_file(llsd.format_pretty_xml(settings_install), @@ -184,7 +202,10 @@ class ViewerManifest(LLManifest): self.path("gpu_table.txt") #summary.json. Standard with exception handling is fine. If we can't open a new file for writing, we have worse problems - summary_dict = {"Type":"viewer","Version":'.'.join(self.args['version']),"Channel":self.channel_with_pkg_suffix()} + #platform is computed above with other arg parsing + summary_dict = {"Type":"viewer","Version":'.'.join(self.args['version']), + "Channel":self.channel_with_pkg_suffix(), + "Platform":summary_json_platform} with open(os.path.join(os.pardir,'summary.json'), 'w') as summary_handle: json.dump(summary_dict,summary_handle) -- cgit v1.2.3 From 92d7eaaf07f3b764a9c626c148a2a5652df590ad Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 17 Nov 2016 17:50:55 -0500 Subject: DRTVWR-418: Provide Darwin_i686_Manifest alias to Darwin_i386_Manifest. It's never been clear to me why Macs tend to refer to 32-bit Intel processors as i386 when other platforms tend to refer to them as i686. New CMake logic to derive ARCH from ADDRESS_SIZE produces i686. Give viewer_manifest.py a Darwin_i686_Manifest class alias so it continues to work when arch is passed as i686 as well as i386. --- indra/newview/viewer_manifest.py | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 29751edfac..1b6e8c9747 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -1049,6 +1049,10 @@ class Darwin_i386_Manifest(ViewerManifest): self.package_file = finalname self.remove(sparsename) +class Darwin_i686_Manifest(Darwin_i386_Manifest): + """alias in case arch is passed as i686 instead of i386""" + pass + class LinuxManifest(ViewerManifest): def construct(self): super(LinuxManifest, self).construct() -- cgit v1.2.3 From a47e16b3169b2fd91faf7a4dbfbba1f305298bce Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 30 Nov 2016 16:48:38 -0500 Subject: DRTVWR-418: Flesh out the set of Platform_arch_Manifest classes. --- indra/newview/viewer_manifest.py | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 1b6e8c9747..589d74a014 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -287,7 +287,8 @@ class ViewerManifest(LLManifest): random.shuffle(names) return ', '.join(names) -class Windows_i686_Manifest(ViewerManifest): + +class WindowsManifest(ViewerManifest): def final_exe(self): return self.app_name_oneword()+".exe" @@ -338,7 +339,7 @@ class Windows_i686_Manifest(ViewerManifest): print "Doesn't exist:", src def construct(self): - super(Windows_i686_Manifest, self).construct() + super(WindowsManifest, self).construct() pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') relpkgdir = os.path.join(pkgdir, "lib", "release") @@ -696,7 +697,17 @@ class Windows_i686_Manifest(ViewerManifest): self.package_file = installer_file -class Darwin_i386_Manifest(ViewerManifest): +class Windows_i686_Manifest(WindowsManifest): + # specialize when we must + pass + + +class Windows_x86_64_Manifest(WindowsManifest): + # specialize when we must + pass + + +class DarwinManifest(ViewerManifest): def is_packaging_viewer(self): # darwin requires full app bundle packaging even for debugging. return True @@ -722,7 +733,7 @@ class Darwin_i386_Manifest(ViewerManifest): # most everything goes in the Resources directory if self.prefix(src="", dst="Resources"): - super(Darwin_i386_Manifest, self).construct() + super(DarwinManifest, self).construct() if self.prefix("cursors_mac"): self.path("*.tif") @@ -1049,10 +1060,20 @@ class Darwin_i386_Manifest(ViewerManifest): self.package_file = finalname self.remove(sparsename) -class Darwin_i686_Manifest(Darwin_i386_Manifest): + +class Darwin_i386_Manifest(DarwinManifest): + pass + + +class Darwin_i686_Manifest(DarwinManifest): """alias in case arch is passed as i686 instead of i386""" pass + +class Darwin_x86_64_Manifest(DarwinManifest): + pass + + class LinuxManifest(ViewerManifest): def construct(self): super(LinuxManifest, self).construct() -- cgit v1.2.3 From 911cd64e60ac7ee7805534ec42e1ef006adf9a46 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Mon, 5 Dec 2016 13:00:50 -0500 Subject: lower the verbosity of makensis to emit only warnings and errors --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 589d74a014..d9c4cf1b9e 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -669,7 +669,7 @@ class WindowsManifest(ViewerManifest): while (not installer_created) and (nsis_attempts > 0): try: nsis_attempts-=1; - self.run_command('"' + NSIS_path + '" ' + self.dst_path_of(tempfile)) + self.run_command('"' + NSIS_path + '" /V2 ' + self.dst_path_of(tempfile)) installer_created=True # if no exception was raised, the codesign worked except ManifestError, err: if nsis_attempts: -- cgit v1.2.3 From 004cd151ff068d348a24127dbeb33696d00d2748 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Mon, 5 Dec 2016 12:24:00 -0800 Subject: update copying of fmodex{64}.dll to right place for 32/64 bit builds --- indra/newview/viewer_manifest.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 589d74a014..ef93ad1ac1 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -379,8 +379,8 @@ class WindowsManifest(ViewerManifest): # Get fmodex dll, continue if missing try: - if self.args['configuration'].lower() == 'debug': - self.path("fmodexL.dll") + if(self.args['arch'].lower() == 'x86_64'): + self.path("fmodex64.dll") else: self.path("fmodex.dll") except: @@ -432,11 +432,6 @@ class WindowsManifest(ViewerManifest): self.path("featuretable.txt") self.path("featuretable_xp.txt") - # Media plugins - QuickTime - if self.prefix(src='../media_plugins/quicktime/%s' % self.args['configuration'], dst="llplugin"): - self.path("media_plugin_quicktime.dll") - self.end_prefix() - # Media plugins - CEF if self.prefix(src='../media_plugins/cef/%s' % self.args['configuration'], dst="llplugin"): self.path("media_plugin_cef.dll") @@ -447,11 +442,6 @@ class WindowsManifest(ViewerManifest): self.path("media_plugin_libvlc.dll") self.end_prefix() - # winmm.dll shim - if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst=""): - self.path("winmm.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"): -- cgit v1.2.3 From 2906a61a93548eb56e217dda356a2889e913fe34 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Fri, 9 Dec 2016 10:20:59 -0500 Subject: remove non-functional attempt to load llbase from the viewer tree; it is not there any more --- indra/newview/viewer_manifest.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 814eee202d..a8049d874d 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -41,10 +41,7 @@ viewer_dir = os.path.dirname(__file__) # indra.util.llmanifest under their system Python! sys.path.insert(0, os.path.join(viewer_dir, os.pardir, "lib", "python")) from indra.util.llmanifest import LLManifest, main, path_ancestors, CHANNEL_VENDOR_BASE, RELEASE_CHANNEL, ManifestError -try: - from llbase import llsd -except ImportError: - from indra.base import llsd +from llbase import llsd class ViewerManifest(LLManifest): def is_packaging_viewer(self): -- cgit v1.2.3 From a1a395b6798f941969220f8a27cf927adafcba73 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 20 Dec 2016 15:42:57 -0500 Subject: DRTVWR-418: Make viewer_manifest.py copy current libexpat.1.dylib. --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index a8049d874d..1a68bb0173 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -788,7 +788,7 @@ class DarwinManifest(ViewerManifest): "libapr-1.0.dylib", "libaprutil-1.0.dylib", "libcollada14dom.dylib", - "libexpat.1.5.2.dylib", + "libexpat.1.dylib", "libexception_handler.dylib", "libGLOD.dylib", ): -- cgit v1.2.3 From e575abe99f15adba967342ad3646ba57040c778e Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 20 Dec 2016 16:44:51 -0500 Subject: DRTVWR-418: Create CEF framework symlink from LLCefLib Helper.app. Without that symlink, the helper app can't find CEF and we get no web content. --- indra/newview/viewer_manifest.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 1a68bb0173..f259826443 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -846,6 +846,14 @@ class DarwinManifest(ViewerManifest): self.path2basename(relpkgdir, helperappfile) pluginframeworkpath = self.dst_path_of('Chromium Embedded Framework.framework'); + # Putting a Frameworks directory under Contents/MacOS + # isn't canonical, but the path baked into LLCefLib + # Helper.app/Contents/MacOS/LLCefLib Helper is: + # @executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework + # (notice, not @executable_path/../Frameworks/etc.) + # So we'll create a symlink (below) from there back to the + # Frameworks directory nested under SLPlugin.app. + helperframeworkpath = self.dst_path_of('LLCefLib Helper.app/Contents/MacOS/Frameworks') self.end_prefix() @@ -879,11 +887,21 @@ class DarwinManifest(ViewerManifest): # Real Frameworks folder, with the symlink inside the bundled SLPlugin.app (and why it's relative) # .app/Contents/Frameworks/Chromium Embedded Framework.framework/ # .app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework -> - frameworkpath = os.path.join(os.pardir, os.pardir, os.pardir, os.pardir, "Frameworks", "Chromium Embedded Framework.framework") + frameworkdir = os.path.join(os.pardir, os.pardir, os.pardir, os.pardir, "Frameworks") + frameworkpath = os.path.join(frameworkdir, "Chromium Embedded Framework.framework") try: - symlinkf(frameworkpath, pluginframeworkpath) + # 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/LLCefLib + # Helper.app/Contents/MacOS/Frameworks back to + # SLPlugin.app/Contents/Frameworks + origin, target = helperframeworkpath, frameworkdir + symlinkf(target, origin) except OSError as err: - print "Can't symlink %s -> %s: %s" % (frameworkpath, pluginframeworkpath, err) + print "Can't symlink %s -> %s: %s" % (origin, target, err) raise self.end_prefix("Contents") -- cgit v1.2.3 From 1cbdfce396f165ab3ac18373901c0563088202df Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 20 Dec 2016 21:27:40 -0500 Subject: DRTVWR-418: Avoid constructing symlink cycle for CEF framework. --- indra/newview/viewer_manifest.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index f259826443..89c98a1cb3 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -853,7 +853,9 @@ class DarwinManifest(ViewerManifest): # (notice, not @executable_path/../Frameworks/etc.) # So we'll create a symlink (below) from there back to the # Frameworks directory nested under SLPlugin.app. - helperframeworkpath = self.dst_path_of('LLCefLib Helper.app/Contents/MacOS/Frameworks') + helperframeworkpath = \ + self.dst_path_of('LLCefLib Helper.app/Contents/MacOS/' + 'Frameworks/Chromium Embedded Framework.framework') self.end_prefix() @@ -882,13 +884,20 @@ class DarwinManifest(ViewerManifest): # 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'ds relative + # 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) # .app/Contents/Frameworks/Chromium Embedded Framework.framework/ # .app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework -> - frameworkdir = os.path.join(os.pardir, os.pardir, os.pardir, os.pardir, "Frameworks") - frameworkpath = os.path.join(frameworkdir, "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 @@ -896,9 +905,12 @@ class DarwinManifest(ViewerManifest): origin, target = pluginframeworkpath, frameworkpath symlinkf(target, origin) # from SLPlugin.app/Contents/Frameworks/LLCefLib - # Helper.app/Contents/MacOS/Frameworks back to - # SLPlugin.app/Contents/Frameworks - origin, target = helperframeworkpath, frameworkdir + # 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) -- cgit v1.2.3 From dcae92c0a306aaf6447089b340913d4a678855ac Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Fri, 27 Jan 2017 15:47:16 -0800 Subject: First batch of changes to add LibVLC media plugin to macOS viewer. Plugin fails to start because of an as-yet undiagnosed issue with VLC plugin files related to their extyended attributes --- indra/newview/viewer_manifest.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 89c98a1cb3..6fb9479564 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -861,10 +861,24 @@ class DarwinManifest(ViewerManifest): # SLPlugin plugins if self.prefix(src="", dst="llplugin"): - self.path2basename("../media_plugins/quicktime/" + self.args['configuration'], - "media_plugin_quicktime.dylib") self.path2basename("../media_plugins/cef/" + self.args['configuration'], "media_plugin_cef.dylib") + + # copy LibVLC plugin itself + self.path2basename("../media_plugins/libvlc/" + self.args['configuration'], + "media_plugin_libvlc.dylib") + + # copy LibVLC dynamic libraries + if 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="plugins"): + self.path( "lib*_plugin.dylib" ) + self.path( "plugins.dat" ) + self.end_prefix() + self.end_prefix("llplugin") self.end_prefix("Resources") -- cgit v1.2.3 From ac9777bd8eed3899c48ba203d88911085c09e65a Mon Sep 17 00:00:00 2001 From: "callum@lindenlab.com" Date: Fri, 3 Feb 2017 16:25:33 -0800 Subject: Change destination location of updated VLC files to correct one --- indra/newview/viewer_manifest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 6fb9479564..d68c01351f 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -874,8 +874,8 @@ class DarwinManifest(ViewerManifest): self.end_prefix() # copy LibVLC plugins folder - if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release', 'plugins' ), dst="plugins"): - self.path( "lib*_plugin.dylib" ) + if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release', 'plugins' ), dst="lib"): + self.path( "*.dylib" ) self.path( "plugins.dat" ) self.end_prefix() -- cgit v1.2.3 From 5534ab4e182b8403cf0ed514059e346d55f18162 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Tue, 21 Feb 2017 15:06:21 -0800 Subject: First round of changes to replace LLCEFLib with Dullahan. Mostly Windows changes in this batch since I'm working on Windows box but some speculative macOS ones too although they are quite untested --- indra/newview/viewer_manifest.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index d68c01351f..c5bd91e396 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -447,7 +447,7 @@ class WindowsManifest(ViewerManifest): self.path("libcef.dll") self.path("libEGL.dll") self.path("libGLESv2.dll") - self.path("llceflib_host.exe") + self.path("dullahan_host.exe") self.path("natives_blob.bin") self.path("snapshot_blob.bin") self.path("widevinecdmadapter.dll") @@ -461,7 +461,7 @@ class WindowsManifest(ViewerManifest): self.path("libcef.dll") self.path("libEGL.dll") self.path("libGLESv2.dll") - self.path("llceflib_host.exe") + self.path("dullahan_host.exe") self.path("natives_blob.bin") self.path("snapshot_blob.bin") self.path("widevinecdmadapter.dll") @@ -839,22 +839,21 @@ class DarwinManifest(ViewerManifest): except OSError as err: print "Can't symlink %s -> %s: %s" % (src, dst, err) - # LLCefLib helper apps go inside SLPlugin.app + # Dullahan helper apps go inside SLPlugin.app if self.prefix(src="", dst="SLPlugin.app/Contents/Frameworks"): - for helperappfile in ('LLCefLib Helper.app', - 'LLCefLib Helper EH.app'): + for helperappfile in ('DullahanHelper.app'): self.path2basename(relpkgdir, helperappfile) pluginframeworkpath = self.dst_path_of('Chromium Embedded Framework.framework'); # Putting a Frameworks directory under Contents/MacOS - # isn't canonical, but the path baked into LLCefLib - # Helper.app/Contents/MacOS/LLCefLib Helper is: + # isn't canonical, but the path baked into Dullahan + # Helper.app/Contents/MacOS/DullahanHelper is: # @executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework # (notice, not @executable_path/../Frameworks/etc.) # So we'll create a symlink (below) from there back to the # Frameworks directory nested under SLPlugin.app. helperframeworkpath = \ - self.dst_path_of('LLCefLib Helper.app/Contents/MacOS/' + self.dst_path_of('DullahanHelper.app/Contents/MacOS/' 'Frameworks/Chromium Embedded Framework.framework') self.end_prefix() @@ -918,7 +917,7 @@ class DarwinManifest(ViewerManifest): # Life.app/Contents/Frameworks/Chromium Embedded Framework.framework origin, target = pluginframeworkpath, frameworkpath symlinkf(target, origin) - # from SLPlugin.app/Contents/Frameworks/LLCefLib + # 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 -- cgit v1.2.3 From 08940da90ee944dd838b1db65658c39bb0aa80d4 Mon Sep 17 00:00:00 2001 From: "callum@lindenlab.com" Date: Fri, 24 Feb 2017 15:44:36 -0800 Subject: First round of changes to make the macOS 64 build work --- indra/newview/viewer_manifest.py | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index c5bd91e396..3b80f519f4 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -858,6 +858,13 @@ class DarwinManifest(ViewerManifest): self.end_prefix() + # the helper app needs to have it's @executable_path modified to point to the + # same location we drop the CEF framework shortcut + helperexecutablepath = self.dst_path_of('SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper') + self.run_command('install_name_tool -change ' + '"@executable_path/Chromium Embedded Framework" ' + '"@executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % helperexecutablepath) + # SLPlugin plugins if self.prefix(src="", dst="llplugin"): self.path2basename("../media_plugins/cef/" + self.args['configuration'], -- cgit v1.2.3 From e6ed0b0ae7b2eebeb569373ad561b182f5d9d541 Mon Sep 17 00:00:00 2001 From: "callum@lindenlab.com" Date: Wed, 8 Mar 2017 14:29:02 -0800 Subject: Second Life SL-643 viewer_manifest.py still tried to copy the CEF file wow_helper.exe but it's no longer present --- indra/newview/viewer_manifest.py | 2 -- 1 file changed, 2 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 3b80f519f4..2d868c407d 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -451,7 +451,6 @@ class WindowsManifest(ViewerManifest): self.path("natives_blob.bin") self.path("snapshot_blob.bin") self.path("widevinecdmadapter.dll") - self.path("wow_helper.exe") self.end_prefix() else: # CEF runtime files - not debug (release, relwithdebinfo etc.) @@ -465,7 +464,6 @@ class WindowsManifest(ViewerManifest): self.path("natives_blob.bin") self.path("snapshot_blob.bin") self.path("widevinecdmadapter.dll") - self.path("wow_helper.exe") self.end_prefix() # MSVC DLLs needed for CEF and have to be in same directory as plugin -- cgit v1.2.3 From 10bcd510b59fe73bf9e948de3dce9cea6d7d8b93 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Fri, 10 Mar 2017 15:11:44 -0800 Subject: MAINT-6998 [Project Alex Ivy] 64bit viewer installs to Program Files (x86) by default. --- indra/newview/viewer_manifest.py | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 2d868c407d..1b2c502729 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -631,6 +631,11 @@ class WindowsManifest(ViewerManifest): Caption "%(caption)s" """ + if(self.args['arch'].lower() == 'x86_64'): + program_files="$PROGRAMFILES64" + else: + program_files="$PROGRAMFILES32" + tempfile = "secondlife_setup_tmp.nsi" # the following replaces strings in the nsi template # it also does python-style % substitution @@ -639,6 +644,7 @@ class WindowsManifest(ViewerManifest): "%%SOURCE%%":self.get_src_prefix(), "%%INST_VARS%%":inst_vars_template % substitution_strings, "%%INSTALL_FILES%%":self.nsi_file_commands(True), + "%%$PROGRAMFILES%%":program_files, "%%DELETE_FILES%%":self.nsi_file_commands(False)}) # We use the Unicode version of NSIS, available from -- cgit v1.2.3 From 1053c5ca407917c3bc842cbcb80786d43206c5b3 Mon Sep 17 00:00:00 2001 From: "callum@lindenlab.com" Date: Sat, 11 Mar 2017 16:15:37 -0800 Subject: Update: (thanks Drake) MAINT-6998 [Project Alex Ivy] 64bit viewer installs to Program Files (x86) by default. Added option to engage 32 or 64 bit registry --- indra/newview/viewer_manifest.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 1b2c502729..7ea600f24a 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -632,8 +632,10 @@ class WindowsManifest(ViewerManifest): """ if(self.args['arch'].lower() == 'x86_64'): + registry="SetRegView 64" program_files="$PROGRAMFILES64" else: + registry="SetRegView 32" program_files="$PROGRAMFILES32" tempfile = "secondlife_setup_tmp.nsi" @@ -645,6 +647,7 @@ class WindowsManifest(ViewerManifest): "%%INST_VARS%%":inst_vars_template % substitution_strings, "%%INSTALL_FILES%%":self.nsi_file_commands(True), "%%$PROGRAMFILES%%":program_files, + "%%REGISTRY%%":registry, "%%DELETE_FILES%%":self.nsi_file_commands(False)}) # We use the Unicode version of NSIS, available from -- cgit v1.2.3 From 656457e79b47cf1dd7c34bee1e0ab98ec759f634 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Sat, 11 Mar 2017 18:01:43 -0800 Subject: MAINT-6998 [Project Alex Ivy] 64bit viewer installs to Program Files (x86) by default. (Update: call to select registry needs to be inside a function) --- indra/newview/viewer_manifest.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 7ea600f24a..743df609aa 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -632,10 +632,10 @@ class WindowsManifest(ViewerManifest): """ if(self.args['arch'].lower() == 'x86_64'): - registry="SetRegView 64" + engage_registry="SetRegView 64" program_files="$PROGRAMFILES64" else: - registry="SetRegView 32" + engage_registry="SetRegView 32" program_files="$PROGRAMFILES32" tempfile = "secondlife_setup_tmp.nsi" @@ -647,7 +647,7 @@ class WindowsManifest(ViewerManifest): "%%INST_VARS%%":inst_vars_template % substitution_strings, "%%INSTALL_FILES%%":self.nsi_file_commands(True), "%%$PROGRAMFILES%%":program_files, - "%%REGISTRY%%":registry, + "%%ENGAGEREGISTRY%%":engage_registry, "%%DELETE_FILES%%":self.nsi_file_commands(False)}) # We use the Unicode version of NSIS, available from -- cgit v1.2.3 From c1f7c00869653e50a6599cc80ab755a773fadbff Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Tue, 14 Mar 2017 12:40:25 -0700 Subject: SL-641 - Update CEF -> cef-bin -> Dullahan -> p64_3p-Dullahan -> media_plugin_cef.cpp to latest versionPull in p64_3p-dullahan that has the cef 2897/chrome 57 --- indra/newview/viewer_manifest.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 743df609aa..3dd44fb19e 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -442,6 +442,7 @@ class WindowsManifest(ViewerManifest): # CEF runtime files - debug if self.args['configuration'].lower() == 'debug': if 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") self.path("libcef.dll") @@ -455,6 +456,7 @@ class WindowsManifest(ViewerManifest): else: # CEF runtime files - not debug (release, relwithdebinfo etc.) if 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") self.path("libcef.dll") -- cgit v1.2.3 From bdecc9cce982ab35ce1d74444515f536e66d4356 Mon Sep 17 00:00:00 2001 From: "callum@lindenlab.com" Date: Wed, 15 Mar 2017 16:33:51 -0700 Subject: Next part of the 'SL-641 Update CEF -> cef-bin -> Dullahan -> p64_3p-Dullahan -> media_plugin_cef.cpp to current latest version' puzzle - fix @rpath/@executable paths for macOS --- indra/newview/viewer_manifest.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 3dd44fb19e..3a8cd0c626 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -867,11 +867,9 @@ class DarwinManifest(ViewerManifest): self.end_prefix() - # the helper app needs to have it's @executable_path modified to point to the - # same location we drop the CEF framework shortcut helperexecutablepath = self.dst_path_of('SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper') self.run_command('install_name_tool -change ' - '"@executable_path/Chromium Embedded Framework" ' + '"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" ' '"@executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % helperexecutablepath) # SLPlugin plugins @@ -896,6 +894,12 @@ class DarwinManifest(ViewerManifest): 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) + self.end_prefix("Resources") # CEF framework goes inside Second Life.app/Contents/Frameworks -- cgit v1.2.3 From 510e101627970c62a479ec01d26a26124c9c7991 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Thu, 30 Mar 2017 17:36:33 -0700 Subject: fix for MAINT-6998 64bit viewer installs to Program Files (x86) by default. - this change also fixes MAINT-5365 Windows viewer uninstall icon is system default not SL logo --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 3a8cd0c626..bce94263c4 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -648,7 +648,7 @@ class WindowsManifest(ViewerManifest): "%%SOURCE%%":self.get_src_prefix(), "%%INST_VARS%%":inst_vars_template % substitution_strings, "%%INSTALL_FILES%%":self.nsi_file_commands(True), - "%%$PROGRAMFILES%%":program_files, + "%%PROGRAMFILES%%":program_files, "%%ENGAGEREGISTRY%%":engage_registry, "%%DELETE_FILES%%":self.nsi_file_commands(False)}) -- cgit v1.2.3 From 97c43e6397299620bd3018ae3221ec468cce7962 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Fri, 31 Mar 2017 12:38:37 -0700 Subject: SL-321: sign *before* nsis grabs the EXEs --- indra/newview/viewer_manifest.py | 45 ++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 20 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 770567f13d..81711c717e 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -699,6 +699,29 @@ class WindowsManifest(ViewerManifest): "%%ENGAGEREGISTRY%%":engage_registry, "%%DELETE_FILES%%":self.nsi_file_commands(False)}) + # If we're on a build machine, sign the code using our Authenticode certificate. JC + # note that the enclosing setup exe is signed later, after the makensis makes it. + sign_py = os.path.expandvars("${SIGN}") + if not sign_py or sign_py == "${SIGN}": + sign_py = 'C:\\buildscripts\\code-signing\\sign.py' + else: + sign_py = sign_py.replace('\\', '\\\\\\\\') + python = os.path.expandvars("${PYTHON}") + if not python or python == "${PYTHON}": + python = 'python' + if os.path.exists(sign_py): + #Unlike the viewer binary, the VMP filenames are invariant with respect to version, os, etc. + print "about to run signing of: ", self.dst_path_of("apply_update.exe").replace('\\', '\\\\\\\\') + self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("apply_update.exe").replace('\\', '\\\\\\\\'))) + print "about to run signing of: ", self.dst_path_of("download_update.exe").replace('\\', '\\\\\\\\') + self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("download_update.exe").replace('\\', '\\\\\\\\'))) + print "about to run signing of: ", self.dst_path_of("SL_Launcher.exe").replace('\\', '\\\\\\\\') + self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("SL_Launcher.exe").replace('\\', '\\\\\\\\'))) + print "about to run signing of: ", self.dst_path_of("update_manager.exe").replace('\\', '\\\\\\\\') + self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("update_manager.exe").replace('\\', '\\\\\\\\'))) + else: + print "Skipping code signing of vmp executables,", sign_py, "does not exist" + # We use the Unicode version of NSIS, available from # http://www.scratchpaper.com/ # Check two paths, one for Program Files, and one for Program Files (x86). @@ -722,30 +745,12 @@ class WindowsManifest(ViewerManifest): else: print >> sys.stderr, "Maximum nsis attempts exceeded; giving up" raise - # self.remove(self.dst_path_of(tempfile)) - # If we're on a build machine, sign the code using our Authenticode certificate. JC - sign_py = os.path.expandvars("${SIGN}") - if not sign_py or sign_py == "${SIGN}": - sign_py = 'C:\\buildscripts\\code-signing\\sign.py' - else: - sign_py = sign_py.replace('\\', '\\\\\\\\') - python = os.path.expandvars("${PYTHON}") - if not python or python == "${PYTHON}": - python = 'python' + if os.path.exists(sign_py): print "about to run signing of: ", self.dst_path_of(installer_file).replace('\\', '\\\\\\\\') self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of(installer_file).replace('\\', '\\\\\\\\'))) - #Unlike the viewer binary, the VMP filenames are invariant with respect to version, os, etc. - print "about to run signing of: ", self.dst_path_of("apply_update.exe").replace('\\', '\\\\\\\\') - self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("apply_update.exe").replace('\\', '\\\\\\\\'))) - print "about to run signing of: ", self.dst_path_of("download_update.exe").replace('\\', '\\\\\\\\') - self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("download_update.exe").replace('\\', '\\\\\\\\'))) - print "about to run signing of: ", self.dst_path_of("SL_Launcher.exe").replace('\\', '\\\\\\\\') - self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("SL_Launcher.exe").replace('\\', '\\\\\\\\'))) - print "about to run signing of: ", self.dst_path_of("update_manager.exe").replace('\\', '\\\\\\\\') - self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("update_manager.exe").replace('\\', '\\\\\\\\'))) else: - print "Skipping code signing,", sign_py, "does not exist" + print "Skipping code signing of setup executable,", sign_py, "does not exist" self.created_path(self.dst_path_of(installer_file)) self.package_file = installer_file -- cgit v1.2.3 From d2db8239c21298f55a468100d0b3b06d2623bf67 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Wed, 5 Apr 2017 16:50:47 -0700 Subject: MAINT-6928: update VMP package 503733, add requests package 504010, associated viewer-manifest changes for new files --- indra/newview/viewer_manifest.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 81711c717e..512a1e870d 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -436,15 +436,15 @@ class WindowsManifest(ViewerManifest): # These need to be installed as a SxS assembly, currently a 'private' assembly. # See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx if self.args['configuration'].lower() == 'debug': - self.path("msvcr120d.dll") - self.path("msvcp120d.dll") - self.path("msvcr100d.dll") - self.path("msvcp100d.dll") + self.path("msvcr120d.dll") + self.path("msvcp120d.dll") + self.path("msvcr100d.dll") + self.path("msvcp100d.dll") else: - self.path("msvcr120.dll") - self.path("msvcp120.dll") - self.path("msvcr100.dll") - self.path("msvcp100.dll") + self.path("msvcr120.dll") + self.path("msvcp120.dll") + self.path("msvcr100.dll") + self.path("msvcp100.dll") # Vivox runtimes self.path("SLVoice.exe") @@ -778,7 +778,9 @@ class DarwinManifest(ViewerManifest): relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") vmpdir = os.path.join(pkgdir, "VMP") + vmp266dir = os.path.join(vmpdir, "2.6") llbasedir = os.path.join(pkgdir, "llbase") + requestsdir = os.path.join(pkgdir, "requests") if self.prefix(src="", dst="Contents"): # everything goes in Contents self.path("Info.plist", dst="Info.plist") @@ -799,6 +801,14 @@ class DarwinManifest(ViewerManifest): 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"): + self.path2basename(requestsdir,"*") + self.end_prefix() self.end_prefix() # most everything goes in the Resources directory -- cgit v1.2.3 From 6a393ada3e1d2cf0543f80dfd522436554d5bb95 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Mon, 10 Apr 2017 13:33:55 -0700 Subject: MAINT-6928: Add in Python 2.6.6 modules --- indra/newview/viewer_manifest.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 512a1e870d..7c1db31f04 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -790,7 +790,7 @@ class DarwinManifest(ViewerManifest): self.path(os.path.join(relpkgdir, "libhunspell-1.3.0.dylib"), dst="Resources/libhunspell-1.3.0.dylib") if self.prefix(dst="MacOS"): - #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323 + #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322, SL-323 and MAINT-6928 self.path2basename(vmpdir,"SL_Launcher") self.path2basename(vmpdir,"*.py") llbase_path = os.path.join(self.get_dst_prefix(),'llbase') @@ -808,6 +808,14 @@ class DarwinManifest(ViewerManifest): os.makedirs(requests_path) if self.prefix(dst="requests"): self.path2basename(requestsdir,"*") + self.end_prefix() + #these supplemental files are in case the user still has 2.6 as their default python + #https://jira.secondlife.com/browse/MAINT-6928 + p266_path = os.path.join(self.get_dst_prefix(),'2.6') + if not os.path.exists(p266_path): + os.makedirs(p266_path) + if self.prefix(dst="2.6"): + self.path2basename(vmp266dir,"*.py") self.end_prefix() self.end_prefix() @@ -903,7 +911,7 @@ class DarwinManifest(ViewerManifest): 'ca-bundle.crt', 'SLVoice', ): - self.path2basename(relpkgdir, libfile) + self.path2basename(relpkgdir, libfile) # dylibs that vary based on configuration if self.args['configuration'].lower() == 'debug': -- cgit v1.2.3 From 5a1135e364142c173a75ed0002ff336a31745019 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Tue, 11 Apr 2017 09:08:48 -0700 Subject: MAINT-6928: upgrade to VMP package 504140, use renamed directory to walk around codesign bug; fix dullahan file copy code --- indra/newview/viewer_manifest.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 7c1db31f04..4fb40061c2 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -779,6 +779,8 @@ class DarwinManifest(ViewerManifest): debpkgdir = os.path.join(pkgdir, "lib", "debug") vmpdir = os.path.join(pkgdir, "VMP") vmp266dir = os.path.join(vmpdir, "2.6") + #apparently the codesign tool has a problem with dir names with dots in them + vmp266nodotdir = os.path.join(vmpdir, "python26") llbasedir = os.path.join(pkgdir, "llbase") requestsdir = os.path.join(pkgdir, "requests") @@ -818,6 +820,12 @@ class DarwinManifest(ViewerManifest): self.path2basename(vmp266dir,"*.py") self.end_prefix() self.end_prefix() + if os.path.exists(vmp266dir): + try: + os.rename(vmp266dir, vmp266nodotdir) + except Exception, e: + print "Failed to rename python 2.6 supplemental directory with error %s" % repr(e) + raise # most everything goes in the Resources directory if self.prefix(src="", dst="Resources"): @@ -948,8 +956,8 @@ class DarwinManifest(ViewerManifest): # Dullahan helper apps go inside SLPlugin.app if self.prefix(src="", dst="SLPlugin.app/Contents/Frameworks"): - for helperappfile in ('DullahanHelper.app'): - self.path2basename(relpkgdir, helperappfile) + helperappfile = 'DullahanHelper.app' + self.path2basename(relpkgdir, helperappfile) pluginframeworkpath = self.dst_path_of('Chromium Embedded Framework.framework'); # Putting a Frameworks directory under Contents/MacOS -- cgit v1.2.3 From e082edf5961ead47b39a317909a1b362fea8785f Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Tue, 11 Apr 2017 12:14:21 -0700 Subject: MAINT-6928: os,rename is retarded, use shutil.move instead --- indra/newview/viewer_manifest.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 4fb40061c2..9a084da1be 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -779,8 +779,6 @@ class DarwinManifest(ViewerManifest): debpkgdir = os.path.join(pkgdir, "lib", "debug") vmpdir = os.path.join(pkgdir, "VMP") vmp266dir = os.path.join(vmpdir, "2.6") - #apparently the codesign tool has a problem with dir names with dots in them - vmp266nodotdir = os.path.join(vmpdir, "python26") llbasedir = os.path.join(pkgdir, "llbase") requestsdir = os.path.join(pkgdir, "requests") @@ -792,6 +790,8 @@ class DarwinManifest(ViewerManifest): self.path(os.path.join(relpkgdir, "libhunspell-1.3.0.dylib"), dst="Resources/libhunspell-1.3.0.dylib") if self.prefix(dst="MacOS"): + #apparently the codesign tool has a problem with dir names with dots in them + vmp266nodotdir = os.path.join(self.get_dst_prefix(), "python26") #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322, SL-323 and MAINT-6928 self.path2basename(vmpdir,"SL_Launcher") self.path2basename(vmpdir,"*.py") @@ -819,10 +819,11 @@ class DarwinManifest(ViewerManifest): if self.prefix(dst="2.6"): self.path2basename(vmp266dir,"*.py") self.end_prefix() - self.end_prefix() - if os.path.exists(vmp266dir): + self.end_prefix() + if os.path.exists(p266_path): try: - os.rename(vmp266dir, vmp266nodotdir) + print "renaming python 2.6 directory %s to %s " % (p266_path, vmp266nodotdir) + shutil.move(p266_path, vmp266nodotdir) except Exception, e: print "Failed to rename python 2.6 supplemental directory with error %s" % repr(e) raise -- cgit v1.2.3 From 7de21de71f16ffe6ae9d7d72133b32041a4dfcac Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Tue, 11 Apr 2017 12:57:09 -0700 Subject: MAINT-6928: guard shutil.move against retry --- indra/newview/viewer_manifest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 9a084da1be..d038392ba0 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -823,7 +823,8 @@ class DarwinManifest(ViewerManifest): if os.path.exists(p266_path): try: print "renaming python 2.6 directory %s to %s " % (p266_path, vmp266nodotdir) - shutil.move(p266_path, vmp266nodotdir) + if not os.path.exists(vmp266nodotdir): + shutil.move(p266_path, vmp266nodotdir) except Exception, e: print "Failed to rename python 2.6 supplemental directory with error %s" % repr(e) raise -- cgit v1.2.3 From e26b66cc6d48b6f98a941090f644807f4f14affb Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Tue, 11 Apr 2017 16:18:01 -0700 Subject: MAINT-6928: revert previous post-move strategy, rename via self.path instead --- indra/newview/viewer_manifest.py | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index d038392ba0..f6bbe7365a 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -778,7 +778,7 @@ class DarwinManifest(ViewerManifest): relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") vmpdir = os.path.join(pkgdir, "VMP") - vmp266dir = os.path.join(vmpdir, "2.6") + vmp266dir = os.path.join(vmpdir, "python26") llbasedir = os.path.join(pkgdir, "llbase") requestsdir = os.path.join(pkgdir, "requests") @@ -791,7 +791,7 @@ class DarwinManifest(ViewerManifest): if self.prefix(dst="MacOS"): #apparently the codesign tool has a problem with dir names with dots in them - vmp266nodotdir = os.path.join(self.get_dst_prefix(), "python26") + """vmp266nodotdir = os.path.join(self.get_dst_prefix(), "python26")""" #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322, SL-323 and MAINT-6928 self.path2basename(vmpdir,"SL_Launcher") self.path2basename(vmpdir,"*.py") @@ -813,21 +813,13 @@ class DarwinManifest(ViewerManifest): self.end_prefix() #these supplemental files are in case the user still has 2.6 as their default python #https://jira.secondlife.com/browse/MAINT-6928 - p266_path = os.path.join(self.get_dst_prefix(),'2.6') + p266_path = os.path.join(self.get_dst_prefix(),'python26') if not os.path.exists(p266_path): os.makedirs(p266_path) - if self.prefix(dst="2.6"): + if self.prefix("python26"): self.path2basename(vmp266dir,"*.py") self.end_prefix() - self.end_prefix() - if os.path.exists(p266_path): - try: - print "renaming python 2.6 directory %s to %s " % (p266_path, vmp266nodotdir) - if not os.path.exists(vmp266nodotdir): - shutil.move(p266_path, vmp266nodotdir) - except Exception, e: - print "Failed to rename python 2.6 supplemental directory with error %s" % repr(e) - raise + self.end_prefix() # most everything goes in the Resources directory if self.prefix(src="", dst="Resources"): -- cgit v1.2.3 From 869771f7c9b6ef30d01120b68b3759aeac74fea5 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Mon, 17 Apr 2017 13:09:19 -0700 Subject: SL-617: alter viewer manifest to write exe name to summary.json, upgrade VMP package to 504292 to read it --- indra/newview/viewer_manifest.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index f6bbe7365a..bac80d8c13 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -206,6 +206,9 @@ class ViewerManifest(LLManifest): summary_dict = {"Type":"viewer","Version":'.'.join(self.args['version']), "Channel":self.channel_with_pkg_suffix(), "Platform":summary_json_platform} + #MAINT-7294: Windows exe names depend on channel name, so write that in also + if summary_json_platform.startswith('win'): + summary_dict.update({'Executable':self.channel_with_pkg_suffix().replace(' ', '')+'.exe'}) with open(os.path.join(os.pardir,'summary.json'), 'w') as summary_handle: json.dump(summary_dict,summary_handle) -- cgit v1.2.3 From c49eeb9a6202c5c38338ef229851bd84901ee24c Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Wed, 19 Apr 2017 15:59:29 -0700 Subject: Add back the missing pieces and updated code for the example plugin. It was useful during testing SLPlugin changes. Not shipped with release versions of viewer --- indra/newview/viewer_manifest.py | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index bce94263c4..fba8a8b159 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -439,6 +439,12 @@ class WindowsManifest(ViewerManifest): 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"): + self.path("media_plugin_example.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"): -- cgit v1.2.3 From e625a65a5be42d517016714d297fb3e5df60d8fc Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 20 Apr 2017 19:45:17 -0400 Subject: DRTVWR-418: Boost fixed max size of temporary Mac volume used during construction of the eventual installation .dmg. With newer 64-bit Havok packages, we need more elbow room on the temporary volume. --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 3a8cd0c626..3792adc06c 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -980,7 +980,7 @@ class DarwinManifest(ViewerManifest): # make sure we don't have stale files laying about self.remove(sparsename, finalname) - self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 1000 -layout SPUD' % { + self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 1100 -layout SPUD' % { 'sparse':sparsename, 'vol':volname}) -- cgit v1.2.3 From 62ecf7091821c37e89d79e94880fcf585f27ba5c Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Sat, 22 Apr 2017 17:37:03 -0400 Subject: DRTVWR-418: Make temporary .sparseimage drive bigger for signing. --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 3792adc06c..0d03965858 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -980,7 +980,7 @@ class DarwinManifest(ViewerManifest): # make sure we don't have stale files laying about self.remove(sparsename, finalname) - self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 1100 -layout SPUD' % { + self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 2000 -layout SPUD' % { 'sparse':sparsename, 'vol':volname}) -- cgit v1.2.3 From e4cd2028ea01f31a20296d407512159dc942f977 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Sat, 22 Apr 2017 18:45:18 -0400 Subject: DRTVWR-418: Binary search for a good size for temp Mac disk image --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 0d03965858..4e516db121 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -980,7 +980,7 @@ class DarwinManifest(ViewerManifest): # make sure we don't have stale files laying about self.remove(sparsename, finalname) - self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 2000 -layout SPUD' % { + self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 1500 -layout SPUD' % { 'sparse':sparsename, 'vol':volname}) -- cgit v1.2.3 From fad8c7edd7da7e43b0129282c790daa8b4c04ffb Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Sat, 22 Apr 2017 19:51:40 -0400 Subject: DRTVWR-418: Binary search for a good size for temp Mac disk image --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 4e516db121..2aaa041eda 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -980,7 +980,7 @@ class DarwinManifest(ViewerManifest): # make sure we don't have stale files laying about self.remove(sparsename, finalname) - self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 1500 -layout SPUD' % { + self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 1300 -layout SPUD' % { 'sparse':sparsename, 'vol':volname}) -- cgit v1.2.3 From 24b4d3c13f15917f8c775d5b4211d213af9309c0 Mon Sep 17 00:00:00 2001 From: "coyot@coyot-sager-PC" Date: Fri, 28 Apr 2017 01:09:14 +0100 Subject: SL-671: make icon point to launcher, not viewer --- indra/newview/viewer_manifest.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index bac80d8c13..78dc830c1b 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -654,6 +654,7 @@ class WindowsManifest(ViewerManifest): 'version' : '.'.join(self.args['version']), 'version_short' : '.'.join(self.args['version'][:-1]), 'version_dashes' : '-'.join(self.args['version']), + 'viewer_exe' : self.channel_with_pkg_suffix().replace(' ', '')+'.exe', 'final_exe' : self.final_exe(), 'flags':'', 'app_name':self.app_name(), @@ -668,6 +669,7 @@ class WindowsManifest(ViewerManifest): !define VERSION "%(version_short)s" !define VERSION_LONG "%(version)s" !define VERSION_DASHES "%(version_dashes)s" + !define VIEWER_EXE "%(viewer_exe)%s" """ % substitution_strings if self.channel_type() == 'release': -- cgit v1.2.3 From b6e1419007e0bc768302d594649a262952e5fce6 Mon Sep 17 00:00:00 2001 From: "coyot@coyot-sager-PC" Date: Fri, 28 Apr 2017 17:05:58 +0100 Subject: SL-671: fix string substitution --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 78dc830c1b..2e3e4d6a07 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -669,7 +669,7 @@ class WindowsManifest(ViewerManifest): !define VERSION "%(version_short)s" !define VERSION_LONG "%(version)s" !define VERSION_DASHES "%(version_dashes)s" - !define VIEWER_EXE "%(viewer_exe)%s" + !define VIEWER_EXE "%(viewer_exe)s%" """ % substitution_strings if self.channel_type() == 'release': -- cgit v1.2.3 From a67d449813a9b6c6198ed15ad15d30535344051e Mon Sep 17 00:00:00 2001 From: "coyot@coyot-sager-PC" Date: Fri, 28 Apr 2017 20:04:32 +0100 Subject: SL-617: pass final_exe from viewer manifest to NSIS as VIEWER_EXE --- indra/newview/viewer_manifest.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 2e3e4d6a07..b289db9b8f 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -654,7 +654,6 @@ class WindowsManifest(ViewerManifest): 'version' : '.'.join(self.args['version']), 'version_short' : '.'.join(self.args['version'][:-1]), 'version_dashes' : '-'.join(self.args['version']), - 'viewer_exe' : self.channel_with_pkg_suffix().replace(' ', '')+'.exe', 'final_exe' : self.final_exe(), 'flags':'', 'app_name':self.app_name(), @@ -669,7 +668,7 @@ class WindowsManifest(ViewerManifest): !define VERSION "%(version_short)s" !define VERSION_LONG "%(version)s" !define VERSION_DASHES "%(version_dashes)s" - !define VIEWER_EXE "%(viewer_exe)s%" + !define VIEWER_EXE "%(final_exe)s" """ % substitution_strings if self.channel_type() == 'release': -- cgit v1.2.3 From 7005310541b9b9b002b2bd52cb1f28c0d25a8281 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Mon, 1 May 2017 12:42:12 -0700 Subject: Fix MAINT-7360 Investigate removal of MSVCR100.DLL and MSVCP100.DLL --- indra/newview/viewer_manifest.py | 4 ---- 1 file changed, 4 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index fba8a8b159..7ea59ad5ea 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -391,13 +391,9 @@ class WindowsManifest(ViewerManifest): if self.args['configuration'].lower() == 'debug': self.path("msvcr120d.dll") self.path("msvcp120d.dll") - self.path("msvcr100d.dll") - self.path("msvcp100d.dll") else: self.path("msvcr120.dll") self.path("msvcp120.dll") - self.path("msvcr100.dll") - self.path("msvcp100.dll") # Vivox runtimes self.path("SLVoice.exe") -- cgit v1.2.3 From 81c5f03013ca53402abc1df31cac28d47dc8aa46 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Wed, 3 May 2017 11:06:12 -0700 Subject: MAINT-6928: upgrade VMP package to 504920 and rip out viewer-manifest changes for 2.6 --- indra/newview/viewer_manifest.py | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index b289db9b8f..fced30370c 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -782,7 +782,6 @@ class DarwinManifest(ViewerManifest): relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") vmpdir = os.path.join(pkgdir, "VMP") - vmp266dir = os.path.join(vmpdir, "python26") llbasedir = os.path.join(pkgdir, "llbase") requestsdir = os.path.join(pkgdir, "requests") @@ -793,10 +792,8 @@ class DarwinManifest(ViewerManifest): self.path(os.path.join(relpkgdir, "libndofdev.dylib"), dst="Resources/libndofdev.dylib") self.path(os.path.join(relpkgdir, "libhunspell-1.3.0.dylib"), dst="Resources/libhunspell-1.3.0.dylib") - if self.prefix(dst="MacOS"): - #apparently the codesign tool has a problem with dir names with dots in them - """vmp266nodotdir = os.path.join(self.get_dst_prefix(), "python26")""" - #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322, SL-323 and MAINT-6928 + if 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") llbase_path = os.path.join(self.get_dst_prefix(),'llbase') @@ -814,15 +811,7 @@ class DarwinManifest(ViewerManifest): os.makedirs(requests_path) if self.prefix(dst="requests"): self.path2basename(requestsdir,"*") - self.end_prefix() - #these supplemental files are in case the user still has 2.6 as their default python - #https://jira.secondlife.com/browse/MAINT-6928 - p266_path = os.path.join(self.get_dst_prefix(),'python26') - if not os.path.exists(p266_path): - os.makedirs(p266_path) - if self.prefix("python26"): - self.path2basename(vmp266dir,"*.py") - self.end_prefix() + self.end_prefix() self.end_prefix() # most everything goes in the Resources directory -- cgit v1.2.3 From 6d425401c11264e4dd77d0f60d8fd452fbce0020 Mon Sep 17 00:00:00 2001 From: "coyot@coyot-sager-PC.hsd1.ca.comcast.net" Date: Thu, 4 May 2017 18:59:01 +0100 Subject: SL-617: use final_exe to create exe name in summary.json --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index fced30370c..06ac62d353 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -208,7 +208,7 @@ class ViewerManifest(LLManifest): "Platform":summary_json_platform} #MAINT-7294: Windows exe names depend on channel name, so write that in also if summary_json_platform.startswith('win'): - summary_dict.update({'Executable':self.channel_with_pkg_suffix().replace(' ', '')+'.exe'}) + summary_dict.update({'Executable':self.final_exe()}) with open(os.path.join(os.pardir,'summary.json'), 'w') as summary_handle: json.dump(summary_dict,summary_handle) -- cgit v1.2.3 From e044902aaf1aa963d41a30a249b564e1b8910de7 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 24 May 2017 09:41:44 -0400 Subject: SL-702: refactor to make the viewer-manager easier for TPVs to integrate --- indra/newview/viewer_manifest.py | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index e806a4fdad..d9fef022e5 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -123,20 +123,20 @@ class ViewerManifest(LLManifest): #do not need to test for existence. If no platform is passed, llmanifest computes a default in get_default_platform #the choice of value names (lnx, mac, win32, win) is dictated by the VMM API - summary_json_platform = "" + build_data_json_platform = "" if 'linux' in self.args['platform']: - summary_json_platform = 'lnx' + build_data_json_platform = 'lnx' elif 'darwin' in self.args['platform']: - summary_json_platform = 'mac' + build_data_json_platform = 'mac' elif 'windows' in self.args['platform']: #default case - summary_json_platform = 'win' + build_data_json_platform = 'win' if 'arch' in self.args and self.args['arch']: if 'i686' in self.args['arch']: - summary_json_platform = 'win32' + build_data_json_platform = 'win32' #we really shouldn't be here, something is very wrong at this point else: - summary_json_platform = 'None' + build_data_json_platform = 'None' # put_in_file(src=) need not be an actual pathname; it @@ -201,21 +201,26 @@ class ViewerManifest(LLManifest): # File in the newview/ directory self.path("gpu_table.txt") - #summary.json. Standard with exception handling is fine. If we can't open a new file for writing, we have worse problems + #build_data.json. Standard with exception handling is fine. If we can't open a new file for writing, we have worse problems #platform is computed above with other arg parsing - summary_dict = {"Type":"viewer","Version":'.'.join(self.args['version']), + build_data_dict = {"Type":"viewer","Version":'.'.join(self.args['version']), + "Channel Base": CHANNEL_VENDOR_BASE, "Channel":self.channel_with_pkg_suffix(), - "Platform":summary_json_platform} + "Platform":build_data_json_platform, + "Update Service":"https://update.secondlife.com/update/", + } #MAINT-7294: Windows exe names depend on channel name, so write that in also - if summary_json_platform.startswith('win'): - summary_dict.update({'Executable':self.final_exe()}) - with open(os.path.join(os.pardir,'summary.json'), 'w') as summary_handle: - json.dump(summary_dict,summary_handle) + if build_data_json_platform.startswith('win'): + build_data_dict.update({'Executable':self.final_exe()}) + if build_data_json_platform.startswith('mac'): + build_data_dict.update({'Bundle Id':self.args['bundleid']}) + with open(os.path.join(os.pardir,'build_data.json'), 'w') as build_data_handle: + json.dump(build_data_dict,build_data_handle) #we likely no longer need the test, since we will throw an exception above, but belt and suspenders and we get the #return code for free. - if not self.path2basename(os.pardir, "summary.json"): - print "No summary.json file" + if not self.path2basename(os.pardir, "build_data.json"): + print "No build_data.json file" def grid(self): return self.args['grid'] -- cgit v1.2.3 From c538ff12c5a75ba9aa51648e97fd629a9a2829e9 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Wed, 14 Jun 2017 14:16:23 -0700 Subject: SL-700: temporarily use local version of ca-bundle.crt instead of from voice, misc cleanup --- indra/newview/viewer_manifest.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index d9fef022e5..5ccedee06d 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -482,7 +482,7 @@ class WindowsManifest(ViewerManifest): self.path(src="licenses-win32.txt", dst="licenses.txt") self.path("featuretable.txt") - self.path("featuretable_xp.txt") + self.path("ca-bundle.crt") # Media plugins - CEF if self.prefix(src='../media_plugins/cef/%s' % self.args['configuration'], dst="llplugin"): @@ -836,6 +836,7 @@ class DarwinManifest(ViewerManifest): self.path("licenses-mac.txt", dst="licenses.txt") self.path("featuretable_mac.txt") self.path("SecondLife.nib") + self.path("ca-bundle.crt") icon_path = self.icon_path() if self.prefix(src=icon_path, dst="") : @@ -1295,6 +1296,7 @@ class LinuxManifest(ViewerManifest): print "Skipping llcommon.so (assuming llcommon was linked statically)" self.path("featuretable_linux.txt") + self.path("ca-bundle.crt") def package_finish(self): installer_name = self.installer_base_name() -- cgit v1.2.3 From 7ead7c7285c3f47f1dd271f80adfd098b6757326 Mon Sep 17 00:00:00 2001 From: Glenn Glazer Date: Wed, 14 Jun 2017 16:02:54 -0700 Subject: SL-700: temporarily use local version of ca-bundle.crt, remove ca-bundle copy calls from viewer manifest --- indra/newview/viewer_manifest.py | 2 -- 1 file changed, 2 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 5ccedee06d..001c4817b1 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -460,7 +460,6 @@ class WindowsManifest(ViewerManifest): self.path("ortp.dll") self.path("libsndfile-1.dll") self.path("vivoxoal.dll") - self.path("ca-bundle.crt") # Security self.path("ssleay32.dll") @@ -915,7 +914,6 @@ class DarwinManifest(ViewerManifest): 'libvivoxoal.dylib', 'libvivoxsdk.dylib', 'libvivoxplatform.dylib', - 'ca-bundle.crt', 'SLVoice', ): self.path2basename(relpkgdir, libfile) -- cgit v1.2.3 From 55796deebb553d23b524267d93812dcc7ff00679 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Fri, 16 Jun 2017 10:43:04 -0400 Subject: MAINT-7505: correct packaging of python llbase --- indra/newview/viewer_manifest.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 001c4817b1..58bdf1816f 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -372,7 +372,7 @@ class WindowsManifest(ViewerManifest): relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") vmpdir = os.path.join(pkgdir, "VMP") - llbasedir = os.path.join(pkgdir, "llbase") + llbasedir = os.path.join(pkgdir, "lib", "python", "llbase") if self.is_packaging_viewer(): # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. @@ -792,7 +792,7 @@ class DarwinManifest(ViewerManifest): relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") vmpdir = os.path.join(pkgdir, "VMP") - llbasedir = os.path.join(pkgdir, "llbase") + llbasedir = os.path.join(pkgdir, "lib", "python", "llbase") requestsdir = os.path.join(pkgdir, "requests") if self.prefix(src="", dst="Contents"): # everything goes in Contents @@ -1255,8 +1255,8 @@ class LinuxManifest(ViewerManifest): if not os.path.exists(llbase_path): os.makedirs(llbase_path) if self.prefix(dst="llbase"): - self.path2basename("../packages/llbase","*.py") - self.path2basename("../packages/llbase","_cllsd.so") + self.path2basename("../packages/lib/python/llbase","*.py") + self.path2basename("../packages/lib/python/llbase","_cllsd.so") self.end_prefix("bin") if self.prefix("res-sdl"): -- cgit v1.2.3 From 51116c46c684de158000299cf7bef6f7e46fb2a7 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Fri, 16 Jun 2017 13:29:44 -0400 Subject: remove redundant slash from update service base url (cosmetic) --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 58bdf1816f..97ed24bad7 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -207,7 +207,7 @@ class ViewerManifest(LLManifest): "Channel Base": CHANNEL_VENDOR_BASE, "Channel":self.channel_with_pkg_suffix(), "Platform":build_data_json_platform, - "Update Service":"https://update.secondlife.com/update/", + "Update Service":"https://update.secondlife.com/update", } #MAINT-7294: Windows exe names depend on channel name, so write that in also if build_data_json_platform.startswith('win'): -- cgit v1.2.3 From 543d9b98a315980ee1ab35558ad07dd45673b837 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Mon, 19 Jun 2017 18:01:40 -0400 Subject: update viewer-manager, primarily to solve Mac packaging problem --- indra/newview/viewer_manifest.py | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 97ed24bad7..377c46f8e0 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -793,7 +793,10 @@ class DarwinManifest(ViewerManifest): debpkgdir = os.path.join(pkgdir, "lib", "debug") vmpdir = os.path.join(pkgdir, "VMP") llbasedir = os.path.join(pkgdir, "lib", "python", "llbase") - requestsdir = os.path.join(pkgdir, "requests") + requestsdir = os.path.join(pkgdir, "lib", "python", "requests") + urllib3dir = os.path.join(pkgdir, "lib", "python", "urllib3") + 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 self.path("Info.plist", dst="Info.plist") @@ -806,10 +809,17 @@ class DarwinManifest(ViewerManifest): #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") + # certifi will be imported by requests; this is our custom version to get our ca-bundle.crt + 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"): + 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) - #before, we only needed llbase at build time. With VMP, we need it at run time. if self.prefix(dst="llbase"): self.path2basename(llbasedir,"*.py") self.path2basename(llbasedir,"_cllsd.so") @@ -822,6 +832,24 @@ class DarwinManifest(ViewerManifest): if 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"): + 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"): + 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"): + self.path2basename(idnadir,"*") + self.end_prefix() self.end_prefix() # most everything goes in the Resources directory -- cgit v1.2.3 From b3c506bc68ea64d9e296d2be94380cd93b0c49c4 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 26 Jun 2017 09:15:01 -0400 Subject: MAINT-7514: Add (32) or (64) to registry for "install again?" prompt. Specifically, append (32) or (64) to the four-part version number stored in the registry entry used to detect whether this viewer has already been installed. This is injected as a new VERSION_REGISTRY NSIS variable. (It was tempting to simply change the value of VERSION_LONG with the embedded address size. However, there is one other use of VERSION_LONG in the NSIS template. That use is the subject of MAINT-7533.) Synthesize the VERSION_REGISTRY value in viewer_manifest.py and add it to the substitution dict used to populate the NSIS template. ADDRESS_SIZE isn't passed into viewer_manifest.py, but it can be inferred from the existing 'arch' parameter: 'arch' as well as 'platform' is used to select the specific subclass of the ViewerManifest class to instantiate for this run. Add an appropriate address_size attribute to every such subclass. Change a couple existing tests on 'arch' to tests on self.address_size instead -- clearer to the maintainer. Also, given that subclass selection mechanism, the ViewerManifest base class shouldn't need if / elif tests on 'platform'. Make build_data_json_platform a class attribute as well, removing the base-class stanza that dynamically examines 'platform' and 'arch'. Similarly, move platform-specific tweaks to the build_data_dict used to populate build_data.json into a new finish_build_data_dict() method overridden by individual platform subclasses. Encapsulate the logic around running the Windows code-signing tool into a sign() method, and call it as needed. For obtaining environment variables with fallback values, use os.environ.get() instead of os.path.expandvars() with tests on the returned value. --- indra/newview/viewer_manifest.py | 137 ++++++++++++++++++++------------------- 1 file changed, 69 insertions(+), 68 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 377c46f8e0..3f6fc94d92 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -121,24 +121,6 @@ class ViewerManifest(LLManifest): settings_install['CmdLineGridChoice']['Value'] = self.grid() print "Set CmdLineGridChoice in settings_install.xml to '%s'" % self.grid() - #do not need to test for existence. If no platform is passed, llmanifest computes a default in get_default_platform - #the choice of value names (lnx, mac, win32, win) is dictated by the VMM API - build_data_json_platform = "" - if 'linux' in self.args['platform']: - build_data_json_platform = 'lnx' - elif 'darwin' in self.args['platform']: - build_data_json_platform = 'mac' - elif 'windows' in self.args['platform']: - #default case - build_data_json_platform = 'win' - if 'arch' in self.args and self.args['arch']: - if 'i686' in self.args['arch']: - build_data_json_platform = 'win32' - #we really shouldn't be here, something is very wrong at this point - else: - build_data_json_platform = 'None' - - # put_in_file(src=) need not be an actual pathname; it # only needs to be non-empty self.put_in_file(llsd.format_pretty_xml(settings_install), @@ -206,14 +188,10 @@ class ViewerManifest(LLManifest): build_data_dict = {"Type":"viewer","Version":'.'.join(self.args['version']), "Channel Base": CHANNEL_VENDOR_BASE, "Channel":self.channel_with_pkg_suffix(), - "Platform":build_data_json_platform, + "Platform":self.build_data_json_platform, "Update Service":"https://update.secondlife.com/update", } - #MAINT-7294: Windows exe names depend on channel name, so write that in also - if build_data_json_platform.startswith('win'): - build_data_dict.update({'Executable':self.final_exe()}) - if build_data_json_platform.startswith('mac'): - build_data_dict.update({'Bundle Id':self.args['bundleid']}) + build_data_dict = self.finish_build_data_dict(build_data_dict) with open(os.path.join(os.pardir,'build_data.json'), 'w') as build_data_handle: json.dump(build_data_dict,build_data_handle) @@ -222,6 +200,9 @@ class ViewerManifest(LLManifest): if not self.path2basename(os.pardir, "build_data.json"): print "No build_data.json file" + def finish_build_data_dict(self, build_data_dict): + return build_data_dict + def grid(self): return self.args['grid'] @@ -319,6 +300,11 @@ class WindowsManifest(ViewerManifest): def final_exe(self): return self.app_name_oneword()+".exe" + def finish_build_data_dict(self, build_data_dict): + #MAINT-7294: Windows exe names depend on channel name, so write that in also + build_data_dict.update({'Executable':self.final_exe()}) + return build_data_dict + def test_msvcrt_and_copy_action(self, src, dst): # This is used to test a dll manifest. # It is used as a temporary override during the construct method @@ -431,7 +417,7 @@ class WindowsManifest(ViewerManifest): # Get fmodex dll, continue if missing try: - if(self.args['arch'].lower() == 'x86_64'): + if(self.address_size == 64): self.path("fmodex64.dll") else: self.path("fmodex.dll") @@ -664,6 +650,8 @@ class WindowsManifest(ViewerManifest): 'version' : '.'.join(self.args['version']), 'version_short' : '.'.join(self.args['version'][:-1]), 'version_dashes' : '-'.join(self.args['version']), + 'version_registry' : '%s(%s)' % + ('.'.join(self.args['version']), self.address_size), 'final_exe' : self.final_exe(), 'flags':'', 'app_name':self.app_name(), @@ -678,6 +666,7 @@ class WindowsManifest(ViewerManifest): !define VERSION "%(version_short)s" !define VERSION_LONG "%(version)s" !define VERSION_DASHES "%(version_dashes)s" + !define VERSION_REGISTRY "%(version_registry)s" !define VIEWER_EXE "%(final_exe)s" """ % substitution_strings @@ -694,7 +683,7 @@ class WindowsManifest(ViewerManifest): Caption "%(caption)s" """ - if(self.args['arch'].lower() == 'x86_64'): + if(self.address_size == 64): engage_registry="SetRegView 64" program_files="$PROGRAMFILES64" else: @@ -715,71 +704,77 @@ class WindowsManifest(ViewerManifest): # If we're on a build machine, sign the code using our Authenticode certificate. JC # note that the enclosing setup exe is signed later, after the makensis makes it. - sign_py = os.path.expandvars("${SIGN}") - if not sign_py or sign_py == "${SIGN}": - sign_py = 'C:\\buildscripts\\code-signing\\sign.py' - else: - sign_py = sign_py.replace('\\', '\\\\\\\\') - python = os.path.expandvars("${PYTHON}") - if not python or python == "${PYTHON}": - python = 'python' - if os.path.exists(sign_py): - #Unlike the viewer binary, the VMP filenames are invariant with respect to version, os, etc. - print "about to run signing of: ", self.dst_path_of("apply_update.exe").replace('\\', '\\\\\\\\') - self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("apply_update.exe").replace('\\', '\\\\\\\\'))) - print "about to run signing of: ", self.dst_path_of("download_update.exe").replace('\\', '\\\\\\\\') - self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("download_update.exe").replace('\\', '\\\\\\\\'))) - print "about to run signing of: ", self.dst_path_of("SL_Launcher.exe").replace('\\', '\\\\\\\\') - self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("SL_Launcher.exe").replace('\\', '\\\\\\\\'))) - print "about to run signing of: ", self.dst_path_of("update_manager.exe").replace('\\', '\\\\\\\\') - self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of("update_manager.exe").replace('\\', '\\\\\\\\'))) - else: - print "Skipping code signing of vmp executables,", sign_py, "does not exist" + sign_py = os.environ.get('SIGN', r'C:\buildscripts\code-signing\sign.py') + python = os.environ.get('PYTHON', 'python') + #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(sign_py, exe) # We use the Unicode version of NSIS, available from # http://www.scratchpaper.com/ # Check two paths, one for Program Files, and one for Program Files (x86). # Yay 64bit windows. - NSIS_path = os.path.expandvars('${ProgramFiles}\\NSIS\\Unicode\\makensis.exe') - if not os.path.exists(NSIS_path): - NSIS_path = os.path.expandvars('${ProgramFiles(x86)}\\NSIS\\Unicode\\makensis.exe') + for ProgramFiles in 'ProgramFiles', 'ProgramFiles(x86)': + NSIS_path = os.path.expandvars(r'${%s}\NSIS\Unicode\makensis.exe' % ProgramFiles) + if os.path.exists(NSIS_path): + break installer_created=False nsis_attempts=3 nsis_retry_wait=15 - while (not installer_created) and (nsis_attempts > 0): + for attempt in xrange(nsis_attempts): try: - nsis_attempts-=1; self.run_command('"' + NSIS_path + '" /V2 ' + self.dst_path_of(tempfile)) - installer_created=True # if no exception was raised, the codesign worked except ManifestError, err: - if nsis_attempts: + if attempt+1 < nsis_attempts: print >> sys.stderr, "nsis failed, waiting %d seconds before retrying" % nsis_retry_wait time.sleep(nsis_retry_wait) nsis_retry_wait*=2 - else: - print >> sys.stderr, "Maximum nsis attempts exceeded; giving up" - raise - - if os.path.exists(sign_py): - print "about to run signing of: ", self.dst_path_of(installer_file).replace('\\', '\\\\\\\\') - self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of(installer_file).replace('\\', '\\\\\\\\'))) + else: + # NSIS worked! Done! + break else: - print "Skipping code signing of setup executable,", sign_py, "does not exist" + print >> sys.stderr, "Maximum nsis attempts exceeded; giving up" + raise + + self.sign(sign_py, installer_file) self.created_path(self.dst_path_of(installer_file)) self.package_file = installer_file + def sign(self, sign_py, exe): + if os.path.exists(sign_py): + dst_path = self.dst_path_of(exe) + print "about to run signing of: ", dst_path + self.run_command(' '.join((python, self.escape_slashes(sign_py), + self.escape_slashes(dst_path)))) + else: + print "Skipping code signing of %s: %s not found" % (exe, sign_py) -class Windows_i686_Manifest(WindowsManifest): - # specialize when we must - pass + def escape_slashes(self, path): + return path.replace('\\', '\\\\\\\\') +class Windows_i686_Manifest(WindowsManifest): + # Although we aren't literally passed ADDRESS_SIZE, we can infer it from + # the passed 'arch', which is used to select the specific subclass. + address_size = 32 + build_data_json_platform = 'win32' class Windows_x86_64_Manifest(WindowsManifest): - # specialize when we must - pass + address_size = 64 + build_data_json_platform = 'win' class DarwinManifest(ViewerManifest): + build_data_json_platform = 'mac' + + def finish_build_data_dict(self, build_data_dict): + build_data_dict.update({'Bundle Id':self.args['bundleid']}) + return build_data_dict + def is_packaging_viewer(self): # darwin requires full app bundle packaging even for debugging. return True @@ -1237,7 +1232,7 @@ class DarwinManifest(ViewerManifest): class Darwin_i386_Manifest(DarwinManifest): - pass + address_size = 32 class Darwin_i686_Manifest(DarwinManifest): @@ -1246,10 +1241,12 @@ class Darwin_i686_Manifest(DarwinManifest): class Darwin_x86_64_Manifest(DarwinManifest): - pass + address_size = 64 class LinuxManifest(ViewerManifest): + build_data_json_platform = 'lnx' + def construct(self): super(LinuxManifest, self).construct() @@ -1369,6 +1366,8 @@ class LinuxManifest(ViewerManifest): self.run_command(r"find %(d)r/bin %(d)r/lib -type f \! -name \*.py \! -name SL_Launcher \! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) class Linux_i686_Manifest(LinuxManifest): + address_size = 32 + def construct(self): super(Linux_i686_Manifest, self).construct() @@ -1454,6 +1453,8 @@ class Linux_i686_Manifest(LinuxManifest): class Linux_x86_64_Manifest(LinuxManifest): + address_size = 64 + def construct(self): super(Linux_x86_64_Manifest, self).construct() -- cgit v1.2.3 From 924414d65e06c6aa4d835fd40ea7940c7ca92080 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 26 Jun 2017 10:04:57 -0400 Subject: MAINT-7514: Fetch needed env vars in WindowsManifest.sign() method. --- indra/newview/viewer_manifest.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 3f6fc94d92..2d88fe7dce 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -704,16 +704,14 @@ class WindowsManifest(ViewerManifest): # If we're on a build machine, sign the code using our Authenticode certificate. JC # note that the enclosing setup exe is signed later, after the makensis makes it. - sign_py = os.environ.get('SIGN', r'C:\buildscripts\code-signing\sign.py') - python = os.environ.get('PYTHON', 'python') - #Unlike the viewer binary, the VMP filenames are invariant with respect to version, os, etc. + # 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(sign_py, exe) + self.sign(exe) # We use the Unicode version of NSIS, available from # http://www.scratchpaper.com/ @@ -741,11 +739,13 @@ class WindowsManifest(ViewerManifest): print >> sys.stderr, "Maximum nsis attempts exceeded; giving up" raise - self.sign(sign_py, installer_file) + self.sign(installer_file) self.created_path(self.dst_path_of(installer_file)) self.package_file = installer_file - def sign(self, sign_py, exe): + def sign(self, exe): + sign_py = os.environ.get('SIGN', r'C:\buildscripts\code-signing\sign.py') + python = os.environ.get('PYTHON', 'python') if os.path.exists(sign_py): dst_path = self.dst_path_of(exe) print "about to run signing of: ", dst_path -- cgit v1.2.3 From e6e088d5ab3f477634c98474ad66e58e6f8dff41 Mon Sep 17 00:00:00 2001 From: callum_linden Date: Tue, 8 Aug 2017 15:12:26 -0700 Subject: Added comment block to code signing portion of viewer-manifest.py describing potential gotchas in the future and how to obviate them --- indra/newview/viewer_manifest.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 2d88fe7dce..d734106a9d 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -1192,6 +1192,18 @@ class DarwinManifest(ViewerManifest): keychain_pwd_path = os.path.join(build_secrets_checkout,'code-signing-osx','password.txt') keychain_pwd = open(keychain_pwd_path).read().rstrip() + # Note: As of macOS Sierra, keychains are created with names postfixed with '-db' so for example, the + # SL Viewer keychain would by default be found in ~/Library/Keychains/viewer.keychain-db instead of + # just ~/Library/Keychains/viewer.keychain in earlier versions. + # + # Because we have old OS files from previous versions of macOS on the build hosts, the configurations + # are different on each host. Some have viewer.keychain, some have viewer.keychain-db and some have both. + # As you can see in the line below, this script expects the Linden Developer cert/keys to be in viewer.keychain. + # + # To correctly sign builds you need to make sure ~/Library/Keychains/viewer.keychain exists on the host + # and that it contains the correct cert/key. If a build host is set up with a clean version of macOS Sierra (or later) + # then you will need to change this line (and the one for 'codesign' command below) to point to right place or else + # pull in the cert/key into the default viewer keychain 'viewer.keychain-db' and export it to 'viewer.keychain' self.run_command('security unlock-keychain -p "%s" "%s/Library/Keychains/viewer.keychain"' % ( keychain_pwd, home_path ) ) signed=False sign_attempts=3 @@ -1200,6 +1212,7 @@ class DarwinManifest(ViewerManifest): try: sign_attempts-=1; self.run_command( + # Note: See blurb above about names of keychains 'codesign --verbose --deep --force --keychain "%(home_path)s/Library/Keychains/viewer.keychain" --sign %(identity)r %(bundle)r' % { 'home_path' : home_path, 'identity': identity, -- cgit v1.2.3 From 2bdb3b4411222cfeba3a929825ead2341b0675fb Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Fri, 15 Sep 2017 11:59:50 -0400 Subject: add address size to build_data.json so that SL_Launcher can log it --- indra/newview/viewer_manifest.py | 1 + 1 file changed, 1 insertion(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index d734106a9d..b47faed8b7 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -189,6 +189,7 @@ class ViewerManifest(LLManifest): "Channel Base": CHANNEL_VENDOR_BASE, "Channel":self.channel_with_pkg_suffix(), "Platform":self.build_data_json_platform, + "Address Size":self.address_size, "Update Service":"https://update.secondlife.com/update", } build_data_dict = self.finish_build_data_dict(build_data_dict) -- cgit v1.2.3 From 6ac682619275580eb42f2aaa93b6a251df6239b8 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 21 Sep 2017 15:50:29 -0400 Subject: Clean up running commands under viewer_manifest (at least a little) * do not redirect stderr to stdout * catch errors generated in platform specific code and display them more nicely * run_command no longer captures output (only used in one place; replaced that with direct use of subprocess) --- indra/newview/viewer_manifest.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index b47faed8b7..900e9f7b1b 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -36,6 +36,8 @@ import re import tarfile import time import random +import subprocess + viewer_dir = os.path.dirname(__file__) # Add indra/lib/python to our path so we don't have to muck with PYTHONPATH. # Put it FIRST because some of our build hosts have an ancient install of @@ -341,9 +343,9 @@ class WindowsManifest(ViewerManifest): else: test_assembly_binding(src, "Microsoft.VC80.CRT", "") raise Exception("Unknown condition") - except NoManifestException, err: + except NoManifestException as err: pass - except NoMatchingAssemblyException, err: + except NoMatchingAssemblyException as err: pass self.ccopy(src,dst) @@ -405,14 +407,14 @@ class WindowsManifest(ViewerManifest): self.path('libaprutil-1.dll') self.path('libapriconv-1.dll') - except RuntimeError, err: + except RuntimeError as err: print err.message print "Skipping llcommon.dll (assuming llcommon was linked statically)" # Mesh 3rd party libs needed for auto LOD and collada reading try: self.path("glod.dll") - except RuntimeError, err: + except RuntimeError as err: print err.message print "Skipping GLOD library (assumming linked statically)" @@ -728,7 +730,7 @@ class WindowsManifest(ViewerManifest): for attempt in xrange(nsis_attempts): try: self.run_command('"' + NSIS_path + '" /V2 ' + self.dst_path_of(tempfile)) - except ManifestError, err: + except ManifestError as err: if attempt+1 < nsis_attempts: print >> sys.stderr, "nsis failed, waiting %d seconds before retrying" % nsis_retry_wait time.sleep(nsis_retry_wait) @@ -1106,7 +1108,11 @@ class DarwinManifest(ViewerManifest): 'vol':volname}) # mount the image and get the name of the mount point and device node - hdi_output = self.run_command('hdiutil attach -private %r' % sparsename) + try: + hdi_output = subprocess.check_output(['hdiutil', 'attach', '-private', sparsename]) + except subprocess.CalledProcessError as err: + sys.exit("failed to mount image at '%s'" % sparsename) + try: devfile = re.search("/dev/disk([0-9]+)[^s]", hdi_output).group(0).strip() volpath = re.search('HFS\s+(.+)', hdi_output).group(1).strip() @@ -1220,7 +1226,7 @@ class DarwinManifest(ViewerManifest): 'bundle': app_in_dmg }) signed=True # if no exception was raised, the codesign worked - except ManifestError, err: + except ManifestError as err: if sign_attempts: print >> sys.stderr, "codesign failed, waiting %d seconds before retrying" % sign_retry_wait time.sleep(sign_retry_wait) @@ -1483,7 +1489,7 @@ def symlinkf(src, dst): """ try: os.symlink(src, dst) - except OSError, err: + except OSError as err: if err.errno != errno.EEXIST: raise # We could just blithely attempt to remove and recreate the target -- cgit v1.2.3 From 19bb6fd33e315e1370583d7a90ec3da10f184a54 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 27 Sep 2017 15:27:30 -0400 Subject: MAINT-7081: Mention nghttp2 library wherever it must be mentioned. --- indra/newview/viewer_manifest.py | 1 + 1 file changed, 1 insertion(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 900e9f7b1b..e9e1b1d6ac 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -930,6 +930,7 @@ class DarwinManifest(ViewerManifest): "libexpat.1.dylib", "libexception_handler.dylib", "libGLOD.dylib", + "libnghttp2.dylib", ): dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile) -- cgit v1.2.3 From 1a22b7706419f592c132a1c9234c9efeb10fd4f7 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 28 Sep 2017 17:58:03 -0400 Subject: MAINT-7081: Package all libnghttp2.*.dylibs. To support that, enhance path_optional() to accept wildcards and return the expanded filenames. --- indra/newview/viewer_manifest.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index e9e1b1d6ac..29c9337cc1 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -906,10 +906,19 @@ class DarwinManifest(ViewerManifest): or a list containing dst (present). Concatenate these return values to get a list of all libs that are present. """ - if self.path(src, dst): - return [dst] - print "Skipping %s" % dst - return [] + # This was simple before we started needing to pass + # wildcards. Fortunately, self.path() ends up appending a + # (source, dest) pair to self.file_list for every expanded + # file processed. Remember its size before the call. + oldlen = len(self.file_list) + self.path(src, dst) + # The dest appended to self.file_list has been prepended + # with self.get_dst_prefix(). Strip it off again. + added = [os.path.relpath(d, self.get_dst_prefix()) + for s, d in self.file_list[oldlen:]] + if not added: + print "Skipping %s" % dst + return added # dylibs is a list of all the .dylib files we expect to need # in our bundled sub-apps. For each of these we'll create a @@ -930,7 +939,10 @@ class DarwinManifest(ViewerManifest): "libexpat.1.dylib", "libexception_handler.dylib", "libGLOD.dylib", - "libnghttp2.dylib", + # libnghttp2.dylib is a symlink to + # libnghttp2.major.dylib, which is a symlink + # to libnghttp2.version.dylib. Get all of them. + "libnghttp2.*dylib", ): dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile) -- cgit v1.2.3 From ee2a1902a59f41326bea2dccb79f920640cad7c0 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 29 Sep 2017 08:46:44 -0400 Subject: MAINT-7081: Mention nghttp2.dll where it must be mentioned. --- indra/newview/viewer_manifest.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 29c9337cc1..ecff21e6d2 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -454,6 +454,9 @@ class WindowsManifest(ViewerManifest): self.path("ssleay32.dll") self.path("libeay32.dll") + # HTTP/2 + self.path("nghttp2.dll") + # Hunspell self.path("libhunspell.dll") -- cgit v1.2.3 From de59932c29bfaf40c371cadb304f6a71f1609c79 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 5 Oct 2017 22:54:33 -0400 Subject: MAINT-7684: Don't try to package or sign deleted Windows VMP .exes. --- indra/newview/viewer_manifest.py | 4 ---- 1 file changed, 4 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 900e9f7b1b..c8b51fcd86 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -368,10 +368,8 @@ class WindowsManifest(ViewerManifest): self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) # 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") @@ -709,10 +707,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) -- cgit v1.2.3 From be0e3cb2508e4de9ff85fc03fdb91dcb7b68a6a2 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 9 Oct 2017 16:35:53 -0400 Subject: MAINT-7831: Update viewer_manifest.py to use 'with self.prefix(...):' Now that LLManifest.prefix() supports use as a context manager: with self.prefix(...): ... convert existing calls to that form. This was an interesting exercise because it surfaced at least two places where the indentation did not match the self.prefix() nesting, plus another place where existing code was undented without a self.end_prefix() call. (That last was an uncaught logic bug.) This underscores the value of using a SINGLE consistent, idiomatic mechanism to limit the scope of each self.prefix() call. --- indra/newview/viewer_manifest.py | 283 ++++++++++++++++----------------------- 1 file changed, 117 insertions(+), 166 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 900e9f7b1b..d021e5b9f3 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -61,7 +61,7 @@ class ViewerManifest(LLManifest): self.path(src="../../etc/message.xml", dst="app_settings/message.xml") 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") @@ -84,9 +84,8 @@ class ViewerManifest(LLManifest): # ... 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) # include the extracted packages information (see BuildPackagesInfo.cmake) self.path(src=os.path.join(self.args['build'],"packages-info.txt"), dst="packages-info.txt") @@ -129,24 +128,21 @@ class ViewerManifest(LLManifest): "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.end_prefix("fonts") # skins - if self.prefix(src="skins"): + with self.prefix(src="skins"): # include the entire textures directory recursively - if self.prefix(src="*/textures"): + with self.prefix(src="*/textures"): self.path("*/*.tga") self.path("*/*.j2c") self.path("*/*.jpg") @@ -156,7 +152,6 @@ class ViewerManifest(LLManifest): 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("*/*.xml") @@ -168,19 +163,16 @@ class ViewerManifest(LLManifest): # 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") @@ -377,19 +369,17 @@ class WindowsManifest(ViewerManifest): self.path2basename(vmpdir,"InstallerUserMessage.py") #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() # Plugin host application self.path2basename(os.path.join(os.pardir, @@ -397,7 +387,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. @@ -466,31 +456,27 @@ 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") self.path("ca-bundle.crt") # 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() # 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") @@ -501,10 +487,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") @@ -515,25 +500,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") @@ -587,13 +569,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 @@ -796,14 +776,14 @@ 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 /Contents/MacOS/ self.path(os.path.join(relpkgdir, "libndofdev.dylib"), dst="Resources/libndofdev.dylib") self.path(os.path.join(relpkgdir, "libhunspell-1.3.0.dylib"), dst="Resources/libhunspell-1.3.0.dylib") - 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") @@ -811,52 +791,44 @@ 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() # 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") @@ -864,15 +836,13 @@ 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("secondlife.icns") - self.end_prefix(icon_path) #VMP Tkinter icons - if self.prefix("vmp_icons"): + with self.prefix("vmp_icons"): self.path("*.png") self.path("*.gif") - self.end_prefix("vmp_icons") self.path("SecondLife.nib") @@ -978,7 +948,7 @@ class DarwinManifest(ViewerManifest): print "Can't symlink %s -> %s: %s" % (src, dst, err) # 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) @@ -994,15 +964,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") @@ -1011,74 +980,68 @@ 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) - - self.end_prefix("Resources") - - # 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") - - # 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) - # .app/Contents/Frameworks/Chromium Embedded Framework.framework/ - # .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") + + + # 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) + + + # 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) + # .app/Contents/Frameworks/Chromium Embedded Framework.framework/ + # .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 + # 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 @@ -1275,21 +1238,19 @@ class LinuxManifest(ViewerManifest): debpkgdir = os.path.join(pkgdir, "lib", "debug") self.path("licenses-linux.txt","licenses.txt") - if self.prefix("linux_tools", dst=""): + with self.prefix("linux_tools", dst=""): self.path("client-readme.txt","README-linux.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","secondlife") - 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("secondlife-bin","do-not-directly-run-secondlife-bin") self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin") self.path2basename("../llplugin/slplugin", "SLPlugin") @@ -1299,40 +1260,33 @@ 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") - 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("secondlife_256.png","secondlife_icon.png") - if self.prefix(src="",dst="res-sdl") : + with self.prefix(src="",dst="res-sdl") : self.path("secondlife_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/libvlc/libmedia_plugin_libvlc.so", "libmedia_plugin_libvlc.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() # llcommon if not self.path("../llcommon/libllcommon.so", "lib/libllcommon.so"): @@ -1395,7 +1349,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") @@ -1455,21 +1409,18 @@ 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") - - self.strip_binaries() + # 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.strip_binaries() class Linux_x86_64_Manifest(LinuxManifest): -- cgit v1.2.3 From 9e95301be5e0466f4dbfec40abffadeb9f14e9fc Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 9 Oct 2017 16:46:22 -0400 Subject: MAINT-7809: Add secondlife.ico to viewer's vmp_icons install dir. --- indra/newview/viewer_manifest.py | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index d021e5b9f3..0e6c98f230 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -368,6 +368,9 @@ class WindowsManifest(ViewerManifest): #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 with self.prefix("vmp_icons"): self.path("*.png") @@ -839,6 +842,9 @@ class DarwinManifest(ViewerManifest): with self.prefix(src=icon_path, dst="") : self.path("secondlife.icns") + with self.prefix(src=icon_path, dst="vmp_icons"): + self.path("secondlife.ico") + #VMP Tkinter icons with self.prefix("vmp_icons"): self.path("*.png") -- cgit v1.2.3 From 3f84c43e148b075f00c59fb8278bea52cd29e1e7 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 25 Oct 2017 14:33:26 -0400 Subject: MAINT-7911: Set build_data.json's Platform to win for both W32, W64. --- indra/newview/viewer_manifest.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 71e348db3f..9778ceb8fa 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -292,6 +292,10 @@ class ViewerManifest(LLManifest): class WindowsManifest(ViewerManifest): + # We want the platform, per se, for every Windows build to be 'win'. The + # VMP will concatenate that with the address_size. + build_data_json_platform = 'win' + def final_exe(self): return self.app_name_oneword()+".exe" @@ -743,11 +747,9 @@ class Windows_i686_Manifest(WindowsManifest): # Although we aren't literally passed ADDRESS_SIZE, we can infer it from # the passed 'arch', which is used to select the specific subclass. address_size = 32 - build_data_json_platform = 'win32' class Windows_x86_64_Manifest(WindowsManifest): address_size = 64 - build_data_json_platform = 'win' class DarwinManifest(ViewerManifest): -- cgit v1.2.3 From 29c9739f0d1c52ca3b4bc712e871094556025c69 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 21 Nov 2017 17:05:40 -0500 Subject: MAINT-7684: Stop packaging or signing download_update.exe. --- indra/newview/viewer_manifest.py | 2 -- 1 file changed, 2 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 5cee88ca32..57539077fa 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -364,7 +364,6 @@ class WindowsManifest(ViewerManifest): self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) # include the compiled launcher scripts so that it gets included in the file_list - self.path(src='%s/download_update.exe' % vmpdir, dst="download_update.exe") self.path(src='%s/SL_Launcher.exe' % vmpdir, dst="SL_Launcher.exe") #IUM is not normally executed directly, just imported. No exe needed. @@ -697,7 +696,6 @@ 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 ( - "download_update.exe", "SL_Launcher.exe", ): self.sign(exe) -- cgit v1.2.3 From ec13121def29405788c1eeb37bb714c5d39e3a4c Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 28 Nov 2017 16:42:24 -0500 Subject: MAINT-7751: Remove redundant viewer_manifest.py directory creation. The LLManifest.copy_action() method ensures that the destination directory for any file copy exists before trying to copy the file, specifically so we don't have to clutter the business logic with tests and explicit directory creation. Remove redundant os.makedirs() stanzas. --- indra/newview/viewer_manifest.py | 37 +++++++++---------------------------- 1 file changed, 9 insertions(+), 28 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 5cee88ca32..e55020f689 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -308,6 +308,8 @@ class WindowsManifest(ViewerManifest): # This is used to test a dll manifest. # It is used as a temporary override during the construct method from test_win32_manifest import test_assembly_binding + # TODO: This is redundant with LLManifest.copy_action(). Why aren't we + # calling copy_action() in conjunction with test_assembly_binding()? if src and (os.path.exists(src) or os.path.islink(src)): # ensure that destination path exists self.cmakedirs(os.path.dirname(dst)) @@ -328,6 +330,8 @@ class WindowsManifest(ViewerManifest): # It is used as a temporary override during the construct method from test_win32_manifest import test_assembly_binding from test_win32_manifest import NoManifestException, NoMatchingAssemblyException + # TODO: This is redundant with LLManifest.copy_action(). Why aren't we + # calling copy_action() in conjunction with test_assembly_binding()? if src and (os.path.exists(src) or os.path.islink(src)): # ensure that destination path exists self.cmakedirs(os.path.dirname(dst)) @@ -379,9 +383,6 @@ class WindowsManifest(ViewerManifest): self.path("*.gif") #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) with self.prefix(dst="llbase"): self.path2basename(llbasedir,"*.py") self.path2basename(llbasedir,"_cllsd.so") @@ -781,49 +782,32 @@ class DarwinManifest(ViewerManifest): idnadir = os.path.join(pkgdir, "lib", "python", "idna") with self.prefix(src="", dst="Contents"): # everything goes in Contents - self.path("Info.plist", dst="Info.plist") + self.path("Info.plist") - # copy additional libs in /Contents/MacOS/ - self.path(os.path.join(relpkgdir, "libndofdev.dylib"), dst="Resources/libndofdev.dylib") - self.path(os.path.join(relpkgdir, "libhunspell-1.3.0.dylib"), dst="Resources/libhunspell-1.3.0.dylib") + with self.prefix(src=relpkgdir, dst="Resources"): + self.path("libndofdev.dylib") + self.path("libhunspell-1.3.0.dylib") + # copy additional libs in /Contents/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") # certifi will be imported by requests; this is our custom version to get our ca-bundle.crt - certifi_path = os.path.join(self.get_dst_prefix(),'certifi') - if not os.path.exists(certifi_path): - os.makedirs(certifi_path) with self.prefix(dst="certifi"): self.path2basename(os.path.join(vmpdir,"certifi"),"*") # 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) with self.prefix(dst="llbase"): self.path2basename(llbasedir,"*.py") self.path2basename(llbasedir,"_cllsd.so") #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) with self.prefix(dst="requests"): self.path2basename(requestsdir,"*") - urllib3_path = os.path.join(self.get_dst_prefix(),'urllib3') - if not os.path.exists(urllib3_path): - os.makedirs(urllib3_path) with self.prefix(dst="urllib3"): self.path2basename(urllib3dir,"*") - chardet_path = os.path.join(self.get_dst_prefix(),'chardet') - if not os.path.exists(chardet_path): - os.makedirs(chardet_path) with self.prefix(dst="chardet"): self.path2basename(chardetdir,"*") - idna_path = os.path.join(self.get_dst_prefix(),'idna') - if not os.path.exists(idna_path): - os.makedirs(idna_path) with self.prefix(dst="idna"): self.path2basename(idnadir,"*") @@ -1277,9 +1261,6 @@ class LinuxManifest(ViewerManifest): #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323 self.path2basename("../viewer_components/manager","SL_Launcher") self.path2basename("../viewer_components/manager","*.py") - llbase_path = os.path.join(self.get_dst_prefix(),'llbase') - if not os.path.exists(llbase_path): - os.makedirs(llbase_path) with self.prefix(dst="llbase"): self.path2basename("../packages/lib/python/llbase","*.py") self.path2basename("../packages/lib/python/llbase","_cllsd.so") -- cgit v1.2.3 From 662013f146feee5e5403c91ddc43e8d9ea07a8b2 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 29 Nov 2017 09:58:12 -0500 Subject: MAINT-7751: Tidying up viewer_manifest.py a little --- indra/newview/viewer_manifest.py | 80 +++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 46 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 89bea10c95..8048f4eb2f 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -360,18 +360,16 @@ class WindowsManifest(ViewerManifest): pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") - vmpdir = os.path.join(pkgdir, "VMP") - llbasedir = os.path.join(pkgdir, "lib", "python", "llbase") if self.is_packaging_viewer(): # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) - # include the compiled launcher scripts so that it gets included in the file_list - self.path(src='%s/SL_Launcher.exe' % vmpdir, dst="SL_Launcher.exe") - - #IUM is not normally executed directly, just imported. No exe needed. - self.path2basename(vmpdir,"InstallerUserMessage.py") + with self.prefix(src=os.path.join(pkgdir, "VMP"), dst=""): + # include the compiled launcher scripts so that it gets included in the file_list + self.path('SL_Launcher.exe') + #IUM is not normally executed directly, just imported. No exe needed. + self.path("InstallerUserMessage.py") with self.prefix(src=self.icon_path(), dst="vmp_icons"): self.path("secondlife.ico") @@ -382,9 +380,9 @@ class WindowsManifest(ViewerManifest): self.path("*.gif") #before, we only needed llbase at build time. With VMP, we need it at run time. - with self.prefix(dst="llbase"): - self.path2basename(llbasedir,"*.py") - self.path2basename(llbasedir,"_cllsd.so") + with self.prefix(src=os.path.join(pkgdir, "lib", "python", "llbase"), dst="llbase"): + self.path("*.py") + self.path("_cllsd.so") # Plugin host application self.path2basename(os.path.join(os.pardir, @@ -772,12 +770,6 @@ class DarwinManifest(ViewerManifest): pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") - vmpdir = os.path.join(pkgdir, "VMP") - llbasedir = os.path.join(pkgdir, "lib", "python", "llbase") - requestsdir = os.path.join(pkgdir, "lib", "python", "requests") - urllib3dir = os.path.join(pkgdir, "lib", "python", "urllib3") - chardetdir = os.path.join(pkgdir, "lib", "python", "chardet") - idnadir = os.path.join(pkgdir, "lib", "python", "idna") with self.prefix(src="", dst="Contents"): # everything goes in Contents self.path("Info.plist") @@ -789,25 +781,20 @@ class DarwinManifest(ViewerManifest): # copy additional libs in /Contents/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") - # certifi will be imported by requests; this is our custom version to get our ca-bundle.crt - with self.prefix(dst="certifi"): - self.path2basename(os.path.join(vmpdir,"certifi"),"*") - # llbase provides our llrest service layer and llsd decoding - with self.prefix(dst="llbase"): - self.path2basename(llbasedir,"*.py") - self.path2basename(llbasedir,"_cllsd.so") - #requests module needed by llbase/llrest.py - #this is only needed on POSIX, because in Windows we compile it into the EXE - with self.prefix(dst="requests"): - self.path2basename(requestsdir,"*") - with self.prefix(dst="urllib3"): - self.path2basename(urllib3dir,"*") - with self.prefix(dst="chardet"): - self.path2basename(chardetdir,"*") - with self.prefix(dst="idna"): - self.path2basename(idnadir,"*") + with self.prefix(src=os.path.join(pkgdir, "VMP"), dst=""): + self.path("SL_Launcher") + self.path("*.py") + # certifi will be imported by requests; this is our custom version to get our ca-bundle.crt + self.path("certifi") + with self.prefix(src=os.path.join(pkgdir, "lib", "python"), dst=""): + # llbase provides our llrest service layer and llsd decoding + with self.prefix("llbase"): + self.path("*.py") + self.path("_cllsd.so") + #requests module needed by llbase/llrest.py + #this is only needed on POSIX, because in Windows we compile it into the EXE + for pypkg in "chardet", "idna", "requests", "urllib3": + self.path(pypkg) # most everything goes in the Resources directory with self.prefix(src="", dst="Resources"): @@ -1257,15 +1244,15 @@ class LinuxManifest(ViewerManifest): self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin") self.path2basename("../llplugin/slplugin", "SLPlugin") #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323 - self.path2basename("../viewer_components/manager","SL_Launcher") - self.path2basename("../viewer_components/manager","*.py") - with self.prefix(dst="llbase"): - self.path2basename("../packages/lib/python/llbase","*.py") - self.path2basename("../packages/lib/python/llbase","_cllsd.so") + with self.prefix(src="../viewer_components/manager", dst=""): + self.path("SL_Launcher") + self.path("*.py") + with self.prefix(src=os.path.join("lib", "python", "llbase"), dst="llbase"): + self.path("*.py") + self.path("_cllsd.so") - with self.prefix("res-sdl"): - self.path("*") - # recurse + # recurses, packaged again + self.path("res-sdl") # Get the icons based on the channel type icon_path = self.icon_path() @@ -1276,9 +1263,10 @@ class LinuxManifest(ViewerManifest): self.path("secondlife_256.BMP","ll_icon.BMP") # plugins - with self.prefix(src="", dst="bin/llplugin"): - self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so") - self.path("../media_plugins/libvlc/libmedia_plugin_libvlc.so", "libmedia_plugin_libvlc.so") + with self.prefix(src="../media_plugins", dst="bin/llplugin"): + self.path("gstreamer010/libmedia_plugin_gstreamer010.so", + "libmedia_plugin_gstreamer.so") + self.path2basename("libvlc", "libmedia_plugin_libvlc.so") with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'vlc', 'plugins'), dst="bin/llplugin/vlc/plugins"): self.path( "plugins.dat" ) -- cgit v1.2.3 From 488d165895db3c2ae2aebbb3b727e95b8a3de6bf Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 4 Dec 2017 17:15:47 -0500 Subject: MAINT-7751: Rework DarwinManifest to produce new app bundle structure. Specifically, Second Life.app is now mostly just a wrapper. Its Contents/ Resources contains nested Launcher.app (the VMP) and Viewer.app (the viewer itself). Most of what used to be in the top-level Second Life.app has been relocated to the embedded Viewer.app. VMP stuff has of course been extracted to Launcher.app. The top-level Second Life.app executable is now a tiny script that runs Launcher.app. This structure permits different icons and different Dock flyover text for the launcher and the viewer, hopefully ameliorating a certain amount of user confusion about the dual icons. This requires a corresponding VMP change: on macOS, the VMP must now find both its resources and the viewer executable by walking up from Launcher.app and down again into its sibling Viewer.app. Since Dock flyover text is determined by the embedded app names, allow Product to change these at will. That means we should be able to tweak exactly one variable assignment to change either of those embedded app names, without having to chase down other references scattered throughout the source repo. For that reason, create top-level trampoline SL_Launcher script dynamically: it must reference the launcher app by name. That means we must also perform (the equivalent of) chmod +x on that generated script. The one mystery surrounding this restructuring is that without a top-level Frameworks symlink pointing to the embedded Viewer.app's Frameworks directory (where CEF lives), CEF refuses to start: no splash screen, no MoP. Perhaps we can fix that someday. Use Python's bundled plistlib to generate Info.plist files for the embedded applications. Reorganize stray code stanzas to try to help the structure of the code more or less resemble the structure of the desired result. Add ViewerManifest.relpath() method to determine the relative path from a specified base to the target path. If base omitted, assumes get_dst_prefix() -- handy for creating symlinks. Determining exactly the right number of os.pardir instances to concatenate into the relative pathname for a symlink (or an install_name_tool stamp) was tedious, fragile and unobvious, difficult to desk-check. Using relpath() should make all that more robust. Migrate symlinkf() from free function to ViewerManifest method, refactoring into _symlinkf_prep_dst() and _symlinkf(), adding relsymlinkf(). This lets us add convenience features such as prepending get_dst_prefix() to the dest (the place where we want to create the symlink), defaulting dest to the basename of target and ensuring that the parent of that dest already exists -- as with LLManifest.path(). Moreover, since it makes no sense whatsoever to create an absolute symlink to some path on the build machine, relsymlinkf() creates every symlink relative to dirname(dest). That, in turn, lets us eliminate a certain amount of boilerplate around existing calls. (Also, since we now ensure the parent directory exists, scrap the logic to diagnose "nonexistent parent directory.") Make llmanifest.LLManifest.run_command() not pass shell=True to subprocess, thereby permitting (requiring) the list form rather than the string form. Change all existing calls to list form. This makes calls more readable, for two reasons. First, many of the arguments are taken from script variables; these can simply be dropped into the list instead of indirecting through string interpolation. Second, it eliminates the need to manually escape individual arguments, since subprocess promises to honor the distinction between list elements. Also fix LLManifest.put_in_file() to ensure the containing directory exists. Consolidate some viewer_manifest.py redundancy, e.g. copying the same set of ten DLLs from either of two directories depending on Release vs. Debug. --- indra/newview/viewer_manifest.py | 945 +++++++++++++++++++++++---------------- 1 file changed, 566 insertions(+), 379 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 8048f4eb2f..cb5503eee0 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -32,11 +32,12 @@ import os.path import shutil import errno import json +import random import re +import stat +import subprocess import tarfile import time -import random -import subprocess viewer_dir = os.path.dirname(__file__) # Add indra/lib/python to our path so we don't have to muck with PYTHONPATH. @@ -290,6 +291,129 @@ class ViewerManifest(LLManifest): random.shuffle(names) return ', '.join(names) + def relsymlinkf(self, src, dst=None, catch=True): + """ + relsymlinkf() is just like symlinkf(), but instead of requiring the + caller to pass 'src' as a relative pathname, this method expects 'src' + to be absolute, and creates a symlink whose target is the relative + path from 'src' to dirname(dst). + """ + dstdir, dst = self._symlinkf_prep_dst(src, dst) + + # Determine the relative path starting from the directory containing + # dst to the intended src. + src = self.relpath(src, dstdir) + + self._symlinkf(src, dst, catch) + return dst + + def symlinkf(self, src, dst=None, catch=True): + """ + Like ln -sf, but uses os.symlink() instead of running ln. This creates + a symlink at 'dst' that points to 'src' -- see: + https://docs.python.org/2/library/os.html#os.symlink + + If you omit 'dst', this creates a symlink with basename(src) at + get_dst_prefix() -- in other words: put a symlink to this pathname + here at the current dst prefix. + + 'src' must specifically be a *relative* symlink. It makes no sense to + create an absolute symlink pointing to some path on the build machine! + + Also: + - We prepend 'dst' with the current get_dst_prefix(), so it has similar + meaning to associated self.path() calls. + - We ensure that the containing directory os.path.dirname(dst) exists + before attempting the symlink. + + If you pass catch=False, exceptions will be propagated instead of + caught. + """ + dstdir, dst = self._symlinkf_prep_dst(src, dst) + self._symlinkf(src, dst, catch) + return dst + + def _symlinkf_prep_dst(self, src, dst): + # helper for relsymlinkf() and symlinkf() + if dst is None: + dst = os.path.basename(src) + dst = os.path.join(self.get_dst_prefix(), dst) + # Seems silly to prepend get_dst_prefix() to dst only to call + # os.path.dirname() on it again, but this works even when the passed + # 'dst' is itself a pathname. + dstdir = os.path.dirname(dst) + self.cmakedirs(dstdir) + return dstdir, dst + + def _symlinkf(self, src, dst, catch): + # helper for relsymlinkf() and symlinkf() + # the passed src must be relative + if os.path.isabs(src): + raise ManifestError("Do not symlinkf(absolute %r, asis=True)" % src) + + # The outer catch is the one that reports failure even after attempted + # recovery. + try: + # At the inner layer, recovery may be possible. + try: + os.symlink(src, dst) + except OSError as err: + if err.errno != errno.EEXIST: + raise + # We could just blithely attempt to remove and recreate the target + # file, but that strategy doesn't work so well if we don't have + # permissions to remove it. Check to see if it's already the + # symlink we want, which is the usual reason for EEXIST. + elif os.path.islink(dst): + if os.readlink(dst) == src: + # the requested link already exists + pass + else: + # dst is the wrong symlink; attempt to remove and recreate it + os.remove(dst) + os.symlink(src, dst) + elif os.path.isdir(dst): + print "Requested symlink (%s) exists but is a directory; replacing" % dst + shutil.rmtree(dst) + os.symlink(src, dst) + elif os.path.exists(dst): + print "Requested symlink (%s) exists but is a file; replacing" % dst + os.remove(dst) + os.symlink(src, dst) + else: + # out of ideas + raise + except Exception as err: + # report + print "Can't symlink %r -> %r: %s: %s" % \ + (dst, src, err.__class__.__name__, err) + # if caller asked us not to catch, re-raise this exception + if not catch: + raise + + def relpath(self, path, base=None, symlink=False): + """ + Return the relative path from 'base' to the passed 'path'. If base is + omitted, self.get_dst_prefix() is assumed. In other words: make a + same-name symlink to this path right here in the current dest prefix. + + Normally we resolve symlinks. To retain symlinks, pass symlink=True. + """ + if base is None: + base = self.get_dst_prefix() + + # Since we use os.path.relpath() for this, which is purely textual, we + # must ensure that both pathnames are absolute. + if symlink: + # symlink=True means: we know path is (or indirects through) a + # symlink, don't resolve, we want to use the symlink. + abspath = os.path.abspath + else: + # symlink=False means to resolve any symlinks we may find + abspath = os.path.realpath + + return os.path.relpath(abspath(path), abspath(base)) + class WindowsManifest(ViewerManifest): # We want the platform, per se, for every Windows build to be 'win'. The @@ -481,31 +605,19 @@ class WindowsManifest(ViewerManifest): self.path("media_plugin_example.dll") # CEF runtime files - debug - if self.args['configuration'].lower() == 'debug': - 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") - self.path("libcef.dll") - self.path("libEGL.dll") - self.path("libGLESv2.dll") - self.path("dullahan_host.exe") - self.path("natives_blob.bin") - self.path("snapshot_blob.bin") - self.path("widevinecdmadapter.dll") - else: # CEF runtime files - not debug (release, relwithdebinfo etc.) - 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") - self.path("libcef.dll") - self.path("libEGL.dll") - self.path("libGLESv2.dll") - self.path("dullahan_host.exe") - self.path("natives_blob.bin") - self.path("snapshot_blob.bin") - self.path("widevinecdmadapter.dll") + config = 'debug' if self.args['configuration'].lower() == 'debug' else 'release' + with self.prefix(src=os.path.join(pkgdir, 'bin', config), dst="llplugin"): + self.path("chrome_elf.dll") + self.path("d3dcompiler_43.dll") + self.path("d3dcompiler_47.dll") + self.path("libcef.dll") + self.path("libEGL.dll") + self.path("libGLESv2.dll") + self.path("dullahan_host.exe") + self.path("natives_blob.bin") + self.path("snapshot_blob.bin") + self.path("widevinecdmadapter.dll") # MSVC DLLs needed for CEF and have to be in same directory as plugin with self.prefix(src=os.path.join(os.pardir, 'sharedlibs', 'Release'), dst="llplugin"): @@ -513,7 +625,7 @@ class WindowsManifest(ViewerManifest): self.path("msvcr120.dll") # CEF files common to all configurations - with self.prefix(src=os.path.join(os.pardir, 'packages', 'resources'), dst="llplugin"): + with self.prefix(src=os.path.join(pkgdir, 'resources'), dst="llplugin"): self.path("cef.pak") self.path("cef_100_percent.pak") self.path("cef_200_percent.pak") @@ -521,7 +633,7 @@ class WindowsManifest(ViewerManifest): self.path("devtools_resources.pak") self.path("icudtl.dat") - with self.prefix(src=os.path.join(os.pardir, 'packages', 'resources', 'locales'), dst=os.path.join('llplugin', 'locales')): + with self.prefix(src=os.path.join(pkgdir, 'resources', 'locales'), dst=os.path.join('llplugin', 'locales')): self.path("am.pak") self.path("ar.pak") self.path("bg.pak") @@ -576,7 +688,7 @@ class WindowsManifest(ViewerManifest): self.path("zh-CN.pak") self.path("zh-TW.pak") - with self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"): + with self.prefix(src=os.path.join(pkgdir, 'bin', 'release'), dst="llplugin"): self.path("libvlc.dll") self.path("libvlccore.dll") self.path("plugins/") @@ -712,7 +824,7 @@ class WindowsManifest(ViewerManifest): nsis_retry_wait=15 for attempt in xrange(nsis_attempts): try: - self.run_command('"' + NSIS_path + '" /V2 ' + self.dst_path_of(tempfile)) + self.run_command([NSIS_path, '/V2', self.dst_path_of(tempfile)]) except ManifestError as err: if attempt+1 < nsis_attempts: print >> sys.stderr, "nsis failed, waiting %d seconds before retrying" % nsis_retry_wait @@ -735,8 +847,7 @@ class WindowsManifest(ViewerManifest): if os.path.exists(sign_py): dst_path = self.dst_path_of(exe) print "about to run signing of: ", dst_path - self.run_command(' '.join((python, self.escape_slashes(sign_py), - self.escape_slashes(dst_path)))) + self.run_command([python, sign_py, dst_path]) else: print "Skipping code signing of %s: %s not found" % (exe, sign_py) @@ -764,282 +875,397 @@ class DarwinManifest(ViewerManifest): return True def construct(self): + global plistlib + import plistlib # only import for Darwin + + # These are the names of the top-level application and the embedded + # applications for the VMP and for the actual viewer, respectively. + # These names, without the .app suffix, determine the flyover text for + # their corresponding Dock icons. + toplevel_app, toplevel_icon = "Second Life.app", "secondlife.icns" + launcher_app, launcher_icon = "Launcher.app", "secondlife.icns" + viewer_app, viewer_icon = "Viewer.app", "secondlife.icns" + # copy over the build result (this is a no-op if run within the xcode script) - self.path(self.args['configuration'] + "/Second Life.app", dst="") + self.path(os.path.join(self.args['configuration'], toplevel_app), dst="") pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") + # -------------------- top-level Second Life.app --------------------- + # top-level Second Life application is only a container with self.prefix(src="", dst="Contents"): # everything goes in Contents - self.path("Info.plist") - - with self.prefix(src=relpkgdir, dst="Resources"): - self.path("libndofdev.dylib") - self.path("libhunspell-1.3.0.dylib") - - # copy additional libs in /Contents/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 - with self.prefix(src=os.path.join(pkgdir, "VMP"), dst=""): - self.path("SL_Launcher") - self.path("*.py") - # certifi will be imported by requests; this is our custom version to get our ca-bundle.crt - self.path("certifi") - with self.prefix(src=os.path.join(pkgdir, "lib", "python"), dst=""): - # llbase provides our llrest service layer and llsd decoding - with self.prefix("llbase"): - self.path("*.py") - self.path("_cllsd.so") - #requests module needed by llbase/llrest.py - #this is only needed on POSIX, because in Windows we compile it into the EXE - for pypkg in "chardet", "idna", "requests", "urllib3": - self.path(pypkg) - - # most everything goes in the Resources directory - with self.prefix(src="", dst="Resources"): - super(DarwinManifest, self).construct() - - with self.prefix("cursors_mac"): - self.path("*.tif") - - self.path("licenses-mac.txt", dst="licenses.txt") - self.path("featuretable_mac.txt") - self.path("SecondLife.nib") - self.path("ca-bundle.crt") - - icon_path = self.icon_path() - with self.prefix(src=icon_path, dst="") : - self.path("secondlife.icns") + # top-level Info.plist is as generated by CMake + Info_plist = "Info.plist" + ## This self.path() call reports 0 files... skip? + self.path(Info_plist) + Info_plist = self.dst_path_of(Info_plist) + + # the one file in top-level MacOS directory is the trampoline to + # our nested launcher_app + with self.prefix(dst="MacOS"): + toplevel_MacOS = self.get_dst_prefix() + trampoline = self.put_in_file( + 'open "%s"\n' % + # up one directory from MacOS to its sibling Resources directory + os.path.join('$(dirname "$0")', os.pardir, 'Resources', launcher_app), + "SL_Launcher", # write this file + "trampoline") # flag to add to list of copied files + # Script must be executable -- but os.chmod() is pretty low-level: + # if we just chmod(stat.S_IEXEC), we end up with NOTHING BUT x! + # Have to read the existing permissions bits, then supplement with + # x for (user, group, other). + os.chmod(trampoline, stat.S_IMODE(os.stat(trampoline).st_mode) + | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) + + # Make a symlink to a nested app Frameworks directory that doesn't + # yet exist. We shouldn't need this; the only things that need + # Frameworks are nested apps under viewer_app, and they should + # simply find its Contents/Frameworks by relative pathnames. But + # empirically, we do: if we omit this symlink, CEF doesn't work -- + # the login splash screen doesn't even display. SIIIIGH. + # We're passing a path that's already relative, hence symlinkf() + # rather than relsymlinkf(). + self.symlinkf(os.path.join("Resources", viewer_app, "Contents", "Frameworks")) - with self.prefix(src=icon_path, dst="vmp_icons"): - self.path("secondlife.ico") - - #VMP Tkinter icons - with self.prefix("vmp_icons"): - self.path("*.png") - self.path("*.gif") - - self.path("SecondLife.nib") - - # Translations - self.path("English.lproj/language.txt") - self.replace_in(src="English.lproj/InfoPlist.strings", - dst="English.lproj/InfoPlist.strings", - searchdict={'%%VERSION%%':'.'.join(self.args['version'])} - ) - self.path("German.lproj") - self.path("Japanese.lproj") - self.path("Korean.lproj") - self.path("da.lproj") - self.path("es.lproj") - self.path("fr.lproj") - self.path("hu.lproj") - self.path("it.lproj") - self.path("nl.lproj") - self.path("pl.lproj") - self.path("pt.lproj") - self.path("ru.lproj") - self.path("tr.lproj") - self.path("uk.lproj") - self.path("zh-Hans.lproj") - - def path_optional(src, dst): - """ - For a number of our self.path() calls, not only do we want - to deal with the absence of src, we also want to remember - which were present. Return either an empty list (absent) - or a list containing dst (present). Concatenate these - return values to get a list of all libs that are present. - """ - # This was simple before we started needing to pass - # wildcards. Fortunately, self.path() ends up appending a - # (source, dest) pair to self.file_list for every expanded - # file processed. Remember its size before the call. - oldlen = len(self.file_list) - self.path(src, dst) - # The dest appended to self.file_list has been prepended - # with self.get_dst_prefix(). Strip it off again. - added = [os.path.relpath(d, self.get_dst_prefix()) - for s, d in self.file_list[oldlen:]] - if not added: - print "Skipping %s" % dst - return added - - # dylibs is a list of all the .dylib files we expect to need - # in our bundled sub-apps. For each of these we'll create a - # symlink from sub-app/Contents/Resources to the real .dylib. - # Need to get the llcommon dll from any of the build directories as well. - libfile = "libllcommon.dylib" - dylibs = path_optional(self.find_existing_file(os.path.join(os.pardir, - "llcommon", - self.args['configuration'], - libfile), - os.path.join(relpkgdir, libfile)), - dst=libfile) - - for libfile in ( - "libapr-1.0.dylib", - "libaprutil-1.0.dylib", - "libcollada14dom.dylib", - "libexpat.1.dylib", - "libexception_handler.dylib", - "libGLOD.dylib", - # libnghttp2.dylib is a symlink to - # libnghttp2.major.dylib, which is a symlink - # to libnghttp2.version.dylib. Get all of them. - "libnghttp2.*dylib", - ): - dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile) - - # SLVoice and vivox lols, no symlinks needed - for libfile in ( - 'libortp.dylib', - 'libsndfile.dylib', - 'libvivoxoal.dylib', - 'libvivoxsdk.dylib', - 'libvivoxplatform.dylib', - 'SLVoice', - ): - self.path2basename(relpkgdir, libfile) - - # dylibs that vary based on configuration - if self.args['configuration'].lower() == 'debug': - for libfile in ( - "libfmodexL.dylib", - ): - dylibs += path_optional(os.path.join(debpkgdir, libfile), libfile) - else: - for libfile in ( - "libfmodex.dylib", - ): - dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile) - - # our apps - for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"), - # plugin launcher - (os.path.join("llplugin", "slplugin"), "SLPlugin.app"), - ): - self.path2basename(os.path.join(os.pardir, - app_bld_dir, self.args['configuration']), - app) - - # our apps dependencies on shared libs - # for each app, for each dylib we collected in dylibs, - # create a symlink to the real copy of the dylib. - resource_path = self.dst_path_of(os.path.join(app, "Contents", "Resources")) - for libfile in dylibs: - src = os.path.join(os.pardir, os.pardir, os.pardir, libfile) - dst = os.path.join(resource_path, libfile) - try: - symlinkf(src, dst) - except OSError as err: - print "Can't symlink %s -> %s: %s" % (src, dst, err) - - # Dullahan helper apps go inside SLPlugin.app - with self.prefix(src="", dst="SLPlugin.app/Contents/Frameworks"): - helperappfile = 'DullahanHelper.app' - self.path2basename(relpkgdir, helperappfile) - - pluginframeworkpath = self.dst_path_of('Chromium Embedded Framework.framework'); - # Putting a Frameworks directory under Contents/MacOS - # isn't canonical, but the path baked into Dullahan - # Helper.app/Contents/MacOS/DullahanHelper is: - # @executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework - # (notice, not @executable_path/../Frameworks/etc.) - # So we'll create a symlink (below) from there back to the - # Frameworks directory nested under SLPlugin.app. - helperframeworkpath = \ - self.dst_path_of('DullahanHelper.app/Contents/MacOS/' - 'Frameworks/Chromium Embedded Framework.framework') - - - 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 - with self.prefix(src="", dst="llplugin"): - self.path2basename("../media_plugins/cef/" + self.args['configuration'], - "media_plugin_cef.dylib") - - # copy LibVLC plugin itself - self.path2basename("../media_plugins/libvlc/" + self.args['configuration'], - "media_plugin_libvlc.dylib") - - # copy LibVLC dynamic libraries - with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release' ), dst="lib"): - self.path( "libvlc*.dylib*" ) - - # copy LibVLC plugins folder - with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release', 'plugins' ), dst="lib"): - self.path( "*.dylib" ) - self.path( "plugins.dat" ) - - - # 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) - - - # 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) - # .app/Contents/Frameworks/Chromium Embedded Framework.framework/ - # .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 + with self.prefix(src="", dst="Resources"): + # top-level Resources directory should be pretty sparse + # need .icns file referenced by top-level Info.plist + with self.prefix(src=self.icon_path(), dst="") : + self.path(toplevel_icon) + + # ------------------- nested launcher_app -------------------- + with self.prefix(dst=os.path.join(launcher_app, "Contents")): + # Info.plist is just like top-level one... + Info = plistlib.readPlist(Info_plist) + # except for these replacements: + Info["CFBundleExecutable"] = "SL_Launcher" + Info["CFBundleIconFile"] = launcher_icon + self.put_in_file( + plistlib.writePlistToString(Info), + os.path.basename(Info_plist), + "Info.plist") + + # copy VMP libs to 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 + with self.prefix(src=os.path.join(pkgdir, "VMP"), dst=""): + self.path("SL_Launcher") + self.path("*.py") + # certifi will be imported by requests; this is + # our custom version to get our ca-bundle.crt + self.path("certifi") + with self.prefix(src=os.path.join(pkgdir, "lib", "python"), dst=""): + # llbase provides our llrest service layer and llsd decoding + with self.prefix("llbase"): + # (Why is llbase treated specially here? What + # DON'T we want to copy out of lib/python/llbase?) + self.path("*.py") + self.path("_cllsd.so") + #requests module needed by llbase/llrest.py + #this is only needed on POSIX, because in Windows + #we compile it into the EXE + for pypkg in "chardet", "idna", "requests", "urllib3": + self.path(pypkg) + + # launcher_app/Contents/Resources + with self.prefix(dst="Resources"): + with self.prefix(src=self.icon_path(), dst="") : + self.path(launcher_icon) + with self.prefix(dst="vmp_icons"): + self.path("secondlife.ico") + #VMP Tkinter icons + with self.prefix("vmp_icons"): + self.path("*.png") + self.path("*.gif") + + # -------------------- nested viewer_app --------------------- + with self.prefix(dst=os.path.join(viewer_app, "Contents")): + # Info.plist is just like top-level one... + Info = plistlib.readPlist(Info_plist) + # except for these replacements: + # (CFBundleExecutable may be moot: SL_Launcher directly + # runs the executable, instead of launching the app) + Info["CFBundleExecutable"] = "Second Life" + Info["CFBundleIconFile"] = viewer_icon + self.put_in_file( + plistlib.writePlistToString(Info), + os.path.basename(Info_plist), + "Info.plist") + + # CEF framework goes inside viewer_app/Contents/Frameworks. + # Remember where we parked this car. + with self.prefix(src="", dst="Frameworks"): + CEF_framework = "Chromium Embedded Framework.framework" + self.path2basename(relpkgdir, CEF_framework) + CEF_framework = self.dst_path_of(CEF_framework) + + with self.prefix(dst="MacOS"): + # CMake constructs the Second Life executable in the + # MacOS directory belonging to the top-level Second + # Life.app. Move it here. + here = self.get_dst_prefix() + relbase = os.path.realpath(os.path.dirname(Info_plist)) + self.cmakedirs(here) + for f in os.listdir(toplevel_MacOS): + if f == os.path.basename(trampoline): + # don't move the trampoline script we just made! + continue + fromwhere = os.path.join(toplevel_MacOS, f) + towhere = os.path.join(here, f) + print "Moving %s => %s" % \ + (self.relpath(fromwhere, relbase), + self.relpath(towhere, relbase)) + # now do it, only without relativizing paths + os.rename(fromwhere, towhere) + + # 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 arguments + # yields a slightly smaller binary but makes crash + # logs mostly useless. This may be desirable for the + # final release. Or not. + if ("package" in self.args['actions'] or + "unpacked" in self.args['actions']): + self.run_command( + ['strip', '-S', self.dst_path_of('Second Life')]) + + with self.prefix(dst="Resources"): + # defer cross-platform file copies until we're in the right + # nested Resources directory + super(DarwinManifest, self).construct() + + with self.prefix(src=self.icon_path(), dst="") : + self.path(viewer_icon) + + with self.prefix(src=relpkgdir, dst=""): + self.path("libndofdev.dylib") + self.path("libhunspell-1.3.0.dylib") + + with self.prefix("cursors_mac"): + self.path("*.tif") + + self.path("licenses-mac.txt", dst="licenses.txt") + self.path("featuretable_mac.txt") + self.path("SecondLife.nib") + self.path("ca-bundle.crt") + + self.path("SecondLife.nib") + + # Translations + self.path("English.lproj/language.txt") + self.replace_in(src="English.lproj/InfoPlist.strings", + dst="English.lproj/InfoPlist.strings", + searchdict={'%%VERSION%%':'.'.join(self.args['version'])} + ) + self.path("German.lproj") + self.path("Japanese.lproj") + self.path("Korean.lproj") + self.path("da.lproj") + self.path("es.lproj") + self.path("fr.lproj") + self.path("hu.lproj") + self.path("it.lproj") + self.path("nl.lproj") + self.path("pl.lproj") + self.path("pt.lproj") + self.path("ru.lproj") + self.path("tr.lproj") + self.path("uk.lproj") + self.path("zh-Hans.lproj") + + def path_optional(src, dst): + """ + For a number of our self.path() calls, not only do we want + to deal with the absence of src, we also want to remember + which were present. Return either an empty list (absent) + or a list containing dst (present). Concatenate these + return values to get a list of all libs that are present. + """ + # This was simple before we started needing to pass + # wildcards. Fortunately, self.path() ends up appending a + # (source, dest) pair to self.file_list for every expanded + # file processed. Remember its size before the call. + oldlen = len(self.file_list) + self.path(src, dst) + # The dest appended to self.file_list has been prepended + # with self.get_dst_prefix(). Strip it off again. + added = [os.path.relpath(d, self.get_dst_prefix()) + for s, d in self.file_list[oldlen:]] + if not added: + print "Skipping %s" % dst + return added + + # dylibs is a list of all the .dylib files we expect to need + # in our bundled sub-apps. For each of these we'll create a + # symlink from sub-app/Contents/Resources to the real .dylib. + # Need to get the llcommon dll from any of the build directories as well. + libfile_parent = self.get_dst_prefix() + libfile = "libllcommon.dylib" + dylibs = path_optional(self.find_existing_file(os.path.join(os.pardir, + "llcommon", + self.args['configuration'], + libfile), + os.path.join(relpkgdir, libfile)), + dst=libfile) + + for libfile in ( + "libapr-1.0.dylib", + "libaprutil-1.0.dylib", + "libcollada14dom.dylib", + "libexpat.1.dylib", + "libexception_handler.dylib", + "libGLOD.dylib", + # libnghttp2.dylib is a symlink to + # libnghttp2.major.dylib, which is a symlink to + # libnghttp2.version.dylib. Get all of them. + "libnghttp2.*dylib", + ): + dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile) + + # SLVoice and vivox lols, no symlinks needed + for libfile in ( + 'libortp.dylib', + 'libsndfile.dylib', + 'libvivoxoal.dylib', + 'libvivoxsdk.dylib', + 'libvivoxplatform.dylib', + 'SLVoice', + ): + self.path2basename(relpkgdir, libfile) + + # dylibs that vary based on configuration + if self.args['configuration'].lower() == 'debug': + for libfile in ( + "libfmodexL.dylib", + ): + dylibs += path_optional(os.path.join(debpkgdir, libfile), libfile) + else: + for libfile in ( + "libfmodex.dylib", + ): + dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile) + + # our apps + executable_path = {} + for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"), + # plugin launcher + (os.path.join("llplugin", "slplugin"), "SLPlugin.app"), + ): + self.path2basename(os.path.join(os.pardir, + app_bld_dir, self.args['configuration']), + app) + executable_path[app] = \ + self.dst_path_of(os.path.join(app, "Contents", "MacOS")) + + # our apps dependencies on shared libs + # for each app, for each dylib we collected in dylibs, + # create a symlink to the real copy of the dylib. + with self.prefix(dst=os.path.join(app, "Contents", "Resources")): + for libfile in dylibs: + self.relsymlinkf(os.path.join(libfile_parent, libfile)) + + # Dullahan helper apps go inside SLPlugin.app + with self.prefix(dst=os.path.join( + "SLPlugin.app", "Contents", "Frameworks")): + + frameworkname = 'Chromium Embedded Framework' + + # This code constructs a relative symlink from the + # target framework folder back to the real CEF framework. + # 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 pass catch=False, + # letting the uncaught exception terminate the process, since + # without this symlink, Second Life web media can't possibly work. + + # It might seem simpler just to symlink Frameworks back 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. + + # from SLPlugin.app/Contents/Frameworks/Chromium Embedded + # Framework.framework back to + # $viewer_app/Contents/Frameworks/Chromium Embedded Framework.framework + SLPlugin_framework = self.relsymlinkf(CEF_framework, catch=False) + + # copy DullahanHelper.app + self.path2basename(relpkgdir, 'DullahanHelper.app') + + # and fix that up with a Frameworks/CEF symlink too + with self.prefix(dst=os.path.join( + 'DullahanHelper.app', 'Contents', 'Frameworks')): + # from Dullahan Helper.app/Contents/Frameworks/Chromium Embedded + # Framework.framework back to + # SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework + # Since SLPlugin_framework is itself a + # symlink, don't let relsymlinkf() resolve -- + # explicitly call relpath(symlink=True) and + # create that symlink here. + DullahanHelper_framework = \ + self.symlinkf(self.relpath(SLPlugin_framework, symlink=True), + catch=False) + + # change_command includes install_name_tool, the + # -change subcommand and the old framework rpath + # stamped into the executable. To use it with + # run_command(), we must still append the new + # framework path and the pathname of the + # executable to change. + change_command = [ + 'install_name_tool', '-change', + '@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework'] + + with self.prefix(dst=os.path.join( + 'DullahanHelper.app', 'Contents', 'MacOS')): + # Now self.get_dst_prefix() is, at runtime, + # @executable_path. Locate the helper app + # framework (which is a symlink) from here. + newpath = os.path.join( + '@executable_path', + self.relpath(DullahanHelper_framework, symlink=True), + frameworkname) + # and restamp the DullahanHelper executable + self.run_command( + change_command + + [newpath, self.dst_path_of('DullahanHelper')]) + + # SLPlugin plugins + with self.prefix(dst="llplugin"): + dylibexecutable = 'media_plugin_cef.dylib' + self.path2basename("../media_plugins/cef/" + self.args['configuration'], + dylibexecutable) + + # Do this install_name_tool *after* media plugin is copied over. + # Locate the framework lib executable -- relative to + # SLPlugin.app/Contents/MacOS, which will be our + # @executable_path at runtime! + newpath = os.path.join( + '@executable_path', + self.relpath(SLPlugin_framework, executable_path["SLPlugin.app"], + symlink=True), + frameworkname) + # restamp media_plugin_cef.dylib + self.run_command( + change_command + + [newpath, self.dst_path_of(dylibexecutable)]) + # copy LibVLC plugin itself + self.path2basename("../media_plugins/libvlc/" + self.args['configuration'], + "media_plugin_libvlc.dylib") - # 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 - # arguments yields a slightly smaller binary but makes crash logs mostly useless. - # This may be desirable for the final release. Or not. - if ("package" in self.args['actions'] or - "unpacked" in self.args['actions']): - self.run_command('strip -S %(viewer_binary)r' % - { 'viewer_binary' : self.dst_path_of('Contents/MacOS/Second Life')}) + # copy LibVLC dynamic libraries + with self.prefix(src=relpkgdir, dst="lib"): + self.path( "libvlc*.dylib*" ) + # copy LibVLC plugins folder + with self.prefix(src='plugins', dst=""): + self.path( "*.dylib" ) + self.path( "plugins.dat" ) def package_finish(self): global CHANNEL_VENDOR_BASE @@ -1055,9 +1281,10 @@ class DarwinManifest(ViewerManifest): # make sure we don't have stale files laying about self.remove(sparsename, finalname) - self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 1300 -layout SPUD' % { - 'sparse':sparsename, - 'vol':volname}) + self.run_command(['hdiutil', 'create', sparsename, + '-volname', volname, '-fs', 'HFS+', + '-type', 'SPARSE', '-megabytes', '1300', + '-layout', 'SPUD']) # mount the image and get the name of the mount point and device node try: @@ -1116,18 +1343,18 @@ class DarwinManifest(ViewerManifest): # well, possibly we've mistaken the nature of the problem. In any # case, don't hang up the whole build looping indefinitely, let # the original problem manifest by executing the desired command. - self.run_command('SetFile -a V %r' % pathname) + self.run_command(['SetFile', '-a', 'V', pathname]) # Create the alias file (which is a resource file) from the .r - self.run_command('Rez %r -o %r' % - (self.src_path_of("installers/darwin/release-dmg/Applications-alias.r"), - os.path.join(volpath, "Applications"))) + self.run_command( + ['Rez', self.src_path_of("installers/darwin/release-dmg/Applications-alias.r"), + '-o', os.path.join(volpath, "Applications")]) # Set the alias file's alias and custom icon bits - self.run_command('SetFile -a AC %r' % os.path.join(volpath, "Applications")) + self.run_command(['SetFile', '-a', 'AC', os.path.join(volpath, "Applications")]) # Set the disk image root's custom icon bit - self.run_command('SetFile -a C %r' % volpath) + self.run_command(['SetFile', '-a', 'C', volpath]) # Sign the app if requested; # do this in the copy that's in the .dmg so that the extended attributes used by @@ -1163,7 +1390,10 @@ class DarwinManifest(ViewerManifest): # and that it contains the correct cert/key. If a build host is set up with a clean version of macOS Sierra (or later) # then you will need to change this line (and the one for 'codesign' command below) to point to right place or else # pull in the cert/key into the default viewer keychain 'viewer.keychain-db' and export it to 'viewer.keychain' - self.run_command('security unlock-keychain -p "%s" "%s/Library/Keychains/viewer.keychain"' % ( keychain_pwd, home_path ) ) + viewer_keychain = os.path.join(home_path, 'Library', + 'Keychains', 'viewer.keychain') + self.run_command(['security', 'unlock-keychain', + '-p', keychain_pwd, viewer_keychain]) signed=False sign_attempts=3 sign_retry_wait=15 @@ -1172,11 +1402,9 @@ class DarwinManifest(ViewerManifest): sign_attempts-=1; self.run_command( # Note: See blurb above about names of keychains - 'codesign --verbose --deep --force --keychain "%(home_path)s/Library/Keychains/viewer.keychain" --sign %(identity)r %(bundle)r' % { - 'home_path' : home_path, - 'identity': identity, - 'bundle': app_in_dmg - }) + ['codesign', '--verbose', '--deep', '--force', + '--keychain', viewer_keychain, '--sign', identity, + app_in_dmg]) signed=True # if no exception was raised, the codesign worked except ManifestError as err: if sign_attempts: @@ -1186,18 +1414,19 @@ class DarwinManifest(ViewerManifest): else: print >> sys.stderr, "Maximum codesign attempts exceeded; giving up" raise - self.run_command('spctl -a -texec -vv %(bundle)r' % { 'bundle': app_in_dmg }) + self.run_command(['spctl', '-a', '-texec', '-vv', app_in_dmg]) imagename="SecondLife_" + '_'.join(self.args['version']) finally: # Unmount the image even if exceptions from any of the above - self.run_command('hdiutil detach -force %r' % devfile) + self.run_command(['hdiutil', 'detach', '-force', devfile]) print "Converting temp disk image to final disk image" - self.run_command('hdiutil convert %(sparse)r -format UDZO -imagekey zlib-level=9 -o %(final)r' % {'sparse':sparsename, 'final':finalname}) - self.run_command('hdiutil internet-enable -yes %(final)r' % {'final':finalname}) + self.run_command(['hdiutil', 'convert', sparsename, '-format', 'UDZO', + '-imagekey', 'zlib-level=9', '-o', finalname]) + self.run_command(['hdiutil', 'internet-enable', '-yes', finalname]) # get rid of the temp file self.package_file = finalname self.remove(sparsename) @@ -1268,11 +1497,11 @@ class LinuxManifest(ViewerManifest): "libmedia_plugin_gstreamer.so") self.path2basename("libvlc", "libmedia_plugin_libvlc.so") - with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'vlc', 'plugins'), dst="bin/llplugin/vlc/plugins"): + with self.prefix(src=os.path.join(pkgdir, 'lib', 'vlc', 'plugins'), dst="bin/llplugin/vlc/plugins"): self.path( "plugins.dat" ) self.path( "*/*.so" ) - with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib' ), dst="lib"): + with self.prefix(src=os.path.join(pkgdir, 'lib' ), dst="lib"): self.path( "libvlc*.so*" ) # llcommon @@ -1288,43 +1517,42 @@ class LinuxManifest(ViewerManifest): self.strip_binaries() # Fix access permissions - self.run_command(""" - find %(dst)s -type d | xargs --no-run-if-empty chmod 755; - find %(dst)s -type f -perm 0700 | xargs --no-run-if-empty chmod 0755; - find %(dst)s -type f -perm 0500 | xargs --no-run-if-empty chmod 0555; - find %(dst)s -type f -perm 0600 | xargs --no-run-if-empty chmod 0644; - find %(dst)s -type f -perm 0400 | xargs --no-run-if-empty chmod 0444; - true""" % {'dst':self.get_dst_prefix() }) + self.run_command(['find', self.get_dst_prefix(), + '-type', 'd', '-exec', 'chmod', '755', '{}', ';']) + for old, new in ('0700', '0755'), ('0500', '0555'), ('0600', '0644'), ('0400', '0444'): + self.run_command(['find', self.get_dst_prefix(), + '-type', 'f', '-perm', old, + '-exec', 'chmod', new, '{}', ';']) self.package_file = installer_name + '.tar.bz2' # temporarily move directory tree so that it has the right # name in the tarfile - self.run_command("mv %(dst)s %(inst)s" % { - 'dst': self.get_dst_prefix(), - 'inst': self.build_path_of(installer_name)}) + realname = self.get_dst_prefix() + tempname = self.build_path_of(installer_name) + self.run_command(["mv", realname, tempname]) try: # only create tarball if it's a release build. if self.args['buildtype'].lower() == 'release': # --numeric-owner hides the username of the builder for # security etc. - self.run_command('tar -C %(dir)s --numeric-owner -cjf ' - '%(inst_path)s.tar.bz2 %(inst_name)s' % { - 'dir': self.get_build_prefix(), - 'inst_name': installer_name, - 'inst_path':self.build_path_of(installer_name)}) + self.run_command(['tar', '-C', self.get_build_prefix(), + '--numeric-owner', '-cjf', + tempname + '.tar.bz2', installer_name]) else: print "Skipping %s.tar.bz2 for non-Release build (%s)" % \ (installer_name, self.args['buildtype']) finally: - self.run_command("mv %(inst)s %(dst)s" % { - 'dst': self.get_dst_prefix(), - 'inst': self.build_path_of(installer_name)}) + self.run_command(["mv", tempname, realname]) def strip_binaries(self): if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer(): print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" # makes some small assumptions about our packaged dir structure - self.run_command(r"find %(d)r/bin %(d)r/lib -type f \! -name \*.py \! -name SL_Launcher \! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) + self.run_command( + ["find"] + + [os.path.join(self.get_dst_prefix(), dir) for dir in ('bin', 'lib')] + + ['-type', 'f', '!', '-name', '*.py', '!', '-name', 'SL_Launcher', + '!', '-name', 'update_install', '-exec', 'strip', '-S', '{}', ';']) class Linux_i686_Manifest(LinuxManifest): address_size = 32 @@ -1421,46 +1649,5 @@ class Linux_x86_64_Manifest(LinuxManifest): ################################################################ -def symlinkf(src, dst): - """ - Like ln -sf, but uses os.symlink() instead of running ln. - """ - try: - os.symlink(src, dst) - except OSError as err: - if err.errno != errno.EEXIST: - raise - # We could just blithely attempt to remove and recreate the target - # file, but that strategy doesn't work so well if we don't have - # permissions to remove it. Check to see if it's already the - # symlink we want, which is the usual reason for EEXIST. - elif os.path.islink(dst): - if os.readlink(dst) == src: - # the requested link already exists - pass - else: - # dst is the wrong symlink; attempt to remove and recreate it - os.remove(dst) - os.symlink(src, dst) - elif os.path.isdir(dst): - print "Requested symlink (%s) exists but is a directory; replacing" % dst - shutil.rmtree(dst) - os.symlink(src, dst) - elif os.path.exists(dst): - print "Requested symlink (%s) exists but is a file; replacing" % dst - os.remove(dst) - os.symlink(src, dst) - else: - # see if the problem is that the parent directory does not exist - # and try to explain what is missing - (parent, tail) = os.path.split(dst) - while not os.path.exists(parent): - (parent, tail) = os.path.split(parent) - if tail: - raise Exception("Requested symlink (%s) cannot be created because %s does not exist" - % os.path.join(parent, tail)) - else: - raise - if __name__ == "__main__": main() -- cgit v1.2.3 From 6bba46effa13549988031d58ea8c4c60a97cfe3b Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 6 Dec 2017 05:17:14 -0500 Subject: MAINT-7751: Add shbang line to macOS trampoline script. This evidently makes all the difference as to whether the app is considered launchable. --- indra/newview/viewer_manifest.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index cb5503eee0..5456c264d3 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -906,8 +906,10 @@ class DarwinManifest(ViewerManifest): # our nested launcher_app with self.prefix(dst="MacOS"): toplevel_MacOS = self.get_dst_prefix() - trampoline = self.put_in_file( - 'open "%s"\n' % + trampoline = self.put_in_file("""\ +#!/bin/bash +open "%s" +""" % # up one directory from MacOS to its sibling Resources directory os.path.join('$(dirname "$0")', os.pardir, 'Resources', launcher_app), "SL_Launcher", # write this file -- cgit v1.2.3 From d79846a779ed6a819a390eb653e78c6f1e25b0e3 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 6 Dec 2017 17:09:06 -0500 Subject: MAINT-7751: Respond to Coyot's code-review suggestions. --- indra/newview/viewer_manifest.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 5456c264d3..73631631e0 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -32,6 +32,7 @@ import os.path import shutil import errno import json +import plistlib import random import re import stat @@ -343,7 +344,7 @@ class ViewerManifest(LLManifest): # 'dst' is itself a pathname. dstdir = os.path.dirname(dst) self.cmakedirs(dstdir) - return dstdir, dst + return (dstdir, dst) def _symlinkf(self, src, dst, catch): # helper for relsymlinkf() and symlinkf() @@ -875,9 +876,6 @@ class DarwinManifest(ViewerManifest): return True def construct(self): - global plistlib - import plistlib # only import for Darwin - # These are the names of the top-level application and the embedded # applications for the VMP and for the actual viewer, respectively. # These names, without the .app suffix, determine the flyover text for @@ -914,12 +912,8 @@ open "%s" os.path.join('$(dirname "$0")', os.pardir, 'Resources', launcher_app), "SL_Launcher", # write this file "trampoline") # flag to add to list of copied files - # Script must be executable -- but os.chmod() is pretty low-level: - # if we just chmod(stat.S_IEXEC), we end up with NOTHING BUT x! - # Have to read the existing permissions bits, then supplement with - # x for (user, group, other). - os.chmod(trampoline, stat.S_IMODE(os.stat(trampoline).st_mode) - | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) + # Script must be executable + self.run_command(["chmod", "+x", trampoline]) # Make a symlink to a nested app Frameworks directory that doesn't # yet exist. We shouldn't need this; the only things that need -- cgit v1.2.3 From 0e73aec0a25091b010812b878676c24dfb140af4 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 7 Dec 2017 14:03:47 -0500 Subject: MAINT-8070: Tweak macOS embedded app names (flyover text) per Product --- indra/newview/viewer_manifest.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 73631631e0..9fc113ff72 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -880,9 +880,9 @@ class DarwinManifest(ViewerManifest): # applications for the VMP and for the actual viewer, respectively. # These names, without the .app suffix, determine the flyover text for # their corresponding Dock icons. - toplevel_app, toplevel_icon = "Second Life.app", "secondlife.icns" - launcher_app, launcher_icon = "Launcher.app", "secondlife.icns" - viewer_app, viewer_icon = "Viewer.app", "secondlife.icns" + toplevel_app, toplevel_icon = "Second Life.app", "secondlife.icns" + launcher_app, launcher_icon = "Second Life Launcher.app", "secondlife.icns" + viewer_app, viewer_icon = "Second Life Viewer.app", "secondlife.icns" # copy over the build result (this is a no-op if run within the xcode script) self.path(os.path.join(self.args['configuration'], toplevel_app), dst="") -- cgit v1.2.3 From c565c62745ec37484118888f8f45dbde34d42e46 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 7 Dec 2017 16:43:04 -0500 Subject: MAINT-8069: Pass any command-line arguments through to SL_Launcher. --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 9fc113ff72..f930e8b2ce 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -906,7 +906,7 @@ class DarwinManifest(ViewerManifest): toplevel_MacOS = self.get_dst_prefix() trampoline = self.put_in_file("""\ #!/bin/bash -open "%s" +open "%s" --args "$@" """ % # up one directory from MacOS to its sibling Resources directory os.path.join('$(dirname "$0")', os.pardir, 'Resources', launcher_app), -- cgit v1.2.3 From 7ac3a755e713d0a34747660b3d48d0a7f6978c3e Mon Sep 17 00:00:00 2001 From: callum_linden Date: Thu, 21 Dec 2017 14:36:50 -0800 Subject: MAINT-8119 Fix. A change elsewhere in the viewer_manifest.py script that copies files into the right place after a build impacted the fragment of code that copies over the VLC runtime files (Libvlc.dll, libvlccore.dll and the VLC plugins dir) and they never made it to the right place. This change restores that copy --- indra/newview/viewer_manifest.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'indra/newview/viewer_manifest.py') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index f930e8b2ce..e0c332681e 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -689,10 +689,10 @@ class WindowsManifest(ViewerManifest): self.path("zh-CN.pak") self.path("zh-TW.pak") - with self.prefix(src=os.path.join(pkgdir, 'bin', 'release'), dst="llplugin"): - self.path("libvlc.dll") - self.path("libvlccore.dll") - self.path("plugins/") + with self.prefix(src=os.path.join(pkgdir, 'bin', 'release'), dst="llplugin"): + self.path("libvlc.dll") + self.path("libvlccore.dll") + self.path("plugins/") # pull in the crash logger and updater from other projects # tag:"crash-logger" here as a cue to the exporter -- cgit v1.2.3