""" A simpler setup version just to compile the speedup module. It should be used as: python setup_cython build_ext --inplace Note: the .c file and other generated files are regenerated from the .pyx file by running "python build_tools/build.py" """ import os import sys from setuptools import setup os.chdir(os.path.dirname(os.path.abspath(__file__))) IS_PY36_OR_GREATER = sys.version_info > (3, 6) IS_PY39_OR_GREATER = sys.version_info > (3, 9) def process_args(): extension_folder = None target_pydevd_name = None target_frame_eval = None force_cython = False target_arch = None for i, arg in enumerate(sys.argv[:]): if arg == '--build-lib': extension_folder = sys.argv[i + 1] # It shouldn't be removed from sys.argv (among with --build-temp) # because they're passed further to setup(). if arg.startswith('--target-pyd-name='): sys.argv.remove(arg) target_pydevd_name = arg[len('--target-pyd-name='):] if arg.startswith('--target-pyd-frame-eval='): sys.argv.remove(arg) target_frame_eval = arg[len('--target-pyd-frame-eval='):] if arg == '--force-cython': sys.argv.remove(arg) force_cython = True if arg.startswith('--target='): sys.argv.remove(arg) target_arch = arg[len('--target='):] return bool(extension_folder), target_pydevd_name, target_frame_eval, \ force_cython, target_arch def build_extension(dir_name, extension_name, target_pydevd_name, force_cython, target_arch, extended=False): pyx_file = os.path.join(os.path.dirname(__file__), dir_name, "%s.pyx" % (extension_name,)) has_pxd = False if target_pydevd_name != extension_name: # It MUST be there in this case! (Otherwise we'll have unresolved externals # because the .c file had another name initially). import shutil # We must force Cython in this case (but only in this case -- for the regular # setup in the user machine, we should always compile the .c file). force_cython = True new_pyx_file = os.path.join(os.path.dirname(__file__), dir_name, "%s.pyx" % (target_pydevd_name,)) new_c_file = os.path.join(os.path.dirname(__file__), dir_name, "%s.c" % (target_pydevd_name,)) shutil.copy(pyx_file, new_pyx_file) pyx_file = new_pyx_file pxd_file = os.path.join(os.path.dirname(__file__), dir_name, "%s.pxd" % (extension_name,)) if os.path.exists(pxd_file) and os.path.isfile(pxd_file): new_pxd_file = os.path.join(os.path.dirname(__file__), dir_name, "%s.pxd" % (target_pydevd_name,)) shutil.copy(pxd_file, new_pxd_file) has_pxd = True assert os.path.exists(pyx_file) try: from distutils.extension import Extension if target_arch: extra_compile_args = ["--target=%s" % target_arch] extra_link_args = ["--target=%s" % target_arch] else: extra_compile_args = [] extra_link_args = [] if force_cython: # noinspection PyPackageRequirements from Cython.Build import cythonize ext_modules = cythonize(Extension( "%s.%s" % (dir_name, target_pydevd_name,), ["%s/%s.pyx" % (dir_name, target_pydevd_name,)], extra_compile_args=extra_compile_args, extra_link_args=extra_link_args, ), force=True) else: # Always compile the .c (and not the .pyx) file (which we should keep # up-to-date by running build_tools/build.py). ext_modules = [Extension( "%s%s.%s" % (dir_name, "_ext" if extended else "", target_pydevd_name), [os.path.join(dir_name, "%s.c" % target_pydevd_name), ], # uncomment to generate pdbs for visual studio. # extra_compile_args=["-Zi", "/Od"], # extra_link_args=["-debug"], extra_compile_args=extra_compile_args, extra_link_args=extra_link_args, )] setup( name='Cythonize', ext_modules=ext_modules ) finally: if target_pydevd_name != extension_name: try: # noinspection PyUnboundLocalVariable os.remove(new_pyx_file) except: # noqa: 722 import traceback traceback.print_exc() try: # noinspection PyUnboundLocalVariable os.remove(new_c_file) except: # noqa: 722 import traceback traceback.print_exc() if has_pxd: try: # noinspection PyUnboundLocalVariable os.remove(new_pxd_file) except: # noqa: 722 import traceback traceback.print_exc() def main(): extended, target_pydevd_name, target_frame_eval, force_cython, target_arch \ = process_args() extension_name = "pydevd_cython" target_pydevd_name = target_pydevd_name or extension_name build_extension( "_pydevd_bundle", extension_name, target_pydevd_name, force_cython, target_arch, extended) if IS_PY36_OR_GREATER: extension_name = "pydevd_frame_evaluator" frame_eval_dir_name = "_pydevd_frame_eval" target_frame_eval_common = "%s_%s" % (extension_name, "common") build_extension(frame_eval_dir_name, target_frame_eval_common, target_frame_eval_common, force_cython, target_arch, extended) if IS_PY39_OR_GREATER: extension_name += "_py39_and_above" target_frame_eval = target_frame_eval or extension_name build_extension(frame_eval_dir_name, extension_name, target_frame_eval, force_cython, target_arch, extended) if __name__ == "__main__": main()