Skip to content

Commit c2e62ef

Browse files
authored
Merge pull request #2004 from GenericMappingTools/ALT-GS
Add an alternative way of setting which version of Ghostscript to use.
2 parents bd188ff + ceab32e commit c2e62ef

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)