glib2 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +3023 -0
- data/README +28 -0
- data/Rakefile +87 -0
- data/extconf.rb +61 -0
- data/sample/bookmarkfile.rb +66 -0
- data/sample/completion.rb +45 -0
- data/sample/idle.rb +41 -0
- data/sample/iochannel.rb +44 -0
- data/sample/keyfile.rb +62 -0
- data/sample/shell.rb +36 -0
- data/sample/spawn.rb +25 -0
- data/sample/timeout.rb +28 -0
- data/sample/timeout2.rb +35 -0
- data/sample/timer.rb +40 -0
- data/sample/type-register.rb +103 -0
- data/sample/type-register2.rb +104 -0
- data/sample/utils.rb +54 -0
- data/src/glib-enum-types.c +1032 -0
- data/src/glib-enum-types.h +140 -0
- data/src/lib/glib-mkenums.rb +199 -0
- data/src/lib/glib2.rb +220 -0
- data/src/lib/mkmf-gnome2.rb +390 -0
- data/src/lib/pkg-config.rb +137 -0
- data/src/rbgcompat.h +30 -0
- data/src/rbglib.c +320 -0
- data/src/rbglib.h +96 -0
- data/src/rbglib_bookmarkfile.c +595 -0
- data/src/rbglib_completion.c +192 -0
- data/src/rbglib_convert.c +195 -0
- data/src/rbglib_error.c +95 -0
- data/src/rbglib_fileutils.c +83 -0
- data/src/rbglib_i18n.c +44 -0
- data/src/rbglib_int64.c +157 -0
- data/src/rbglib_iochannel.c +883 -0
- data/src/rbglib_keyfile.c +846 -0
- data/src/rbglib_maincontext.c +917 -0
- data/src/rbglib_mainloop.c +87 -0
- data/src/rbglib_messages.c +150 -0
- data/src/rbglib_pollfd.c +111 -0
- data/src/rbglib_shell.c +68 -0
- data/src/rbglib_source.c +190 -0
- data/src/rbglib_spawn.c +345 -0
- data/src/rbglib_threads.c +51 -0
- data/src/rbglib_timer.c +127 -0
- data/src/rbglib_unicode.c +611 -0
- data/src/rbglib_utils.c +386 -0
- data/src/rbglib_win32.c +136 -0
- data/src/rbgobj_boxed.c +251 -0
- data/src/rbgobj_closure.c +337 -0
- data/src/rbgobj_convert.c +167 -0
- data/src/rbgobj_enums.c +961 -0
- data/src/rbgobj_fundamental.c +30 -0
- data/src/rbgobj_object.c +892 -0
- data/src/rbgobj_param.c +390 -0
- data/src/rbgobj_paramspecs.c +305 -0
- data/src/rbgobj_signal.c +963 -0
- data/src/rbgobj_strv.c +61 -0
- data/src/rbgobj_type.c +851 -0
- data/src/rbgobj_typeinstance.c +121 -0
- data/src/rbgobj_typeinterface.c +148 -0
- data/src/rbgobj_typemodule.c +66 -0
- data/src/rbgobj_typeplugin.c +49 -0
- data/src/rbgobj_value.c +313 -0
- data/src/rbgobj_valuearray.c +59 -0
- data/src/rbgobj_valuetypes.c +298 -0
- data/src/rbgobject.c +406 -0
- data/src/rbgobject.h +265 -0
- data/src/rbgprivate.h +88 -0
- data/src/rbgutil.c +222 -0
- data/src/rbgutil.h +82 -0
- data/src/rbgutil_callback.c +231 -0
- data/test/glib-test-init.rb +6 -0
- data/test/glib-test-utils.rb +12 -0
- data/test/run-test.rb +25 -0
- data/test/test_enum.rb +99 -0
- data/test/test_file_utils.rb +15 -0
- data/test/test_glib2.rb +120 -0
- data/test/test_iochannel.rb +275 -0
- data/test/test_key_file.rb +38 -0
- data/test/test_mkenums.rb +25 -0
- data/test/test_signal.rb +20 -0
- data/test/test_timeout.rb +28 -0
- data/test/test_unicode.rb +369 -0
- data/test/test_utils.rb +37 -0
- data/test/test_win32.rb +13 -0
- metadata +165 -0
@@ -0,0 +1,390 @@
|
|
1
|
+
#
|
2
|
+
# mkmf-gnome2.rb
|
3
|
+
#
|
4
|
+
# Extended mkmf for Ruby-GNOME2 and Ruby/GLib based libraries.
|
5
|
+
#
|
6
|
+
# Copyright(C) 2003-2005 Ruby-GNOME2 Project.
|
7
|
+
#
|
8
|
+
# This program is licenced under the same
|
9
|
+
# license of Ruby-GNOME2.
|
10
|
+
#
|
11
|
+
|
12
|
+
require 'mkmf'
|
13
|
+
require 'pkg-config'
|
14
|
+
require 'glib-mkenums'
|
15
|
+
|
16
|
+
unless defined?(macro_defined?)
|
17
|
+
def macro_defined?(macro, src, opt="")
|
18
|
+
try_cpp(src + <<EOP, opt)
|
19
|
+
#ifndef #{macro}
|
20
|
+
# error
|
21
|
+
#endif
|
22
|
+
EOP
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
STDOUT.print("checking for GCC... ")
|
28
|
+
STDOUT.flush
|
29
|
+
if macro_defined?("__GNUC__", "")
|
30
|
+
STDOUT.print "yes\n"
|
31
|
+
$CFLAGS += ' -Wall'
|
32
|
+
$cc_is_gcc = true
|
33
|
+
else
|
34
|
+
STDOUT.print "no\n"
|
35
|
+
$cc_is_gcc = false
|
36
|
+
end
|
37
|
+
|
38
|
+
include_path = nil
|
39
|
+
if ENV['GTK_BASEPATH'] and /cygwin/ !~ RUBY_PLATFORM
|
40
|
+
include_path = (ENV['GTK_BASEPATH'] + "\\INCLUDE").gsub("\\", "/")
|
41
|
+
# $hdrdir += " -I#{include_path} "
|
42
|
+
$CFLAGS += " -I#{include_path} "
|
43
|
+
end
|
44
|
+
|
45
|
+
def check_win32()
|
46
|
+
$G_PLATFORM_WIN32 = false
|
47
|
+
$G_OS_WIN32 = false
|
48
|
+
$G_WITH_CYGWIN = false
|
49
|
+
|
50
|
+
STDOUT.print("checking for G_PLATFORM_WIN32... ")
|
51
|
+
STDOUT.flush
|
52
|
+
if macro_defined?('G_PLATFORM_WIN32', "#include <glibconfig.h>\n")
|
53
|
+
STDOUT.print "yes\n"
|
54
|
+
$G_PLATFORM_WIN32 = true
|
55
|
+
else
|
56
|
+
STDOUT.print "no\n"
|
57
|
+
end
|
58
|
+
|
59
|
+
if $G_PLATFORM_WIN32
|
60
|
+
STDOUT.print("checking for G_OS_WIN32... ")
|
61
|
+
STDOUT.flush
|
62
|
+
if macro_defined?('G_OS_WIN32', "#include <glibconfig.h>\n")
|
63
|
+
STDOUT.print "yes\n"
|
64
|
+
$G_OS_WIN32 = true
|
65
|
+
if $cc_is_gcc
|
66
|
+
if /^2\./ =~ `#{Config::CONFIG['CC']} -dumpversion`.chomp
|
67
|
+
$CFLAGS += ' -fnative-struct'
|
68
|
+
else
|
69
|
+
$CFLAGS += ' -mms-bitfields'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
else
|
73
|
+
STDOUT.print "no\n"
|
74
|
+
end
|
75
|
+
|
76
|
+
# STDOUT.print("checking for G_WITH_CYGWIN... ")
|
77
|
+
# STDOUT.flush
|
78
|
+
# if macro_defined?('G_WITH_CYGWIN', "#include <glibconfig.h>\n")
|
79
|
+
# STDOUT.print "yes\n"
|
80
|
+
# $G_WITH_CYGWIN = true
|
81
|
+
# else
|
82
|
+
# STDOUT.print "no\n"
|
83
|
+
# end
|
84
|
+
end
|
85
|
+
|
86
|
+
nil
|
87
|
+
end
|
88
|
+
|
89
|
+
def set_output_lib(target_name)
|
90
|
+
if /cygwin|mingw/ =~ RUBY_PLATFORM
|
91
|
+
filename = "libruby-#{target_name}.a"
|
92
|
+
if RUBY_VERSION > "1.8.0"
|
93
|
+
$DLDFLAGS << ",--out-implib=#{filename}" if filename
|
94
|
+
elsif RUBY_VERSION > "1.8"
|
95
|
+
$DLDFLAGS.gsub!(/ -Wl,--out-implib=[^ ]+/, '')
|
96
|
+
$DLDFLAGS << " -Wl,--out-implib=#{filename}" if filename
|
97
|
+
else
|
98
|
+
$DLDFLAGS.gsub!(/ --output-lib\s+[^ ]+/, '')
|
99
|
+
$DLDFLAGS << " --output-lib #{filename}" if filename
|
100
|
+
end
|
101
|
+
elsif /mswin32/ =~ RUBY_PLATFORM
|
102
|
+
filename = "libruby-#{target_name}.lib"
|
103
|
+
$DLDFLAGS.gsub!(/ --output-lib\s+[^ ]+/, '')
|
104
|
+
$DLDFLAGS.gsub!(/ \/IMPLIB:[^ ]+/, '')
|
105
|
+
$DLDFLAGS << " /IMPLIB:#{filename}" if filename
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def setup_win32(target_name)
|
110
|
+
check_win32
|
111
|
+
set_output_lib(target_name)
|
112
|
+
end
|
113
|
+
|
114
|
+
#add_depend_package("glib2", "glib/src", "/...../ruby-gnome2")
|
115
|
+
def add_depend_package(target_name, target_srcdir, top_srcdir)
|
116
|
+
[top_srcdir, $configure_args['--topdir']].each do |topdir|
|
117
|
+
topdir = File.expand_path(topdir)
|
118
|
+
if RUBY_VERSION < "1.8.5"
|
119
|
+
$CFLAGS = "-I#{File.join(topdir, target_srcdir)} #{$CFLAGS}"
|
120
|
+
else
|
121
|
+
$INCFLAGS = "-I#{File.join(topdir, target_srcdir)} #{$INCFLAGS}"
|
122
|
+
end
|
123
|
+
|
124
|
+
if /cygwin|mingw/ =~ RUBY_PLATFORM
|
125
|
+
$libs << " -lruby-#{target_name}"
|
126
|
+
$LDFLAGS << " -L#{topdir}/#{target_srcdir}"
|
127
|
+
elsif /mswin32/ =~ RUBY_PLATFORM
|
128
|
+
$DLDFLAGS << " /libpath:#{topdir}/#{target_srcdir}"
|
129
|
+
$libs << " libruby-#{target_name}.lib"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def add_distcleanfile(file)
|
135
|
+
$distcleanfiles ||= []
|
136
|
+
$distcleanfiles << file
|
137
|
+
end
|
138
|
+
|
139
|
+
def create_pkg_config_file(package_name, c_package,
|
140
|
+
version=nil, pc_file_name=nil)
|
141
|
+
pc_file_name ||= "#{package_name.downcase.sub(/\//, '-')}.pc"
|
142
|
+
version ||= ruby_gnome2_version || PKGConfig.modversion(c_package)
|
143
|
+
|
144
|
+
puts "creating #{pc_file_name}"
|
145
|
+
|
146
|
+
File.open(pc_file_name, 'w') do |pc_file|
|
147
|
+
if package_name.nil?
|
148
|
+
c_module_name = PKGConfig.name(c_package)
|
149
|
+
package_name = "Ruby/#{c_module_name}" if c_module_name
|
150
|
+
end
|
151
|
+
pc_file.puts("Name: #{package_name}") if package_name
|
152
|
+
|
153
|
+
description = PKGConfig.description(c_package)
|
154
|
+
pc_file.puts("Description: Ruby bindings for #{description}") if description
|
155
|
+
pc_file.printf("Version: #{version}")
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def ruby_gnome2_version(glib_source_directory=nil)
|
160
|
+
glib_source_directory ||= File.join(File.dirname(__FILE__), "..")
|
161
|
+
rbglib_h = File.join(glib_source_directory, "rbglib.h")
|
162
|
+
return nil unless File.exist?(rbglib_h)
|
163
|
+
|
164
|
+
version = nil
|
165
|
+
File.open(rbglib_h) do |h_file|
|
166
|
+
version_info = {}
|
167
|
+
h_file.each_line do |line|
|
168
|
+
case line
|
169
|
+
when /\A#define RBGLIB_(MAJOR|MINOR|MICRO)_VERSION\s+(\d+)/
|
170
|
+
version_info[$1] = $2
|
171
|
+
end
|
172
|
+
end
|
173
|
+
version_info = [version_info["MAJOR"],
|
174
|
+
version_info["MINOR"],
|
175
|
+
version_info["MICRO"]].compact
|
176
|
+
version = version_info.join(".") if version_info.size == 3
|
177
|
+
end
|
178
|
+
|
179
|
+
version
|
180
|
+
end
|
181
|
+
|
182
|
+
def create_makefile_at_srcdir(pkg_name, srcdir, defs = nil)
|
183
|
+
base_dir = File.basename(Dir.pwd)
|
184
|
+
last_common_index = srcdir.rindex(base_dir)
|
185
|
+
if last_common_index
|
186
|
+
builddir = srcdir[(last_common_index + base_dir.size + 1)..-1]
|
187
|
+
end
|
188
|
+
builddir ||= "."
|
189
|
+
FileUtils.mkdir_p(builddir)
|
190
|
+
|
191
|
+
Dir.chdir(builddir) do
|
192
|
+
yield if block_given?
|
193
|
+
|
194
|
+
$defs << defs if defs
|
195
|
+
|
196
|
+
pattern = "*.{#{SRC_EXT.join(',')}}"
|
197
|
+
srcs = Dir[File.join(srcdir, pattern)]
|
198
|
+
srcs |= Dir[File.join(".", pattern)]
|
199
|
+
$objs = srcs.collect do |src|
|
200
|
+
File.basename(src, ".*") + ".o"
|
201
|
+
end.flatten.uniq
|
202
|
+
|
203
|
+
create_makefile(pkg_name, srcdir)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
def run_make_in_sub_dirs_command(command, sub_dirs)
|
208
|
+
if /mswin32/ =~ RUBY_PLATFORM
|
209
|
+
sub_dirs.collect do |dir|
|
210
|
+
<<-EOM.chmop
|
211
|
+
@cd #{dir}
|
212
|
+
@nmake -nologo DESTDIR=$(DESTDIR) #{command}
|
213
|
+
@cd ..
|
214
|
+
EOM
|
215
|
+
end.join("\n")
|
216
|
+
else
|
217
|
+
sub_dirs.collect do |dir|
|
218
|
+
"\t@cd #{dir}; $(MAKE) #{command}"
|
219
|
+
end.join("\n")
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def create_top_makefile(sub_dirs=["src"])
|
224
|
+
File.open("Makefile", "w") do |makefile|
|
225
|
+
makefile.print(<<-EOM)
|
226
|
+
all:
|
227
|
+
#{run_make_in_sub_dirs_command("all", sub_dirs)}
|
228
|
+
|
229
|
+
install:
|
230
|
+
#{run_make_in_sub_dirs_command("install", sub_dirs)}
|
231
|
+
|
232
|
+
site-install:
|
233
|
+
#{run_make_in_sub_dirs_command("site-install", sub_dirs)}
|
234
|
+
|
235
|
+
clean:
|
236
|
+
#{run_make_in_sub_dirs_command("clean", sub_dirs)}
|
237
|
+
EOM
|
238
|
+
|
239
|
+
if /mswin32/ =~ RUBY_PLATFORM
|
240
|
+
makefile.print(<<-EOM)
|
241
|
+
@if exist extconf.h del extconf.h
|
242
|
+
@if exist conftest.* del conftest.*
|
243
|
+
@if exist *.lib del *.lib
|
244
|
+
@if exist *~ del *~
|
245
|
+
@if exist mkmf.log del mkmf.log
|
246
|
+
EOM
|
247
|
+
else
|
248
|
+
makefile.print(<<-EOM)
|
249
|
+
|
250
|
+
distclean: clean
|
251
|
+
#{run_make_in_sub_dirs_command("distclean", sub_dirs)}
|
252
|
+
@rm -f Makefile extconf.h conftest.*
|
253
|
+
@rm -f core *~ mkmf.log
|
254
|
+
EOM
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
# This is used for the library which doesn't support version info.
|
260
|
+
def make_version_header(app_name, pkgname, dir = "src")
|
261
|
+
version = PKGConfig.modversion(pkgname).split(/\./)
|
262
|
+
(0..2).each do |v|
|
263
|
+
version[v] = "0" unless version[v]
|
264
|
+
end
|
265
|
+
filename = "rb#{app_name.downcase}version.h"
|
266
|
+
|
267
|
+
puts "creating #{filename}"
|
268
|
+
|
269
|
+
add_distcleanfile(filename)
|
270
|
+
|
271
|
+
FileUtils.mkdir_p(dir)
|
272
|
+
out = File.open(File.join(dir, filename), "w")
|
273
|
+
|
274
|
+
out.print %Q[/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
275
|
+
/************************************************
|
276
|
+
|
277
|
+
#{filename} -
|
278
|
+
|
279
|
+
This file was generated by mkmf-gnome2.rb.
|
280
|
+
|
281
|
+
************************************************/
|
282
|
+
|
283
|
+
#ifndef __RB#{app_name}_VERSION_H__
|
284
|
+
#define __RB#{app_name}_VERSION_H__
|
285
|
+
|
286
|
+
#define #{app_name}_MAJOR_VERSION (#{version[0]})
|
287
|
+
#define #{app_name}_MINOR_VERSION (#{version[1]})
|
288
|
+
#define #{app_name}_MICRO_VERSION (#{version[2]})
|
289
|
+
|
290
|
+
#define #{app_name}_CHECK_VERSION(major,minor,micro) \\
|
291
|
+
(#{app_name}_MAJOR_VERSION > (major) || \\
|
292
|
+
(#{app_name}_MAJOR_VERSION == (major) && #{app_name}_MINOR_VERSION > (minor)) || \\
|
293
|
+
(#{app_name}_MAJOR_VERSION == (major) && #{app_name}_MINOR_VERSION == (minor) && \\
|
294
|
+
#{app_name}_MICRO_VERSION >= (micro)))
|
295
|
+
|
296
|
+
|
297
|
+
#endif /* __RB#{app_name}_VERSION_H__ */
|
298
|
+
]
|
299
|
+
out.close
|
300
|
+
end
|
301
|
+
|
302
|
+
def check_ruby_func
|
303
|
+
#Other options
|
304
|
+
ruby_header = "ruby.h"
|
305
|
+
have_func("rb_define_alloc_func", ruby_header) # for ruby-1.8
|
306
|
+
have_func("rb_block_proc", ruby_header) # for ruby-1.8
|
307
|
+
|
308
|
+
STDOUT.print("checking for new allocation framework... ") # for ruby-1.7
|
309
|
+
if Object.respond_to? :allocate
|
310
|
+
STDOUT.print "yes\n"
|
311
|
+
$defs << "-DHAVE_OBJECT_ALLOCATE"
|
312
|
+
else
|
313
|
+
STDOUT.print "no\n"
|
314
|
+
end
|
315
|
+
|
316
|
+
STDOUT.print("checking for attribute assignment... ") # for ruby-1.7
|
317
|
+
STDOUT.flush
|
318
|
+
if defined? try_compile and try_compile <<SRC
|
319
|
+
#include "ruby.h"
|
320
|
+
#include "node.h"
|
321
|
+
int node_attrasgn = (int)NODE_ATTRASGN;
|
322
|
+
SRC
|
323
|
+
STDOUT.print "yes\n"
|
324
|
+
$defs << "-DHAVE_NODE_ATTRASGN"
|
325
|
+
else
|
326
|
+
STDOUT.print "no\n"
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
def add_obj(name)
|
331
|
+
$objs << name unless $objs.index(name)
|
332
|
+
end
|
333
|
+
|
334
|
+
def glib_mkenums(prefix, files, g_type_prefix, include_files, options={})
|
335
|
+
add_distcleanfile(prefix + ".h")
|
336
|
+
add_distcleanfile(prefix + ".c")
|
337
|
+
GLib::MkEnums.create(prefix, files, g_type_prefix, include_files, options)
|
338
|
+
end
|
339
|
+
|
340
|
+
def check_cairo
|
341
|
+
return false unless PKGConfig.have_package('cairo')
|
342
|
+
|
343
|
+
have_rb_cairo_h = have_header('rb_cairo.h')
|
344
|
+
unless have_rb_cairo_h
|
345
|
+
begin
|
346
|
+
require 'rubygems'
|
347
|
+
gem 'cairo'
|
348
|
+
require 'cairo'
|
349
|
+
rcairo_src_gem_path_re =
|
350
|
+
/\A#{Regexp.escape(Gem.dir)}\/gems\/cairo-[\d.]+\/src\z/
|
351
|
+
$:.each do |path|
|
352
|
+
if rcairo_src_gem_path_re =~ path
|
353
|
+
$CFLAGS += " -I#{path} "
|
354
|
+
have_rb_cairo_h = have_header('rb_cairo.h')
|
355
|
+
break
|
356
|
+
end
|
357
|
+
end
|
358
|
+
rescue LoadError
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
if have_rb_cairo_h
|
363
|
+
if /mingw|cygwin|mswin32/ =~ RUBY_PLATFORM
|
364
|
+
unless ENV["CAIRO_PATH"]
|
365
|
+
puts "Error! Set CAIRO_PATH."
|
366
|
+
exit 1
|
367
|
+
end
|
368
|
+
add_depend_package("cairo", "src", ENV["CAIRO_PATH"])
|
369
|
+
$defs << "-DRUBY_CAIRO_PLATFORM_WIN32"
|
370
|
+
end
|
371
|
+
end
|
372
|
+
have_rb_cairo_h
|
373
|
+
end
|
374
|
+
|
375
|
+
add_include_path = Proc.new do |dir_variable|
|
376
|
+
value = Config::CONFIG[dir_variable]
|
377
|
+
if value and File.exist?(value)
|
378
|
+
$INCFLAGS << " -I$(#{dir_variable}) "
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
382
|
+
add_include_path.call("sitearchdir")
|
383
|
+
add_include_path.call("vendorarchdir")
|
384
|
+
|
385
|
+
check_ruby_func
|
386
|
+
|
387
|
+
if /mingw/ =~ RUBY_PLATFORM
|
388
|
+
$ruby.gsub!('\\', '/')
|
389
|
+
end
|
390
|
+
|
@@ -0,0 +1,137 @@
|
|
1
|
+
#
|
2
|
+
# pkg-config.rb
|
3
|
+
#
|
4
|
+
# Wrapper of pkg-config tool.
|
5
|
+
#
|
6
|
+
# Copyright(C) 2003-2005 Ruby-GNOME2 Project.
|
7
|
+
#
|
8
|
+
# This file is part of Ruby/GLib2.
|
9
|
+
#
|
10
|
+
# Ruby/GLib2 is free software: you can redistribute it and/or modify
|
11
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
12
|
+
# the Free Software Foundation, either version 2.1 of the License.
|
13
|
+
#
|
14
|
+
# Foobar is distributed in the hope that it will be useful,
|
15
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
+
# GNU Lesser General Public License for more details.
|
18
|
+
#
|
19
|
+
# You should have received a copy of the GNU Lesser General Public License
|
20
|
+
# along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
21
|
+
|
22
|
+
|
23
|
+
require 'mkmf'
|
24
|
+
require 'shellwords'
|
25
|
+
|
26
|
+
module PKGConfig
|
27
|
+
@@cmd = with_config('pkg-config', ENV["PKG_CONFIG"] || 'pkg-config')
|
28
|
+
if /mswin32/ =~ RUBY_PLATFORM and /^cl\b/ =~ Config::CONFIG['CC']
|
29
|
+
@@cmd += ' --msvc-syntax'
|
30
|
+
end
|
31
|
+
|
32
|
+
@@list = {}
|
33
|
+
`#{@@cmd} --list-all`.chomp.split(/\n/).each{|v|
|
34
|
+
pkg, name, desc = /(\S+?)\s+(.*?)\s-\s(.*)/.match(v).to_a[1..3]
|
35
|
+
@@list[pkg] = [name, desc]
|
36
|
+
}
|
37
|
+
|
38
|
+
module_function
|
39
|
+
def exist?(pkg)
|
40
|
+
system("#{@@cmd} --exists #{pkg}")
|
41
|
+
end
|
42
|
+
|
43
|
+
def libs(pkg)
|
44
|
+
`#{@@cmd} --libs #{pkg}`.chomp
|
45
|
+
end
|
46
|
+
|
47
|
+
def libs_only_L(pkg)
|
48
|
+
`#{@@cmd} --libs-only-L #{pkg}`.chomp
|
49
|
+
end
|
50
|
+
|
51
|
+
def libs_only_l(pkg)
|
52
|
+
`#{@@cmd} --libs-only-l #{pkg}`.chomp
|
53
|
+
end
|
54
|
+
|
55
|
+
def cflags(pkg)
|
56
|
+
`#{@@cmd} --cflags #{pkg}`.chomp
|
57
|
+
end
|
58
|
+
|
59
|
+
def cflags_only_I(pkg)
|
60
|
+
`#{@@cmd} --cflags-only-I #{pkg}`.chomp
|
61
|
+
end
|
62
|
+
|
63
|
+
def cflags_only_other(pkg)
|
64
|
+
`#{@@cmd} --cflags-only-other #{pkg}`.chomp
|
65
|
+
end
|
66
|
+
|
67
|
+
def variable(pkg, var)
|
68
|
+
`#{@@cmd} --variable=#{var} #{pkg}`.chomp
|
69
|
+
end
|
70
|
+
|
71
|
+
def modversion(pkg)
|
72
|
+
`#{@@cmd} --modversion #{pkg}`.chomp
|
73
|
+
end
|
74
|
+
|
75
|
+
def version
|
76
|
+
`#{@@cmd} --version`.chomp
|
77
|
+
end
|
78
|
+
|
79
|
+
def list_all
|
80
|
+
# Returns [pkg, name, description]
|
81
|
+
@@list.keys.collect{|key| [key] + @@list[key]}.sort
|
82
|
+
end
|
83
|
+
|
84
|
+
def name(pkg)
|
85
|
+
@@list[pkg][0]
|
86
|
+
end
|
87
|
+
|
88
|
+
def description(pkg)
|
89
|
+
@@list[pkg][1]
|
90
|
+
end
|
91
|
+
|
92
|
+
def provides(pkg)
|
93
|
+
`#{@@cmd} --print-provides #{pkg}`.chomp
|
94
|
+
end
|
95
|
+
|
96
|
+
def requires(pkg)
|
97
|
+
`#{@@cmd} --print-requires #{pkg}`.chomp.gsub("\n", ", ")
|
98
|
+
end
|
99
|
+
|
100
|
+
def check_version?(pkg, major = 0, minor = 0, micro = 0)
|
101
|
+
return false unless exist?(pkg)
|
102
|
+
ver = modversion(pkg).split(".").collect{|item| item.to_i}
|
103
|
+
(0..2).each {|i| ver[i] = 0 unless ver[i]}
|
104
|
+
|
105
|
+
(ver[0] > major ||
|
106
|
+
(ver[0] == major && ver[1] > minor) ||
|
107
|
+
(ver[0] == major && ver[1] == minor &&
|
108
|
+
ver[2] >= micro))
|
109
|
+
end
|
110
|
+
|
111
|
+
def have_package(pkg, major = nil, minor = 0, micro = 0)
|
112
|
+
if major.nil?
|
113
|
+
STDOUT.print("checking for #{pkg}... ")
|
114
|
+
else
|
115
|
+
STDOUT.print("checking for #{pkg} version (>= #{major}.#{minor}.#{micro})... ")
|
116
|
+
end
|
117
|
+
major ||= 0
|
118
|
+
STDOUT.flush
|
119
|
+
if check_version?(pkg, major, minor, micro)
|
120
|
+
STDOUT.print "yes\n"
|
121
|
+
libraries = libs_only_l(pkg)
|
122
|
+
dldflags = libs(pkg)
|
123
|
+
dldflags = (Shellwords.shellwords(dldflags) - Shellwords.shellwords(libraries)).map{|s| /\s/ =~ s ? "\"#{s}\"" : s }.join(' ')
|
124
|
+
$libs += ' ' + libraries
|
125
|
+
if /mswin32/ =~ RUBY_PLATFORM
|
126
|
+
$DLDFLAGS += ' ' + dldflags
|
127
|
+
else
|
128
|
+
$LDFLAGS += ' ' + dldflags
|
129
|
+
end
|
130
|
+
$CFLAGS += ' ' + cflags(pkg)
|
131
|
+
true
|
132
|
+
else
|
133
|
+
STDOUT.print "no\n"
|
134
|
+
false
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|