--- /dev/null
+From f3cfdebd75374a29a930687c1f126282c51b7a92 Mon Sep 17 00:00:00 2001
+From: mv-python <matusvalo@users.noreply.github.com>
+Date: Fri, 12 Jun 2026 10:32:42 +0200
+Subject: [PATCH] [3.2.x] Shared module: Use `SharedUtilitySourceDescriptor`
+ instead of temporary directory (#7723) (GH-7739)
+
+This PR uses `SharedUtilitySourceDescriptor` instead of an empty pyx
+file in the temp dir. This simplifies the logic and also assures that
+`__pyx_f` is unchanged across builds.
+
+Backport of https://github.com/cython/cython/pull/7723
+Alternative to https://github.com/cython/cython/pull/7634
+
+Upstream-Status: Backport [https://github.com/cython/cython/commit/f3cfdebd75374a29a930687c1f126282c51b7a92]
+
+Signed-off-by: Zhixiong Chi <zhixiong.chi@windriver.com>
+---
+ Cython/Build/SharedModule.py | 25 ++++++++-----------------
+ Cython/Compiler/Scanning.py | 9 +++++++++
+ 2 files changed, 17 insertions(+), 17 deletions(-)
+
+diff --git a/Cython/Build/SharedModule.py b/Cython/Build/SharedModule.py
+index fed6263cd..45da4b462 100644
+--- a/Cython/Build/SharedModule.py
++++ b/Cython/Build/SharedModule.py
+@@ -1,13 +1,10 @@
+ import os
+-import re
+-import shutil
+-import tempfile
+
+ from Cython.Compiler import (
+ MemoryView, Code, Options, Pipeline, Errors, Main, Symtab
+ )
+ from Cython.Compiler.StringEncoding import EncodedString
+-from Cython.Compiler.Scanning import FileSourceDescriptor
++from Cython.Compiler.Scanning import SharedUtilitySourceDescriptor
+
+
+ def create_shared_library_pipeline(context, scope, options, result):
+@@ -72,23 +69,17 @@ def generate_shared_module(options):
+ Errors.open_listing_file(None)
+
+ dest_c_file = options.shared_c_file_path
++ pyx_file = os.path.splitext(dest_c_file)[0] + '.pyx'
+ module_name = os.path.splitext(os.path.basename(dest_c_file))[0]
+
+ context = Main.Context.from_options(options)
+ scope = Symtab.ModuleScope('MemoryView', parent_module = None, context = context, is_package=False)
+
+- with tempfile.TemporaryDirectory() as tmpdirname:
+- pyx_file = os.path.join(tmpdirname, f'{module_name}.pyx')
+- c_file = os.path.join(tmpdirname, f'{module_name}.c')
+- with open(pyx_file, 'w'):
+- pass
+- source_desc = FileSourceDescriptor(pyx_file)
+- comp_src = Main.CompilationSource(source_desc, EncodedString(module_name), os.getcwd())
+- result = Main.create_default_resultobj(comp_src, options)
+-
+- pipeline = create_shared_library_pipeline(context, scope, options, result)
+- err, enddata = Pipeline.run_pipeline(pipeline, comp_src)
+- if err is None:
+- shutil.copy(c_file, dest_c_file)
++ source_desc = SharedUtilitySourceDescriptor(pyx_file)
++ comp_src = Main.CompilationSource(source_desc, EncodedString(module_name), os.getcwd())
++ result = Main.create_default_resultobj(comp_src, options)
++
++ pipeline = create_shared_library_pipeline(context, scope, options, result)
++ err, enddata = Pipeline.run_pipeline(pipeline, comp_src)
+
+ return err, enddata
+diff --git a/Cython/Compiler/Scanning.py b/Cython/Compiler/Scanning.py
+index 2a8cb5a93..4cec7d1ed 100644
+--- a/Cython/Compiler/Scanning.py
++++ b/Cython/Compiler/Scanning.py
+@@ -281,6 +281,15 @@ class StringSourceDescriptor(SourceDescriptor):
+ return "<StringSourceDescriptor:%s>" % self.name
+
+
++class SharedUtilitySourceDescriptor(FileSourceDescriptor):
++ """
++ A specialized source descriptor for shared utility code only. Not part of public API.
++ """
++
++ def get_file_object(self, encoding=None, error_handling=None):
++ from io import StringIO
++ return StringIO('')
++
+ #------------------------------------------------------------------
+
+ class PyrexScanner(Scanner):
+--
+2.43.0
+