Răsfoiți Sursa

Initial package

Thomas Kluyver 11 ani în urmă
comite
cd738bcbe9

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+*.pyc
+__pycache__

+ 68 - 0
nsisbuilder/__init__.py

@@ -0,0 +1,68 @@
+import os
+import shutil
+from subprocess import check_output, call
+from urllib.request import urlretrieve
+
+from .copymodules import copy_modules
+
+pjoin = os.path.join
+
+_PKGDIR = os.path.dirname(__file__)
+DEFAULT_PY_VERSION = '3.3.2'
+DEFAULT_BUILD_DIR = pjoin('build', 'nsis')
+DEFAULT_ICON = pjoin(_PKGDIR, 'glossyorb.ico')
+DEFAULT_INSTALLER_NAME = 'pynsis_installer.exe'
+
+def fetch_python(version=DEFAULT_PY_VERSION, destination=DEFAULT_BUILD_DIR):
+    """Fetch the MSI for the specified version of Python.
+    
+    It will be placed in the destination directory, and validated using GPG
+    if possible.
+    """
+    url = 'http://python.org/ftp/python/{0}/python-{0}.msi'.format(version)
+    target = pjoin(destination, 'python-{0}.msi'.format(version))
+    if os.path.isfile(target):
+        return
+    urlretrieve(url, target)
+    urlretrieve(url+'.asc', target+'.asc')
+    try:
+        keys_file = os.path.join(_PKGDIR, 'python-pubkeys.txt')
+        check_output(['gpg', '--import', keys_file])
+        check_output(['gpg', '--verify', target+'.asc'])
+    except FileNotFoundError:
+        print("GPG not available - could not check signature of {0}".format(target))
+
+def write_nsis_file(nsi_file, definitions):
+    with open(nsi_file, 'w') as f:
+        for name, value in definitions.items():
+            f.write('!define {} "{}"\n'.format(name, value))
+        
+        with open(pjoin(_PKGDIR, 'template.nsi')) as f2:
+            f.write(f2.read())
+
+def run_nsis(nsi_file):
+    call(['makensis', nsi_file])
+
+def all_steps(appname, version, script, packages=None, icon=DEFAULT_ICON,
+                py_version=DEFAULT_PY_VERSION, build_dir=DEFAULT_BUILD_DIR,
+                installer_name=DEFAULT_INSTALLER_NAME):
+    os.makedirs(build_dir, exist_ok=True)
+    fetch_python(destination=build_dir)
+    shutil.copy2(script, build_dir)
+    shutil.copy2(icon, build_dir)
+    build_pkg_dir = pjoin(build_dir, 'pkgs')
+    if os.path.isdir('pynsis_pkgs'):
+        shutil.copytree('pynsis_pkgs', build_pkg_dir)
+    else:
+        os.mkdir(build_pkg_dir)
+    copy_modules(packages or [], build_pkg_dir)
+    nsi_file = pjoin(build_dir, 'installer.nsi')
+    definitions = {'PRODUCT_NAME': appname,
+                   'PRODUCT_VERSION': version,
+                   'PY_VERSION': py_version,
+                   'SCRIPT': os.path.basename(script),
+                   'PRODUCT_ICON': os.path.basename(icon),
+                   'INSTALLER_NAME': installer_name,
+                  }
+    write_nsis_file(nsi_file, definitions)
+    run_nsis(nsi_file)

+ 50 - 0
nsisbuilder/copymodules.py

@@ -0,0 +1,50 @@
+import importlib, importlib.abc
+import os
+import shutil
+import sys
+import zipfile, zipimport
+
+class ModuleCopier:
+    def __init__(self, path=None):
+        self.path = path if (path is not None) else sys.path
+    
+    def copy(self, modname, target):
+        loader = importlib.find_loader(modname, self.path)
+        pkg = loader.is_package(modname)
+        file = loader.get_filename(modname)
+        if isinstance(loader, importlib.abc.FileLoader):
+            if pkg:
+                pkgdir, basename = os.path.split(file)
+                assert basename.startswith('__init__')
+                dest = os.path.join(target, modname)
+                shutil.copytree(pkgdir, dest, ignore=shutil.ignore_patterns('*.pyc'))
+            else:                
+                shutil.copy2(file, target)
+        
+        elif isinstance(loader, zipimport.zipimporter):
+            prefix = loader.archive + '/' + loader.prefix
+            assert file.startswith(prefix)
+            path_in_zip = file[len(prefix):]
+            zf = zipfile.ZipFile(loader.archive)
+            if pkg:
+                pkgdir, basename = path_in_zip.rsplit('/', 1)
+                assert basename.startswith('__init__')
+                pkgfiles = [f for f in zf.namelist() if f.startswith(pkgdir)]
+                zf.extractall(target, pkgfiles)
+            else:
+                zf.extract(path_in_zip, target)
+
+def copy_modules(modnames, target, path=None):
+    """Copy the specified importable modules to the target directory.
+    
+    By default, it finds modules in sys.path - this can be overridden by passing
+    the path parameter.
+    """
+    mc = ModuleCopier(path)
+    files_in_target_noext = [os.path.splitext(f)[0] for f in os.listdir(target)]
+    
+    for modname in modnames:
+        if modname in files_in_target_noext:
+            # Already there, no need to copy it.
+            continue
+        mc.copy(modname, target)

BIN
nsisbuilder/glossyorb.ico


+ 664 - 0
nsisbuilder/python-pubkeys.txt

@@ -0,0 +1,664 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.0 (GNU/Linux)
+
+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
+GVChf3GH9/g6OnD/16IfIg==
+=PoUr
+-----END PGP PUBLIC KEY BLOCK-----

+ 80 - 0
nsisbuilder/template.nsi

@@ -0,0 +1,80 @@
+
+; Definitions will be added above
+ 
+SetCompressor lzma
+
+; Modern UI installer stuff 
+!include "MUI2.nsh"
+!define MUI_ABORTWARNING
+!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
+
+; UI pages
+!insertmacro MUI_PAGE_WELCOME
+!insertmacro MUI_PAGE_COMPONENTS
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_PAGE_FINISH
+!insertmacro MUI_LANGUAGE "English"
+; MUI end ------
+
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+OutFile "${INSTALLER_NAME}"
+InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
+ShowInstDetails show
+
+Section -SETTINGS
+  SetOutPath "$INSTDIR"
+  SetOverwrite ifnewer
+SectionEnd
+
+Section "Python ${PY_VERSION}" sec_py
+  File "python-${PY_VERSION}.msi"
+  ExecWait 'msiexec /i "$INSTDIR\python-${PY_VERSION}.msi" /qb ALLUSERS=1'
+  Delete $INSTDIR\python-${PY_VERSION}.msi
+SectionEnd
+
+Section "!${PRODUCT_NAME}" sec_app
+  SectionIn RO
+  File ${SCRIPT}
+  File ${PRODUCT_ICON}
+  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}.lnk" "pyw" '"$INSTDIR\${SCRIPT}"' \
+      "$INSTDIR\${PRODUCT_ICON}"
+  WriteUninstaller $INSTDIR\uninstall.exe
+  ; Add ourselves to Add/remove programs
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+                   "DisplayName" "${PRODUCT_NAME}"
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+                   "UninstallString" '"$INSTDIR\uninstall.exe"'
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+                   "InstallLocation" "$INSTDIR"
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+                   "DisplayIcon" "$INSTDIR\${PRODUCT_ICON}"
+  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+                   "NoModify" 1
+  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+                   "NoRepair" 1
+SectionEnd
+
+Section "Uninstall"
+  Delete $INSTDIR\uninstall.exe
+  Delete "$INSTDIR\${SCRIPT}"
+  Delete "$INSTDIR\${PRODUCT_ICON}"
+  Delete "$SMPROGRAMS\${PRODUCT_NAME}.lnk"
+  RMDir $INSTDIR
+  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+SectionEnd
+
+; Functions
+
+Function .onMouseOverSection
+    ; Find which section the mouse is over, and set the corresponding description.
+    FindWindow $R0 "#32770" "" $HWNDPARENT
+    GetDlgItem $R0 $R0 1043 ; description item (must be added to the UI)
+
+    StrCmp $0 ${sec_py} 0 +2
+      SendMessage $R0 ${WM_SETTEXT} 0 "STR:The Python interpreter. \
+            This is required for ${PRODUCT_NAME} to run."
+
+    StrCmp $0 ${sec_app} "" +2
+      SendMessage $R0 ${WM_SETTEXT} 0 "STR:${PRODUCT_NAME}"
+FunctionEnd