ya2 · news · projects · code · about

5ab8296f7d4aa4a50585369659942a8b6f1ab206
[pmachines.git] / setup.py
1 '''e.g. python setup.py bdist_apps --cores=1 --no-windows=1'''
2
3
4 from ya2.utils.log import LogManager
5 LogManager.before_init_setup('pmachines')
6 import sys, os
7 from sys import argv
8 from setuptools import setup
9 from subprocess import Popen
10 from setuptools import Command
11 from setuptools.command.develop import develop
12 from multiprocessing import cpu_count
13 from textwrap import dedent
14 from direct.dist.commands import bdist_apps
15 from p3d_appimage import AppImageBuilder
16 from ya2.build.build import _branch, find_file_names, _version, FindFileNamesInfo
17 from ya2.build.lang import LanguageBuilder
18 from ya2.build.screenshots import ScreenshotsBuilder
19 from ya2.build.images import ImagesBuilder
20 from ya2.build.models import ModelsBuilder
21 from pmachines.application.application import Pmachines
22
23
24 app_name = long_name = 'pmachines'
25
26
27 class SetupDevelopmentCommand(develop):
28
29 def run(self):
30 super().run(self)
31 for argument in ['lang', 'models', 'images']:
32 p = Popen([sys.executable, __file__, argument])
33 p.communicate()
34
35
36 class BaseCommand(Command):
37
38 user_options = [('cores=', None, '#cores')]
39 cores = cpu_count()
40
41 def initialize_options(self):
42 BaseCommand.cores = cpu_count()
43 for a in argv[:]: self.__process_argument(a)
44
45 def __process_argument(self, argument):
46 if argument.startswith('--cores='):
47 BaseCommand.cores = int(argument.split('=')[1])
48
49 def finalize_options(self): pass # must override
50
51
52 class ModelsCommand(BaseCommand):
53
54 def run(self):
55 m = ModelsBuilder('assets/models', int(BaseCommand.cores))
56 m.build()
57
58
59 class ImagesCommand(BaseCommand):
60
61 def run(self):
62 s = ScreenshotsBuilder(Pmachines.scenes())
63 s.build()
64 find_info = FindFileNamesInfo(
65 ['jpg', 'png'],
66 ['models', 'gltf', 'bam'],
67 ['_png.png'])
68 images = find_file_names(find_info)
69 i = ImagesBuilder(images, int(BaseCommand.cores))
70 i.build()
71
72
73 class L10nCommand(BaseCommand):
74
75 def run(self):
76 l = LanguageBuilder(
77 app_name, 'assets/locale/po/', 'assets/scenes/', 'assets/locale/')
78 l.build()
79
80
81 class BDistAppsCommand(bdist_apps):
82
83 user_options = bdist_apps.user_options + [
84 ('cores', None, '#cores'),
85 ('nowindows=', None, "don't build for windows"), # letters, numbers and hypens only
86 ('nolinux=', None, "don't build for linux")]
87
88 def initialize_options(self):
89 super().initialize_options()
90 self.nowindows, self.nolinux = None, None
91 for a in argv[:]: self.__process_argument(a)
92
93 def __process_argument(self, argument):
94 if argument.startswith('--no-windows='):
95 self.nowindows = int(argument.split('=')[1])
96 if argument.startswith('--no-linux='):
97 self.nolinux = int(argument.split('=')[1])
98
99 def run(self):
100 assets_creation_message = dedent('''NOTE: please be sure that you've already created the assets with:
101 * python setup.py images models lang''')
102 print(assets_creation_message)
103 self.__patch_commands_py()
104 super().run()
105 self.__eventually_build_appimage()
106
107 def __patch_commands_py(self):
108 command = 'patch --forward ' + \
109 '../venv/lib/python3.7/site-packages/direct/dist/commands.py' + \
110 ' ya2/build/commands.patch'
111 os.system(command)
112
113 def __eventually_build_appimage(self):
114 if not self.nolinux:
115 a = AppImageBuilder(self)
116 filename_branch = {'master': 'alpha', 'rc': 'rc', 'stable': ''}
117 branch = filename_branch[_branch()]
118 a.build(long_name, branch, 'https://www.ya2.it/downloads/')
119
120
121 def _build_setup_arguments():
122 d = {
123 'name': app_name,
124 'version': _version(),
125 'packages': ['pmachines', 'ya2', 'assets', 'licenses'],
126 'cmdclass': {
127 'develop': SetupDevelopmentCommand,
128 'models': ModelsCommand,
129 'images': ImagesCommand,
130 'lang': L10nCommand,
131 'bdist_apps': BDistAppsCommand},
132 'install_requires': ['panda3d'],
133 'options': {
134 'build_apps': {
135 'exclude_patterns': [
136 'build/*', 'built/*', 'setup.py', 'requirements.txt',
137 'venv/*', '.git*', '*.pyc', 'options.ini', '__pycache__',
138 'assets/models/gltf/*', 'assets/models/**/*.blend',
139 'assets/models/**/models/*.png',
140 'assets/models/**/models/*.jpg'],
141 'log_filename_strftime': True,
142 'log_filename': '$USER_APPDATA/pmachines/logs/%Y/%B/%d/%H_%M_%S.log',
143 'plugins': ['pandagl', 'p3openal_audio', 'pandadx9'],
144 'gui_apps': {app_name: 'main.py'},
145 'package_data_dirs': {'simplepbr': [('simplepbr/shaders*', '', {})]},
146 'icons': {
147 app_name: [
148 'assets/images/icon/icon256.png',
149 'assets/images/icon/icon128.png',
150 'assets/images/icon/icon48.png',
151 'assets/images/icon/icon32.png',
152 'assets/images/icon/icon16.png']},
153 'include_patterns': [
154 '**/ya2/licenses/*',
155 '**/licenses/*',
156 '**/*.bam',
157 '**/*.dds',
158 '**/*.bin',
159 #'**/*.png',
160 #'**/*.jpg',
161 '**/*.ico',
162 '**/*.json',
163 '**/track_tr.py',
164 '**/*.txt',
165 '**/*.ttf',
166 '**/*.vert',
167 '**/*.frag',
168 '**/*.ogg',
169 '**/*.wav',
170 '**/*.mo'],
171 'platforms': __platform_list(),
172 'include_modules': {'*': ['encodings.hex_codec']}},
173 'bdist_apps': {'installers': __installers_dictionary()}}}
174 return d
175
176 def __platform_list():
177 platforms = []
178 if all('--no-windows' not in a for a in argv):
179 platforms += ['win_amd64']
180 if all('--no-linux' not in a for a in argv):
181 platforms += ['manylinux2010_x86_64']
182 return platforms
183
184 def __installers_dictionary():
185 installers = {}
186 if all('--no-windows' not in a for a in argv):
187 installers['win_amd64'] = ['nsis']
188 if all('--no-linux' not in a for a in argv):
189 installers['manylinux2010_x86_64'] = []
190 return installers
191
192 if __name__ == '__main__':
193 setup(**_build_setup_arguments())