Skip to content

Commit 6815bf9

Browse files
committed
Prepare release
1 parent a771c8b commit 6815bf9

File tree

11 files changed

+71
-80
lines changed

11 files changed

+71
-80
lines changed

ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
v0.2.4 Jan 19, 2017:
2+
3+
* Dropped support for SDL1
4+
* PySDL2 is unbundled, not distributed with source anymore
5+
* Input bug fixes
6+
17
v0.2.3 May 04, 2015:
28

39
* Migrated to Qt5

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ provides a user-friendly interface over Mupen64Plus shared library.
1818
Features
1919
--------
2020

21+
* Changeable emulation plugins for audio, core, input, rsp, video
22+
* Selection of emulation core
23+
* Configuration dialogs for core, plugin and input settings
2124
* ROMs list with preview images
2225
* Input bindings configuration
2326
* Cheats support
@@ -27,8 +30,8 @@ Features
2730
Dependencies
2831
------------
2932

30-
* PyQt5
31-
* PySDL2
33+
* [PyQt5](https://www.riverbankcomputing.com/software/pyqt/download5) (QtCore, QtGui, QtWidgets, QtOpenGL)
34+
* [PySDL2](https://pysdl2.readthedocs.io)
3235

3336
Install
3437
-------

dist/debian/copyright

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -47,55 +47,6 @@ License: BSD-3-clause
4747
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
4848
SUCH DAMAGE.
4949

50-
Files: src/m64p/SDL/*
51-
Copyright: 2006, Alex Holkner
52-
License: LGPL-2.1+
53-
This library is free software; you can redistribute it and/or
54-
modify it under the terms of the GNU Lesser General Public
55-
License as published by the Free Software Foundation; either
56-
version 2.1 of the License, or (at your option) any later version.
57-
.
58-
This library is distributed in the hope that it will be useful,
59-
but WITHOUT ANY WARRANTY; without even the implied warranty of
60-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
61-
Lesser General Public License for more details.
62-
.
63-
You should have received a copy of the GNU Lesser General Public
64-
License along with this library; if not, write to the Free Software
65-
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
66-
.
67-
On Debian systems the full text of the GNU Library General Public License,
68-
version 2 or later, can be found in the `/usr/share/common-licenses/LGPL-2.1'
69-
file.
70-
71-
Files: src/m64p/SDL2/*
72-
Copyright: 2012-2014, Marcus von Appen <[email protected]>
73-
2012-2014, Steven Johnson
74-
2012-2014, Marcel Rodrigues
75-
2012-2014, Dan Gillett
76-
Comment:
77-
This software is distributed under the Public Domain (CC0 Public Domain
78-
Dedication).
79-
.
80-
In cases, where the law prohibits the recognition of Public Domain
81-
software, this software can be licensed under the zlib license
82-
License: CC0 or Zlib
83-
84-
Files: examples/resources/tuffy.ttf sdl2/test/resources/tuffy*.ttf
85-
Copyright: 2004-2011, Thatcher Ulrich, Karoly Barta and Michael Everson
86-
License: public-domain
87-
We, the copyright holders of this work, hereby release it into the
88-
public domain. This applies worldwide.
89-
.
90-
In case this is not legally possible,
91-
.
92-
We grant any entity the right to use this work for any purpose, without
93-
any conditions, unless such conditions are required by law.
94-
.
95-
Thatcher Ulrich <[email protected]> http://tulrich.com
96-
Karoly Barta
97-
Michael Evans http://www.evertype.com
98-
9950
Files: src/m64py/ui/icons/*
10051
Copyright: 2005-2009, Ulisse Perusin <[email protected]>
10152
2005-2009, Steven Garrity <[email protected]>

dist/macosx/m64py.spec

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@ a = Analysis([join(BASE_DIR, 'm64py')], pathex=[join(BASE_DIR, 'src')],
99
hookspath=None,
1010
runtime_hooks=None)
1111

12-
a.binaries + [('libQtCLucene.4.dylib',
13-
'/usr/local/lib/libQtCLucene.4.dylib', 'BINARY')]
14-
1512
pyz = PYZ(a.pure)
1613

1714
exe = EXE(pyz,

dist/redhat/m64py.spec.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Prefix: %{_prefix}
1515
BuildArch: noarch
1616
Vendor: Milan Nikolic <[email protected]>
1717
Url: http://m64py.sourceforge.net
18-
Requires: PyQt5 SDL
18+
Requires: PyQt5 PySDL2
1919

2020
%description
2121
M64Py is a Qt5 front-end (GUI) for Mupen64Plus, a cross-platform plugin-based Nintendo 64 emulator.

dist/windows/hooks/libdir.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import os
2+
import sys
3+
4+
def extend_system_path(paths):
5+
old = os.environ.get('PATH', '')
6+
paths.append(old)
7+
new = os.pathsep.join(paths)
8+
os.environ['PATH'] = new
9+
10+
d = os.path.abspath(os.path.join(sys._MEIPASS, "lib"))
11+
12+
sys.path.append(d)
13+
extend_system_path([d])

dist/windows/m64py.iss.in

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,20 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{
2626
Source: "m64py\*.ttf"; DestDir: "{app}";
2727
Source: "m64py\*.ini"; DestDir: "{app}";
2828
Source: "m64py\*.txt"; DestDir: "{app}";
29-
Source: "m64py\*.pyd"; DestDir: "{app}";
3029
Source: "m64py\*.exe"; DestDir: "{app}";
3130
Source: "m64py\*.dll"; DestDir: "{app}";
3231
Source: "m64py\*.zip"; DestDir: "{app}";
32+
Source: "m64py\*.v64"; DestDir: "{app}";
33+
Source: "m64py\*.pyd"; DestDir: "{app}";
34+
Source: "m64py\lib\*"; DestDir: "{app}\lib";
35+
Source: "m64py\doc\*"; DestDir: "{app}\doc";
3336
Source: "m64py\AUTHORS"; DestDir: "{app}";
3437
Source: "m64py\COPYING"; DestDir: "{app}";
3538
Source: "m64py\README.md"; DestDir: "{app}";
3639
Source: "m64py\ChangeLog"; DestDir: "{app}";
37-
Source: "m64py\*.v64"; DestDir: "{app}";
38-
Source: "m64py\qt5_plugins\platforms\qwindows.dll"; DestDir: "{app}\qt5_plugins\platforms";
39-
Source: "m64py\qt5_plugins\imageformats\qjpeg.dll"; DestDir: "{app}\qt5_plugins\imageformats";
40-
Source: "m64py\qt5_plugins\imageformats\qsvg.dll"; DestDir: "{app}\qt5_plugins\imageformats";
41-
Source: "m64py\doc\*"; DestDir: "{app}\doc";
40+
Source: "m64py\lib\qt5_plugins\platforms\qwindows.dll"; DestDir: "{app}\lib\qt5_plugins\platforms";
41+
Source: "m64py\lib\qt5_plugins\imageformats\qjpeg.dll"; DestDir: "{app}\lib\qt5_plugins\imageformats";
42+
Source: "m64py\lib\qt5_plugins\imageformats\qsvg.dll"; DestDir: "{app}\lib\qt5_plugins\imageformats";
4243

4344
[Icons]
4445
Name: {group}\M64Py; Filename: {app}\m64py.exe; Tasks: desktopicon;

dist/windows/m64py.spec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ from os.path import join
44
DIST_DIR = os.environ["DIST_DIR"]
55
BASE_DIR = os.environ["BASE_DIR"]
66

7-
a = Analysis([join(BASE_DIR, 'm64py')], hiddenimports=['pickle', 'PyQt5.Qt'], pathex=[join(BASE_DIR, 'src')])
7+
a = Analysis([join(BASE_DIR, 'm64py')], hiddenimports=['pickle', 'PyQt5.Qt'], pathex=[join(BASE_DIR, 'src')], hookspath=[join(DIST_DIR, 'hooks')], runtime_hooks=[join(DIST_DIR, 'hooks', 'libdir.py')])
88

99
pyz = PYZ(a.pure)
1010

setup.py

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def run(self):
6868
class build_exe(Command):
6969
"""Needs PyQt5, rarfile, PyLZMA, PyWin32, PyInstaller, Inno Setup 5"""
7070
user_options = []
71-
arch = "i686-w64-mingw32"
71+
arch = "i686-w64-mingw32.static"
7272
url = "https://bitbucket.org/ecsv/mupen64plus-mxe-daily/get/master.zip"
7373
dist_dir = join(BASE_DIR, "dist", "windows")
7474

@@ -101,6 +101,24 @@ def copy_emulator(self):
101101
zf.close()
102102
shutil.rmtree(tempdir)
103103

104+
def move_files(self):
105+
dest_path = join(self.dist_dir, "m64py", "lib")
106+
plugins_path = join(self.dist_dir, "m64py", "qt5_plugins")
107+
shutil.copytree(plugins_path, join(dest_path, "qt5_plugins"))
108+
shutil.rmtree(plugins_path)
109+
110+
for file_name in glob.glob(join(self.dist_dir, "m64py", "*.pyd")):
111+
if "PyQt5" not in file_name:
112+
shutil.move(file_name, dest_path)
113+
114+
for file_name in glob.glob(join(self.dist_dir, "m64py", "api*.dll")):
115+
shutil.move(file_name, dest_path)
116+
117+
for file_name in glob.glob(join(self.dist_dir, "m64py", "*.dll")):
118+
print(file_name)
119+
if "python3" not in file_name and "mupen64plus" not in basename(file_name):
120+
shutil.move(file_name, dest_path)
121+
104122
def copy_files(self):
105123
dest_path = join(self.dist_dir, "m64py")
106124
rar_dir = join(os.environ["ProgramFiles(x86)"], "Unrar")
@@ -116,17 +134,17 @@ def copy_files(self):
116134

117135
import PyQt5
118136
qt5_dir = dirname(PyQt5.__file__)
119-
qwindows = join(qt5_dir, "plugins", "platforms", "qwindows.dll")
120-
qwindows_dest = join(dest_path, "qt5_plugins", "platforms")
137+
qwindows = join(qt5_dir, "Qt", "plugins", "platforms", "qwindows.dll")
138+
qwindows_dest = join(dest_path, "lib", "qt5_plugins", "platforms")
121139
if not os.path.exists(qwindows_dest):
122140
os.makedirs(qwindows_dest)
123141
shutil.copy(qwindows, qwindows_dest)
124142

125143
def remove_files(self):
126144
dest_path = join(self.dist_dir, "m64py")
127-
for dir_name in ["api", "include", "man6", "applications", "apps"]:
128-
shutil.rmtree(join(dest_path, dir_name))
129-
for file_name in glob.glob(join(dest_path, "icu*.dll")):
145+
for dir_name in ["api", "man6", "applications", "apps"]:
146+
shutil.rmtree(join(dest_path, dir_name), True)
147+
for file_name in glob.glob(join(dest_path, "glide*.exe")):
130148
os.remove(file_name)
131149

132150
def run_build_installer(self):
@@ -144,19 +162,20 @@ def run_build_installer(self):
144162
subprocess.call([iscc, iss_out])
145163

146164
def run_build(self):
147-
import PyInstaller.build
165+
import PyInstaller.building.build_main
148166
work_path = join(self.dist_dir, "build")
149167
spec_file = join(self.dist_dir, "m64py.spec")
150168
os.environ["BASE_DIR"] = BASE_DIR
151169
os.environ["DIST_DIR"] = self.dist_dir
152170
opts = {"distpath": self.dist_dir, "workpath": work_path, "clean_build": True, "upx_dir": None, "debug": False}
153-
PyInstaller.build.main(None, spec_file, True, **opts)
171+
PyInstaller.building.build_main.main(None, spec_file, True, **opts)
154172

155173
def run(self):
156174
self.run_command("build_qt")
157175
set_rthook()
158176
self.run_build()
159177
self.copy_emulator()
178+
self.move_files()
160179
self.copy_files()
161180
self.remove_files()
162181
self.run_build_installer()
@@ -197,6 +216,7 @@ def run(self):
197216
self.set_config_path()
198217
self.run_build()
199218
self.copy_emulator()
219+
self.move_files()
200220
self.copy_files()
201221
self.remove_files()
202222
self.run_build_zip()
@@ -248,7 +268,7 @@ def copy_files(self):
248268
def remove_files(self):
249269
dest_path = join(self.dist_dir, "dmg", "M64Py.app", "Contents", "MacOS")
250270
for dir_name in ["include", "lib"]:
251-
shutil.rmtree(join(dest_path, dir_name))
271+
shutil.rmtree(join(dest_path, dir_name), True)
252272
os.remove(join(self.dist_dir, "dmg", "M64Py.app", "Contents", "Resources", "icon-windowed.icns"))
253273

254274
def run_build_dmg(self):
@@ -257,17 +277,16 @@ def run_build_dmg(self):
257277
subprocess.call(["hdiutil", "create", dst_path, "-srcfolder", src_path])
258278

259279
def run_build(self):
260-
import PyInstaller.build
280+
import PyInstaller.building.build_main
261281
work_path = join(self.dist_dir, "build")
262282
spec_file = join(self.dist_dir, "m64py.spec")
263283
os.environ["BASE_DIR"] = BASE_DIR
264284
os.environ["DIST_DIR"] = self.dist_dir
265285
opts = {"distpath": self.dist_dir, "workpath": work_path, "clean_build": True, "upx_dir": None, "debug": False}
266-
PyInstaller.build.main(None, spec_file, True, **opts)
286+
PyInstaller.building.build_main.main(None, spec_file, True, **opts)
267287

268288
def run(self):
269289
self.run_command("build_qt")
270-
set_rthook()
271290
self.run_build()
272291
self.copy_files()
273292
self.copy_emulator()
@@ -282,12 +301,13 @@ def set_rthook():
282301
module_dir = dirname(PyInstaller.__file__)
283302
rthook = join(module_dir, "loader", "rthooks", "pyi_rth_qt5plugins.py")
284303
with open(rthook, "r") as hook: data = hook.read()
285-
if "import sip" not in data:
304+
if 'sys._MEIPASS, "lib"' not in data:
286305
lines = data.split("\n")
287306
for line in lines:
288-
hook_file += line + "\n"
289307
if "MEIPASS" in line:
290-
hook_file += "\nimport sip\n"
308+
hook_file += "d = os.path.join(sys._MEIPASS, \"lib\", d)\n"
309+
else:
310+
hook_file += line + "\n"
291311
with open(rthook, "w") as hook: hook.write(hook_file)
292312

293313

@@ -357,7 +377,7 @@ def run(self):
357377
packages = ["m64py", "m64py.core", "m64py.frontend", "m64py.ui"],
358378
package_dir = {"": "src"},
359379
scripts = ["m64py"],
360-
requires = ["PyQt5"],
380+
requires = ["PyQt5", "PySDL2"],
361381
platforms = ["Linux", "Windows", "Darwin"],
362382
cmdclass = cmdclass,
363383
data_files = [

src/m64py/core/defs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
CORE_API_VERSION = 0x20001
2323
CONFIG_API_VERSION = 0x20000
2424
MINIMUM_CORE_VERSION = 0x016300
25-
FRONTEND_VERSION = "0.2.3"
25+
FRONTEND_VERSION = "0.2.4"
2626

2727
SIZE_1X = (320, 240)
2828
SIZE_2X = (640, 480)

0 commit comments

Comments
 (0)