Skip to content

Commit 80bffd3

Browse files
committed
Add library path override system properties
1 parent b45a6e8 commit 80bffd3

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,12 @@ yet (which could manifest as crashes/segfaults):
172172
* `vipsffm.abinumber.glib.override`, default: `0`
173173
* `vipsffm.abinumber.gobject.override`, default: `0`
174174

175+
If you want to manually override the library lookup path for any of the above (for example, if you're using a platform
176+
like Android where it's hard to set the system library path), you can do so using these system properties:
177+
* libvips: `vipsffm.libpath.vips.override` (eg `/opt/homebrew/lib/libvips.dylib`)
178+
* glib: `vipsffm.libpath.glib.override`
179+
* gobject: `vipsffm.libpath.gobject.override`
180+
175181
## Project goals
176182

177183
Ideas and suggestions are welcome, but please make sure they fit in to these goals, or you have a good argument about

core/src/main/java/app/photofox/vipsffm/VipsLibLookup.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.lang.foreign.Arena;
44
import java.lang.foreign.SymbolLookup;
5+
import java.nio.file.Path;
56
import java.util.List;
67
import 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
}

run_samples.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@ set -eou pipefail
44
echo "building samples..."
55
./gradlew sample:clean sample:shadowJar
66

7+
export JAVA_PATH_OPTS=""
78
if [[ "$OSTYPE" == "darwin"* ]]; then
89
export DYLD_LIBRARY_PATH=/opt/homebrew/lib
10+
# this tests the library path override feature
11+
export JAVA_PATH_OPTS="-Dvipsffm.libpath.vips.override=/opt/homebrew/lib/libvips.dylib"
912
fi
1013

1114
echo "running samples..."
12-
java -jar sample/build/libs/sample-all.jar 2>&1 | tee sample_output.log
15+
java $JAVA_PATH_OPTS -jar sample/build/libs/sample-all.jar 2>&1 | tee sample_output.log
1316

1417
echo "checking for leaks..."
1518
if grep --quiet "objects alive:" sample_output.log; then

0 commit comments

Comments
 (0)