ya2 · news · projects · code · about

box
[pmachines.git] / setup.py
1 '''Setuptools' configuration file
2 e.g. python setup.py models --cores=1
3 e.g. python setup.py bdist_apps --nowin=1'''
4
5
6 from os import system, getcwd, chdir
7 from sys import argv, executable
8 from collections import namedtuple
9 from subprocess import Popen
10 from distutils.cmd import Command
11 from setuptools import setup
12 from setuptools.command.develop import develop
13 from direct.dist.commands import bdist_apps
14 from lib.build.build import branch, files, ver, files, bld_dpath
15 from lib.build.docs import bld_docs
16 from lib.build.models import ModelsBuilder
17 from lib.build.images import bld_images
18 from lib.build.lang import LanguageBuilder
19 from p3d_appimage import AppImageBuilder
20 from p3d_flatpak import FlatpakBuilder
21 import lib.engine.log # so logging's info/debug are logged
22
23
24 appname = longname = 'pmachines'
25
26
27
28 msg = '''NOTE: please be sure that you've already created the assets with:
29 * python setup.py images models lang'''
30
31
32 class DevelopPyCmd(develop):
33 '''Command for setting up the development.'''
34
35 def run(self):
36 '''Prepare the development environment.'''
37 develop.run(self)
38 Popen([executable, __file__, 'lang']).communicate()
39 Popen([executable, __file__, 'models']).communicate()
40
41
42 class AbsCmd(Command):
43 '''Common functionalities for commands.'''
44
45 user_options = [('cores=', None, '#cores')]
46 cores = 1
47
48 def initialize_options(self):
49 for arg in argv[:]:
50 if arg.startswith('--cores='):
51 AbsCmd.cores = int(arg.split('=')[1])
52
53 def finalize_options(self): # must override
54 pass
55
56
57 class DocsCmd(AbsCmd):
58 '''Command for building the docs.'''
59
60 def run(self):
61 '''Builds the docs.'''
62 bld_docs()
63
64
65 class ModelsCmd(AbsCmd):
66 '''Command for building the models.'''
67
68 def run(self):
69 '''Builds the models.'''
70 ModelsBuilder().build('assets/models', int(AbsCmd.cores))
71
72
73 class ImagesCmd(AbsCmd):
74 '''Command for building the models.'''
75
76 def run(self):
77 '''Builds the images.'''
78 bld_images(
79 files(['jpg', 'png'], ['models', 'gltf', 'bam'], ['_png.png']), int(AbsCmd.cores))
80
81
82 class LangCmd(AbsCmd):
83 '''Command for building po, pot and mo files.'''
84
85 lang_path = 'assets/locale/'
86
87 def _process_lang(self, lang_code):
88 '''Processes a single language.'''
89 poname = 'assets/po/%s.po' % lang_code
90 LanguageBuilder.merge(lang_code, 'assets/po/', self.lang_path, appname)
91 mo_tmpl = '%s%s/LC_MESSAGES/%s.mo'
92 moname = mo_tmpl % (self.lang_path, lang_code, appname)
93 LanguageBuilder.mo(moname, self.lang_path, appname)
94
95 def run(self):
96 '''Builds the language files.'''
97 LanguageBuilder.pot(appname, 'assets/po/')
98 list(map(self._process_lang, ['it_IT']))
99
100
101 class BDistAppsCmd(bdist_apps):
102 '''Customization of BDistApps.'''
103
104 user_options = bdist_apps.user_options + [
105 ('cores', None, '#cores'),
106 ('nowin=', None, "don't build for windows"),
107 ('nolinux=', None, "don't build for linux")]
108
109 def initialize_options(self):
110 '''Default values.'''
111 bdist_apps.initialize_options(self)
112 self.nowin, self.nolinux = None, None
113
114 #def finalize_options(self): # must override
115 # bdist_apps.finalize_options(self)
116
117 def run(self):
118 '''Our bdist_apps' customization.'''
119 print(msg)
120 cmd = 'patch --forward ' + \
121 '../venv/lib/python3.7/site-packages/direct/dist/commands.py' + \
122 ' lib/build/commands.patch'
123 system(cmd)
124 bdist_apps.run(self)
125 if not self.nolinux:
126 hbranch = {'master': 'alpha', 'rc': 'rc', 'stable': ''}[branch]
127 AppImageBuilder(self).build(longname, hbranch,
128 'http://www.ya2tech.it/downloads/')
129 fbranch = {'master': 'alpha', 'rc': 'rc', 'stable': 'stable'}[branch]
130 bld = FlatpakBuilder(
131 self,
132 'it.ya2.Pmachines',
133 '/home/flavio/pmachines_builder/flatpak',
134 'D43B6D401912B520B6805FCC8E019E6340E3BAB5',
135 '/home/flavio/pmachines_builder/gpg',
136 'http://www.ya2tech.it/flatpak',
137 ['options*.ini'],
138 fbranch,
139 ['assets'])
140 bld.build()
141
142
143 if __name__ == '__main__':
144 platform_lst, installers_dct = [], {}
145 if all('--nowin' not in arg for arg in argv):
146 platform_lst += ['win_amd64']
147 installers_dct['win_amd64'] = ['nsis']
148 if all('--nolinux' not in arg for arg in argv):
149 platform_lst += ['manylinux1_x86_64']
150 installers_dct['manylinux1_x86_64'] = []
151 log_path = '$USER_APPDATA/pmachines/logs/%Y/%B/%d/%H_%M_%S.log'
152 package_data_dirs = {'simplepbr': [('simplepbr/shaders*', '', {})]}
153 setup(
154 name=appname,
155 version=ver,
156 cmdclass={
157 'develop': DevelopPyCmd,
158 'docs': DocsCmd,
159 'models': ModelsCmd,
160 'images': ImagesCmd,
161 'lang': LangCmd,
162 'bdist_apps': BDistAppsCmd},
163 install_requires=['panda3d'],
164 options={
165 'build_apps': {
166 'exclude_patterns': [
167 'build/*', 'built/*', 'setup.py', 'requirements.txt',
168 'venv/*', '.git*', '*.pyc', 'options.ini', '__pycache__',
169 'assets/gltf/*', 'assets/models/**/*.blend',
170 'assets/models/**/models/*.png',
171 'assets/models/**/models/*.jpg'],
172 'log_filename_strftime': True,
173 'log_filename': log_path,
174 'plugins': ['pandagl', 'p3openal_audio', 'pandadx9'],
175 'gui_apps': {appname: 'main.py'},
176 'package_data_dirs': package_data_dirs,
177 'icons': {
178 appname: [
179 'assets/images/icon/icon256_png.png',
180 'assets/images/icon/icon128_png.png',
181 'assets/images/icon/icon48_png.png',
182 'assets/images/icon/icon32_png.png',
183 'assets/images/icon/icon16_png.png']},
184 'include_patterns': [
185 '**/lib/licenses/*',
186 '**/licenses/*',
187 '**/*.bam',
188 '**/*.dds',
189 '**/*.bin',
190 #'**/*.png',
191 #'**/*.jpg',
192 '**/*.ico',
193 '**/*.json',
194 '**/track_tr.py',
195 '**/*.txt',
196 '**/*.ttf',
197 '**/*.vert',
198 '**/*.frag',
199 '**/*.ogg',
200 '**/*.wav',
201 '**/*.mo'],
202 'platforms': platform_lst,
203 'include_modules': {'*': ['encodings.hex_codec']}},
204 'bdist_apps': {'installers': installers_dct}})