diff --git a/.gitignore b/.gitignore index 69122c9..7a9ceb9 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,4 @@ src/mceditlib/relight/with_cython.cpp src/mceditlib/relight/with_cython.html src/mcedit2/ui/**/*.py !__init__.py +env-av diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..c9893db --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,59 @@ +# Notes: +# - Minimal appveyor.yml file is an empty file. All sections are optional. +# - Indent each level of configuration with 2 spaces. Do not use tabs! +# - All section names are case-sensitive. +# - Section names should be unique on each level. + +#---------------------------------# +# general configuration # +#---------------------------------# + +# version format +version: 2.0.0-appveyor-testing-{build} + + +cache: + # Cache downloaded pip packages. + - "C:\\Users\\appveyor\\AppData\\Local\\pip" + + +#---------------------------------# +# environment configuration # +#---------------------------------# + +# Operating system (build VM template) +os: Windows Server 2012 + +environment: + matrix: + - PYTHON: "c:\\python27" + + - PYTHON: "c:\\python27-x64" + + global: + MCEDIT_BUILD_VERSION: $(APPVEYOR_REPO_TAG_NAME) + + +# scripts that run after cloning repository +install: + # by default, all script lines are interpreted as batch + - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%" + - pip install -r requirements.txt + - pip install git+http://github.com/pyinstaller/pyinstaller + +build_script: + - pyinstaller mcedit2.spec + +artifacts: + - path: dist/mcedit2-*.exe + +deploy: + description: 'MCEdit 2 beta release $(APPVEYOR_REPO_TAG_NAME)' + provider: GitHub + auth_token: "$(GITHUB_AUTH_TOKEN)" + artifact: /dist\/mcedit2-.*\.exe/ + draft: false + prerelease: true + force_update: true + on: + appveyor_repo_tag: true # deploy on tag push only \ No newline at end of file diff --git a/mcedit2.spec b/mcedit2.spec index 5c278b0..55a1649 100644 --- a/mcedit2.spec +++ b/mcedit2.spec @@ -2,15 +2,77 @@ # Build script for pyinstaller. Run using: # $ pyinstaller mcedit2.spec -import fnmatch + import os -import itertools +import sys +import platform + +import subprocess + +import shutil +from os import path try: from PyInstaller.utils.hooks import collect_data_files except ImportError: from PyInstaller.hooks.hookutils import collect_data_files + +# --- Configurations --- + +onefile = True # if False, also skips the distribution packaging + +SEVENZIP = r"C:\Program Files\7-Zip\7z.exe" + +if 'APPVEYOR_BUILD_FOLDER' in os.environ: + SEVENZIP = '7z' + +# --- Get build parameters and environment --- + +arch_plat = os.environ.get('PYTHON_ARCH_PLAT') +if arch_plat is None: + _arch = platform.architecture()[0][:2] + _plat = "win" if os.name == 'nt' else os.name + + arch_plat = _plat + _arch + + +# --- Get version number and write to _version.py --- + +def get_git_version(): + """ + Get the version from git. + """ + + return subprocess.check_output('git describe --tags'.split()).strip() + +build_version = os.environ.get('MCEDIT_BUILD_VERSION') +if build_version is None: + build_version = "HOMEBAKED-" + get_git_version() + +version_src = """ +__version__ = %r +""" % (build_version,) + +with file("src/mcedit2/_version.py", "w") as f: + f.write(version_src) + +# --- Distribution settings --- + +dist_folder_name = "mcedit2-%s-%s" % (arch_plat, build_version) +sfx_exe_name = dist_folder_name + ".exe" + +# --- Install mcedit2 in develop-mode and rebuild extensions --- + +subprocess.check_call([sys.executable, 'setup.py', 'develop']) + +# --- Rebuild UI files + +subprocess.check_call([sys.executable, '-m', 'mcedit2.util.gen_ui']) + + +# --- Call PyInstaller to perform build --- + a = Analysis(['src/mcedit2/main.py'], hiddenimports=['PySide.QtXml'], hookspath=['.'], @@ -60,8 +122,6 @@ a.binaries = a.binaries - TOC([ pyz = PYZ(a.pure) -onefile = True - def data_filter(filename): return not ( # Remove IPython html assets, saving 1.5MB. @@ -81,9 +141,9 @@ def data_filter(filename): # mcedit egg-infos "mcedit2.egg-info" in filename or "mceditlib.egg-info" in filename - ) + def apply_filter(toc): return [(filename, path, filetype) for filename, path, filetype in toc @@ -97,7 +157,6 @@ if onefile: exe = EXE(pyz, a.scripts, - [('i', '', 'OPTION')], exclude_binaries=not onefile, name='mcedit2.exe', debug=True, @@ -114,3 +173,29 @@ if not onefile: strip=None, upx=True, name='mcedit2') + +# --- Distribution packaging --- + +if onefile: + dist_folder_path = path.join("dist", dist_folder_name) + os.makedirs(dist_folder_path) + shutil.copy(path.join("dist", "mcedit2.exe"), dist_folder_path) + + userdata_path = path.join(dist_folder_path, "MCEdit 2 Files") + plugins_path = path.join(userdata_path, "plugins") + + os.makedirs(userdata_path) + + shutil.copytree(path.join('src', 'plugins'), plugins_path) + + sfx_exe_path = path.join("dist", sfx_exe_name) + + subprocess.check_call( + [ + SEVENZIP, "a", "-sfx7z.sfx", + sfx_exe_name, + dist_folder_name, + "-m0=Copy", # STORE compression mode + ], + cwd="dist") + diff --git a/requirements-mceditlib.txt b/requirements-mceditlib.txt index 16a2e72..037830e 100644 --- a/requirements-mceditlib.txt +++ b/requirements-mceditlib.txt @@ -1,3 +1,3 @@ cython -numpy>=1.9.0, <1.10.0 +numpy arrow \ No newline at end of file