comparison setup.py @ 46243:63c923fd7fa8

setup: when possible, build and bundle man pages This makes it so the manual pages are built as part of the Python build, and includes them in any wheel generated. This should make Python wheels a much more useful and complete way of distributing Mercurial binaries. Differential Revision: https://phab.mercurial-scm.org/D9640
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
date Mon, 21 Dec 2020 15:50:01 +0100
parents 172b294b6d65
children 2ef575c62f10
comparison
equal deleted inserted replaced
46242:cb12658bf0e1 46243:63c923fd7fa8
194 from distutils.command.build import build 194 from distutils.command.build import build
195 from distutils.command.build_ext import build_ext 195 from distutils.command.build_ext import build_ext
196 from distutils.command.build_py import build_py 196 from distutils.command.build_py import build_py
197 from distutils.command.build_scripts import build_scripts 197 from distutils.command.build_scripts import build_scripts
198 from distutils.command.install import install 198 from distutils.command.install import install
199 from distutils.command.install_data import install_data
199 from distutils.command.install_lib import install_lib 200 from distutils.command.install_lib import install_lib
200 from distutils.command.install_scripts import install_scripts 201 from distutils.command.install_scripts import install_scripts
201 from distutils import log 202 from distutils import log
202 from distutils.spawn import spawn, find_executable 203 from distutils.spawn import spawn, find_executable
203 from distutils import file_util 204 from distutils import file_util
209 from distutils.sysconfig import get_python_inc, get_config_var 210 from distutils.sysconfig import get_python_inc, get_config_var
210 from distutils.version import StrictVersion 211 from distutils.version import StrictVersion
211 212
212 # Explain to distutils.StrictVersion how our release candidates are versionned 213 # Explain to distutils.StrictVersion how our release candidates are versionned
213 StrictVersion.version_re = re.compile(r'^(\d+)\.(\d+)(\.(\d+))?-?(rc(\d+))?$') 214 StrictVersion.version_re = re.compile(r'^(\d+)\.(\d+)(\.(\d+))?-?(rc(\d+))?$')
215
216 # Can we build the documentation?
217 try:
218 import docutils
219 except ImportError:
220 docutils = None
214 221
215 222
216 def write_if_changed(path, content): 223 def write_if_changed(path, content):
217 """Write content to a file iff the content hasn't changed.""" 224 """Write content to a file iff the content hasn't changed."""
218 if os.path.exists(path): 225 if os.path.exists(path):
469 class hgbuild(build): 476 class hgbuild(build):
470 # Insert hgbuildmo first so that files in mercurial/locale/ are found 477 # Insert hgbuildmo first so that files in mercurial/locale/ are found
471 # when build_py is run next. 478 # when build_py is run next.
472 sub_commands = [('build_mo', None)] + build.sub_commands 479 sub_commands = [('build_mo', None)] + build.sub_commands
473 480
481 def run(self):
482 if os.name == 'nt':
483 pass
484 elif docutils is None:
485 log.warn('not building optional documentation')
486 else:
487 self.run_command('build_doc')
488
474 489
475 class hgbuildmo(build): 490 class hgbuildmo(build):
476 491
477 description = "build translations (.mo files)" 492 description = "build translations (.mo files)"
478 493
1038 genman(root) 1053 genman(root)
1039 if self.html: 1054 if self.html:
1040 genhtml(root) 1055 genhtml(root)
1041 1056
1042 1057
1058 class hginstalldata(install_data):
1059 user_options = install_data.user_options + [
1060 (
1061 'install-man=',
1062 None,
1063 'installation directory for manual pages [share/man]',
1064 ),
1065 ]
1066
1067 install_man = None
1068
1069 def finalize_options(self):
1070 install_data.finalize_options(self)
1071
1072 self.set_undefined_options('install', ('install_man', 'install_man'))
1073
1074 if self.install_man is None:
1075 self.install_man = os.path.join('share', 'man')
1076
1077 if os.name == 'nt':
1078 pass
1079 elif docutils is None:
1080 log.warn('not installing manual pages')
1081 else:
1082 manpages = [
1083 f for f in os.listdir('doc') if re.search(r'\.[0-9]$', f)
1084 ]
1085
1086 self.data_files += [
1087 (
1088 os.path.join(self.install_man, 'man' + ext[1:]),
1089 ['doc/' + f for f in manpages if f.endswith(ext)],
1090 )
1091 for ext in set(os.path.splitext(f)[1] for f in manpages)
1092 ]
1093
1094
1043 class hginstall(install): 1095 class hginstall(install):
1044 1096
1045 user_options = install.user_options + [ 1097 user_options = install.user_options + [
1046 ( 1098 (
1047 'old-and-unmanageable', 1099 'old-and-unmanageable',
1051 ( 1103 (
1052 'single-version-externally-managed', 1104 'single-version-externally-managed',
1053 None, 1105 None,
1054 'noop, present for eggless setuptools compat', 1106 'noop, present for eggless setuptools compat',
1055 ), 1107 ),
1108 (
1109 'install-man=',
1110 None,
1111 'installation directory for manual pages [share/man]',
1112 ),
1056 ] 1113 ]
1057 1114
1058 # Also helps setuptools not be sad while we refuse to create eggs. 1115 # Also helps setuptools not be sad while we refuse to create eggs.
1059 single_version_externally_managed = True 1116 single_version_externally_managed = True
1060 1117
1118 install_man = None
1119
1061 def get_sub_commands(self): 1120 def get_sub_commands(self):
1121 subcommands = install.get_sub_commands(self)
1122 subcommands.append('install_data')
1062 # Screen out egg related commands to prevent egg generation. But allow 1123 # Screen out egg related commands to prevent egg generation. But allow
1063 # mercurial.egg-info generation, since that is part of modern 1124 # mercurial.egg-info generation, since that is part of modern
1064 # packaging. 1125 # packaging.
1065 excl = {'bdist_egg'} 1126 excl = {'bdist_egg'}
1066 return filter(lambda x: x not in excl, install.get_sub_commands(self)) 1127 return filter(lambda x: x not in excl, subcommands)
1067 1128
1068 1129
1069 class hginstalllib(install_lib): 1130 class hginstalllib(install_lib):
1070 """ 1131 """
1071 This is a specialization of install_lib that replaces the copy_file used 1132 This is a specialization of install_lib that replaces the copy_file used
1263 'build_py': hgbuildpy, 1324 'build_py': hgbuildpy,
1264 'build_scripts': hgbuildscripts, 1325 'build_scripts': hgbuildscripts,
1265 'build_hgextindex': buildhgextindex, 1326 'build_hgextindex': buildhgextindex,
1266 'install': hginstall, 1327 'install': hginstall,
1267 'install_lib': hginstalllib, 1328 'install_lib': hginstalllib,
1329 'install_data': hginstalldata,
1268 'install_scripts': hginstallscripts, 1330 'install_scripts': hginstallscripts,
1269 'build_hgexe': buildhgexe, 1331 'build_hgexe': buildhgexe,
1270 } 1332 }
1271 1333
1272 if py2exehacked: 1334 if py2exehacked: