nokogiri 1.11.0.rc4 → 1.11.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/LICENSE-DEPENDENCIES.md +12 -12
  4. data/LICENSE.md +1 -1
  5. data/README.md +168 -91
  6. data/ext/nokogiri/depend +34 -474
  7. data/ext/nokogiri/extconf.rb +270 -183
  8. data/ext/nokogiri/html_document.c +10 -15
  9. data/ext/nokogiri/html_element_description.c +84 -71
  10. data/ext/nokogiri/html_entity_lookup.c +21 -16
  11. data/ext/nokogiri/html_sax_parser_context.c +67 -64
  12. data/ext/nokogiri/html_sax_push_parser.c +42 -34
  13. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  14. data/ext/nokogiri/nokogiri.c +171 -60
  15. data/ext/nokogiri/nokogiri.h +158 -75
  16. data/ext/nokogiri/test_global_handlers.c +40 -0
  17. data/ext/nokogiri/xml_attr.c +15 -15
  18. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  19. data/ext/nokogiri/xml_cdata.c +13 -18
  20. data/ext/nokogiri/xml_comment.c +19 -26
  21. data/ext/nokogiri/xml_document.c +246 -188
  22. data/ext/nokogiri/xml_document_fragment.c +13 -15
  23. data/ext/nokogiri/xml_dtd.c +54 -48
  24. data/ext/nokogiri/xml_element_content.c +30 -27
  25. data/ext/nokogiri/xml_element_decl.c +22 -22
  26. data/ext/nokogiri/xml_encoding_handler.c +17 -11
  27. data/ext/nokogiri/xml_entity_decl.c +32 -30
  28. data/ext/nokogiri/xml_entity_reference.c +16 -18
  29. data/ext/nokogiri/xml_namespace.c +56 -49
  30. data/ext/nokogiri/xml_node.c +371 -320
  31. data/ext/nokogiri/xml_node_set.c +168 -156
  32. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  33. data/ext/nokogiri/xml_reader.c +191 -157
  34. data/ext/nokogiri/xml_relax_ng.c +29 -23
  35. data/ext/nokogiri/xml_sax_parser.c +117 -112
  36. data/ext/nokogiri/xml_sax_parser_context.c +101 -84
  37. data/ext/nokogiri/xml_sax_push_parser.c +36 -27
  38. data/ext/nokogiri/xml_schema.c +48 -42
  39. data/ext/nokogiri/xml_syntax_error.c +42 -21
  40. data/ext/nokogiri/xml_text.c +13 -17
  41. data/ext/nokogiri/xml_xpath_context.c +134 -127
  42. data/ext/nokogiri/xslt_stylesheet.c +157 -157
  43. data/lib/nokogiri/css/parser.rb +1 -1
  44. data/lib/nokogiri/extension.rb +26 -0
  45. data/lib/nokogiri/html/document_fragment.rb +15 -15
  46. data/lib/nokogiri/version/constant.rb +1 -1
  47. data/lib/nokogiri/version/info.rb +31 -8
  48. data/lib/nokogiri/xml/document.rb +74 -28
  49. data/lib/nokogiri/xml/node.rb +39 -42
  50. data/lib/nokogiri/xml/reader.rb +2 -9
  51. data/lib/nokogiri/xml/xpath/syntax_error.rb +1 -1
  52. data/lib/nokogiri/xml/xpath.rb +1 -3
  53. data/lib/nokogiri.rb +2 -6
  54. data/patches/libxml2/0009-avoid-isnan-isinf.patch +81 -0
  55. data/patches/libxml2/0010-parser.c-shrink-the-input-buffer-when-appropriate.patch +70 -0
  56. data/patches/libxml2/0011-update-automake-files-for-arm64.patch +2511 -0
  57. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2511 -0
  58. metadata +66 -160
  59. data/ext/nokogiri/html_document.h +0 -10
  60. data/ext/nokogiri/html_element_description.h +0 -10
  61. data/ext/nokogiri/html_entity_lookup.h +0 -8
  62. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  63. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  64. data/ext/nokogiri/xml_attr.h +0 -9
  65. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  66. data/ext/nokogiri/xml_cdata.h +0 -9
  67. data/ext/nokogiri/xml_comment.h +0 -9
  68. data/ext/nokogiri/xml_document.h +0 -23
  69. data/ext/nokogiri/xml_document_fragment.h +0 -10
  70. data/ext/nokogiri/xml_dtd.h +0 -10
  71. data/ext/nokogiri/xml_element_content.h +0 -10
  72. data/ext/nokogiri/xml_element_decl.h +0 -9
  73. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  74. data/ext/nokogiri/xml_entity_decl.h +0 -10
  75. data/ext/nokogiri/xml_entity_reference.h +0 -9
  76. data/ext/nokogiri/xml_io.c +0 -63
  77. data/ext/nokogiri/xml_io.h +0 -11
  78. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  79. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  80. data/ext/nokogiri/xml_namespace.h +0 -14
  81. data/ext/nokogiri/xml_node.h +0 -13
  82. data/ext/nokogiri/xml_node_set.h +0 -12
  83. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  84. data/ext/nokogiri/xml_reader.h +0 -10
  85. data/ext/nokogiri/xml_relax_ng.h +0 -9
  86. data/ext/nokogiri/xml_sax_parser.h +0 -39
  87. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  88. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  89. data/ext/nokogiri/xml_schema.h +0 -9
  90. data/ext/nokogiri/xml_syntax_error.h +0 -13
  91. data/ext/nokogiri/xml_text.h +0 -9
  92. data/ext/nokogiri/xml_xpath_context.h +0 -10
  93. data/ext/nokogiri/xslt_stylesheet.h +0 -14
@@ -1,4 +1,4 @@
1
- # :stopdoc:
1
+ # frozen_string_literal: true
2
2
  ENV['RC_ARCHS'] = '' if RUBY_PLATFORM =~ /darwin/
3
3
 
4
4
  require "mkmf"
@@ -7,9 +7,7 @@ require "fileutils"
7
7
  require "shellwords"
8
8
  require "pathname"
9
9
 
10
- #
11
- # helpful constants
12
- #
10
+ # helpful constants
13
11
  PACKAGE_ROOT_DIR = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
14
12
  REQUIRED_LIBXML_VERSION = "2.6.21"
15
13
  RECOMMENDED_LIBXML_VERSION = "2.9.3"
@@ -28,64 +26,109 @@ NOKOGIRI_HELP_MESSAGE = <<~HELP
28
26
  Flags that are always valid:
29
27
 
30
28
  --use-system-libraries
31
- Use system libraries instead of building and using the packaged libraries
29
+ --enable-system-libraries
30
+ Use system libraries instead of building and using the packaged libraries.
31
+
32
+ --disable-system-libraries
33
+ Use the packaged libraries, and ignore the system libraries. This is the default on most
34
+ platforms, and overrides `--use-system-libraries` and the environment variable
35
+ `NOKOGIRI_USE_SYSTEM_LIBRARIES`.
32
36
 
33
37
  --disable-clean
34
- Do not clean out intermediate files after successful build
38
+ Do not clean out intermediate files after successful build.
39
+
40
+ --prevent-strip
41
+ Take steps to prevent stripping the symbol table and debugging info from the shared
42
+ library, potentially overriding RbConfig's CFLAGS/LDFLAGS/DLDFLAGS.
35
43
 
36
44
 
37
45
  Flags only used when using system libraries:
38
46
 
39
- --with-opt-dir=DIRECTORY
40
- Look for headers and libraries in DIRECTORY
47
+ General:
48
+
49
+ --with-opt-dir=DIRECTORY
50
+ Look for headers and libraries in DIRECTORY.
51
+
52
+ --with-opt-lib=DIRECTORY
53
+ Look for libraries in DIRECTORY.
54
+
55
+ --with-opt-include=DIRECTORY
56
+ Look for headers in DIRECTORY.
57
+
58
+
59
+ Related to zlib:
60
+
61
+ --with-zlib-dir=DIRECTORY
62
+ Look for zlib headers and library in DIRECTORY.
63
+
64
+ --with-zlib-lib=DIRECTORY
65
+ Look for zlib library in DIRECTORY.
66
+
67
+ --with-zlib-include=DIRECTORY
68
+ Look for zlib headers in DIRECTORY.
69
+
70
+
71
+ Related to iconv:
72
+
73
+ --with-iconv-dir=DIRECTORY
74
+ Look for iconv headers and library in DIRECTORY.
75
+
76
+ --with-iconv-lib=DIRECTORY
77
+ Look for iconv library in DIRECTORY.
41
78
 
42
- --with-zlib-dir=DIR
43
- Look for zlib header and library in DIRECTORY
79
+ --with-iconv-include=DIRECTORY
80
+ Look for iconv headers in DIRECTORY.
44
81
 
45
- --with-iconv-dir=DIRECTORY
46
- Look for iconv header and library in DIRECTORY
47
82
 
48
- --with-xml2-dir=DIRECTORY
49
- Look for xml2 headers and library in DIRECTORY
83
+ Related to libxml2:
50
84
 
51
- --with-xml2-lib=DIRECTORY
52
- Look for xml2 library in DIRECTORY
85
+ --with-xml2-dir=DIRECTORY
86
+ Look for xml2 headers and library in DIRECTORY.
53
87
 
54
- --with-xslt-include=DIRECTORY
55
- Look for xslt headers in DIRECTORY
88
+ --with-xml2-lib=DIRECTORY
89
+ Look for xml2 library in DIRECTORY.
56
90
 
57
- --with-xslt-dir=DIRECTORY
58
- Look for xslt headers and library in DIRECTORY
91
+ --with-xml2-include=DIRECTORY
92
+ Look for xml2 headers in DIRECTORY.
59
93
 
60
- --with-xslt-lib=DIRECTORY
61
- Look for xslt library in DIRECTORY
62
94
 
63
- --with-xslt-include=DIRECTORY
64
- Look for xslt headers in DIRECTORY
95
+ Related to libxslt:
65
96
 
66
- --with-exslt-dir=DIRECTORY
67
- Look for exslt headers and library in DIRECTORY
97
+ --with-xslt-dir=DIRECTORY
98
+ Look for xslt headers and library in DIRECTORY.
68
99
 
69
- --with-exslt-lib=DIRECTORY
70
- Look for exslt library in DIRECTORY
100
+ --with-xslt-lib=DIRECTORY
101
+ Look for xslt library in DIRECTORY.
71
102
 
72
- --with-exslt-include=DIRECTORY
73
- Look for exslt headers in DIRECTORY
103
+ --with-xslt-include=DIRECTORY
104
+ Look for xslt headers in DIRECTORY.
105
+
106
+
107
+ Related to libexslt:
108
+
109
+ --with-exslt-dir=DIRECTORY
110
+ Look for exslt headers and library in DIRECTORY.
111
+
112
+ --with-exslt-lib=DIRECTORY
113
+ Look for exslt library in DIRECTORY.
114
+
115
+ --with-exslt-include=DIRECTORY
116
+ Look for exslt headers in DIRECTORY.
74
117
 
75
118
 
76
119
  Flags only used when building and using the packaged libraries:
77
120
 
78
121
  --disable-static
79
- Do not statically link packaged libraries, instead use shared libraries
122
+ Do not statically link packaged libraries, instead use shared libraries.
80
123
 
81
124
  --enable-cross-build
82
125
  Enable cross-build mode. (You probably do not want to set this manually.)
83
126
 
127
+
84
128
  Environment variables used:
85
129
 
86
130
  NOKOGIRI_USE_SYSTEM_LIBRARIES
87
- When set, even if nil or blank, use system libraries instead of building and using the
88
- packaged libraries. Equivalent to `--use-system-libraries`.
131
+ Equivalent to `--enable-system-libraries` when set, even if nil or blank.
89
132
 
90
133
  CC
91
134
  Use this path to invoke the compiler instead of `RbConfig::CONFIG['CC']`
@@ -106,6 +149,25 @@ HELP
106
149
  #
107
150
  # utility functions
108
151
  #
152
+ def config_clean?
153
+ enable_config('clean', true)
154
+ end
155
+
156
+ def config_static?
157
+ default_static = !truffle?
158
+ enable_config("static", default_static)
159
+ end
160
+
161
+ def config_cross_build?
162
+ enable_config("cross-build")
163
+ end
164
+
165
+ def config_system_libraries?
166
+ enable_config("system-libraries", ENV.key?("NOKOGIRI_USE_SYSTEM_LIBRARIES")) do |_, default|
167
+ arg_config('--use-system-libraries', default)
168
+ end
169
+ end
170
+
109
171
  def windows?
110
172
  RbConfig::CONFIG['target_os'] =~ /mingw32|mswin/
111
173
  end
@@ -127,15 +189,19 @@ def aix?
127
189
  end
128
190
 
129
191
  def nix?
130
- ! (windows? || solaris? || darwin?)
192
+ !(windows? || solaris? || darwin?)
131
193
  end
132
194
 
133
- def concat_flags *args
195
+ def truffle?
196
+ ::RUBY_ENGINE == 'truffleruby'
197
+ end
198
+
199
+ def concat_flags(*args)
134
200
  args.compact.join(" ")
135
201
  end
136
202
 
137
- def local_have_library(lib, func=nil, headers=nil)
138
- have_library(lib, func, headers) or have_library("lib#{lib}", func, headers)
203
+ def local_have_library(lib, func = nil, headers = nil)
204
+ have_library(lib, func, headers) || have_library("lib#{lib}", func, headers)
139
205
  end
140
206
 
141
207
  LOCAL_PACKAGE_RESPONSE = Object.new
@@ -145,7 +211,7 @@ end
145
211
 
146
212
  # wrapper around MakeMakefil#pkg_config and the PKGConfig gem
147
213
  def try_package_configuration(pc)
148
- if !ENV.key?("NOKOGIRI_TEST_PKG_CONFIG_GEM")
214
+ unless ENV.key?("NOKOGIRI_TEST_PKG_CONFIG_GEM")
149
215
  # try MakeMakefile#pkg_config, which uses the system utility `pkg-config`.
150
216
  return if checking_for("#{pc} using `pkg_config`", LOCAL_PACKAGE_RESPONSE) do
151
217
  pkg_config(pc)
@@ -157,7 +223,7 @@ def try_package_configuration(pc)
157
223
  # same logic as MakeMakefile#pkg_config
158
224
  begin
159
225
  require 'rubygems'
160
- gem 'pkg-config', REQUIRED_PKG_CONFIG_VERSION
226
+ gem('pkg-config', REQUIRED_PKG_CONFIG_VERSION)
161
227
  require 'pkg-config'
162
228
 
163
229
  checking_for("#{pc} using pkg-config gem version #{PKGConfig::VERSION}", LOCAL_PACKAGE_RESPONSE) do
@@ -166,14 +232,14 @@ def try_package_configuration(pc)
166
232
  ldflags = PKGConfig.libs_only_L(pc)
167
233
  libs = PKGConfig.libs_only_l(pc)
168
234
 
169
- Logging::message "pkg-config gem found package configuration for %s\n", pc
170
- Logging::message "cflags: %s\nldflags: %s\nlibs: %s\n\n", cflags, ldflags, libs
235
+ Logging.message("pkg-config gem found package configuration for %s\n", pc)
236
+ Logging.message("cflags: %s\nldflags: %s\nlibs: %s\n\n", cflags, ldflags, libs)
171
237
 
172
238
  [cflags, ldflags, libs]
173
239
  end
174
240
  end
175
241
  rescue LoadError
176
- message "Please install either the `pkg-config` utility or the `pkg-config` rubygem.\n"
242
+ message("Please install either the `pkg-config` utility or the `pkg-config` rubygem.\n")
177
243
  end
178
244
  end
179
245
 
@@ -185,7 +251,7 @@ def have_package_configuration(opt: nil, pc: nil, lib:, func:, headers:)
185
251
  end
186
252
 
187
253
  # see if we have enough path info to do this without trying any harder
188
- if !ENV.key?("NOKOGIRI_TEST_PKG_CONFIG")
254
+ unless ENV.key?("NOKOGIRI_TEST_PKG_CONFIG")
189
255
  return true if local_have_library(lib, func, headers)
190
256
  end
191
257
 
@@ -196,12 +262,12 @@ def have_package_configuration(opt: nil, pc: nil, lib:, func:, headers:)
196
262
  end
197
263
 
198
264
  def ensure_package_configuration(opt: nil, pc: nil, lib:, func:, headers:)
199
- have_package_configuration(opt: opt, pc: pc, lib: lib, func: func, headers: headers) or
265
+ have_package_configuration(opt: opt, pc: pc, lib: lib, func: func, headers: headers) ||
200
266
  abort_could_not_find_library(lib)
201
267
  end
202
268
 
203
- def ensure_func(func, headers=nil)
204
- have_func(func, headers) or abort_could_not_find_library(lib)
269
+ def ensure_func(func, headers = nil)
270
+ have_func(func, headers) || abort_could_not_find_library(func)
205
271
  end
206
272
 
207
273
  def preserving_globals
@@ -212,7 +278,7 @@ ensure
212
278
  end
213
279
 
214
280
  def abort_could_not_find_library(lib)
215
- abort "-----\n#{caller[0]}\n#{lib} is missing. Please locate mkmf.log to investigate how it is failing.\n-----"
281
+ abort("-----\n#{caller[0]}\n#{lib} is missing. Please locate mkmf.log to investigate how it is failing.\n-----")
216
282
  end
217
283
 
218
284
  def chdir_for_build
@@ -225,7 +291,7 @@ def chdir_for_build
225
291
  end
226
292
  end
227
293
 
228
- def sh_export_path path
294
+ def sh_export_path(path)
229
295
  # because libxslt 1.1.29 configure.in uses AC_PATH_TOOL which treats ":"
230
296
  # as a $PATH separator, we need to convert windows paths from
231
297
  #
@@ -237,7 +303,7 @@ def sh_export_path path
237
303
  #
238
304
  # which is sh-compatible, in order to find things properly during
239
305
  # configuration
240
- return path if !windows?
306
+ return path unless windows?
241
307
 
242
308
  match = Regexp.new("^([A-Z]):(/.*)").match(path)
243
309
  if match && match.length == 3
@@ -250,31 +316,26 @@ end
250
316
  def libflag_to_filename(ldflag)
251
317
  case ldflag
252
318
  when /\A-l(.+)/
253
- "lib#{$1}.#{$LIBEXT}"
319
+ "lib#{Regexp.last_match(1)}.#{$LIBEXT}"
254
320
  end
255
321
  end
256
322
 
257
- def using_system_libraries?
258
- # NOTE: TruffleRuby uses this env var as it does not support using static libraries yet.
259
- arg_config('--use-system-libraries', ENV.key?("NOKOGIRI_USE_SYSTEM_LIBRARIES"))
260
- end
261
-
262
- def have_libxml_headers?(version=nil)
323
+ def have_libxml_headers?(version = nil)
263
324
  source = if version.nil?
264
- <<~SRC
265
- #include <libxml/xmlversion.h>
266
- SRC
267
- else
268
- version_int = sprintf "%d%2.2d%2.2d", *(version.split("."))
269
- <<~SRC
270
- #include <libxml/xmlversion.h>
271
- #if LIBXML_VERSION < #{version_int}
272
- # error libxml2 is older than #{version}
273
- #endif
274
- SRC
275
- end
276
-
277
- try_cpp source
325
+ <<~SRC
326
+ #include <libxml/xmlversion.h>
327
+ SRC
328
+ else
329
+ version_int = format("%d%2.2d%2.2d", *version.split("."))
330
+ <<~SRC
331
+ #include <libxml/xmlversion.h>
332
+ #if LIBXML_VERSION < #{version_int}
333
+ # error libxml2 is older than #{version}
334
+ #endif
335
+ SRC
336
+ end
337
+
338
+ try_cpp(source)
278
339
  end
279
340
 
280
341
  def try_link_iconv(using = nil)
@@ -302,19 +363,18 @@ def iconv_configure_flags
302
363
  # give --with-iconv-dir and --with-opt-dir first priority
303
364
  ["iconv", "opt"].each do |target|
304
365
  config = preserving_globals { dir_config(target) }
305
- if config.any? && try_link_iconv("--with-#{target}-* flags") { dir_config(target) }
306
- idirs, ldirs = config.map do |dirs|
307
- Array(dirs).flat_map do |dir|
308
- dir.split(File::PATH_SEPARATOR)
309
- end if dirs
310
- end
311
-
312
- return [
313
- '--with-iconv=yes',
314
- *("CPPFLAGS=#{idirs.map { |dir| '-I' + dir }.join(' ')}" if idirs),
315
- *("LDFLAGS=#{ldirs.map { |dir| '-L' + dir }.join(' ')}" if ldirs),
316
- ]
366
+ next unless config.any? && try_link_iconv("--with-#{target}-* flags") { dir_config(target) }
367
+ idirs, ldirs = config.map do |dirs|
368
+ Array(dirs).flat_map do |dir|
369
+ dir.split(File::PATH_SEPARATOR)
370
+ end if dirs
317
371
  end
372
+
373
+ return [
374
+ '--with-iconv=yes',
375
+ *("CPPFLAGS=#{idirs.map { |dir| '-I' + dir }.join(' ')}" if idirs),
376
+ *("LDFLAGS=#{ldirs.map { |dir| '-L' + dir }.join(' ')}" if ldirs),
377
+ ]
318
378
  end
319
379
 
320
380
  if try_link_iconv
@@ -333,14 +393,14 @@ def iconv_configure_flags
333
393
  ]
334
394
  end
335
395
 
336
- abort_could_not_find_library "libiconv"
396
+ abort_could_not_find_library("libiconv")
337
397
  end
338
398
 
339
399
  def process_recipe(name, version, static_p, cross_p)
340
400
  require 'rubygems'
341
- gem 'mini_portile2', REQUIRED_MINI_PORTILE_VERSION
401
+ gem('mini_portile2', REQUIRED_MINI_PORTILE_VERSION)
342
402
  require 'mini_portile2'
343
- message "Using mini_portile version #{MiniPortile::VERSION}\n"
403
+ message("Using mini_portile version #{MiniPortile::VERSION}\n")
344
404
 
345
405
  if name != "libxml2" && name != "libxslt"
346
406
  OTHER_LIBRARY_VERSIONS[name] = version
@@ -352,12 +412,12 @@ def process_recipe(name, version, static_p, cross_p)
352
412
  # correct compiler prefix for cross build, but use host if not set.
353
413
  recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"]
354
414
  recipe.patch_files = Dir[File.join(PACKAGE_ROOT_DIR, "patches", name, "*.patch")].sort
355
- recipe.configure_options << "--libdir=#{File.join(recipe.path, "lib")}"
415
+ recipe.configure_options << "--libdir=#{File.join(recipe.path, 'lib')}"
356
416
 
357
417
  yield recipe
358
418
 
359
419
  env = Hash.new do |hash, key|
360
- hash[key] = "#{ENV[key]}" # (ENV[key].dup rescue '')
420
+ hash[key] = (ENV[key]).to_s
361
421
  end
362
422
 
363
423
  recipe.configure_options.flatten!
@@ -365,10 +425,10 @@ def process_recipe(name, version, static_p, cross_p)
365
425
  recipe.configure_options.delete_if do |option|
366
426
  case option
367
427
  when /\A(\w+)=(.*)\z/
368
- if env.key?($1)
369
- env[$1] = concat_flags(env[$1], $2)
428
+ env[Regexp.last_match(1)] = if env.key?(Regexp.last_match(1))
429
+ concat_flags(env[Regexp.last_match(1)], Regexp.last_match(2))
370
430
  else
371
- env[$1] = $2
431
+ Regexp.last_match(2)
372
432
  end
373
433
  true
374
434
  else
@@ -410,34 +470,34 @@ def process_recipe(name, version, static_p, cross_p)
410
470
 
411
471
  checkpoint = "#{recipe.target}/#{recipe.name}-#{recipe.version}-#{recipe.host}.installed"
412
472
  if File.exist?(checkpoint)
413
- message "Building Nokogiri with a packaged version of #{name}-#{version}.\n"
473
+ message("Building Nokogiri with a packaged version of #{name}-#{version}.\n")
414
474
  else
415
- message <<~EOM
475
+ message(<<~EOM)
416
476
  ---------- IMPORTANT NOTICE ----------
417
477
  Building Nokogiri with a packaged version of #{name}-#{version}.
418
478
  Configuration options: #{recipe.configure_options.shelljoin}
419
479
  EOM
420
480
 
421
481
  unless recipe.patch_files.empty?
422
- message "The following patches are being applied:\n"
482
+ message("The following patches are being applied:\n")
423
483
 
424
484
  recipe.patch_files.each do |patch|
425
- message " - %s\n" % File.basename(patch)
485
+ message(" - %s\n" % File.basename(patch))
426
486
  end
427
487
  end
428
488
 
429
- message <<~EOM
489
+ message(<<~EOM)
430
490
 
431
491
  The Nokogiri maintainers intend to provide timely security updates, but if
432
492
  this is a concern for you and want to use your OS/distro system library
433
493
  instead, then abort this installation process and install nokogiri as
434
494
  instructed at:
435
495
 
436
- https://nokogiri.org/tutorials/installing_nokogiri.html#install-with-system-libraries
496
+ https://nokogiri.org/tutorials/installing_nokogiri.html#installing-using-standard-system-libraries
437
497
 
438
498
  EOM
439
499
 
440
- message <<~EOM if name == 'libxml2'
500
+ message(<<~EOM) if name == 'libxml2'
441
501
  Note, however, that nokogiri cannot guarantee compatiblity with every
442
502
  version of libxml2 that may be provided by OS/package vendors.
443
503
 
@@ -446,7 +506,7 @@ def process_recipe(name, version, static_p, cross_p)
446
506
  chdir_for_build do
447
507
  recipe.cook
448
508
  end
449
- FileUtils.touch checkpoint
509
+ FileUtils.touch(checkpoint)
450
510
  end
451
511
  recipe.activate
452
512
  end
@@ -461,8 +521,8 @@ def copy_packaged_libraries_headers(to_path:, from_recipes:)
461
521
  end
462
522
 
463
523
  def do_help
464
- print NOKOGIRI_HELP_MESSAGE
465
- exit! 0
524
+ print(NOKOGIRI_HELP_MESSAGE)
525
+ exit!(0)
466
526
  end
467
527
 
468
528
  def do_clean
@@ -471,7 +531,7 @@ def do_clean
471
531
 
472
532
  # Skip if this is a development work tree
473
533
  unless (root + '.git').exist?
474
- message "Cleaning files only used during build.\n"
534
+ message("Cleaning files only used during build.\n")
475
535
 
476
536
  # (root + 'tmp') cannot be removed at this stage because
477
537
  # nokogiri.so is yet to be copied to lib.
@@ -481,7 +541,7 @@ def do_clean
481
541
  FileUtils.rm_rf(dir, verbose: true)
482
542
  end
483
543
 
484
- if enable_config('static')
544
+ if config_static?
485
545
  # ports installation can be safely removed if statically linked.
486
546
  FileUtils.rm_rf(root + 'ports', verbose: true)
487
547
  else
@@ -489,7 +549,7 @@ def do_clean
489
549
  end
490
550
  end
491
551
 
492
- exit! 0
552
+ exit!(0)
493
553
  end
494
554
 
495
555
  #
@@ -498,10 +558,10 @@ end
498
558
  do_help if arg_config('--help')
499
559
  do_clean if arg_config('--clean')
500
560
 
501
- if openbsd? && !using_system_libraries?
502
- if `#{ENV['CC'] || '/usr/bin/cc'} -v 2>&1` !~ /clang/
503
- ENV['CC'] ||= find_executable('egcc') or
504
- abort "Please install gcc 4.9+ from ports using `pkg_add -v gcc`"
561
+ if openbsd? && !config_system_libraries?
562
+ if %x(#{ENV['CC'] || '/usr/bin/cc'} -v 2>&1) !~ /clang/
563
+ (ENV['CC'] ||= find_executable('egcc')) ||
564
+ abort("Please install gcc 4.9+ from ports using `pkg_add -v gcc`")
505
565
  end
506
566
  append_cppflags "-I/usr/local/include"
507
567
  end
@@ -513,21 +573,42 @@ end
513
573
  # use same c compiler for libxml and libxslt
514
574
  ENV['CC'] = RbConfig::CONFIG['CC']
515
575
 
576
+ if arg_config('--prevent-strip')
577
+ old_cflags = $CFLAGS.split.join(" ")
578
+ old_ldflags = $LDFLAGS.split.join(" ")
579
+ old_dldflags = $DLDFLAGS.split.join(" ")
580
+ $CFLAGS = $CFLAGS.split.reject { |flag| flag == "-s" }.join(" ")
581
+ $LDFLAGS = $LDFLAGS.split.reject { |flag| flag == "-s" }.join(" ")
582
+ $DLDFLAGS = $DLDFLAGS.split.reject { |flag| flag == "-s" }.join(" ")
583
+ puts "Prevent stripping by removing '-s' from $CFLAGS" if old_cflags != $CFLAGS
584
+ puts "Prevent stripping by removing '-s' from $LDFLAGS" if old_ldflags != $LDFLAGS
585
+ puts "Prevent stripping by removing '-s' from $DLDFLAGS" if old_dldflags != $DLDFLAGS
586
+ end
587
+
516
588
  # adopt environment config
517
- append_cflags(ENV["CFLAGS"].split(/\s+/)) if !ENV["CFLAGS"].nil?
518
- append_cppflags(ENV["CPPFLAGS"].split(/\s+/)) if !ENV["CPPFLAGS"].nil?
519
- append_ldflags(ENV["LDFLAGS"].split(/\s+/)) if !ENV["LDFLAGS"].nil?
589
+ append_cflags(ENV["CFLAGS"].split) unless ENV["CFLAGS"].nil?
590
+ append_cppflags(ENV["CPPFLAGS"].split) unless ENV["CPPFLAGS"].nil?
591
+ append_ldflags(ENV["LDFLAGS"].split) unless ENV["LDFLAGS"].nil?
520
592
  $LIBS = concat_flags($LIBS, ENV["LIBS"])
521
593
 
522
- append_cflags("-g") # always include debugging information
523
- append_cflags("-Winline") # we use at least one inline function in the C extension
524
- append_cflags("-Wmissing-noreturn") # good to have no matter what Ruby was compiled with
594
+ # always include debugging information
595
+ append_cflags("-g")
596
+
597
+ # we use at least one inline function in the C extension
598
+ append_cflags("-Winline")
599
+
600
+ # good to have no matter what Ruby was compiled with
601
+ append_cflags("-Wmissing-noreturn")
602
+
603
+ # handle clang variations, see #1101
525
604
  append_cflags("-Wno-error=unused-command-line-argument-hard-error-in-future") if darwin?
526
- # append_cflags(["-Wcast-qual", "-Wwrite-strings"]) # these tend to be noisy, but on occasion useful during development
605
+
606
+ # these tend to be noisy, but on occasion useful during development
607
+ # append_cflags(["-Wcast-qual", "-Wwrite-strings"])
527
608
 
528
609
  # Add SDK-specific include path for macOS and brew versions before v2.2.12 (2020-04-08) [#1851, #1801]
529
610
  macos_mojave_sdk_include_path = "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/libxml2"
530
- if using_system_libraries? && darwin? && Dir.exist?(macos_mojave_sdk_include_path)
611
+ if config_system_libraries? && darwin? && Dir.exist?(macos_mojave_sdk_include_path)
531
612
  append_cppflags("-I#{macos_mojave_sdk_include_path}")
532
613
  end
533
614
 
@@ -535,26 +616,30 @@ end
535
616
  # See https://sourceforge.net/p/mingw/bugs/2142
536
617
  append_cppflags(' "-Idummypath"') if windows?
537
618
 
538
- if using_system_libraries?
619
+ if config_system_libraries?
539
620
  message "Building nokogiri using system libraries.\n"
540
- ensure_package_configuration(opt: "zlib", pc: "zlib", lib: "z", headers: "zlib.h", func: "gzdopen")
541
- ensure_package_configuration(opt: "xml2", pc: "libxml-2.0", lib: "xml2", headers: "libxml/parser.h", func: "xmlParseDoc")
542
- ensure_package_configuration(opt: "xslt", pc: "libxslt", lib: "xslt", headers: "libxslt/xslt.h", func: "xsltParseStylesheetDoc")
543
- ensure_package_configuration(opt: "exslt", pc: "libexslt", lib: "exslt", headers: "libexslt/exslt.h", func: "exsltFuncRegister")
544
-
545
- have_libxml_headers?(REQUIRED_LIBXML_VERSION) or
546
- abort "ERROR: libxml2 version #{REQUIRED_LIBXML_VERSION} or later is required!"
547
- have_libxml_headers?(RECOMMENDED_LIBXML_VERSION) or
548
- warn "WARNING: libxml2 version #{RECOMMENDED_LIBXML_VERSION} or later is highly recommended, but proceeding anyway."
621
+ ensure_package_configuration(opt: "zlib", pc: "zlib", lib: "z",
622
+ headers: "zlib.h", func: "gzdopen")
623
+ ensure_package_configuration(opt: "xml2", pc: "libxml-2.0", lib: "xml2",
624
+ headers: "libxml/parser.h", func: "xmlParseDoc")
625
+ ensure_package_configuration(opt: "xslt", pc: "libxslt", lib: "xslt",
626
+ headers: "libxslt/xslt.h", func: "xsltParseStylesheetDoc")
627
+ ensure_package_configuration(opt: "exslt", pc: "libexslt", lib: "exslt",
628
+ headers: "libexslt/exslt.h", func: "exsltFuncRegister")
629
+
630
+ have_libxml_headers?(REQUIRED_LIBXML_VERSION) ||
631
+ abort("ERROR: libxml2 version #{REQUIRED_LIBXML_VERSION} or later is required!")
632
+ have_libxml_headers?(RECOMMENDED_LIBXML_VERSION) ||
633
+ warn("WARNING: libxml2 version #{RECOMMENDED_LIBXML_VERSION} or later is highly recommended, but proceeding anyway.")
549
634
 
550
635
  else
551
636
  message "Building nokogiri using packaged libraries.\n"
552
637
 
553
- static_p = enable_config("static", true)
554
- message "Static linking is #{static_p ? "enabled" : "disabled"}.\n"
638
+ static_p = config_static?
639
+ message "Static linking is #{static_p ? 'enabled' : 'disabled'}.\n"
555
640
 
556
- cross_build_p = enable_config("cross-build")
557
- message "Cross build is #{cross_build_p ? "enabled" : "disabled"}.\n"
641
+ cross_build_p = config_cross_build?
642
+ message "Cross build is #{cross_build_p ? 'enabled' : 'disabled'}.\n"
558
643
 
559
644
  require 'yaml'
560
645
  dependencies = YAML.load_file(File.join(PACKAGE_ROOT_DIR, "dependencies.yml"))
@@ -564,17 +649,17 @@ else
564
649
  if cross_build_p || windows?
565
650
  zlib_recipe = process_recipe("zlib", dependencies["zlib"]["version"], static_p, cross_build_p) do |recipe|
566
651
  recipe.files = [{
567
- url: "http://zlib.net/fossils/#{recipe.name}-#{recipe.version}.tar.gz",
568
- sha256: dependencies["zlib"]["sha256"]
569
- }]
652
+ url: "http://zlib.net/fossils/#{recipe.name}-#{recipe.version}.tar.gz",
653
+ sha256: dependencies["zlib"]["sha256"],
654
+ }]
570
655
  if windows?
571
656
  class << recipe
572
657
  attr_accessor :cross_build_p
573
658
 
574
659
  def configure
575
- Dir.chdir work_path do
576
- mk = File.read 'win32/Makefile.gcc'
577
- File.open 'win32/Makefile.gcc', 'wb' do |f|
660
+ Dir.chdir(work_path) do
661
+ mk = File.read('win32/Makefile.gcc')
662
+ File.open('win32/Makefile.gcc', 'wb') do |f|
578
663
  f.puts "BINARY_PATH = #{path}/bin"
579
664
  f.puts "LIBRARY_PATH = #{path}/lib"
580
665
  f.puts "INCLUDE_PATH = #{path}/include"
@@ -585,17 +670,17 @@ else
585
670
  end
586
671
 
587
672
  def configured?
588
- Dir.chdir work_path do
589
- !! (File.read('win32/Makefile.gcc') =~ /^BINARY_PATH/)
673
+ Dir.chdir(work_path) do
674
+ !!(File.read('win32/Makefile.gcc') =~ /^BINARY_PATH/)
590
675
  end
591
676
  end
592
677
 
593
678
  def compile
594
- execute "compile", "make -f win32/Makefile.gcc"
679
+ execute("compile", "make -f win32/Makefile.gcc")
595
680
  end
596
681
 
597
682
  def install
598
- execute "install", "make -f win32/Makefile.gcc install"
683
+ execute("install", "make -f win32/Makefile.gcc install")
599
684
  end
600
685
  end
601
686
  recipe.cross_build_p = cross_build_p
@@ -603,12 +688,13 @@ else
603
688
  class << recipe
604
689
  def configure
605
690
  cflags = concat_flags(ENV["CFLAGS"], "-fPIC", "-g")
606
- execute "configure", ["env", "CHOST=#{host}", "CFLAGS=#{cflags}", "./configure", "--static", configure_prefix]
691
+ execute("configure",
692
+ ["env", "CHOST=#{host}", "CFLAGS=#{cflags}", "./configure", "--static", configure_prefix])
607
693
  end
608
694
 
609
695
  def compile
610
- if host=~/darwin/
611
- execute "compile", "make AR=#{host}-libtool"
696
+ if host =~ /darwin/
697
+ execute("compile", "make AR=#{host}-libtool")
612
698
  else
613
699
  super
614
700
  end
@@ -618,11 +704,12 @@ else
618
704
  end
619
705
 
620
706
  unless nix?
621
- libiconv_recipe = process_recipe("libiconv", dependencies["libiconv"]["version"], static_p, cross_build_p) do |recipe|
707
+ libiconv_recipe = process_recipe("libiconv", dependencies["libiconv"]["version"], static_p,
708
+ cross_build_p) do |recipe|
622
709
  recipe.files = [{
623
- url: "http://ftp.gnu.org/pub/gnu/libiconv/#{recipe.name}-#{recipe.version}.tar.gz",
624
- sha256: dependencies["libiconv"]["sha256"]
625
- }]
710
+ url: "http://ftp.gnu.org/pub/gnu/libiconv/#{recipe.name}-#{recipe.version}.tar.gz",
711
+ sha256: dependencies["libiconv"]["sha256"],
712
+ }]
626
713
 
627
714
  cflags = concat_flags(ENV["CFLAGS"], "-O2", "-U_FORTIFY_SOURCE", "-g")
628
715
 
@@ -630,37 +717,35 @@ else
630
717
  "CPPFLAGS=-Wall",
631
718
  "CFLAGS=#{cflags}",
632
719
  "CXXFLAGS=#{cflags}",
633
- "LDFLAGS="
720
+ "LDFLAGS=",
634
721
  ]
635
722
  end
636
723
  end
637
- else
638
- if darwin? && !have_header('iconv.h')
639
- abort <<~EOM.chomp
640
- -----
641
- The file "iconv.h" is missing in your build environment,
642
- which means you haven't installed Xcode Command Line Tools properly.
643
-
644
- To install Command Line Tools, try running `xcode-select --install` on
645
- terminal and follow the instructions. If it fails, open Xcode.app,
646
- select from the menu "Xcode" - "Open Developer Tool" - "More Developer
647
- Tools" to open the developer site, download the installer for your OS
648
- version and run it.
649
- -----
724
+ elsif darwin? && !have_header('iconv.h')
725
+ abort(<<~EOM.chomp)
726
+ -----
727
+ The file "iconv.h" is missing in your build environment,
728
+ which means you haven't installed Xcode Command Line Tools properly.
729
+
730
+ To install Command Line Tools, try running `xcode-select --install` on
731
+ terminal and follow the instructions. If it fails, open Xcode.app,
732
+ select from the menu "Xcode" - "Open Developer Tool" - "More Developer
733
+ Tools" to open the developer site, download the installer for your OS
734
+ version and run it.
735
+ -----
650
736
  EOM
651
- end
652
737
  end
653
738
 
654
739
  unless windows?
655
- preserving_globals { local_have_library('z', 'gzdopen', 'zlib.h') } or
656
- abort 'zlib is missing; necessary for building libxml2'
740
+ preserving_globals { local_have_library('z', 'gzdopen', 'zlib.h') } ||
741
+ abort('zlib is missing; necessary for building libxml2')
657
742
  end
658
743
 
659
744
  libxml2_recipe = process_recipe("libxml2", dependencies["libxml2"]["version"], static_p, cross_build_p) do |recipe|
660
745
  recipe.files = [{
661
- url: "http://xmlsoft.org/sources/#{recipe.name}-#{recipe.version}.tar.gz",
662
- sha256: dependencies["libxml2"]["sha256"]
663
- }]
746
+ url: "http://xmlsoft.org/sources/#{recipe.name}-#{recipe.version}.tar.gz",
747
+ sha256: dependencies["libxml2"]["sha256"],
748
+ }]
664
749
 
665
750
  cflags = concat_flags(ENV["CFLAGS"], "-O2", "-U_FORTIFY_SOURCE", "-g")
666
751
 
@@ -679,6 +764,10 @@ else
679
764
  recipe.configure_options += ["RANLIB=/usr/bin/ranlib", "AR=/usr/bin/ar"]
680
765
  end
681
766
 
767
+ if windows?
768
+ cflags = concat_flags(cflags, "-ULIBXML_STATIC", "-DIN_LIBXML")
769
+ end
770
+
682
771
  recipe.configure_options += [
683
772
  "--without-python",
684
773
  "--without-readline",
@@ -691,9 +780,9 @@ else
691
780
 
692
781
  libxslt_recipe = process_recipe("libxslt", dependencies["libxslt"]["version"], static_p, cross_build_p) do |recipe|
693
782
  recipe.files = [{
694
- url: "http://xmlsoft.org/sources/#{recipe.name}-#{recipe.version}.tar.gz",
695
- sha256: dependencies["libxslt"]["sha256"]
696
- }]
783
+ url: "http://xmlsoft.org/sources/#{recipe.name}-#{recipe.version}.tar.gz",
784
+ sha256: dependencies["libxslt"]["sha256"],
785
+ }]
697
786
 
698
787
  cflags = concat_flags(ENV["CFLAGS"], "-O2", "-U_FORTIFY_SOURCE", "-g")
699
788
 
@@ -721,15 +810,15 @@ else
721
810
  libname = recipe.name[/\Alib(.+)\z/, 1]
722
811
  File.join(recipe.path, "bin", "#{libname}-config").tap do |config|
723
812
  # call config scripts explicit with 'sh' for compat with Windows
724
- $CPPFLAGS = `sh #{config} --cflags`.strip << ' ' << $CPPFLAGS
725
- `sh #{config} --libs`.strip.shellsplit.each do |arg|
813
+ $CPPFLAGS = %x(sh #{config} --cflags).strip << ' ' << $CPPFLAGS
814
+ %x(sh #{config} --libs).strip.shellsplit.each do |arg|
726
815
  case arg
727
816
  when /\A-L(.+)\z/
728
817
  # Prioritize ports' directories
729
- if $1.start_with?(PACKAGE_ROOT_DIR + '/')
730
- $LIBPATH = [$1] | $LIBPATH
818
+ $LIBPATH = if Regexp.last_match(1).start_with?(PACKAGE_ROOT_DIR + '/')
819
+ [Regexp.last_match(1)] | $LIBPATH
731
820
  else
732
- $LIBPATH = $LIBPATH | [$1]
821
+ $LIBPATH | [Regexp.last_match(1)]
733
822
  end
734
823
  when /\A-l./
735
824
  libs.unshift(arg)
@@ -740,7 +829,7 @@ else
740
829
  end
741
830
 
742
831
  patches_string = recipe.patch_files.map { |path| File.basename(path) }.join(' ')
743
- append_cppflags(%Q[-DNOKOGIRI_#{recipe.name.upcase}_PATCHES="\\\"#{patches_string}\\\""])
832
+ append_cppflags(%[-DNOKOGIRI_#{recipe.name.upcase}_PATCHES="\\\"#{patches_string}\\\""])
744
833
 
745
834
  case libname
746
835
  when 'xml2'
@@ -776,7 +865,7 @@ else
776
865
  ensure_func("exsltFuncRegister", "libexslt/exslt.h")
777
866
  end
778
867
 
779
- have_func('xmlHasFeature') or abort("xmlHasFeature() is missing.") # introduced in libxml 2.6.21
868
+ have_func('xmlHasFeature') || abort("xmlHasFeature() is missing.") # introduced in libxml 2.6.21
780
869
  have_func('xmlFirstElementChild') # introduced in libxml 2.7.3
781
870
  have_func('xmlRelaxNGSetParserStructuredErrors') # introduced in libxml 2.6.24
782
871
  have_func('xmlRelaxNGSetValidStructuredErrors') # introduced in libxml 2.6.21
@@ -785,10 +874,10 @@ have_func('xmlSchemaSetParserStructuredErrors') # introduced in libxml 2.6.23
785
874
 
786
875
  have_func('vasprintf')
787
876
 
788
- other_library_versions_string = OTHER_LIBRARY_VERSIONS.map { |k,v| [k,v].join(":") }.join(",")
789
- append_cppflags(%Q[-DNOKOGIRI_OTHER_LIBRARY_VERSIONS="\\\"#{other_library_versions_string}\\\""])
877
+ other_library_versions_string = OTHER_LIBRARY_VERSIONS.map { |k, v| [k, v].join(":") }.join(",")
878
+ append_cppflags(%[-DNOKOGIRI_OTHER_LIBRARY_VERSIONS="\\\"#{other_library_versions_string}\\\""])
790
879
 
791
- unless using_system_libraries?
880
+ unless config_system_libraries?
792
881
  if cross_build_p
793
882
  # When precompiling native gems, copy packaged libraries' headers to ext/nokogiri/include
794
883
  # These are packaged up by the cross-compiling callback in the ExtensionTask
@@ -804,10 +893,10 @@ end
804
893
 
805
894
  create_makefile('nokogiri/nokogiri')
806
895
 
807
- if enable_config('clean', true)
896
+ if config_clean?
808
897
  # Do not clean if run in a development work tree.
809
898
  File.open('Makefile', 'at') do |mk|
810
- mk.print <<~EOF
899
+ mk.print(<<~EOF)
811
900
 
812
901
  all: clean-ports
813
902
  clean-ports: $(DLLIB)
@@ -815,5 +904,3 @@ if enable_config('clean', true)
815
904
  EOF
816
905
  end
817
906
  end
818
-
819
- # :startdoc: