@@ -41,11 +41,21 @@ def set_rpath(filepath: Path, old: List[str], rpath: List[str]) -> None:
4141    @classmethod  
4242    def  fix_rpath (cls , filepath : Path , libs_relative_path : str ) ->  None :
4343        old_rpath  =  cls .get_rpath (filepath )
44-         new_rpath  =  []
45-         for  path  in  old_rpath :
46-             if  path .startswith (cls .origin ):
47-                 path  =  os .path .join (cls .origin , libs_relative_path )
48-             new_rpath .append (path )
44+         new_rpath  =  old_rpath [:]
45+ 
46+         # When an executable, libray, or Python extension module is 
47+         # dynamically linked to a library built as part of the project, Meson 
48+         # adds a build RPATH pointing to the build directory, in the form of a 
49+         # relative RPATH entry. We can use the presence of any RPATH entries 
50+         # relative to ``$ORIGIN`` as an indicator that the installed object 
51+         # depends on shared libraries internal to the project. In this case we 
52+         # need to add an RPATH entry pointing to the meson-python shared 
53+         # library install location. This heuristic is not perfect: RPATH 
54+         # entries relative to ``$ORIGIN`` can exist for other reasons. 
55+         # However, this only results in harmless additional RPATH entries. 
56+         if  any (path .startswith (cls .origin ) for  path  in  old_rpath ):
57+             new_rpath .append (os .path .join (cls .origin , libs_relative_path ))
58+ 
4959        new_rpath  =  unique (new_rpath )
5060        if  new_rpath  !=  old_rpath :
5161            cls .set_rpath (filepath , old_rpath , new_rpath )
0 commit comments