Skip to content

Commit ceab32e

Browse files
committed
Add an alternative way of setting which version of Ghostscript to use.
The idea is to be able to escape the JLL grip.
1 parent bd188ff commit ceab32e

3 files changed

Lines changed: 63 additions & 51 deletions

File tree

src/GMT.jl

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,34 @@ if ((!(@isdefined have_jll) || have_jll == 1) && get(ENV, "SYSTEMWIDE_GMT", "")
4949
const GMTver = VersionNumber(t[1])
5050
const GMTdevdate = (length(t) > 1) ? Date(t[end], dateformat"y.m.d") : Date("0001-01-01")# For DEV versions
5151
const GMTuserdir = [readlines(`$(GMT_jll.gmt()) "--show-userdir"`)[1]]
52-
const GSbin = Ghostscript_jll.gs()[1]
5352
const GMTbin = GMT_jll.gmt()[1]
5453
const isJLL = true
54+
gs_path, _libgs = "", ""
55+
gsSYS = string(get(ENV, "SYSTEMWIDE_GS", ""))
56+
if (gsSYS !== "")
57+
if Sys.iswindows()
58+
if (contains(gsSYS, ':')) # A path for sure. Believe it ... for now
59+
gs_path = gsSYS
60+
_libgs = joinpath(gs_path, "gsdll64.dll")
61+
else
62+
try
63+
t2 = string(readchomp(`where gswin64c`))
64+
ind = findfirst(".exe", t2)
65+
gs_path = t2[1:ind[end]]
66+
_libgs = t2[1:ind[1]-9] * "//gsdll64.dll"
67+
catch
68+
end
69+
end
70+
(gs_path === "") && println("\n\nNo Ghostscript system wide installation found. Resorting to the JLL one\n\n")
71+
else # Assume it is Unix
72+
gs_path = string(readchomp(`which gs`))
73+
_libgs = split(readlines(pipeline(`ldd $(gs_path)`, `grep libgs`))[1])[3]
74+
end
75+
end
76+
const GSbin = (gs_path === "") ? Ghostscript_jll.gs()[1] : gs_path
77+
const gslib = (gs_path === "") ? libgs : _libgs
78+
79+
#const GSbin = Ghostscript_jll.gs()[1]
5580
fname = joinpath(GMTuserdir[1], "ghost_jll_path.txt")
5681
!isdir(GMTuserdir[1]) && mkdir(GMTuserdir[1]) # When installing on a clean no GMT sys, ~/.gmt doesn't exist
5782
open(fname, "w") do f
@@ -61,7 +86,7 @@ if ((!(@isdefined have_jll) || have_jll == 1) && get(ENV, "SYSTEMWIDE_GMT", "")
6186
libpostscriptlight = joinpath(pato, replace(fname, "gmt" => "postscriptlight"))
6287
else
6388
const isJLL = false
64-
const GMTver, libgmt, libpostscriptlight, libgs, libgdal, libproj, GMTuserdir, GMTbin = _GMTver, _libgmt, _libpostscriptlight, _libgs, _libgdal, _libproj, [userdir], "gmt"
89+
const GMTver, libgmt, libpostscriptlight, gslib, libgdal, libproj, GMTuserdir, GMTbin = _GMTver, _libgmt, _libpostscriptlight, _libgs, _libgdal, _libproj, [userdir], "gmt"
6590
const GMTdevdate = Date(devdate, dateformat"y.m.d") # 'devdate' comes from reading 'deps.jl'
6691
end
6792

src/ghost/ghost_funs.jl

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@
1919
└────────────┴──────────────────────────────────────────┴───────────────────────────────────────────┘
2020
"""
2121

22-
# Include libghostscript.jl in GMT's own scope so that all ccalls use GMT's `libgs`,
23-
# not Ghostscript_jll's libgs-9.dll which lacks the bbox device.
24-
#include(joinpath(dirname(Base.find_package("Ghostscript")), "libghostscript.jl"))
25-
2622
# ── Display format flags (gdevdsp.h) ─────────────────────────────────────────
2723
# RGB 24-bit, no alpha, big-endian, top row first = 0x00000804
2824
const _GS_FMT_RGB24 = 0x00000004 | 0x00000800
@@ -154,8 +150,6 @@ function _gs_session(args::Vector{String}, action::Function; setup::Function=(_)
154150
rc < 0 && error("gsapi_set_display_callback failed: $rc")
155151
end
156152
setup(inst)
157-
#args_c = [Base.cconvert(Cstring, s) for s in args]
158-
#argv = [Base.unsafe_convert(Cstring, s) for s in args_c]
159153
GC.@preserve display_cb begin
160154
rc = gsapi_init_with_args(inst, Cint(length(args)), args)
161155
rc < 0 && error("gsapi_init_with_args failed: $rc")
@@ -603,8 +597,7 @@ function psview(ps_data::Union{String, AbstractVector{UInt8}}; dpi::Int=300)
603597
# Returns RECT {left, top, right, bottom} as four Int32.
604598
workrect = zeros(Int32, 4)
605599
GC.@preserve workrect begin
606-
ccall((:SystemParametersInfoW, "user32"), Bool,
607-
(UInt32, UInt32, Ptr{Int32}, UInt32),
600+
ccall((:SystemParametersInfoW, "user32"), Bool, (UInt32, UInt32, Ptr{Int32}, UInt32),
608601
UInt32(0x0030), UInt32(0), pointer(workrect), UInt32(0))
609602
end
610603
wa_x = Int(workrect[1]); wa_y = Int(workrect[2])

src/ghost/libghostscript.jl

Lines changed: 35 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -40,141 +40,135 @@ struct gsapi_fs_t
4040
open_handle::Ptr{Cvoid}
4141
end
4242

43-
function gsapi_revision(pr, len)
44-
ccall((:gsapi_revision, libgs), Cint, (Ptr{gsapi_revision_s}, Cint), pr, len)
45-
end
43+
gsapi_revision(pr, len) = ccall((:gsapi_revision, gslib), Cint, (Ptr{gsapi_revision_s}, Cint), pr, len)
4644

4745
function gsapi_new_instance(pinstance, caller_handle)
48-
ccall((:gsapi_new_instance, libgs), Cint, (Ptr{Ptr{Cvoid}}, Ptr{Cvoid}), pinstance, caller_handle)
46+
ccall((:gsapi_new_instance, gslib), Cint, (Ptr{Ptr{Cvoid}}, Ptr{Cvoid}), pinstance, caller_handle)
4947
end
5048

51-
function gsapi_delete_instance(instance)
52-
ccall((:gsapi_delete_instance, libgs), Cvoid, (Ptr{Cvoid},), instance)
53-
end
49+
gsapi_delete_instance(instance) = ccall((:gsapi_delete_instance, gslib), Cvoid, (Ptr{Cvoid},), instance)
5450

5551
function gsapi_set_stdio(instance, stdin_fn, stdout_fn, stderr_fn)
56-
ccall((:gsapi_set_stdio, libgs), Cint, (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}), instance, stdin_fn, stdout_fn, stderr_fn)
52+
ccall((:gsapi_set_stdio, gslib), Cint, (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}), instance, stdin_fn, stdout_fn, stderr_fn)
5753
end
5854

5955
function gsapi_set_stdio_with_handle(instance, stdin_fn, stdout_fn, stderr_fn, caller_handle)
60-
ccall((:gsapi_set_stdio_with_handle, libgs), Cint, (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}),
56+
ccall((:gsapi_set_stdio_with_handle, gslib), Cint, (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}),
6157
instance, stdin_fn, stdout_fn, stderr_fn, caller_handle)
6258
end
6359

64-
function gsapi_set_poll(instance, poll_fn)
65-
ccall((:gsapi_set_poll, libgs), Cint, (Ptr{Cvoid}, Ptr{Cvoid}), instance, poll_fn)
66-
end
60+
gsapi_set_poll(instance, poll_fn) = ccall((:gsapi_set_poll, gslib), Cint, (Ptr{Cvoid}, Ptr{Cvoid}), instance, poll_fn)
6761

6862
function gsapi_set_poll_with_handle(instance, poll_fn, caller_handle)
69-
ccall((:gsapi_set_poll_with_handle, libgs), Cint, (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}), instance, poll_fn, caller_handle)
63+
ccall((:gsapi_set_poll_with_handle, gslib), Cint, (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}), instance, poll_fn, caller_handle)
7064
end
7165

7266
function gsapi_set_display_callback(instance, callback)
73-
ccall((:gsapi_set_display_callback, libgs), Cint, (Ptr{Cvoid}, Ptr{Cvoid}), instance, callback)
67+
ccall((:gsapi_set_display_callback, gslib), Cint, (Ptr{Cvoid}, Ptr{Cvoid}), instance, callback)
7468
end
7569

7670
function gsapi_register_callout(instance, callout, callout_handle)
77-
ccall((:gsapi_register_callout, libgs), Cint, (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}), instance, callout, callout_handle)
71+
ccall((:gsapi_register_callout, gslib), Cint, (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}), instance, callout, callout_handle)
7872
end
7973

8074
function gsapi_deregister_callout(instance, callout, callout_handle)
81-
ccall((:gsapi_deregister_callout, libgs), Cvoid, (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}), instance, callout, callout_handle)
75+
ccall((:gsapi_deregister_callout, gslib), Cvoid, (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}), instance, callout, callout_handle)
8276
end
8377

8478
function gsapi_set_default_device_list(instance, list, listlen)
85-
ccall((:gsapi_set_default_device_list, libgs), Cint, (Ptr{Cvoid}, Cstring, Cint), instance, list, listlen)
79+
ccall((:gsapi_set_default_device_list, gslib), Cint, (Ptr{Cvoid}, Cstring, Cint), instance, list, listlen)
8680
end
8781

8882
function gsapi_get_default_device_list(instance, list, listlen)
89-
ccall((:gsapi_get_default_device_list, libgs), Cint, (Ptr{Cvoid}, Ptr{Cstring}, Ptr{Cint}), instance, list, listlen)
83+
ccall((:gsapi_get_default_device_list, gslib), Cint, (Ptr{Cvoid}, Ptr{Cstring}, Ptr{Cint}), instance, list, listlen)
9084
end
9185

9286
function gsapi_set_arg_encoding(instance, encoding)
93-
ccall((:gsapi_set_arg_encoding, libgs), Cint, (Ptr{Cvoid}, Cint), instance, encoding)
87+
ccall((:gsapi_set_arg_encoding, gslib), Cint, (Ptr{Cvoid}, Cint), instance, encoding)
9488
end
9589

9690
function gsapi_init_with_args(instance, argc, argv)
97-
ccall((:gsapi_init_with_args, libgs), Cint, (Ptr{Cvoid}, Cint, Ptr{Cstring}), instance, argc, argv)
91+
ccall((:gsapi_init_with_args, gslib), Cint, (Ptr{Cvoid}, Cint, Ptr{Cstring}), instance, argc, argv)
9892
end
9993

10094
function gsapi_init_with_argsA(instance, argc, argv)
101-
ccall((:gsapi_init_with_argsA, libgs), Cint, (Ptr{Cvoid}, Cint, Ptr{Cstring}), instance, argc, argv)
95+
ccall((:gsapi_init_with_argsA, gslib), Cint, (Ptr{Cvoid}, Cint, Ptr{Cstring}), instance, argc, argv)
10296
end
10397

10498
function gsapi_init_with_argsW(instance, argc, argv)
105-
ccall((:gsapi_init_with_argsW, libgs), Cint, (Ptr{Cvoid}, Cint, Ptr{Ptr{Cwchar_t}}), instance, argc, argv)
99+
ccall((:gsapi_init_with_argsW, gslib), Cint, (Ptr{Cvoid}, Cint, Ptr{Ptr{Cwchar_t}}), instance, argc, argv)
106100
end
107101

108102
function gsapi_run_string_begin(instance, user_errors, pexit_code)
109-
ccall((:gsapi_run_string_begin, libgs), Cint, (Ptr{Cvoid}, Cint, Ptr{Cint}), instance, user_errors, pexit_code)
103+
ccall((:gsapi_run_string_begin, gslib), Cint, (Ptr{Cvoid}, Cint, Ptr{Cint}), instance, user_errors, pexit_code)
110104
end
111105

112106
function gsapi_run_string_continue(instance, str, length, user_errors, pexit_code)
113-
ccall((:gsapi_run_string_continue, libgs), Cint, (Ptr{Cvoid}, Ptr{UInt8}, Cuint, Cint, Ptr{Cint}), instance, str, length, user_errors, pexit_code)
107+
ccall((:gsapi_run_string_continue, gslib), Cint, (Ptr{Cvoid}, Ptr{UInt8}, Cuint, Cint, Ptr{Cint}), instance, str, length, user_errors, pexit_code)
114108
end
115109

116110
function gsapi_run_string_end(instance, user_errors, pexit_code)
117-
ccall((:gsapi_run_string_end, libgs), Cint, (Ptr{Cvoid}, Cint, Ptr{Cint}), instance, user_errors, pexit_code)
111+
ccall((:gsapi_run_string_end, gslib), Cint, (Ptr{Cvoid}, Cint, Ptr{Cint}), instance, user_errors, pexit_code)
118112
end
119113

120114
function gsapi_run_string_with_length(instance, str, length, user_errors, pexit_code)
121-
ccall((:gsapi_run_string_with_length, libgs), Cint, (Ptr{Cvoid}, Ptr{UInt8}, Cuint, Cint, Ptr{Cint}), instance, str, length, user_errors, pexit_code)
115+
ccall((:gsapi_run_string_with_length, gslib), Cint, (Ptr{Cvoid}, Ptr{UInt8}, Cuint, Cint, Ptr{Cint}), instance, str, length, user_errors, pexit_code)
122116
end
123117

124118
function gsapi_run_string(instance, str, user_errors, pexit_code)
125-
ccall((:gsapi_run_string, libgs), Cint, (Ptr{Cvoid}, Cstring, Cint, Ptr{Cint}), instance, str, user_errors, pexit_code)
119+
ccall((:gsapi_run_string, gslib), Cint, (Ptr{Cvoid}, Cstring, Cint, Ptr{Cint}), instance, str, user_errors, pexit_code)
126120
end
127121

128122
function gsapi_run_file(instance, file_name, user_errors, pexit_code)
129-
ccall((:gsapi_run_file, libgs), Cint, (Ptr{Cvoid}, Cstring, Cint, Ptr{Cint}), instance, file_name, user_errors, pexit_code)
123+
ccall((:gsapi_run_file, gslib), Cint, (Ptr{Cvoid}, Cstring, Cint, Ptr{Cint}), instance, file_name, user_errors, pexit_code)
130124
end
131125

132126
function gsapi_run_fileA(instance, file_name, user_errors, pexit_code)
133-
ccall((:gsapi_run_fileA, libgs), Cint, (Ptr{Cvoid}, Cstring, Cint, Ptr{Cint}), instance, file_name, user_errors, pexit_code)
127+
ccall((:gsapi_run_fileA, gslib), Cint, (Ptr{Cvoid}, Cstring, Cint, Ptr{Cint}), instance, file_name, user_errors, pexit_code)
134128
end
135129

136130
function gsapi_run_fileW(instance, file_name, user_errors, pexit_code)
137-
ccall((:gsapi_run_fileW, libgs), Cint, (Ptr{Cvoid}, Ptr{Cwchar_t}, Cint, Ptr{Cint}), instance, file_name, user_errors, pexit_code)
131+
ccall((:gsapi_run_fileW, gslib), Cint, (Ptr{Cvoid}, Ptr{Cwchar_t}, Cint, Ptr{Cint}), instance, file_name, user_errors, pexit_code)
138132
end
139133

140-
gsapi_exit(instance) = ccall((:gsapi_exit, libgs), Cint, (Ptr{Cvoid},), instance)
134+
gsapi_exit(instance) = ccall((:gsapi_exit, gslib), Cint, (Ptr{Cvoid},), instance)
141135

142136
function gsapi_set_param(instance, param, value, type)
143-
ccall((:gsapi_set_param, libgs), Cint, (Ptr{Cvoid}, Cstring, Ptr{Cvoid}, gs_set_param_type), instance, param, value, type)
137+
ccall((:gsapi_set_param, gslib), Cint, (Ptr{Cvoid}, Cstring, Ptr{Cvoid}, gs_set_param_type), instance, param, value, type)
144138
end
145139

146140
function gsapi_get_param(instance, param, value, type)
147-
ccall((:gsapi_get_param, libgs), Cint, (Ptr{Cvoid}, Cstring, Ptr{Cvoid}, gs_set_param_type), instance, param, value, type)
141+
ccall((:gsapi_get_param, gslib), Cint, (Ptr{Cvoid}, Cstring, Ptr{Cvoid}, gs_set_param_type), instance, param, value, type)
148142
end
149143

150144
function gsapi_enumerate_params(instance, iterator, key, type)
151-
ccall((:gsapi_enumerate_params, libgs), Cint, (Ptr{Cvoid}, Ptr{Ptr{Cvoid}}, Ptr{Cstring}, Ptr{gs_set_param_type}), instance, iterator, key, type)
145+
ccall((:gsapi_enumerate_params, gslib), Cint, (Ptr{Cvoid}, Ptr{Ptr{Cvoid}}, Ptr{Cstring}, Ptr{gs_set_param_type}), instance, iterator, key, type)
152146
end
153147

154148
function gsapi_add_control_path(instance, type, path)
155-
ccall((:gsapi_add_control_path, libgs), Cint, (Ptr{Cvoid}, Cint, Cstring), instance, type, path)
149+
ccall((:gsapi_add_control_path, gslib), Cint, (Ptr{Cvoid}, Cint, Cstring), instance, type, path)
156150
end
157151

158152
function gsapi_remove_control_path(instance, type, path)
159-
ccall((:gsapi_remove_control_path, libgs), Cint, (Ptr{Cvoid}, Cint, Cstring), instance, type, path)
153+
ccall((:gsapi_remove_control_path, gslib), Cint, (Ptr{Cvoid}, Cint, Cstring), instance, type, path)
160154
end
161155

162156
function gsapi_purge_control_paths(instance, type)
163-
ccall((:gsapi_purge_control_paths, libgs), Cvoid, (Ptr{Cvoid}, Cint), instance, type)
157+
ccall((:gsapi_purge_control_paths, gslib), Cvoid, (Ptr{Cvoid}, Cint), instance, type)
164158
end
165159

166160
function gsapi_activate_path_control(instance, enable)
167-
ccall((:gsapi_activate_path_control, libgs), Cvoid, (Ptr{Cvoid}, Cint), instance, enable)
161+
ccall((:gsapi_activate_path_control, gslib), Cvoid, (Ptr{Cvoid}, Cint), instance, enable)
168162
end
169163

170164
function gsapi_is_path_control_active(instance)
171-
ccall((:gsapi_is_path_control_active, libgs), Cint, (Ptr{Cvoid},), instance)
165+
ccall((:gsapi_is_path_control_active, gslib), Cint, (Ptr{Cvoid},), instance)
172166
end
173167

174168
function gsapi_add_fs(instance, fs, secret)
175-
ccall((:gsapi_add_fs, libgs), Cint, (Ptr{Cvoid}, Ptr{gsapi_fs_t}, Ptr{Cvoid}), instance, fs, secret)
169+
ccall((:gsapi_add_fs, gslib), Cint, (Ptr{Cvoid}, Ptr{gsapi_fs_t}, Ptr{Cvoid}), instance, fs, secret)
176170
end
177171

178172
function gsapi_remove_fs(instance, fs, secret)
179-
ccall((:gsapi_remove_fs, libgs), Cvoid, (Ptr{Cvoid}, Ptr{gsapi_fs_t}, Ptr{Cvoid}), instance, fs, secret)
173+
ccall((:gsapi_remove_fs, gslib), Cvoid, (Ptr{Cvoid}, Ptr{gsapi_fs_t}, Ptr{Cvoid}), instance, fs, secret)
180174
end

0 commit comments

Comments
 (0)