linkparser 1.0.4 → 1.1.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.tar.gz.sig +0 -0
- data/ChangeLog +134 -506
- data/LICENSE +1 -1
- data/README.md +95 -0
- data/Rakefile +145 -95
- data/Rakefile.local +31 -39
- data/ext/dictionary.c +103 -37
- data/ext/extconf.rb +79 -32
- data/ext/linkage.c +245 -210
- data/ext/linkparser.c +3 -2
- data/ext/linkparser.h +21 -17
- data/ext/parseoptions.c +65 -65
- data/ext/sentence.c +75 -64
- data/lib/linkparser.rb +16 -26
- data/lib/linkparser/linkage.rb +68 -50
- data/lib/linkparser/mixins.rb +38 -0
- data/lib/linkparser/sentence.rb +15 -40
- data/rake/dependencies.rb +1 -1
- data/rake/documentation.rb +123 -0
- data/rake/helpers.rb +400 -310
- data/rake/hg.rb +318 -0
- data/rake/manual.rb +84 -79
- data/rake/packaging.rb +33 -37
- data/rake/publishing.rb +166 -146
- data/rake/style.rb +1 -1
- data/rake/svn.rb +577 -549
- data/rake/testing.rb +55 -106
- data/spec/bugfixes_spec.rb +12 -6
- data/spec/linkparser/dictionary_spec.rb +45 -29
- data/spec/linkparser/linkage_spec.rb +90 -94
- data/spec/linkparser/mixins_spec.rb +67 -0
- data/spec/linkparser/parseoptions_spec.rb +19 -22
- data/spec/linkparser/sentence_spec.rb +19 -17
- data/spec/linkparser_spec.rb +11 -5
- metadata +64 -147
- metadata.gz.sig +0 -0
- data/README +0 -61
- data/rake/rdoc.rb +0 -40
- data/rake/win32.rb +0 -186
data/Rakefile.local
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
#!rake
|
2
2
|
|
3
|
+
require 'rake/extensiontask'
|
4
|
+
|
3
5
|
# C extension constants
|
4
6
|
EXT_MAKEFILE = EXTDIR + 'Makefile'
|
5
7
|
EXT_SOURCES = FileList[ EXTDIR + '*.c' ]
|
@@ -11,55 +13,45 @@ EXT_SO = EXTDIR + "linkparser_ext.#{CONFIG['DLEXT']}"
|
|
11
13
|
#####################################################################
|
12
14
|
|
13
15
|
# Make both the default task and the spec task depend on building the extension
|
14
|
-
task :local => :
|
15
|
-
task :spec => :
|
16
|
+
task :local => :compile
|
17
|
+
task :spec => :compile
|
16
18
|
namespace :spec do
|
17
|
-
task :doc => [ :
|
18
|
-
task :quiet => [ :
|
19
|
-
task :html => [ :
|
20
|
-
task :text => [ :
|
19
|
+
task :doc => [ :compile ]
|
20
|
+
task :quiet => [ :compile ]
|
21
|
+
task :html => [ :compile ]
|
22
|
+
task :text => [ :compile ]
|
21
23
|
end
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
Rake::ExtensionTask.new( 'linkparser_ext', GEMSPEC ) do |ext|
|
26
|
+
ext.ext_dir = 'ext'
|
27
|
+
ext.lib_dir = 'ext'
|
28
|
+
ext.source_pattern = "*.{c,h}"
|
29
|
+
ext.cross_compile = true
|
30
|
+
ext.cross_platform = 'i386-mswin32'
|
29
31
|
end
|
30
|
-
CLOBBER.include( EXTDIR + 'mkmf.log', EXT_SO )
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
sh 'make'
|
36
|
-
end
|
33
|
+
task :debug do
|
34
|
+
$DEBUG = true
|
35
|
+
ENV['DEBUG'] = '1'
|
37
36
|
end
|
38
37
|
|
38
|
+
# Make both the default task and the spec task depend on building the extension
|
39
|
+
namespace :spec do
|
39
40
|
|
40
|
-
desc "
|
41
|
-
task :
|
41
|
+
desc "Run specs under gdb"
|
42
|
+
task :gdb => [ :compile ] do |task|
|
43
|
+
require 'tempfile'
|
42
44
|
|
45
|
+
cmd_parts = ['run']
|
46
|
+
cmd_parts << '-Ilib:ext'
|
47
|
+
cmd_parts << '/usr/bin/spec'
|
48
|
+
cmd_parts += SPEC_FILES.collect { |fn| %["#{fn}"] }
|
49
|
+
cmd_parts += COMMON_SPEC_OPTS + ['-f', 's', '-c']
|
43
50
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
sh 'make clean'
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
+
script = Tempfile.new( 'spec-gdbscript' )
|
52
|
+
script.puts( cmd_parts.join(' ') )
|
53
|
+
script.flush
|
51
54
|
|
52
|
-
|
53
|
-
if EXT_MAKEFILE.exist?
|
54
|
-
in_subdirectory( EXTDIR ) do
|
55
|
-
sh 'make distclean'
|
56
|
-
end
|
55
|
+
run 'gdb', '-x', script.path, RUBY
|
57
56
|
end
|
58
|
-
end
|
59
|
-
CLOBBER.include( EXT_MAKEFILE )
|
60
|
-
|
61
|
-
task :debug do
|
62
|
-
log "Setting $DEBUG to true"
|
63
|
-
$DEBUG = true
|
64
57
|
end
|
65
|
-
|
data/ext/dictionary.c
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* dict.c - Ruby LinkParser - Dictionary Class
|
3
|
-
* $Id: dictionary.c
|
3
|
+
* $Id: dictionary.c,v 53ec62029ee4 2010/10/12 15:45:26 ged $
|
4
4
|
*
|
5
5
|
* Authors:
|
6
6
|
* * Michael Granger <ged@FaerieMUD.org>
|
@@ -16,19 +16,45 @@
|
|
16
16
|
* Memory management functions
|
17
17
|
* -------------------------------------------------- */
|
18
18
|
|
19
|
+
|
20
|
+
/*
|
21
|
+
* Allocation function
|
22
|
+
*/
|
23
|
+
static struct rlink_dictionary *
|
24
|
+
rlink_dictionary_alloc() {
|
25
|
+
struct rlink_dictionary *ptr = ALLOC( struct rlink_dictionary );
|
26
|
+
|
27
|
+
ptr->dict = NULL;
|
28
|
+
|
29
|
+
debugMsg(( "Initialized an rlink_dictionary <%p>", ptr ));
|
30
|
+
return ptr;
|
31
|
+
}
|
32
|
+
|
33
|
+
|
19
34
|
/*
|
20
35
|
* Free function
|
21
36
|
*/
|
22
37
|
static void
|
23
|
-
rlink_dict_gc_free(
|
24
|
-
if (
|
38
|
+
rlink_dict_gc_free( struct rlink_dictionary *ptr ) {
|
39
|
+
if ( ptr ) {
|
40
|
+
debugMsg(( "Freeing Dictionary <%p>", ptr ));
|
41
|
+
if ( ptr->dict )
|
42
|
+
dictionary_delete( ptr->dict );
|
43
|
+
|
44
|
+
ptr->dict = NULL;
|
45
|
+
|
46
|
+
xfree( ptr );
|
47
|
+
ptr = NULL;
|
48
|
+
} else {
|
49
|
+
debugMsg(( "Not freeing already freed Dictionary." ));
|
50
|
+
}
|
25
51
|
}
|
26
52
|
|
27
53
|
|
28
54
|
/*
|
29
55
|
* Object validity checker. Returns the data pointer.
|
30
56
|
*/
|
31
|
-
static
|
57
|
+
static struct rlink_dictionary *
|
32
58
|
check_dict( VALUE self ) {
|
33
59
|
Check_Type( self, T_DATA );
|
34
60
|
|
@@ -36,7 +62,7 @@ check_dict( VALUE self ) {
|
|
36
62
|
rb_raise( rb_eTypeError, "wrong argument type %s (expected LinkParser::Dictionary)",
|
37
63
|
rb_class2name(CLASS_OF( self )) );
|
38
64
|
}
|
39
|
-
|
65
|
+
|
40
66
|
return DATA_PTR( self );
|
41
67
|
}
|
42
68
|
|
@@ -44,21 +70,21 @@ check_dict( VALUE self ) {
|
|
44
70
|
/*
|
45
71
|
* Fetch the data pointer and check it for sanity.
|
46
72
|
*/
|
47
|
-
static
|
73
|
+
static struct rlink_dictionary *
|
48
74
|
get_dict( VALUE self ) {
|
49
|
-
|
75
|
+
struct rlink_dictionary *ptr = check_dict( self );
|
50
76
|
|
51
|
-
if ( !
|
77
|
+
if ( !ptr )
|
52
78
|
rb_raise( rb_eRuntimeError, "uninitialized Dictionary" );
|
53
79
|
|
54
|
-
return
|
80
|
+
return ptr;
|
55
81
|
}
|
56
82
|
|
57
83
|
|
58
84
|
/*
|
59
85
|
* Get the Dictionary behind the LinkParser::Dictionary +object+ specified.
|
60
|
-
*/
|
61
|
-
|
86
|
+
*/
|
87
|
+
struct rlink_dictionary *
|
62
88
|
rlink_get_dict( VALUE obj ) {
|
63
89
|
return get_dict( obj );
|
64
90
|
}
|
@@ -93,35 +119,67 @@ rlink_make_oldstyle_dict( VALUE dict_file, VALUE pp_file, VALUE cons_file, VALUE
|
|
93
119
|
SafeStringValue( pp_file );
|
94
120
|
SafeStringValue( cons_file );
|
95
121
|
SafeStringValue( affix_file );
|
96
|
-
|
122
|
+
|
97
123
|
return dictionary_create(
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
124
|
+
StringValuePtr(dict_file ),
|
125
|
+
StringValuePtr(pp_file ),
|
126
|
+
StringValuePtr(cons_file ),
|
127
|
+
StringValuePtr(affix_file)
|
102
128
|
);
|
103
129
|
}
|
104
130
|
|
105
131
|
|
106
132
|
/*
|
107
133
|
* call-seq:
|
108
|
-
*
|
109
|
-
*
|
110
|
-
*
|
134
|
+
* LinkParser::Dictionary.new( *args ) -> dict
|
135
|
+
*
|
136
|
+
* Create a new LinkParser::Dictionary.
|
137
|
+
*
|
138
|
+
* The preferred way to set up the dictionary is to call it with no
|
139
|
+
* arguments, which will look for a dictionary with the same language
|
140
|
+
* as the current environment. Alternatively, a fixed language can be
|
141
|
+
* specified by specifying an ISO639 language code, for example,
|
142
|
+
* <tt>LinkParser::Dictionary.new( :en )</tt>.
|
111
143
|
*
|
112
|
-
*
|
113
|
-
*
|
144
|
+
* Explicit dictionary file names can be also specified, like so:
|
145
|
+
*
|
146
|
+
* Dictionary.new( dict_file,
|
147
|
+
* post_process_file,
|
148
|
+
* constituent_knowledge_file,
|
149
|
+
* affix_file )
|
150
|
+
*
|
151
|
+
* This mode of dictionary construction is not recommended for new
|
152
|
+
* development, and is intended for advanced users only. To create the
|
153
|
+
* dictionary, the Dictionary looks in the current directory and the data
|
154
|
+
* directory for the files +dict_file+, +post_process_file+,
|
155
|
+
* +constituent_knowledge_file+, and +affix_file+. The last three entries
|
156
|
+
* may be omitted. If +dict_file+ is a fully specified path name, then
|
157
|
+
* the other file names, which need not be fully specified, will be
|
158
|
+
* prefixed by the directory specified by +dict_file+.
|
159
|
+
*
|
160
|
+
* In any case, a Hash of options can be specified which will be used
|
161
|
+
* as default ParseOption attributes for any sentences created from
|
162
|
+
* it.
|
114
163
|
*
|
164
|
+
* Examples:
|
165
|
+
* dict = LinkParser::Dictionary.new
|
166
|
+
*
|
167
|
+
* dict = LinkParser::Dictionary.new( :de )
|
168
|
+
*
|
169
|
+
* dict = LinkParser::Dictionary.new( '/var/data/custom_dicts/4.2.dict' )
|
170
|
+
*
|
171
|
+
*
|
115
172
|
*/
|
116
173
|
static VALUE
|
117
174
|
rlink_dict_initialize( int argc, VALUE *argv, VALUE self ) {
|
118
175
|
if ( !check_dict(self) ) {
|
119
176
|
int i = 0;
|
177
|
+
struct rlink_dictionary *ptr = NULL;
|
120
178
|
Dictionary dict = NULL;
|
121
179
|
VALUE arg1, arg2, arg3, arg4, arg5 = Qnil;
|
122
180
|
VALUE lang = Qnil;
|
123
181
|
VALUE opthash = Qnil;
|
124
|
-
|
182
|
+
|
125
183
|
switch( i = rb_scan_args(argc, argv, "05", &arg1, &arg2, &arg3, &arg4, &arg5) ) {
|
126
184
|
/* Dictionary.new */
|
127
185
|
case 0:
|
@@ -155,10 +213,10 @@ rlink_dict_initialize( int argc, VALUE *argv, VALUE self ) {
|
|
155
213
|
dict = rlink_make_oldstyle_dict( arg1, arg2, arg3, arg4 );
|
156
214
|
opthash = arg5;
|
157
215
|
break;
|
158
|
-
|
159
|
-
/* Anything else is an error */
|
216
|
+
|
217
|
+
/* Anything else is an error */
|
160
218
|
default:
|
161
|
-
rb_raise( rb_eArgError,
|
219
|
+
rb_raise( rb_eArgError,
|
162
220
|
"wrong number of arguments (%d for 0,1,2,4, or 5)", i );
|
163
221
|
}
|
164
222
|
|
@@ -166,17 +224,20 @@ rlink_dict_initialize( int argc, VALUE *argv, VALUE self ) {
|
|
166
224
|
if ( !dict && i < 4 ) {
|
167
225
|
if ( RTEST(lang) ) {
|
168
226
|
SafeStringValue( lang );
|
169
|
-
dict = dictionary_create_lang(
|
227
|
+
dict = dictionary_create_lang( StringValuePtr(lang) );
|
170
228
|
} else {
|
171
229
|
dict = dictionary_create_default_lang();
|
172
230
|
}
|
173
231
|
}
|
174
|
-
|
232
|
+
|
175
233
|
/* If the dictionary still isn't created, there was an error
|
176
234
|
creating it */
|
177
235
|
if ( !dict ) rlink_raise_lp_error();
|
178
236
|
|
179
|
-
|
237
|
+
debugMsg(( "Created dictionary %p", dict ));
|
238
|
+
DATA_PTR( self ) = ptr = rlink_dictionary_alloc();
|
239
|
+
|
240
|
+
ptr->dict = dict;
|
180
241
|
|
181
242
|
/* If they passed in an options hash, save it for later. */
|
182
243
|
if ( RTEST(opthash) ) rb_iv_set( self, "@options", opthash );
|
@@ -199,13 +260,14 @@ rlink_dict_initialize( int argc, VALUE *argv, VALUE self ) {
|
|
199
260
|
* connector in the dictionary. This is useful for designing a parsing
|
200
261
|
* algorithm that progresses in stages, first trying the cheap connectors.
|
201
262
|
*/
|
202
|
-
static VALUE
|
263
|
+
static VALUE
|
203
264
|
rlink_get_max_cost( VALUE self ) {
|
204
|
-
|
205
|
-
|
206
|
-
|
265
|
+
struct rlink_dictionary *ptr = get_dict( self );
|
266
|
+
|
267
|
+
int cost = dictionary_get_max_cost( ptr->dict );
|
268
|
+
|
207
269
|
debugMsg(( "Max cost is: %d", cost ));
|
208
|
-
|
270
|
+
|
209
271
|
return INT2NUM( cost );
|
210
272
|
}
|
211
273
|
|
@@ -219,7 +281,7 @@ rlink_get_max_cost( VALUE self ) {
|
|
219
281
|
* LinkParser::Sentence. If you specify an +options+ hash, its values will override
|
220
282
|
* those of the Dictionary's for the resulting Sentence.
|
221
283
|
*/
|
222
|
-
static VALUE
|
284
|
+
static VALUE
|
223
285
|
rlink_parse( int argc, VALUE *argv, VALUE self ) {
|
224
286
|
VALUE input_string, options, sentence;
|
225
287
|
VALUE args[2];
|
@@ -231,13 +293,13 @@ rlink_parse( int argc, VALUE *argv, VALUE self ) {
|
|
231
293
|
args[0] = input_string;
|
232
294
|
args[1] = self;
|
233
295
|
sentence = rb_class_new_instance( 2, args, rlink_cSentence );
|
234
|
-
|
296
|
+
|
235
297
|
/* Now call #parse on it */
|
236
298
|
if ( i == 1 )
|
237
299
|
rb_funcall( sentence, rb_intern("parse"), 0, 0 );
|
238
300
|
else
|
239
301
|
rb_funcall( sentence, rb_intern("parse"), 1, options );
|
240
|
-
|
302
|
+
|
241
303
|
return sentence;
|
242
304
|
}
|
243
305
|
|
@@ -254,9 +316,13 @@ rlink_parse( int argc, VALUE *argv, VALUE self ) {
|
|
254
316
|
*/
|
255
317
|
void
|
256
318
|
rlink_init_dict() {
|
319
|
+
#ifdef FOR_RDOC
|
320
|
+
rlink_mLinkParser = rb_define_module( "LinkParser" );
|
321
|
+
#endif
|
322
|
+
|
257
323
|
rlink_cDictionary = rb_define_class_under( rlink_mLinkParser, "Dictionary",
|
258
324
|
rb_cObject );
|
259
|
-
|
325
|
+
|
260
326
|
rb_define_alloc_func( rlink_cDictionary, rlink_dict_s_alloc );
|
261
327
|
rb_define_method( rlink_cDictionary, "initialize", rlink_dict_initialize, -1 );
|
262
328
|
|
data/ext/extconf.rb
CHANGED
@@ -2,54 +2,101 @@
|
|
2
2
|
|
3
3
|
require 'mkmf'
|
4
4
|
|
5
|
-
|
6
|
-
/
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
5
|
+
if lgdir = with_config( 'link-grammar' )
|
6
|
+
ENV['PATH'] = "#{lgdir}/bin" + File::PATH_SEPARATOR + ENV['PATH']
|
7
|
+
end
|
8
|
+
|
9
|
+
### Read the output of a command using the fork+pipe syntax so execution errors
|
10
|
+
### propagate to Ruby.
|
11
|
+
def read_cmd_output( *cmd )
|
12
|
+
output = IO.read( '|-' ) or exec( *cmd )
|
13
|
+
return output.chomp
|
14
|
+
end
|
15
|
+
|
16
|
+
pkgconfig = with_config( 'pkg-config' ) || 'pkg-config'
|
17
|
+
pkgconfig = find_executable( pkgconfig ) or
|
18
|
+
fail "Couldn't find your pkg-config binary"
|
19
|
+
|
20
|
+
$LDFLAGS << read_cmd_output( pkgconfig, '--libs-only-L', 'link-grammar' )
|
21
|
+
$CFLAGS << read_cmd_output( pkgconfig, '--cflags', 'link-grammar' )
|
22
|
+
|
23
|
+
# Sort out the universal vs. single-archicture build problems on MacOS X
|
24
|
+
if RUBY_PLATFORM.include?( 'darwin' )
|
25
|
+
puts "MacOS X build: fixing architecture flags:"
|
26
|
+
|
27
|
+
# Only keep the '-arch <a>' flags present in both the cflags reported
|
28
|
+
# by pkg-config and those that Ruby specifies.
|
29
|
+
commonflags = nil
|
30
|
+
if ENV['ARCHFLAGS']
|
31
|
+
puts " using the value in ARCHFLAGS environment variable (%p)." % [ ENV['ARCHFLAGS'] ]
|
32
|
+
commonflags = ENV['ARCHFLAGS']
|
33
|
+
elsif pkgconfig
|
34
|
+
puts " finding flags common to both Ruby and link-grammar..."
|
35
|
+
archflags = []
|
36
|
+
pkgcflags = read_cmd_output( pkgconfig, '--cflags', 'link-grammar' )
|
37
|
+
pkgcflags.scan( /-arch\s+(\S+)/ ).each do |arch|
|
38
|
+
puts " testing for architecture: %p" % [ arch ]
|
39
|
+
archflags << "-arch #{arch}" if Config::CONFIG['CFLAGS'].index("-arch #{arch}")
|
40
|
+
end
|
41
|
+
|
42
|
+
commonflags = archflags.join(' ')
|
43
|
+
puts " common arch flags: %s" % [ commonflags ]
|
44
|
+
else
|
45
|
+
$stderr.puts %{
|
46
|
+
=========== WARNING ===========
|
47
|
+
|
48
|
+
You are building this extension on OS X without setting the
|
49
|
+
ARCHFLAGS environment variable, and pkg-config wasn't found in
|
50
|
+
your PATH. If you are seeing this message, that means that the
|
51
|
+
build will probably fail.
|
52
|
+
|
53
|
+
If it does, you can correct this by either including the path
|
54
|
+
to 'pkg-config' in your PATH or setting the environment variable
|
55
|
+
ARCHFLAGS to '-arch <arch>' before building.
|
56
|
+
|
57
|
+
For example:
|
58
|
+
(in bash) $ export PATH=/opt/local/bin:$PATH
|
59
|
+
$ export ARCHFLAGS='-arch x86_64'
|
60
|
+
(in tcsh) % set path = ( /opt/local/bin $PATH )
|
61
|
+
% setenv ARCHFLAGS '-arch x86_64'
|
62
|
+
|
63
|
+
Then try building again.
|
64
|
+
|
65
|
+
===================================
|
66
|
+
}.gsub( /^\t+/, ' ' )
|
67
|
+
end
|
68
|
+
|
69
|
+
if commonflags
|
70
|
+
$CFLAGS.gsub!( /-arch\s+\S+ /, '' )
|
71
|
+
$LDFLAGS.gsub!( /-arch\s+\S+ /, '' )
|
72
|
+
CONFIG['LDSHARED'].gsub!( /-arch\s+\S+ /, '' )
|
73
|
+
|
74
|
+
$CFLAGS << ' ' << commonflags
|
75
|
+
$LDFLAGS << ' ' << commonflags
|
76
|
+
CONFIG['LDSHARED'] << ' ' << commonflags
|
77
|
+
end
|
21
78
|
end
|
22
79
|
|
23
80
|
|
24
81
|
dir_config( 'link-grammar' )
|
25
82
|
|
26
83
|
|
27
|
-
find_library( "link-grammar", "dictionary_create"
|
84
|
+
find_library( "link-grammar", "dictionary_create" ) or
|
28
85
|
fail( "Could not find Link-Grammar library",
|
29
86
|
"(http://www.abisource.com/projects/link-grammar/#download)." )
|
30
|
-
find_header( "link-grammar/link-includes.h"
|
87
|
+
find_header( "link-grammar/link-includes.h" ) or
|
31
88
|
fail( "Could not find link-includes.h" )
|
32
89
|
|
33
|
-
unless have_func( "
|
90
|
+
unless have_func( "linkage_is_fat", 'link-grammar/link-includes.h' )
|
34
91
|
message "Your link-grammar library is too old for this binding.\n",
|
35
92
|
"Please upgrade to the latest version posted here:\n",
|
36
93
|
" http://www.abisource.com/projects/link-grammar/#download\n",
|
37
94
|
"and try again.\n"
|
38
|
-
fail "No
|
39
|
-
end
|
40
|
-
|
41
|
-
unless have_func( "linkage_get_current_sublinkage" )
|
42
|
-
message "Link grammar library is unpatched. Building anyways.\n"
|
43
|
-
message " LinkParser::Linkage#current_sublinkage will not work,\n"
|
44
|
-
message " but everything else will work okay.\n"
|
45
|
-
end
|
46
|
-
|
47
|
-
unless have_func( "linkgrammar_get_version" )
|
48
|
-
message "You are building with an older, unsupported version of the link-grammar\n"
|
49
|
-
message " library. If you encounter problems, please update it to 4.4.0 or later.\n"
|
50
|
-
message "Trying to build anyway.\n"
|
95
|
+
fail "No linkage_is_fat() in the installed link-grammar."
|
51
96
|
end
|
52
97
|
|
53
98
|
have_func( 'parse_options_get_spell_guess' )
|
99
|
+
have_func( 'linkage_get_disjunct_str' )
|
54
100
|
|
55
101
|
create_makefile( 'linkparser_ext' )
|
102
|
+
|