ya2 · news · projects · code · about

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