Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(74496)

Delta Between Two Patch Sets: setup.py

Issue 7652: Merge C version of decimal into py3k.
Left Patch Set: Created 7 years, 6 months ago
Right Patch Set: Created 7 years, 3 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « pyconfig.h.in ('k') | no next file » | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 # Autodetecting setup.py script for building the Python extensions 1 # Autodetecting setup.py script for building the Python extensions
2 # 2 #
3 3
4 import sys, os, imp, re, optparse 4 import sys, os, imp, re, optparse
5 from glob import glob 5 from glob import glob
6 import sysconfig 6 import sysconfig
7 7
8 from distutils import log 8 from distutils import log
9 from distutils import text_file 9 from distutils import text_file
10 from distutils.errors import * 10 from distutils.errors import *
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 188
189 # Platform-dependent module source and include directories 189 # Platform-dependent module source and include directories
190 platform = self.get_platform() 190 platform = self.get_platform()
191 191
192 # Fix up the paths for scripts, too 192 # Fix up the paths for scripts, too
193 self.distribution.scripts = [os.path.join(srcdir, filename) 193 self.distribution.scripts = [os.path.join(srcdir, filename)
194 for filename in self.distribution.scripts] 194 for filename in self.distribution.scripts]
195 195
196 # Python header files 196 # Python header files
197 headers = [sysconfig.get_config_h_filename()] 197 headers = [sysconfig.get_config_h_filename()]
198 headers += glob(os.path.join(sysconfig.get_path('platinclude'), "*.h")) 198 headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
199 199
200 for ext in self.extensions[:]: 200 for ext in self.extensions[:]:
201 ext.sources = [ find_module_file(filename, moddirlist) 201 ext.sources = [ find_module_file(filename, moddirlist)
202 for filename in ext.sources ] 202 for filename in ext.sources ]
203 if ext.depends is not None: 203 if ext.depends is not None:
204 ext.depends = [find_module_file(filename, moddirlist) 204 ext.depends = [find_module_file(filename, moddirlist)
205 for filename in ext.depends] 205 for filename in ext.depends]
206 else: 206 else:
207 ext.depends = [] 207 ext.depends = []
208 # re-compile extensions if a header file has been changed 208 # re-compile extensions if a header file has been changed
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 # array objects 497 # array objects
498 exts.append( Extension('array', ['arraymodule.c']) ) 498 exts.append( Extension('array', ['arraymodule.c']) )
499 # complex math library functions 499 # complex math library functions
500 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'], 500 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
501 depends=['_math.h'], 501 depends=['_math.h'],
502 libraries=math_libs) ) 502 libraries=math_libs) )
503 # math library functions, e.g. sin() 503 # math library functions, e.g. sin()
504 exts.append( Extension('math', ['mathmodule.c', '_math.c'], 504 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
505 depends=['_math.h'], 505 depends=['_math.h'],
506 libraries=math_libs) ) 506 libraries=math_libs) )
507
508 # time libraries: librt may be needed for clock_gettime()
509 time_libs = []
510 lib = sysconfig.get_config_var('TIMEMODULE_LIB')
511 if lib:
512 time_libs.append(lib)
513
507 # time operations and variables 514 # time operations and variables
508 exts.append( Extension('time', ['timemodule.c', '_time.c'], 515 exts.append( Extension('time', ['timemodule.c', '_time.c'],
509 libraries=math_libs) ) 516 libraries=time_libs) )
510 exts.append( Extension('_datetime', ['_datetimemodule.c', '_time.c'], 517 exts.append( Extension('_datetime', ['_datetimemodule.c', '_time.c']) )
511 libraries=math_libs) )
512 # random number generator implemented in C 518 # random number generator implemented in C
513 exts.append( Extension("_random", ["_randommodule.c"]) ) 519 exts.append( Extension("_random", ["_randommodule.c"]) )
514 # bisect 520 # bisect
515 exts.append( Extension("_bisect", ["_bisectmodule.c"]) ) 521 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
516 # heapq 522 # heapq
517 exts.append( Extension("_heapq", ["_heapqmodule.c"]) ) 523 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
518 # C-optimized pickle replacement 524 # C-optimized pickle replacement
519 exts.append( Extension("_pickle", ["_pickle.c"]) ) 525 exts.append( Extension("_pickle", ["_pickle.c"]) )
520 # atexit 526 # atexit
521 exts.append( Extension("atexit", ["atexitmodule.c"]) ) 527 exts.append( Extension("atexit", ["atexitmodule.c"]) )
522 # _json speedups 528 # _json speedups
523 exts.append( Extension("_json", ["_json.c"]) ) 529 exts.append( Extension("_json", ["_json.c"]) )
524 # Python C API test module 530 # Python C API test module
525 exts.append( Extension('_testcapi', ['_testcapimodule.c'], 531 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
526 depends=['testcapi_long.h']) ) 532 depends=['testcapi_long.h']) )
533 # Python PEP-3118 (buffer protocol) test module
534 exts.append( Extension('_testbuffer', ['_testbuffer.c']) )
527 # profiler (_lsprof is for cProfile.py) 535 # profiler (_lsprof is for cProfile.py)
528 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) ) 536 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
529 # static Unicode character database 537 # static Unicode character database
530 exts.append( Extension('unicodedata', ['unicodedata.c']) ) 538 exts.append( Extension('unicodedata', ['unicodedata.c']) )
531 539
532 # Modules with some UNIX dependencies -- on by default: 540 # Modules with some UNIX dependencies -- on by default:
533 # (If you have a really backward UNIX, select and socket may not be 541 # (If you have a really backward UNIX, select and socket may not be
534 # supported...) 542 # supported...)
535 543
536 # fcntl(2) and ioctl(2) 544 # fcntl(2) and ioctl(2)
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after
1153 libs = ['nsl'] 1161 libs = ['nsl']
1154 else: 1162 else:
1155 libs = [] 1163 libs = []
1156 exts.append( Extension('nis', ['nismodule.c'], 1164 exts.append( Extension('nis', ['nismodule.c'],
1157 libraries = libs) ) 1165 libraries = libs) )
1158 else: 1166 else:
1159 missing.append('nis') 1167 missing.append('nis')
1160 else: 1168 else:
1161 missing.extend(['nis', 'resource', 'termios']) 1169 missing.extend(['nis', 'resource', 'termios'])
1162 1170
1171 # Curses support, requiring the System V version of curses, often
1172 # provided by the ncurses library.
1163 curses_defines = [] 1173 curses_defines = []
1174 curses_includes = []
1175 panel_library = 'panel'
1164 if curses_library == 'ncursesw': 1176 if curses_library == 'ncursesw':
1165 curses_defines.append(('HAVE_NCURSESW', '1')) 1177 curses_defines.append(('HAVE_NCURSESW', '1'))
1166 1178 curses_includes.append('/usr/include/ncursesw')
1167 # Curses support, requiring the System V version of curses, often 1179 # Bug 1464056: If _curses.so links with ncursesw,
1168 # provided by the ncurses library. 1180 # _curses_panel.so must link with panelw.
1169 panel_library = 'panel' 1181 panel_library = 'panelw'
1182
1170 if curses_library.startswith('ncurses'): 1183 if curses_library.startswith('ncurses'):
1171 if curses_library == 'ncursesw':
1172 # Bug 1464056: If _curses.so links with ncursesw,
1173 # _curses_panel.so must link with panelw.
1174 panel_library = 'panelw'
1175 curses_libs = [curses_library] 1184 curses_libs = [curses_library]
1176 exts.append( Extension('_curses', ['_cursesmodule.c'], 1185 exts.append( Extension('_curses', ['_cursesmodule.c'],
1186 include_dirs=curses_includes,
1177 define_macros=curses_defines, 1187 define_macros=curses_defines,
1178 libraries = curses_libs) ) 1188 libraries = curses_libs) )
1179 elif curses_library == 'curses' and platform != 'darwin': 1189 elif curses_library == 'curses' and platform != 'darwin':
1180 # OSX has an old Berkeley curses, not good enough for 1190 # OSX has an old Berkeley curses, not good enough for
1181 # the _curses module. 1191 # the _curses module.
1182 if (self.compiler.find_library_file(lib_dirs, 'terminfo')): 1192 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
1183 curses_libs = ['curses', 'terminfo'] 1193 curses_libs = ['curses', 'terminfo']
1184 elif (self.compiler.find_library_file(lib_dirs, 'termcap')): 1194 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
1185 curses_libs = ['curses', 'termcap'] 1195 curses_libs = ['curses', 'termcap']
1186 else: 1196 else:
1187 curses_libs = ['curses'] 1197 curses_libs = ['curses']
1188 1198
1189 exts.append( Extension('_curses', ['_cursesmodule.c'], 1199 exts.append( Extension('_curses', ['_cursesmodule.c'],
1190 define_macros=curses_defines, 1200 define_macros=curses_defines,
1191 libraries = curses_libs) ) 1201 libraries = curses_libs) )
1192 else: 1202 else:
1193 missing.append('_curses') 1203 missing.append('_curses')
1194 1204
1195 # If the curses module is enabled, check for the panel module 1205 # If the curses module is enabled, check for the panel module
1196 if (module_enabled(exts, '_curses') and 1206 if (module_enabled(exts, '_curses') and
1197 self.compiler.find_library_file(lib_dirs, panel_library)): 1207 self.compiler.find_library_file(lib_dirs, panel_library)):
1198 exts.append( Extension('_curses_panel', ['_curses_panel.c'], 1208 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
1209 include_dirs=curses_includes,
1199 libraries = [panel_library] + curses_libs) ) 1210 libraries = [panel_library] + curses_libs) )
1200 else: 1211 else:
1201 missing.append('_curses_panel') 1212 missing.append('_curses_panel')
1202 1213
1203 # Andrew Kuchling's zlib module. Note that some versions of zlib 1214 # Andrew Kuchling's zlib module. Note that some versions of zlib
1204 # 1.1.3 have security problems. See CERT Advisory CA-2002-07: 1215 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1205 # http://www.cert.org/advisories/CA-2002-07.html 1216 # http://www.cert.org/advisories/CA-2002-07.html
1206 # 1217 #
1207 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to 1218 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1208 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For 1219 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1263 if sys.platform == "darwin": 1274 if sys.platform == "darwin":
1264 bz2_extra_link_args = ('-Wl,-search_paths_first',) 1275 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1265 else: 1276 else:
1266 bz2_extra_link_args = () 1277 bz2_extra_link_args = ()
1267 exts.append( Extension('_bz2', ['_bz2module.c'], 1278 exts.append( Extension('_bz2', ['_bz2module.c'],
1268 libraries = ['bz2'], 1279 libraries = ['bz2'],
1269 extra_link_args = bz2_extra_link_args) ) 1280 extra_link_args = bz2_extra_link_args) )
1270 else: 1281 else:
1271 missing.append('_bz2') 1282 missing.append('_bz2')
1272 1283
1284 # LZMA compression support.
1285 if self.compiler.find_library_file(lib_dirs, 'lzma'):
1286 exts.append( Extension('_lzma', ['_lzmamodule.c'],
1287 libraries = ['lzma']) )
1288 else:
1289 missing.append('_lzma')
1290
1273 # Interface to the Expat XML parser 1291 # Interface to the Expat XML parser
1274 # 1292 #
1275 # Expat was written by James Clark and is now maintained by a group of 1293 # Expat was written by James Clark and is now maintained by a group of
1276 # developers on SourceForge; see www.libexpat.org for more information. 1294 # developers on SourceForge; see www.libexpat.org for more information.
1277 # The pyexpat module was written by Paul Prescod after a prototype by 1295 # The pyexpat module was written by Paul Prescod after a prototype by
1278 # Jack Jansen. The Expat source is included in Modules/expat/. Usage 1296 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1279 # of a system shared libexpat.so is possible with --with-system-expat 1297 # of a system shared libexpat.so is possible with --with-system-expat
1280 # configure option. 1298 # configure option.
1281 # 1299 #
1282 # More information on Expat can be found at www.libexpat.org. 1300 # More information on Expat can be found at www.libexpat.org.
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1376 1394
1377 if sysconfig.get_config_var('WITH_THREAD'): 1395 if sysconfig.get_config_var('WITH_THREAD'):
1378 exts.append ( Extension('_multiprocessing', multiprocessing_srcs, 1396 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1379 define_macros=list(macros.items()), 1397 define_macros=list(macros.items()),
1380 include_dirs=["Modules/_multiprocessing"])) 1398 include_dirs=["Modules/_multiprocessing"]))
1381 else: 1399 else:
1382 missing.append('_multiprocessing') 1400 missing.append('_multiprocessing')
1383 # End multiprocessing 1401 # End multiprocessing
1384 1402
1385 # Platform-specific libraries 1403 # Platform-specific libraries
1386 if any(platform.startswith(prefix) 1404 if platform.startswith(('linux', 'freebsd', 'gnukfreebsd')):
1387 for prefix in ("linux", "freebsd", "gnukfreebsd")):
1388 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) 1405 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
1389 else: 1406 else:
1390 missing.append('ossaudiodev') 1407 missing.append('ossaudiodev')
1391 1408
1392 if sys.platform == 'darwin': 1409 if sys.platform == 'darwin':
1393 exts.append( 1410 exts.append(
1394 Extension('_gestalt', ['_gestalt.c'], 1411 Extension('_gestalt', ['_gestalt.c'],
1395 extra_link_args=['-framework', 'Carbon']) 1412 extra_link_args=['-framework', 'Carbon'])
1396 ) 1413 )
1397 exts.append( 1414 exts.append(
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after
1774 break 1791 break
1775 1792
1776 if ffi_inc and ffi_lib: 1793 if ffi_inc and ffi_lib:
1777 ext.include_dirs.extend(ffi_inc) 1794 ext.include_dirs.extend(ffi_inc)
1778 ext.libraries.append(ffi_lib) 1795 ext.libraries.append(ffi_lib)
1779 self.use_system_libffi = True 1796 self.use_system_libffi = True
1780 1797
1781 def _decimal_ext(self): 1798 def _decimal_ext(self):
1782 sources = [ 1799 sources = [
1783 '_decimal/_decimal.c', 1800 '_decimal/_decimal.c',
1784 '_decimal/basearith.c', 1801 '_decimal/libmpdec/basearith.c',
1785 '_decimal/constants.c', 1802 '_decimal/libmpdec/constants.c',
1786 '_decimal/context.c', 1803 '_decimal/libmpdec/context.c',
1787 '_decimal/convolute.c', 1804 '_decimal/libmpdec/convolute.c',
1788 '_decimal/crt.c', 1805 '_decimal/libmpdec/crt.c',
1789 '_decimal/difradix2.c', 1806 '_decimal/libmpdec/difradix2.c',
1790 '_decimal/fnt.c', 1807 '_decimal/libmpdec/fnt.c',
1791 '_decimal/fourstep.c', 1808 '_decimal/libmpdec/fourstep.c',
1792 '_decimal/io.c', 1809 '_decimal/libmpdec/io.c',
1793 '_decimal/memory.c', 1810 '_decimal/libmpdec/memory.c',
1794 '_decimal/mpdecimal.c', 1811 '_decimal/libmpdec/mpdecimal.c',
1795 '_decimal/numbertheory.c', 1812 '_decimal/libmpdec/numbertheory.c',
1796 '_decimal/sixstep.c', 1813 '_decimal/libmpdec/sixstep.c',
1797 '_decimal/transpose.c', 1814 '_decimal/libmpdec/transpose.c',
1798 ] 1815 ]
1799 depends = [ 1816 depends = [
1800 '_decimal/basearith.h',
1801 '_decimal/bits.h',
1802 '_decimal/constants.h',
1803 '_decimal/convolute.h',
1804 '_decimal/crt.h',
1805 '_decimal/difradix2.h',
1806 '_decimal/docstrings.h', 1817 '_decimal/docstrings.h',
1807 '_decimal/fnt.h', 1818 '_decimal/libmpdec/basearith.h',
1808 '_decimal/fourstep.h', 1819 '_decimal/libmpdec/bits.h',
1809 '_decimal/io.h', 1820 '_decimal/libmpdec/constants.h',
1810 '_decimal/memory.h', 1821 '_decimal/libmpdec/convolute.h',
1811 '_decimal/mpdecimal.h', 1822 '_decimal/libmpdec/crt.h',
1812 '_decimal/mptypes.h', 1823 '_decimal/libmpdec/difradix2.h',
1813 '_decimal/numbertheory.h', 1824 '_decimal/libmpdec/fnt.h',
1814 '_decimal/sixstep.h', 1825 '_decimal/libmpdec/fourstep.h',
1815 '_decimal/transpose.h', 1826 '_decimal/libmpdec/io.h',
1816 '_decimal/typearith.h', 1827 '_decimal/libmpdec/memory.h',
1817 '_decimal/umodarith.h', 1828 '_decimal/libmpdec/mpdecimal.h',
1829 '_decimal/libmpdec/numbertheory.h',
1830 '_decimal/libmpdec/sixstep.h',
1831 '_decimal/libmpdec/transpose.h',
1832 '_decimal/libmpdec/typearith.h',
1833 '_decimal/libmpdec/umodarith.h',
1818 ] 1834 ]
1819 config = { 1835 config = {
1820 'x64': [('CONFIG_64','1'), ('ASM','1')], 1836 'x64': [('CONFIG_64','1'), ('ASM','1')],
1821 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')], 1837 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
1822 'ansi64': [('CONFIG_64','1'), ('ANSI','1')], 1838 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
1823 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')], 1839 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
1824 'ansi32': [('CONFIG_32','1'), ('ANSI','1')], 1840 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
1825 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'), 1841 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
1826 ('LEGACY_COMPILER','1')], 1842 ('LEGACY_COMPILER','1')],
1827 'universal': [('UNIVERSAL','1')] 1843 'universal': [('UNIVERSAL','1')]
1828 } 1844 }
1829 1845
1846 include_dirs = ['./Modules/_decimal/libmpdec']
1830 extra_compile_args = [] 1847 extra_compile_args = []
1831 undef_macros=['NDEBUG'] 1848 undef_macros=['NDEBUG']
1832 1849
1833 platform = self.get_platform() 1850 platform = self.get_platform()
1834 cc = sysconfig.get_config_var('CC') 1851 cc = sysconfig.get_config_var('CC')
1835 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T') 1852 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
1836 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE') 1853 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
1837 1854
1838 if machine: 1855 if machine:
1839 # Override automatic configuration to facilitate testing. 1856 # Override automatic configuration to facilitate testing.
(...skipping 29 matching lines...) Expand all
1869 extra_compile_args.append('-fno-ipa-pure-const') 1886 extra_compile_args.append('-fno-ipa-pure-const')
1870 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'): 1887 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
1871 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect: 1888 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
1872 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html 1889 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
1873 undef_macros.append('_FORTIFY_SOURCE') 1890 undef_macros.append('_FORTIFY_SOURCE')
1874 1891
1875 # Faster version without thread local contexts: 1892 # Faster version without thread local contexts:
1876 if not sysconfig.get_config_var('WITH_THREAD'): 1893 if not sysconfig.get_config_var('WITH_THREAD'):
1877 define_macros.append(('WITHOUT_THREADS', 1)) 1894 define_macros.append(('WITHOUT_THREADS', 1))
1878 1895
1896 # Uncomment for extra functionality:
1897 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
1879 ext = Extension ( 1898 ext = Extension (
1880 '_decimal', 1899 '_decimal',
1900 include_dirs=include_dirs,
1881 define_macros=define_macros, 1901 define_macros=define_macros,
1882 undef_macros=undef_macros, 1902 undef_macros=undef_macros,
1883 extra_compile_args=extra_compile_args, 1903 extra_compile_args=extra_compile_args,
1884 sources=sources, 1904 sources=sources,
1885 depends=depends 1905 depends=depends
1886 ) 1906 )
1887 return ext 1907 return ext
1888 1908
1889 class PyBuildInstall(install): 1909 class PyBuildInstall(install):
1890 # Suppress the warning about installation into the lib_dynload 1910 # Suppress the warning about installation into the lib_dynload
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
2012 # If you change the scripts installed here, you also need to 2032 # If you change the scripts installed here, you also need to
2013 # check the PyBuildScripts command above, and change the links 2033 # check the PyBuildScripts command above, and change the links
2014 # created by the bininstall target in Makefile.pre.in 2034 # created by the bininstall target in Makefile.pre.in
2015 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3", 2035 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
2016 "Tools/scripts/2to3", "Tools/scripts/pysetup3"] 2036 "Tools/scripts/2to3", "Tools/scripts/pysetup3"]
2017 ) 2037 )
2018 2038
2019 # --install-platlib 2039 # --install-platlib
2020 if __name__ == '__main__': 2040 if __name__ == '__main__':
2021 main() 2041 main()
LEFTRIGHT

RSS Feeds Recent Issues | This issue
This is Rietveld 894c83f36cb7+