Index: visual_studio/NativeClientVSAddIn/InstallerResources/install.py |
diff --git a/visual_studio/NativeClientVSAddIn/InstallerResources/install.py b/visual_studio/NativeClientVSAddIn/InstallerResources/install.py |
index 5ce7c666ce3339fca493ea476aa482abf4d19fbd..7ce620a89d70a6c7e96a70ed273e9273a9587753 100644 |
--- a/visual_studio/NativeClientVSAddIn/InstallerResources/install.py |
+++ b/visual_studio/NativeClientVSAddIn/InstallerResources/install.py |
@@ -10,15 +10,105 @@ to where Visual Studio can find them. It assumes the current directory |
contains the necessary files to copy. |
""" |
+import create_ppapi_platform |
+import ctypes |
import os |
+import optparse |
import platform |
import shutil |
+import sys |
+ |
+NACL_PLATFORM_NAME = 'NaCl' |
+PEPPER_PLATFORM_NAME = 'PPAPI' |
+ |
+DEFAULT_VS_USER_DIRECTORY = os.path.expandvars( |
+ '%USERPROFILE%\\My Documents\\Visual Studio 2010') |
+ |
+DEFAULT_MS_BUILD_DIRECTORY = os.path.expandvars('%ProgramFiles(x86)%\\MSBuild') |
+ |
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) |
+ |
+ADDIN_FILES = ['NativeClientVSAddIn.AddIn', 'NativeClientVSAddIn.dll'] |
+ |
+def UninstallDirectory(directory): |
+ if os.path.exists(directory): |
+ shutil.rmtree(directory) |
+ print 'Removed: %s' % (directory) |
+ else: |
+ print 'Failed to remove non-existant directory: %s' % (directory) |
+ |
+ |
+def UninstallFile(file_path): |
+ if os.path.exists(file_path): |
+ os.remove(file_path) |
+ print 'Removed: %s' % (file_path) |
+ else: |
+ print 'Failed to remove non-existant file: %s' % (file_path) |
+ |
+ |
+def Uninstall(nacl_directory, pepper_directory, addin_directory): |
+ UninstallDirectory(nacl_directory) |
+ UninstallDirectory(pepper_directory) |
+ for file_name in ADDIN_FILES: |
+ UninstallFile(os.path.join(addin_directory, file_name)) |
+ |
def main(): |
+ parser = optparse.OptionParser(usage='Usage: %prog [options]') |
+ parser.add_option('-b', '--msbuild-path', dest='msbuild_path', |
+ default=DEFAULT_MS_BUILD_DIRECTORY, metavar='PATH', |
+ help='Provide the path to the MSBuild directory') |
+ parser.add_option('-a', '--vsuser-path', dest='vsuser_path', |
+ default=DEFAULT_VS_USER_DIRECTORY, metavar='PATH', |
+ help='Provide the path to the Visual Studio user directory') |
+ parser.add_option('-f', '--force', action="store_true", dest='overwrite', |
+ default=False, help='Force an overwrite of existing files') |
+ parser.add_option('-p', '--ppapi', action="store_true", dest='install_ppapi', |
+ help='Install PPAPI template without asking.') |
+ parser.add_option('-n', '--no-ppapi', action="store_false", |
+ dest='install_ppapi', help='Do not install PPAPI template and do not ask') |
+ parser.add_option('-u', '--uninstall', action="store_true", |
+ dest='uninstall', help='Remove the add-in.') |
+ (options, args) = parser.parse_args() |
+ |
if platform.system() != 'Windows': |
raise Exception('Must install to Windows system') |
- # Ensure environment variables are set |
+ if sys.version_info < (2, 6, 2): |
+ print "\n\nWARNING: Only python version 2.6.2 or greater is supported. " \ |
+ "Current version is %s\n\n" % (sys.version_info[:3],) |
+ |
+ # Admin is needed to write to the default platform directory. |
+ if ctypes.windll.shell32.IsUserAnAdmin() != 1: |
+ raise Exception("Not running as administrator. The install script needs " |
+ "write access to protected Visual Studio directories.") |
+ |
+ # Ensure install directories exist. |
+ if not os.path.exists(options.vsuser_path): |
+ raise Exception("Could not find user Visual Studio directory: %s" % ( |
+ options.vsuser_path)) |
+ if not os.path.exists(options.msbuild_path): |
+ raise Exception("Could not find MS Build directory: %s" % ( |
+ options.msbuild_path)) |
+ |
+ addin_directory = os.path.join(options.vsuser_path, 'Addins') |
+ platform_directory = os.path.join( |
+ options.msbuild_path, 'Microsoft.Cpp\\v4.0\\Platforms') |
+ nacl_directory = os.path.join(platform_directory, NACL_PLATFORM_NAME) |
+ pepper_directory = os.path.join(platform_directory, PEPPER_PLATFORM_NAME) |
+ |
+ # If uninstalling then redirect to uninstall program. |
+ if options.uninstall: |
+ Uninstall(nacl_directory, pepper_directory, addin_directory) |
+ print "\nUninstall complete!\n" |
+ exit(0) |
+ |
+ if not os.path.exists(platform_directory): |
+ raise Exception("Could not find path: %s" % platform_directory) |
+ if not os.path.exists(addin_directory): |
+ os.mkdir(addin_directory) |
+ |
+ # Ensure environment variables are set. |
nacl_sdk_root = os.getenv('NACL_SDK_ROOT', None) |
chrome_path = os.getenv('CHROME_PATH', None) |
if nacl_sdk_root is None: |
@@ -26,11 +116,53 @@ def main(): |
if chrome_path is None: |
raise Exception('Environment Variable CHROME_PATH is not set') |
- # Copy the necessary files into place |
- add_in_directory = os.path.expandvars( |
- '%USERPROFILE%\My Documents\Visual Studio 2010\Addins') |
- shutil.copy('./NativeClientVSAddIn.AddIn', add_in_directory) |
- shutil.copy('./NativeClientVSAddIn.dll', add_in_directory) |
+ # Remove existing installation. |
+ if os.path.exists(nacl_directory) or os.path.exists(pepper_directory): |
+ # If not forced then ask user permission. |
+ if not options.overwrite: |
+ print "Warning: Pre-existing add-in installation will be overwritten." |
+ print "Continue? ((Yes))/((No))" |
+ remove_answer = raw_input().strip() |
+ if not (remove_answer.lower() == "yes" or remove_answer.lower() == "y"): |
+ raise Exception('User did not allow overwrite of existing install.') |
+ print "Removing existing install..." |
+ Uninstall(nacl_directory, pepper_directory, addin_directory) |
+ |
+ # Ask user before installing PPAPI template. |
+ if options.install_ppapi is None: |
+ print "\n" |
+ print "Set up configuration to enable Pepper development " \ |
+ "with Visual Studio?" |
+ print "((Yes)) - I want to create and copy relevant files into a " \ |
+ "Pepper subdirectory" |
+ print "((No)) - I am not interested or will set up the configuration later" |
+ ppapi_answer = raw_input().strip() |
+ if ppapi_answer.lower() == "yes" or ppapi_answer.lower() == "y": |
+ options.install_ppapi = True |
+ else: |
+ options.install_ppapi = False |
+ print "Not installing PPAPI platform." |
+ |
+ print "Installing..." |
+ |
+ try: |
+ # Copy the necessary files into place. |
+ for file_name in ADDIN_FILES: |
+ shutil.copy(os.path.join(SCRIPT_DIR, file_name), addin_directory) |
+ print "Add-in installed." |
+ |
+ shutil.copytree(os.path.join(SCRIPT_DIR, 'NaCl'), nacl_directory) |
+ print "NaCl platform installed." |
+ |
+ if options.install_ppapi: |
+ create_ppapi_platform.CreatePPAPI(options.msbuild_path) |
+ print "PPAPI platform installed." |
+ except: |
+ print "\nException occured! Rolling back install...\n" |
+ Uninstall(nacl_directory, pepper_directory, addin_directory) |
+ raise |
+ else: |
+ print "\nInstallation complete!\n" |
if __name__ == '__main__': |
main() |