@@ -33,6 +33,89 @@ name collision if the same library is being bundled by a different package, and
3333check if the packages confirm to standards like [ PEP600]  (` manylinux_X_Y ` ).
3434These tools do not allow to have cross wheel library dependency.
3535
36+ ## scikit-build-core wheel repair  
37+ 
38+ :::{warning}
39+ 
40+ This feature is experimental and API and effects may change.
41+ 
42+ :::
43+ 
44+ scikit-build-core also provides a built-in wheel repair which is enabled from
45+ ` wheel.repair.enable ` . Unlike the [ wheel repair tools] , this feature uses the
46+ linking information used during the CMake steps.
47+ 
48+ :::{note}
49+ 
50+ Executables, libraries, dependencies installed in ` ${SKBUILD_SCRIPTS_DIR} `  or
51+ ` ${SKBUILD_DATA_DIR} `  are not considered. Only files in ` wheel.install-dir `  or
52+ ` ${SKBUILD_PLATLIB_DIR} `  are considered.
53+ 
54+ :::
55+ 
56+ So far there are 3 repair features implemented, which can be activated
57+ independently.
58+ 
59+ ### ` wheel.repair.in-wheel `  
60+ 
61+ If this feature is enabled, it patches the executable/libraries so that, if the
62+ dependency is packaged in the _ same_  wheel, the executable/libraries point to
63+ the dependency files inside the wheel.
64+ 
65+ ### ` wheel.repair.cross-wheel `  
66+ 
67+ If this feature is enabled, it patches the executable/libraries so that, if the
68+ dependency is packaged in a _ different_  wheel available from
69+ ` build-system.requires ` , the executable/libraries point to the dependency files
70+ in that other wheel.
71+ 
72+ The same/compatible library that was used in the ` build-system.requires `  should
73+ be used in the project's dependencies. The link to the other wheel will have
74+ priority, but if that wheel is not installed or is incompatible, it will
75+ fall-through to the system dependencies.
76+ 
77+ ### ` wheel.repair.bundle-external `  
78+ 
79+ This feature is enabled by providing a list of regex patterns of the dynamic
80+ libraries that should be bundled. Only the filename is considered for the regex
81+ matching. The dependency files are then copied to a folder ` {project.name}.libs ` 
82+ and the dependents are patched to point to there.
83+ 
84+ External libraries linked from a different wheel available from
85+ ` build-system.requires `  are not considered.
86+ 
87+ :::{warning}
88+ 
89+ Unlike the [ wheel repair tools] , this feature does not mangle the library names,
90+ which may cause issues if multiple dependencies link to the same library with
91+ the same ` SONAME ` /` SOVERSION `  (usually just the library file name).
92+ 
93+ :::
94+ 
95+ ### Windows repairs  
96+ 
97+ The windows wheel repairs are done by adding ` os.add_dll_directory `  commands to
98+ the top-level python package/modules in the current wheel. Thus, the library
99+ linkage is only available when executing a python script/module that import the
100+ current wheel's top-level python package/modules.
101+ 
102+ In contrast, in Unix systems the libraries and executable are patched directly
103+ and are available outside of the python environment as well.
104+ 
105+ ### Beware of library load order  
106+ 
107+ Beware if there are multiple dynamic libraries in other wheels or even on the
108+ system with the same ` SONAME ` /` SOVERSION `  (usually just the library file name).
109+ Depending on the order of python or other script execution, the other libraries
110+ (not the ones that were patched to be linked to) may be loaded first, and when
111+ your libraries are loaded, the dependencies that have already been loaded will
112+ be used instead of the ones that were patched to be linked to.
113+ 
114+ If you want to avoid this, consider using the [ wheel repair tools]  which always
115+ bundle and mangle the libraries appropriately to preserve the consistency.
116+ However, this also makes it impossible to link/fallback to system libraries or
117+ link to a shared library in a different wheel.
118+ 
36119## Manual patching  
37120
38121You can manually make a relative RPath. This has the benefit of working when not
@@ -71,5 +154,6 @@ os.add_dll_directory(str(dependency_dll_path))
71154[ cibuildwheel ] : https://cibuildwheel.pypa.io/en/stable/ 
72155[ repair wheel ] : https://cibuildwheel.pypa.io/en/stable/options/#repair-wheel-command 
73156[ PEP600 ] : https://peps.python.org/pep-0600 
157+ [ wheel repair tools ] : #wheel-repair-tools 
74158
75159<!--  prettier-ignore-end --> 
0 commit comments