22
33import java .lang .foreign .Arena ;
44import java .lang .foreign .SymbolLookup ;
5+ import java .nio .file .Path ;
56import java .util .List ;
67import java .util .Optional ;
78
@@ -25,6 +26,10 @@ public static SymbolLookup buildSymbolLoader(Arena arena) {
2526 }
2627
2728 private static SymbolLookup findVipsLoader (Arena arena ) {
29+ var overrideLookup = makeOptionalLibraryLookup ("vips" , arena );
30+ if (overrideLookup .isPresent ()) {
31+ return overrideLookup .get ();
32+ }
2833 var abiNumber = Optional .ofNullable (System .getProperty ("vipsffm.abinumber.vips.override" ))
2934 .orElse ("42" );
3035 var names = List .of (
@@ -36,6 +41,10 @@ private static SymbolLookup findVipsLoader(Arena arena) {
3641 }
3742
3843 private static SymbolLookup findGlibLoader (Arena arena ) {
44+ var overrideLookup = makeOptionalLibraryLookup ("glib" , arena );
45+ if (overrideLookup .isPresent ()) {
46+ return overrideLookup .get ();
47+ }
3948 var abiNumber = Optional .ofNullable (System .getProperty ("vipsffm.abinumber.glib.override" ))
4049 .orElse ("0" );
4150 var names = List .of (
@@ -47,6 +56,10 @@ private static SymbolLookup findGlibLoader(Arena arena) {
4756 }
4857
4958 private static SymbolLookup findGObjectLoader (Arena arena ) {
59+ var overrideLookup = makeOptionalLibraryLookup ("gobject" , arena );
60+ if (overrideLookup .isPresent ()) {
61+ return overrideLookup .get ();
62+ }
5063 var abiNumber = Optional .ofNullable (System .getProperty ("vipsffm.abinumber.gobject.override" ))
5164 .orElse ("0" );
5265 var names = List .of (
@@ -79,4 +92,26 @@ static Optional<SymbolLookup> attemptLibraryLookup(String name, Arena arena) {
7992 return Optional .empty ();
8093 }
8194 }
95+
96+ private static Optional <SymbolLookup > makeOptionalLibraryLookup (String libraryName , Arena arena ) {
97+ var propertyPath = "vipsffm.libpath.%s.override" .formatted (libraryName );
98+ var overridePath = Optional .ofNullable (System .getProperty (propertyPath ));
99+ return overridePath .map (path -> {
100+ SymbolLookup symbolLookup ;
101+ try {
102+ symbolLookup = SymbolLookup .libraryLookup (Path .of (path ), arena );
103+ } catch (IllegalArgumentException exception ) {
104+ throw makeOverriddenPathMissingException (libraryName , path );
105+ }
106+ return symbolLookup ;
107+ });
108+ }
109+
110+ private static IllegalArgumentException makeOverriddenPathMissingException (
111+ String libraryName ,
112+ String overridePath
113+ ) {
114+ var message = "path override requested for %s, but library not found at path: %s" .formatted (libraryName , overridePath );
115+ return new IllegalArgumentException (message );
116+ }
82117}
0 commit comments