Snap! Clicked send by mistake. Another question popped in my mind. How we will deal with:
> Introduce new `cython` command parameter `--shared` which will take fully qualified module name: When we will introduce new `--shared` option we will have 3 places where we can specify shared module ffully qualified module name: 1. New Cython parameter `--shared` foo.bar 2. Cython Directive parameter: `-X use_shared_utility=foo.bar 3. Cython module comment: `# cython: use_shared_utility=foo.bar What is the priority between 1., 2. and 3.? I suppose 1. and 2. should override 3. But what we should do if 1. and 2. are set but have different values? Matus On Sat, 15 Feb 2025 at 00:00, matus valo <matusv...@gmail.com> wrote: > Another question popped in my mind. How we will deal with: > > Introduce new `cython` command parameter `--shared` which will take > fully qualified module name: > > On Fri, 14 Feb 2025 at 16:06, matus valo <matusv...@gmail.com> wrote: > >> >>> I think I tend to agree with David. Here is my point of view: >>> >>> I am not sure how to implement it. cython command *does not know* about >>> the build directory. This is more part of the build system >>> (setuptools/meson etc). My point is that the cython command should be >>> stupid and just generate a C file with a specified name/location nothing >>> more. It is also consistent with current usage of it (it just generates C >>> files). I understand that it is the build system responsibility to do all >>> the magic around it. As an example, here is working integration of current >>> "stupid" utility present in the PR implemented by scipy dev (Ralf Gommers) >>> [1]: >>> https://github.com/scipy/scipy/compare/main...rgommers:scipy:cy-shared-memoryview?expand=1 >>> >>> The only question is how it can be integrated into setuptools too. The >>> most obvious and stupid solution is to generate C file (which was also >>> recommended way of working with Cython extension until recently), commit it >>> to repository and compile it as regular C extension example is already >>> present in test of the PR: >>> >>> from Cython.Build import cythonize >>> from setuptools import setup, Extension >>> from Cython.Compiler import Options >>> import numpy >>> >>> extensions = [ >>> Extension("*", ["**/*.pyx"], include_dirs=[numpy.get_include()]), >>> Extension("pkg2.MemoryView", sources=["pkg2/MemoryView.c"]) >>> ] >>> >>> setup( >>> ext_modules = cythonize(extensions, >>> compiler_directives={'use_shared_utility': 'pkg2'}) >>> ) >>> >>> > Create all necessary directories, then write the output into the >>> target directory. No need for a failure. >>> >>> Here again `cython` command I would keep consistent. If user wants to >>> generate file, directory must already exist. This is the same logic as with >>> compilation of regular .pyx file: >>> >>> (cython3.11) root@a3be2cc9ff83:~/dev/cython# cython /foo/bar.pyx >>> /root/dev/cython3.11/bin/cython: No such file or directory: >>> '/foo/bar.pyx' >>> >>> Moreover, if we decide to create all directories in cython command, >>> should we create also `__init__.py` files too? I think this is an overkill >>> for cython command. Of course, in the build system it is different story, >>> build backend could do it. >>> >>> That said, I propose following: >>> >>> 1. Introduce the cython command parameter `--generate-shared` which has >>> the argument name & path of generated C file. E.g. >>> >>> cython --generate-shared scipy/_lib/cyshared.c >>> >>> will generate `scipy._lib/cyshared.c` file. This approach should be >>> easily integrated in meson build system based on example in [1]. Also >>> `cython` command will fail if directory `scipy/_lib` does not exist. Also, >>> cython will not care whether it is importable. It will just do stupid >>> and simple C file generation. The rest should be done by build system >>> (meson/setuptools/whatever). **This will be part of this PR**. >>> >>> 2. Introduce new `cython` command parameter `--shared` which will take >>> fully qualified module name: >>> >>> cython --shared=scipy._lib.cyshared.memoryview cython_extention.pyx >>> >>> I think here is already agreement between us. We can do some good old >>> bikeshedding about parameter name. This will be **part of this PR **too. >>> >>> 3. Extend existing `cython.build.cythonize()` function. This should be >>> used in the setuptools: >>> >>> from Cython.Build import cythonize >>> from setuptools import setup, Extension >>> from Cython.Compiler import Options >>> import numpy >>> >>> extensions = [ >>> Extension("*", ["**/*.pyx"], include_dirs=[numpy.get_include()]), >>> ] >>> >>> setup( >>> ext_modules = cythonize(extensions, shared_module=pkg2.MemoryView) >>> ) >>> >>> This function should also ensures that all directories and `__init__.py` >>> files are generated, hence the final `.so` module is importable. Currently, >>> I cannot see all the details and all devils hiding in the details. >>> Hence, I **would postpone it in the separate issue/PR**. Users of meson >>> are fine (see [1]) and users setuptools still can use generated and >>> commited C file in repo. >>> >>> >>> Please let me know what do you think. This is blocking my further >>> progress in PR and I would like to have clear vision to avoid PR flooding >>> with changes. >>> Moreover, I would like to keep the current PR simple and focus on actual >>> code generation of shared module and its integration into the extentions. >>> Build related logic can be implemented later on. >>> >>> >>> [1] https://github.com/cython/cython/pull/6531#issuecomment-2551351591 >> >>
_______________________________________________ cython-devel mailing list cython-devel@python.org https://mail.python.org/mailman/listinfo/cython-devel