diff --git a/appveyor.yml b/appveyor.yml index 1d484f25..b43a02e1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -65,10 +65,10 @@ build_script: - "cd ..\\src" - "%CMD_IN_ENV% python ..\\doc\\generator.py" # Build distributable files. - - "%CMD_IN_ENV% pyinstaller main.spec" - - "cd dist\\TWBlue" + - "%CMD_IN_ENV% python setup.py build" + - "cd dist" # Zip it all. - - cmd: 7z a ..\..\..\snapshot_python3.zip * + - cmd: 7z a ..\..\snapshot_python3.zip * artifacts: - path: snapshot_python3.zip diff --git a/requirements.txt b/requirements.txt index 653db3cf..4d0eb504 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,7 +24,7 @@ python-vlc pypiwin32 certifi backports.functools_lru_cache -pyinstaller +cx_freeze git+https://github.com/manuelcortez/twython git+https://github.com/manuelcortez/libloader git+https://github.com/manuelcortez/platform_utils diff --git a/src/fixes/__init__.py b/src/fixes/__init__.py index bf79d791..70834b1a 100644 --- a/src/fixes/__init__.py +++ b/src/fixes/__init__.py @@ -7,13 +7,13 @@ from . import fix_arrow # A few new locales for Three languages in arrow. from . import fix_libloader # Regenerates comcache properly. from . import fix_urllib3_warnings # Avoiding some SSL warnings related to Twython. from . import fix_win32com -from . import fix_requests #fix cacert.pem location for TWBlue binary copies +#from . import fix_requests #fix cacert.pem location for TWBlue binary copies def setup(): fix_arrow.fix() if hasattr(sys, "frozen"): fix_libloader.fix() fix_win32com.fix() - fix_requests.fix() +# fix_requests.fix() # else: # fix_requests.fix(False) fix_urllib3_warnings.fix() \ No newline at end of file diff --git a/src/setup.py b/src/setup.py index 8ce8baa9..be240c75 100644 --- a/src/setup.py +++ b/src/setup.py @@ -1,131 +1,57 @@ -# -*- coding: utf-8 -*- -""" Setup file to create executables and distribute the source code of this application. Don't forget this file! """ -############################################################ -# Copyright (c) 2014 José Manuel Delicado Alcolea -# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -############################################################ -from setuptools import setup, find_packages -import py2exe -import os -import gettext +# -*- coding: utf-8 -*- +import sys import application import platform -from glob import glob -import wx +import os +from cx_Freeze import setup, Executable from requests import certs def get_architecture_files(): if platform.architecture()[0][:2] == "32": - return [ - ("", ["../windows-dependencies/x86/oggenc2.exe", "../windows-dependencies/x86/bootstrap.exe", "../windows-dependencies/x86/libvlc.dll", "../windows-dependencies/x86/libvlccore.dll"]), - ("Microsoft.VC90.CRT", glob("../windows-dependencies/x86/Microsoft.VC90.CRT/*")), - ("Microsoft.VC90.MFC", glob("../windows-dependencies/x86/Microsoft.VC90.MFC/*")), -("plugins", glob("../windows-dependencies/x86/plugins/*/*.dll")),] + return ["../windows-dependencies/x86/oggenc2.exe", "../windows-dependencies/x86/bootstrap.exe", "../windows-dependencies/x86/libvlc.dll", "../windows-dependencies/x86/libvlccore.dll", "../windows-dependencies/x86/plugins"] elif platform.architecture()[0][:2] == "64": - return [ - ("", ["../windows-dependencies/x64/oggenc2.exe", "../windows-dependencies/x64/bootstrap.exe", "../windows-dependencies/x64/libvlc.dll", "../windows-dependencies/x64/libvlccore.dll"]), - ("Microsoft.VC90.CRT", glob("../windows-dependencies/x64/Microsoft.VC90.CRT/*")), - ("Microsoft.VC90.MFC", glob("../windows-dependencies/x64/Microsoft.VC90.MFC/*")), -("plugins", glob("../windows-dependencies/x64/plugins/*/*.dll")),] + return ["../windows-dependencies/x64/oggenc2.exe", "../windows-dependencies/x64/bootstrap.exe", "../windows-dependencies/x64/libvlc.dll", "../windows-dependencies/x64/libvlccore.dll", "../windows-dependencies/x64/plugins"] -def get_data(): +def find_sound_lib_datafiles(): + import os + import platform import sound_lib - import enchant + path = os.path.join(sound_lib.__path__[0], 'lib') + if platform.architecture()[0] == '32bit' or platform.system() == 'Darwin': + arch = 'x86' + else: + arch = 'x64' + dest_dir = os.path.join('sound_lib', 'lib', arch) + source = os.path.join(path, arch) + return (source, dest_dir) + +def find_accessible_output2_datafiles(): + import os import accessible_output2 - return [ - ("", ["conf.defaults", "app-configuration.defaults", "icon.ico"]), - ("", [certs.where()]), - ("keys/lib", glob("keys/lib/*.dll")), -("keymaps", glob("keymaps/*.keymap")), -]+get_sounds()+get_locales()+get_documentation()+sound_lib.find_datafiles()+accessible_output2.find_datafiles()+enchant.utils.win32_data_files()+get_architecture_files()+wx_files()+get_dictionaries() + path = os.path.join(accessible_output2.__path__[0], 'lib') + dest_dir = os.path.join('accessible_output2', 'lib') + return (path, dest_dir) -def get_dictionaries(): - return [("share/enchant/myspell", glob("../windows-dependencies/dictionaries/*"))] +base = None +if sys.platform == 'win32': + base = 'Win32GUI' -def get_documentation (): - answer = [("documentation", ["documentation/license.txt"])] - depth = 20 - for root, dirs, files in os.walk('documentation'): - if depth == 0: - break - new = (root, glob(os.path.join(root, "*.html"))) - answer.append(new) - depth -= 1 - return answer +build_exe_options = dict( + build_exe="dist", + optimize=1, + include_msvcr=True, + zip_include_packages=["accessible_output2", "sound_lib", "arrow"], + include_files=["icon.ico", "conf.defaults", "app-configuration.defaults", "keymaps", "locales", "sounds", "documentation", ("keys\lib", "keys"), find_sound_lib_datafiles(), find_accessible_output2_datafiles()]+get_architecture_files(), + packages=["wxUI"], + ) -def get_sounds(): - answer = [] - depth = 10 - for root, dirs, files in os.walk('sounds'): - if depth == 0: - break - new = (root, glob(os.path.join(root, "*.ogg"))) - answer.append(new) - depth -= 1 - return answer +executables = [ + Executable('main.py', base=base, targetName="twblue") +] -def get_locales(): - answer = [] - for root, dirs, files in os.walk('locales'): - new = (root, glob(os.path.join(root, '*.mo'))) - answer.append(new) - return answer - -def wx_files(): - wxDir=wx.__path__[0] - localeMoFiles=set() - for f in glob("locales/*/LC_MESSAGES"): - g=f.replace("locales", "locale") - wxMoFile=os.path.join(wxDir,g,"wxstd.mo") - if os.path.isfile(wxMoFile): - localeMoFiles.add((f,(wxMoFile,))) - lang=os.path.split(os.path.split(f)[0])[1] - if '_' in lang: - lang=lang.split('_')[0] - f=os.path.join('locale',lang,'lc_messages') - g=f.replace("locale", "locales") - wxMoFile=os.path.join(wxDir,f,"wxstd.mo") - if os.path.isfile(wxMoFile): - localeMoFiles.add((g,(wxMoFile,))) - return list(localeMoFiles) - -if __name__ == '__main__': - setup( - name = application.name, - author = u", ".join(application.authors), - author_email = application.authorEmail, - version = application.version, - url = application.url, -packages= find_packages(), -data_files = get_data(), -options = { - 'py2exe': { - 'optimize':2, - 'packages': ["pubsub", "pubsub.core", "pubsub.core.kwargs", "dbhash", "oauthlib.oauth1.rfc5849.endpoints.resource", "oauthlib.oauth2.rfc6749.endpoints.resource"], - 'dll_excludes': ["MPR.dll", "api-ms-win-core-apiquery-l1-1-0.dll", "api-ms-win-core-console-l1-1-0.dll", "api-ms-win-core-delayload-l1-1-1.dll", "api-ms-win-core-errorhandling-l1-1-1.dll", "api-ms-win-core-file-l1-2-0.dll", "api-ms-win-core-handle-l1-1-0.dll", "api-ms-win-core-heap-obsolete-l1-1-0.dll", "api-ms-win-core-libraryloader-l1-1-1.dll", "api-ms-win-core-localization-l1-2-0.dll", "api-ms-win-core-processenvironment-l1-2-0.dll", "api-ms-win-core-processthreads-l1-1-1.dll", "api-ms-win-core-profile-l1-1-0.dll", "api-ms-win-core-registry-l1-1-0.dll", "api-ms-win-core-synch-l1-2-0.dll", "api-ms-win-core-sysinfo-l1-2-0.dll", "api-ms-win-security-base-l1-2-0.dll", "api-ms-win-core-heap-l1-2-0.dll", "api-ms-win-core-interlocked-l1-2-0.dll", "api-ms-win-core-localization-obsolete-l1-1-0.dll", "api-ms-win-core-string-l1-1-0.dll", "api-ms-win-core-string-obsolete-l1-1-0.dll", "WLDAP32.dll", "MSVCP90.dll", "CRYPT32.dll", "mfc90.dll"], - 'compressed': True - }, - }, - windows = [ - { - 'script': 'main.py', - 'dest_base': 'TWBlue', -} - ], - install_requires = [ - ] - ) +setup(name=application.name, + version=application.version, + description=application.description, + options = {"build_exe": build_exe_options}, + executables=executables + )