__init__.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. import shutil
  2. from devtools.yamaker.fileutil import subcopy, rename, files
  3. from devtools.yamaker.pathutil import is_c_src
  4. from devtools.yamaker.modules import (
  5. Library,
  6. Py3Library,
  7. Py3Program,
  8. Switch,
  9. Linkable,
  10. Words,
  11. py_srcs,
  12. )
  13. from devtools.yamaker.project import NixSourceProject
  14. MODULES_WINDOWS = (
  15. "Modules/_winapi.c",
  16. "Modules/overlapped.c",
  17. )
  18. MODULES_DARWIN = ("Modules/_scproxy.c",)
  19. MODULES_LINUX = ("Modules/spwdmodule.c",)
  20. MODULES_POSIX = (
  21. "Modules/_cryptmodule.c",
  22. "Modules/_posixsubprocess.c",
  23. "Modules/fcntlmodule.c",
  24. "Modules/grpmodule.c",
  25. "Modules/pwdmodule.c",
  26. "Modules/resource.c",
  27. "Modules/syslogmodule.c",
  28. "Modules/termios.c",
  29. )
  30. MODULES_INCLUDED = (
  31. "Modules/getaddrinfo.c",
  32. "Modules/getnameinfo.c",
  33. "Modules/_ssl/cert.c",
  34. "Modules/_ssl/debughelpers.c",
  35. "Modules/_ssl/misc.c",
  36. )
  37. def post_install(self):
  38. rename(self.dstdir + "/Modules/_decimal/libmpdec/io.h", "mpd_io.h")
  39. subcopy(
  40. self.srcdir,
  41. self.dstdir,
  42. globs=["Lib/venv/scripts/**/*"],
  43. )
  44. for subdir in (
  45. "Lib/__phello__/",
  46. "Lib/idlelib/",
  47. "Lib/test/",
  48. "Lib/tkinter/",
  49. "Lib/turtledemo/",
  50. "Modules/_decimal/libmpdec/examples/",
  51. "Modules/expat/",
  52. "Modules/_testcapi/",
  53. ):
  54. shutil.rmtree(f"{self.dstdir}/{subdir}")
  55. self.yamakes["bin"] = self.module(
  56. Py3Program,
  57. PY_MAIN=":main",
  58. )
  59. self.yamakes["bin"].module_args = ["python3"]
  60. no_lib2to3_srcs = files(f"{self.dstdir}/Lib/lib2to3", rel=f"{self.dstdir}/Lib")
  61. self.yamakes["Lib"] = self.module(
  62. Py3Library,
  63. PEERDIR=["certs", "contrib/tools/python3/lib2/py"],
  64. PY_SRCS=sorted(py_srcs(f"{self.dstdir}/Lib", remove=no_lib2to3_srcs) + ["_sysconfigdata_arcadia.py"]),
  65. NO_LINT=True,
  66. NO_PYTHON_INCLUDES=True,
  67. )
  68. self.yamakes["Lib"].before("PY3_LIBRARY", "ENABLE(PYBUILD_NO_PY)\n")
  69. self.yamakes["Modules/_sqlite"] = self.module(
  70. Py3Library,
  71. PEERDIR=["contrib/libs/sqlite3"],
  72. ADDINCL=[
  73. "contrib/libs/sqlite3",
  74. "contrib/tools/python3/Include",
  75. "contrib/tools/python3/Include/internal",
  76. ],
  77. SRCS=files(f"{self.dstdir}/Modules/_sqlite", rel=True, test=is_c_src),
  78. PY_REGISTER=["_sqlite3"],
  79. NO_COMPILER_WARNINGS=True,
  80. NO_RUNTIME=True,
  81. )
  82. modules_srcs = files(f"{self.dstdir}/Modules", rel=self.dstdir, test=is_c_src) + ["Modules/config.c"]
  83. modules_srcs = filter(lambda x: not x.startswith("Modules/_blake2/impl/"), modules_srcs)
  84. modules_srcs = filter(lambda x: not x.startswith("Modules/_sha3/kcp/"), modules_srcs)
  85. modules_srcs = filter(lambda x: not x.startswith("Modules/_sqlite/"), modules_srcs)
  86. modules_srcs = filter(lambda x: x not in MODULES_WINDOWS, modules_srcs)
  87. modules_srcs = filter(lambda x: x not in MODULES_DARWIN, modules_srcs)
  88. modules_srcs = filter(lambda x: x not in MODULES_LINUX, modules_srcs)
  89. modules_srcs = filter(lambda x: x not in MODULES_POSIX, modules_srcs)
  90. modules_srcs = filter(lambda x: x not in MODULES_INCLUDED, modules_srcs)
  91. src_srcs = files(f"{self.dstdir}/Objects", rel=self.dstdir, test=is_c_src)
  92. src_srcs += files(f"{self.dstdir}/Parser", rel=self.dstdir, test=is_c_src)
  93. src_srcs += files(f"{self.dstdir}/Python", rel=self.dstdir, test=is_c_src)
  94. src_pc_srcs = files(f"{self.dstdir}/PC", rel=self.dstdir, test=is_c_src)
  95. src_srcs.remove("Python/dynload_shlib.c")
  96. src_srcs.remove("Python/dynload_win.c")
  97. src_srcs.append("Python/deepfreeze/deepfreeze.c")
  98. src_srcs.extend(modules_srcs)
  99. self.yamakes["."] = self.module(
  100. Library,
  101. PEERDIR=[
  102. "contrib/libs/expat",
  103. "contrib/libs/libbz2",
  104. # libc_compat is needed in order to make <sys/random.h> resolvable
  105. "contrib/libs/libc_compat",
  106. "contrib/libs/openssl",
  107. "contrib/libs/lzma",
  108. "contrib/libs/zlib",
  109. "contrib/restricted/libffi",
  110. "library/cpp/sanitizer/include",
  111. ],
  112. ADDINCL=[
  113. "contrib/libs/expat",
  114. "contrib/libs/libbz2",
  115. "contrib/restricted/libffi/include",
  116. "contrib/tools/python3/Include",
  117. "contrib/tools/python3/Include/internal",
  118. "contrib/tools/python3/Modules",
  119. "contrib/tools/python3/Modules/_decimal/libmpdec",
  120. "contrib/tools/python3/Modules/_hacl/include",
  121. "contrib/tools/python3/PC",
  122. ],
  123. CFLAGS=[
  124. "-DPy_BUILD_CORE",
  125. "-DPy_BUILD_CORE_BUILTIN",
  126. "-DUSE_ZLIB_CRC32",
  127. '-DABIFLAGS=""',
  128. '-DPREFIX="/var/empty"',
  129. '-DEXEC_PREFIX="/var/empty"',
  130. f'-DVERSION="{self.version[:4]}"',
  131. '-DVPATH=""',
  132. '-DPLATLIBDIR="lib"',
  133. ],
  134. SRCS=src_srcs,
  135. NO_COMPILER_WARNINGS=True,
  136. NO_UTIL=True,
  137. SUPPRESSIONS=["tsan.supp"],
  138. )
  139. self.yamakes["."].after(
  140. "CFLAGS",
  141. Switch(
  142. CLANG_CL=Linkable(CFLAGS=["-Wno-invalid-token-paste"]),
  143. ),
  144. )
  145. vesrion = "".join(self.version.split(".")[:2])
  146. linux = Linkable(
  147. CFLAGS=[
  148. '-DPLATFORM="linux"',
  149. '-DMULTIARCH="x86_64-linux-gnu"',
  150. f'-DSOABI="cpython-{vesrion}-x86_64-linux-gnu"',
  151. ],
  152. )
  153. darwin = Linkable(
  154. CFLAGS=[
  155. '-DPLATFORM="darwin"',
  156. '-DMULTIARCH="darwin"',
  157. f'-DSOABI="cpython-{vesrion}-darwin"',
  158. ],
  159. LDFLAGS=[
  160. Words("-framework", "CoreFoundation"),
  161. Words("-framework", "SystemConfiguration"),
  162. ],
  163. )
  164. windows = Linkable(
  165. CFLAGS=[
  166. '-DPY3_DLLNAME=L"python3"',
  167. ],
  168. LDFLAGS=[
  169. "Mincore.lib",
  170. "Shlwapi.lib",
  171. "Winmm.lib",
  172. ],
  173. )
  174. self.yamakes["."].after(
  175. "CFLAGS",
  176. Switch(
  177. OS_DARWIN=darwin,
  178. OS_LINUX=linux,
  179. OS_WINDOWS=windows,
  180. ),
  181. )
  182. self.yamakes["."].after(
  183. "SRCS",
  184. Switch(
  185. OS_WINDOWS=Linkable(SRCS=MODULES_WINDOWS + tuple(src_pc_srcs) + ("Python/dynload_win.c",)),
  186. default=Linkable(SRCS=MODULES_POSIX + ("Python/dynload_shlib.c",)),
  187. ),
  188. )
  189. linux = Linkable(SRCS=MODULES_LINUX + ("Python/asm_trampoline.S",))
  190. linux.before(
  191. "SRCS",
  192. Switch({"NOT MUSL": Linkable(EXTRALIBS=["crypt"])}),
  193. )
  194. self.yamakes["."].after(
  195. "SRCS",
  196. Switch(
  197. OS_LINUX=linux,
  198. OS_DARWIN=Linkable(SRCS=MODULES_DARWIN),
  199. ),
  200. )
  201. for name, yamake in self.yamakes.items():
  202. yamake.LICENSE = ["Python-2.0"]
  203. self.yamakes["."].RECURSE = sorted(key for key in self.yamakes if key != ".")
  204. python3 = NixSourceProject(
  205. arcdir="contrib/tools/python3",
  206. nixattr="python3",
  207. owners=["g:python-contrib"],
  208. keep_paths=[
  209. "a.yaml",
  210. "lib2",
  211. "Lib/_sysconfigdata_arcadia.py",
  212. "Modules/config.c",
  213. "Python/deepfreeze",
  214. "Python/frozen_modules",
  215. "tsan.supp",
  216. ],
  217. disable_includes=[
  218. "pydtrace_probes.h",
  219. "crtassem.h",
  220. "blake2-kat.h",
  221. "bluetooth/",
  222. "bluetooth.h",
  223. "displayIntermediateValues.h",
  224. "iconv.h",
  225. "KeccakP-200-SnP.h",
  226. "KeccakP-400-SnP.h",
  227. "KeccakP-800-SnP.h",
  228. "netcan/can.h",
  229. "emscripten.h",
  230. "bits/alltypes.h",
  231. "sys/byteorder.h",
  232. "sys/lwp.h",
  233. "sys/memfd.h",
  234. # ifdef __VXWORKS__
  235. "rtpLib.h",
  236. "taskLib.h",
  237. "vxCpuLib.h",
  238. ],
  239. copy_sources=[
  240. "Include/**/*.h",
  241. "Lib/**/*.py",
  242. "Modules/**/*.c",
  243. "Modules/**/*.h",
  244. "Objects/**/*.c",
  245. "Objects/**/*.h",
  246. "Objects/**/*.inc",
  247. "Parser/**/*.c",
  248. "Parser/**/*.h",
  249. "PC/**/*.c",
  250. "PC/**/*.h",
  251. "Programs/*.c",
  252. "Python/**/*.c",
  253. "Python/**/*.h",
  254. "Python/**/*.S",
  255. ],
  256. copy_sources_except=[
  257. "Modules/_test*.c",
  258. "Modules/_ctypes/_ctypes_test*",
  259. "Modules/tkappinit.c",
  260. "Modules/readline.c",
  261. "Modules/ossaudiodev.c",
  262. "Modules/nismodule.c",
  263. "Modules/_ctypes/malloc_closure.c",
  264. "Modules/_curses*.c",
  265. "Modules/_dbmmodule.c",
  266. "Modules/_gdbmmodule.c",
  267. "Modules/_tkinter.c",
  268. "Modules/_uuidmodule.c",
  269. "Modules/xx*",
  270. "Modules/**/bench*.c",
  271. "Modules/getpath_noop.c",
  272. "PC/_msi.c",
  273. "PC/_testconsole.c",
  274. "PC/clinic/_testconsole.c.h",
  275. "PC/config.c",
  276. "PC/config_minimal.c",
  277. "PC/dl_nt.c",
  278. "PC/frozen_dllmain.c",
  279. "PC/launcher.c",
  280. "PC/launcher2.c",
  281. "PC/python3dll.c",
  282. "Programs/_test*",
  283. "Python/bytecodes.c",
  284. "Python/dup2.c",
  285. "Python/dynload_hpux.c",
  286. "Python/dynload_stub.c",
  287. "Python/emscripten_signal.c",
  288. "Python/frozenmain.c",
  289. ],
  290. platform_dispatchers=[
  291. "Include/pyconfig.h",
  292. ],
  293. post_install=post_install,
  294. )