nokogiri 1.16.8 → 1.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +11 -21
  3. data/README.md +4 -0
  4. data/dependencies.yml +6 -6
  5. data/ext/nokogiri/extconf.rb +191 -137
  6. data/ext/nokogiri/gumbo.c +69 -53
  7. data/ext/nokogiri/html4_document.c +10 -4
  8. data/ext/nokogiri/html4_element_description.c +18 -18
  9. data/ext/nokogiri/html4_sax_parser.c +40 -0
  10. data/ext/nokogiri/html4_sax_parser_context.c +48 -58
  11. data/ext/nokogiri/html4_sax_push_parser.c +25 -24
  12. data/ext/nokogiri/libxml2_polyfill.c +114 -0
  13. data/ext/nokogiri/nokogiri.c +9 -2
  14. data/ext/nokogiri/nokogiri.h +18 -33
  15. data/ext/nokogiri/xml_attr.c +1 -1
  16. data/ext/nokogiri/xml_cdata.c +2 -10
  17. data/ext/nokogiri/xml_comment.c +3 -8
  18. data/ext/nokogiri/xml_document.c +163 -156
  19. data/ext/nokogiri/xml_document_fragment.c +10 -25
  20. data/ext/nokogiri/xml_dtd.c +1 -1
  21. data/ext/nokogiri/xml_element_content.c +9 -9
  22. data/ext/nokogiri/xml_encoding_handler.c +4 -4
  23. data/ext/nokogiri/xml_namespace.c +6 -6
  24. data/ext/nokogiri/xml_node.c +130 -104
  25. data/ext/nokogiri/xml_node_set.c +46 -44
  26. data/ext/nokogiri/xml_reader.c +54 -58
  27. data/ext/nokogiri/xml_relax_ng.c +35 -56
  28. data/ext/nokogiri/xml_sax_parser.c +156 -88
  29. data/ext/nokogiri/xml_sax_parser_context.c +213 -131
  30. data/ext/nokogiri/xml_sax_push_parser.c +68 -49
  31. data/ext/nokogiri/xml_schema.c +50 -85
  32. data/ext/nokogiri/xml_syntax_error.c +19 -11
  33. data/ext/nokogiri/xml_text.c +2 -4
  34. data/ext/nokogiri/xml_xpath_context.c +2 -2
  35. data/ext/nokogiri/xslt_stylesheet.c +8 -8
  36. data/gumbo-parser/src/error.c +76 -48
  37. data/gumbo-parser/src/error.h +5 -1
  38. data/gumbo-parser/src/nokogiri_gumbo.h +11 -2
  39. data/gumbo-parser/src/parser.c +61 -23
  40. data/gumbo-parser/src/tokenizer.c +6 -6
  41. data/lib/nokogiri/class_resolver.rb +1 -1
  42. data/lib/nokogiri/css/node.rb +6 -2
  43. data/lib/nokogiri/css/parser.rb +6 -4
  44. data/lib/nokogiri/css/parser.y +2 -2
  45. data/lib/nokogiri/css/parser_extras.rb +6 -66
  46. data/lib/nokogiri/css/selector_cache.rb +38 -0
  47. data/lib/nokogiri/css/tokenizer.rb +4 -4
  48. data/lib/nokogiri/css/tokenizer.rex +9 -8
  49. data/lib/nokogiri/css/xpath_visitor.rb +42 -6
  50. data/lib/nokogiri/css.rb +86 -20
  51. data/lib/nokogiri/decorators/slop.rb +3 -5
  52. data/lib/nokogiri/encoding_handler.rb +2 -2
  53. data/lib/nokogiri/html4/document.rb +44 -23
  54. data/lib/nokogiri/html4/document_fragment.rb +124 -12
  55. data/lib/nokogiri/html4/encoding_reader.rb +1 -1
  56. data/lib/nokogiri/html4/sax/parser.rb +23 -38
  57. data/lib/nokogiri/html4/sax/parser_context.rb +4 -9
  58. data/lib/nokogiri/html4.rb +9 -14
  59. data/lib/nokogiri/html5/builder.rb +40 -0
  60. data/lib/nokogiri/html5/document.rb +61 -30
  61. data/lib/nokogiri/html5/document_fragment.rb +130 -20
  62. data/lib/nokogiri/html5/node.rb +4 -4
  63. data/lib/nokogiri/html5.rb +114 -72
  64. data/lib/nokogiri/version/constant.rb +1 -1
  65. data/lib/nokogiri/xml/builder.rb +8 -1
  66. data/lib/nokogiri/xml/document.rb +70 -26
  67. data/lib/nokogiri/xml/document_fragment.rb +84 -13
  68. data/lib/nokogiri/xml/node.rb +82 -11
  69. data/lib/nokogiri/xml/node_set.rb +9 -7
  70. data/lib/nokogiri/xml/parse_options.rb +1 -1
  71. data/lib/nokogiri/xml/pp/node.rb +6 -1
  72. data/lib/nokogiri/xml/reader.rb +46 -13
  73. data/lib/nokogiri/xml/relax_ng.rb +57 -20
  74. data/lib/nokogiri/xml/sax/document.rb +174 -83
  75. data/lib/nokogiri/xml/sax/parser.rb +115 -41
  76. data/lib/nokogiri/xml/sax/parser_context.rb +116 -8
  77. data/lib/nokogiri/xml/sax/push_parser.rb +3 -0
  78. data/lib/nokogiri/xml/sax.rb +48 -0
  79. data/lib/nokogiri/xml/schema.rb +112 -45
  80. data/lib/nokogiri/xml/searchable.rb +6 -8
  81. data/lib/nokogiri/xml/syntax_error.rb +22 -0
  82. data/lib/nokogiri/xml.rb +13 -24
  83. data/lib/nokogiri/xslt.rb +3 -9
  84. data/lib/xsd/xmlparser/nokogiri.rb +3 -4
  85. data/ports/archives/libxml2-2.13.5.tar.xz +0 -0
  86. data/ports/archives/libxslt-1.1.42.tar.xz +0 -0
  87. metadata +11 -8
  88. data/ext/nokogiri/libxml2_backwards_compat.c +0 -121
  89. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +0 -25
  90. data/ports/archives/libxml2-2.12.9.tar.xz +0 -0
  91. data/ports/archives/libxslt-1.1.39.tar.xz +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eff0523bd350c2cd114bdd93486cd25f266ae4adc064571a108d1926776d6144
4
- data.tar.gz: 7b9ecfc54d5f1ecc8e2b843bd17b404f8c2e5577749dde52678e0c9c1350f3b6
3
+ metadata.gz: e080457d5bfcbaaecd8541a803633978c161abc627935322b7e6dfdf93701fbb
4
+ data.tar.gz: c02d17bed58fdc05d34f230d9ff02dba1e4a738e605408b11786ffaadb89df03
5
5
  SHA512:
6
- metadata.gz: 11d6a2558416abb116410ac6b06015954287b593acdaa2c3cc2bc9daf2105d3bf197d380cce08978afc4102552450c5f7a1a9c85e41ad4307fb430cc56942dcc
7
- data.tar.gz: 3b78a83da090e5f28d300a56c5f057a6e8b29bc3a0eadd95b55d80b228c5c68cd455c4534ef1adc14a2cdc0f3ad0271e461344efe7cca1a63c3d5713eb8038fe
6
+ metadata.gz: 93b4c5abc366ed92ecda3023211bcf74cc13897a443d69fd84f11ce9c1fb9400950aa216edb21925ef8a1377c447291d4c159c21157cb5a5c3307da5074098bc
7
+ data.tar.gz: 944288d73f54fa630624de281c3534bdd1b22ecca58f0a1c03aa79dbd90b23a6f2732855d5f8e2df8e4d4cb74b7fd8192c6d3ae11eed7eacf4415f4d3f734640
data/Gemfile CHANGED
@@ -5,44 +5,34 @@ source "https://rubygems.org"
5
5
  gemspec
6
6
 
7
7
  group :development do
8
- # ruby 3.4.0-dev removed some gems from the default set
9
- #
10
- # TODO: we should be able to remove these as our gem dependencies sort it out and we pull them in
11
- # transitively.
12
- gem "mutex_m"
13
-
14
8
  # bootstrapping
15
9
  gem "bundler", "~> 2.3"
16
- gem "rake", "13.1.0"
10
+ gem "rake", "13.2.1"
17
11
 
18
12
  # building extensions
19
- gem "rake-compiler", "1.2.6"
20
- gem "rake-compiler-dock", "1.4.0"
13
+ gem "rake-compiler", "1.2.8"
14
+ gem "rake-compiler-dock", "1.5.2"
21
15
 
22
16
  # parser generator
23
- gem "rexical", "= 1.0.7"
17
+ gem "rexical", "1.0.8"
24
18
 
25
19
  # tests
26
- gem "minitest", "5.21.2"
20
+ gem "minitest", "5.25.2"
27
21
  gem "minitest-parallel_fork", "2.0.0"
28
- gem "ruby_memcheck", "2.3.0"
22
+ gem "ruby_memcheck", "3.0.0"
29
23
  gem "rubyzip", "~> 2.3.2"
30
24
  gem "simplecov", "= 0.21.2"
31
25
 
32
26
  # rubocop
33
- if Gem::Requirement.new("~> 3.0").satisfied_by?(Gem::Version.new(RUBY_VERSION))
34
- gem "rubocop", "1.60.2"
35
- gem "rubocop-minitest", "0.34.5"
36
- gem "rubocop-packaging", "0.5.2"
37
- gem "rubocop-performance", "1.20.2"
38
- gem "rubocop-rake", "= 0.6.0"
39
- gem "rubocop-shopify", "2.14.0"
40
- end
27
+ gem "standard", "1.42.1"
28
+ gem "rubocop-minitest", "0.36.0"
29
+ gem "rubocop-packaging", "0.5.2"
30
+ gem "rubocop-rake", "0.6.0"
41
31
  end
42
32
 
43
33
  # If Psych doesn't build, you can disable this group locally by running
44
34
  # `bundle config set --local without rdoc`
45
35
  # Then re-run `bundle install`.
46
36
  group :rdoc do
47
- gem "rdoc", "6.6.2"
37
+ gem "rdoc", "6.8.1"
48
38
  end
data/README.md CHANGED
@@ -117,6 +117,10 @@ Requirements:
117
117
  - Ruby >= 3.0
118
118
  - JRuby >= 9.4.0.0
119
119
 
120
+ If you are compiling the native extension against a system version of libxml2:
121
+
122
+ - libxml2 >= 2.9.2 (recommended >= 2.12.0)
123
+
120
124
 
121
125
  ### Native Gems: Faster, more reliable installation
122
126
 
data/dependencies.yml CHANGED
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  libxml2:
3
- version: "2.12.9"
4
- sha256: "59912db536ab56a3996489ea0299768c7bcffe57169f0235e7f962a91f483590"
5
- # sha-256 hash provided in https://download.gnome.org/sources/libxml2/2.12/libxml2-2.12.9.sha256sum
3
+ version: "2.13.5"
4
+ sha256: "74fc163217a3964257d3be39af943e08861263c4231f9ef5b496b6f6d4c7b2b6"
5
+ # sha-256 hash provided in https://download.gnome.org/sources/libxml2/2.13/libxml2-2.13.5.sha256sum
6
6
 
7
7
  libxslt:
8
- version: "1.1.39"
9
- sha256: "2a20ad621148339b0759c4d4e96719362dee64c9a096dbba625ba053846349f0"
10
- # sha-256 hash provided in https://download.gnome.org/sources/libxslt/1.1/libxslt-1.1.39.sha256sum
8
+ version: "1.1.42"
9
+ sha256: "85ca62cac0d41fc77d3f6033da9df6fd73d20ea2fc18b0a3609ffb4110e1baeb"
10
+ # sha-256 hash provided in https://download.gnome.org/sources/libxslt/1.1/libxslt-1.1.42.sha256sum
11
11
 
12
12
  zlib:
13
13
  version: "1.3.1"
@@ -12,8 +12,8 @@ require "pathname"
12
12
 
13
13
  # helpful constants
14
14
  PACKAGE_ROOT_DIR = File.expand_path(File.join(File.dirname(__FILE__), "..", ".."))
15
- REQUIRED_LIBXML_VERSION = "2.6.21"
16
- RECOMMENDED_LIBXML_VERSION = "2.9.3"
15
+ REQUIRED_LIBXML_VERSION = "2.9.2"
16
+ RECOMMENDED_LIBXML_VERSION = "2.12.0"
17
17
 
18
18
  REQUIRED_MINI_PORTILE_VERSION = "~> 2.8.2" # keep this version in sync with the one in the gemspec
19
19
  REQUIRED_PKG_CONFIG_VERSION = "~> 1.1"
@@ -57,30 +57,6 @@ NOKOGIRI_HELP_MESSAGE = <<~HELP
57
57
  Look for headers in DIRECTORY.
58
58
 
59
59
 
60
- Related to zlib:
61
-
62
- --with-zlib-dir=DIRECTORY
63
- Look for zlib headers and library in DIRECTORY.
64
-
65
- --with-zlib-lib=DIRECTORY
66
- Look for zlib library in DIRECTORY.
67
-
68
- --with-zlib-include=DIRECTORY
69
- Look for zlib headers in DIRECTORY.
70
-
71
-
72
- Related to iconv:
73
-
74
- --with-iconv-dir=DIRECTORY
75
- Look for iconv headers and library in DIRECTORY.
76
-
77
- --with-iconv-lib=DIRECTORY
78
- Look for iconv library in DIRECTORY.
79
-
80
- --with-iconv-include=DIRECTORY
81
- Look for iconv headers in DIRECTORY.
82
-
83
-
84
60
  Related to libxml2:
85
61
 
86
62
  --with-xml2-dir=DIRECTORY
@@ -95,6 +71,10 @@ NOKOGIRI_HELP_MESSAGE = <<~HELP
95
71
  --with-xml2-source-dir=DIRECTORY
96
72
  (dev only) Build libxml2 from the source code in DIRECTORY
97
73
 
74
+ --disable-xml2-legacy
75
+ Do not build libxml2 with zlib, liblzma, or HTTP support. This will become the default
76
+ in a future version of Nokogiri.
77
+
98
78
 
99
79
  Related to libxslt:
100
80
 
@@ -123,6 +103,30 @@ NOKOGIRI_HELP_MESSAGE = <<~HELP
123
103
  Look for exslt headers in DIRECTORY.
124
104
 
125
105
 
106
+ Related to iconv:
107
+
108
+ --with-iconv-dir=DIRECTORY
109
+ Look for iconv headers and library in DIRECTORY.
110
+
111
+ --with-iconv-lib=DIRECTORY
112
+ Look for iconv library in DIRECTORY.
113
+
114
+ --with-iconv-include=DIRECTORY
115
+ Look for iconv headers in DIRECTORY.
116
+
117
+
118
+ Related to zlib (ignored if `--disable-xml2-legacy` is used):
119
+
120
+ --with-zlib-dir=DIRECTORY
121
+ Look for zlib headers and library in DIRECTORY.
122
+
123
+ --with-zlib-lib=DIRECTORY
124
+ Look for zlib library in DIRECTORY.
125
+
126
+ --with-zlib-include=DIRECTORY
127
+ Look for zlib headers in DIRECTORY.
128
+
129
+
126
130
  Flags only used when building and using the packaged libraries:
127
131
 
128
132
  --disable-static
@@ -137,6 +141,9 @@ NOKOGIRI_HELP_MESSAGE = <<~HELP
137
141
  NOKOGIRI_USE_SYSTEM_LIBRARIES
138
142
  Equivalent to `--enable-system-libraries` when set, even if nil or blank.
139
143
 
144
+ AR
145
+ Use this path to invoke the library archiver instead of `RbConfig::CONFIG['AR']`
146
+
140
147
  CC
141
148
  Use this path to invoke the compiler instead of `RbConfig::CONFIG['CC']`
142
149
 
@@ -146,6 +153,9 @@ NOKOGIRI_HELP_MESSAGE = <<~HELP
146
153
  CFLAGS
147
154
  If this string is accepted by the compiler, add it to the flags passed to the compiler
148
155
 
156
+ LD
157
+ Use this path to invoke the linker instead of `RbConfig::CONFIG['LD']`
158
+
149
159
  LDFLAGS
150
160
  If this string is accepted by the linker, add it to the flags passed to the linker
151
161
 
@@ -175,6 +185,10 @@ def config_system_libraries?
175
185
  end
176
186
  end
177
187
 
188
+ def config_with_xml2_legacy?
189
+ enable_config("xml2-legacy", true)
190
+ end
191
+
178
192
  def windows?
179
193
  RbConfig::CONFIG["target_os"].match?(/mingw|mswin/)
180
194
  end
@@ -195,10 +209,14 @@ def aix?
195
209
  RbConfig::CONFIG["target_os"].include?("aix")
196
210
  end
197
211
 
198
- def nix?
212
+ def unix?
199
213
  !(windows? || solaris? || darwin?)
200
214
  end
201
215
 
216
+ def nix?
217
+ ENV.key?("NIX_CC")
218
+ end
219
+
202
220
  def truffle?
203
221
  RUBY_ENGINE == "truffleruby"
204
222
  end
@@ -626,12 +644,22 @@ if openbsd? && !config_system_libraries?
626
644
  append_cppflags "-I/usr/local/include"
627
645
  end
628
646
 
647
+ if ENV["AR"]
648
+ RbConfig::CONFIG["AR"] = RbConfig::MAKEFILE_CONFIG["AR"] = ENV["AR"]
649
+ end
650
+
629
651
  if ENV["CC"]
630
652
  RbConfig::CONFIG["CC"] = RbConfig::MAKEFILE_CONFIG["CC"] = ENV["CC"]
631
653
  end
632
654
 
633
- # use same c compiler for libxml and libxslt
655
+ if ENV["LD"]
656
+ RbConfig::CONFIG["LD"] = RbConfig::MAKEFILE_CONFIG["LD"] = ENV["LD"]
657
+ end
658
+
659
+ # use same toolchain for libxml and libxslt
660
+ ENV["AR"] = RbConfig::CONFIG["AR"]
634
661
  ENV["CC"] = RbConfig::CONFIG["CC"]
662
+ ENV["LD"] = RbConfig::CONFIG["LD"]
635
663
 
636
664
  if arg_config("--prevent-strip")
637
665
  old_cflags = $CFLAGS.split.join(" ")
@@ -646,9 +674,9 @@ if arg_config("--prevent-strip")
646
674
  end
647
675
 
648
676
  # adopt environment config
649
- append_cflags(ENV["CFLAGS"].split) unless ENV["CFLAGS"].nil?
650
- append_cppflags(ENV["CPPFLAGS"].split) unless ENV["CPPFLAGS"].nil?
651
- append_ldflags(ENV["LDFLAGS"].split) unless ENV["LDFLAGS"].nil?
677
+ append_cflags(ENV["CFLAGS"]) unless ENV["CFLAGS"].nil?
678
+ append_cppflags(ENV["CPPFLAGS"]) unless ENV["CPPFLAGS"].nil?
679
+ append_ldflags(ENV["LDFLAGS"]) unless ENV["LDFLAGS"].nil?
652
680
  $LIBS = concat_flags($LIBS, ENV["LIBS"])
653
681
 
654
682
  # libgumbo uses C90/C99 features, see #2302
@@ -666,12 +694,9 @@ append_cflags("-Winline")
666
694
  # good to have no matter what Ruby was compiled with
667
695
  append_cflags("-Wmissing-noreturn")
668
696
 
669
- # check integer loss of precision
670
- if darwin?
671
- append_cflags("-Wshorten-64-to-32")
672
- else
673
- append_cflags("-Wconversion -Wno-sign-conversion")
674
- end
697
+ # check integer loss of precision. this flag won't generally work until Ruby 3.4.
698
+ # see https://bugs.ruby-lang.org/issues/20507
699
+ append_cflags("-Wconversion")
675
700
 
676
701
  # handle clang variations, see #1101
677
702
  if darwin?
@@ -684,7 +709,7 @@ end
684
709
 
685
710
  # Add SDK-specific include path for macOS and brew versions before v2.2.12 (2020-04-08) [#1851, #1801]
686
711
  macos_mojave_sdk_include_path = "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/libxml2"
687
- if config_system_libraries? && darwin? && Dir.exist?(macos_mojave_sdk_include_path)
712
+ if config_system_libraries? && darwin? && Dir.exist?(macos_mojave_sdk_include_path) && !nix?
688
713
  append_cppflags("-I#{macos_mojave_sdk_include_path}")
689
714
  end
690
715
 
@@ -694,13 +719,15 @@ append_cppflags(' "-Idummypath"') if windows?
694
719
 
695
720
  if config_system_libraries?
696
721
  message "Building nokogiri using system libraries.\n"
697
- ensure_package_configuration(
698
- opt: "zlib",
699
- pc: "zlib",
700
- lib: "z",
701
- headers: "zlib.h",
702
- func: "gzdopen",
703
- )
722
+ if config_with_xml2_legacy?
723
+ ensure_package_configuration(
724
+ opt: "zlib",
725
+ pc: "zlib",
726
+ lib: "z",
727
+ headers: "zlib.h",
728
+ func: "gzdopen",
729
+ )
730
+ end
704
731
  ensure_package_configuration(
705
732
  opt: "xml2",
706
733
  pc: "libxml-2.0",
@@ -744,58 +771,60 @@ else
744
771
  require "yaml"
745
772
  dependencies = YAML.load_file(File.join(PACKAGE_ROOT_DIR, "dependencies.yml"))
746
773
 
747
- dir_config("zlib")
774
+ dir_config("zlib") if config_with_xml2_legacy?
748
775
 
749
776
  if cross_build_p || windows?
750
- zlib_recipe = process_recipe("zlib", dependencies["zlib"]["version"], static_p, cross_build_p) do |recipe|
751
- recipe.files = [{
752
- url: zlib_source(recipe.version),
753
- sha256: dependencies["zlib"]["sha256"],
754
- }]
755
- if windows?
756
- class << recipe
757
- attr_accessor :cross_build_p
758
-
759
- def configure
760
- Dir.chdir(work_path) do
761
- mk = File.read("win32/Makefile.gcc")
762
- File.open("win32/Makefile.gcc", "wb") do |f|
763
- f.puts "BINARY_PATH = #{path}/bin"
764
- f.puts "LIBRARY_PATH = #{path}/lib"
765
- f.puts "INCLUDE_PATH = #{path}/include"
766
- mk.sub!(/^PREFIX\s*=\s*$/, "PREFIX = #{host}-") if cross_build_p
767
- f.puts mk
777
+ if config_with_xml2_legacy?
778
+ zlib_recipe = process_recipe("zlib", dependencies["zlib"]["version"], static_p, cross_build_p) do |recipe|
779
+ recipe.files = [{
780
+ url: zlib_source(recipe.version),
781
+ sha256: dependencies["zlib"]["sha256"],
782
+ }]
783
+ if windows?
784
+ class << recipe
785
+ attr_accessor :cross_build_p
786
+
787
+ def configure
788
+ Dir.chdir(work_path) do
789
+ mk = File.read("win32/Makefile.gcc")
790
+ File.open("win32/Makefile.gcc", "wb") do |f|
791
+ f.puts "BINARY_PATH = #{path}/bin"
792
+ f.puts "LIBRARY_PATH = #{path}/lib"
793
+ f.puts "INCLUDE_PATH = #{path}/include"
794
+ mk.sub!(/^PREFIX\s*=\s*$/, "PREFIX = #{host}-") if cross_build_p
795
+ f.puts mk
796
+ end
768
797
  end
769
798
  end
770
- end
771
799
 
772
- def configured?
773
- Dir.chdir(work_path) do
774
- !!(File.read("win32/Makefile.gcc") =~ /^BINARY_PATH/)
800
+ def configured?
801
+ Dir.chdir(work_path) do
802
+ !!(File.read("win32/Makefile.gcc") =~ /^BINARY_PATH/)
803
+ end
775
804
  end
776
- end
777
805
 
778
- def compile
779
- execute("compile", "make -f win32/Makefile.gcc")
780
- end
806
+ def compile
807
+ execute("compile", "make -f win32/Makefile.gcc")
808
+ end
781
809
 
782
- def install
783
- execute("install", "make -f win32/Makefile.gcc install")
810
+ def install
811
+ execute("install", "make -f win32/Makefile.gcc install")
812
+ end
784
813
  end
785
- end
786
- recipe.cross_build_p = cross_build_p
787
- else
788
- class << recipe
789
- def configure
790
- env = {}
791
- env["CFLAGS"] = concat_flags(ENV["CFLAGS"], "-fPIC", "-g")
792
- env["CHOST"] = host
793
- execute("configure", ["./configure", "--static", configure_prefix], { env: env })
794
- if darwin?
795
- # needed as of zlib 1.2.13
796
- Dir.chdir(work_path) do
797
- makefile = File.read("Makefile").gsub(/^AR=.*$/, "AR=#{host}-libtool")
798
- File.open("Makefile", "w") { |m| m.write(makefile) }
814
+ recipe.cross_build_p = cross_build_p
815
+ else
816
+ class << recipe
817
+ def configure
818
+ env = {}
819
+ env["CFLAGS"] = concat_flags(ENV["CFLAGS"], "-fPIC", "-g")
820
+ env["CHOST"] = host
821
+ execute("configure", ["./configure", "--static", configure_prefix], { env: env })
822
+ if darwin?
823
+ # needed as of zlib 1.2.13
824
+ Dir.chdir(work_path) do
825
+ makefile = File.read("Makefile").gsub(/^AR=.*$/, "AR=#{host}-libtool")
826
+ File.open("Makefile", "w") { |m| m.write(makefile) }
827
+ end
799
828
  end
800
829
  end
801
830
  end
@@ -803,7 +832,7 @@ else
803
832
  end
804
833
  end
805
834
 
806
- unless nix?
835
+ unless unix?
807
836
  libiconv_recipe = process_recipe(
808
837
  "libiconv",
809
838
  dependencies["libiconv"]["version"],
@@ -888,6 +917,10 @@ else
888
917
  cppflags = concat_flags(cppflags, "-DNOKOGIRI_PRECOMPILED_LIBRARIES")
889
918
  end
890
919
 
920
+ if config_with_xml2_legacy?
921
+ recipe.configure_options << "--with-legacy"
922
+ end
923
+
891
924
  if zlib_recipe
892
925
  recipe.configure_options << "--with-zlib=#{zlib_recipe.path}"
893
926
  end
@@ -899,7 +932,8 @@ else
899
932
  end
900
933
 
901
934
  if darwin? && !cross_build_p
902
- recipe.configure_options += ["RANLIB=/usr/bin/ranlib", "AR=/usr/bin/ar"]
935
+ recipe.configure_options << "RANLIB=/usr/bin/ranlib" unless ENV.key?("RANLIB")
936
+ recipe.configure_options << "AR=/usr/bin/ar" unless ENV.key?("AR")
903
937
  end
904
938
 
905
939
  if windows?
@@ -940,7 +974,8 @@ else
940
974
  cflags = concat_flags(ENV["CFLAGS"], "-O2", "-U_FORTIFY_SOURCE", "-g")
941
975
 
942
976
  if darwin? && !cross_build_p
943
- recipe.configure_options += ["RANLIB=/usr/bin/ranlib", "AR=/usr/bin/ar"]
977
+ recipe.configure_options << "RANLIB=/usr/bin/ranlib" unless ENV.key?("RANLIB")
978
+ recipe.configure_options << "AR=/usr/bin/ar" unless ENV.key?("AR")
944
979
  end
945
980
 
946
981
  if windows?
@@ -1031,62 +1066,81 @@ else
1031
1066
  ensure_func("exsltFuncRegister", "libexslt/exslt.h")
1032
1067
  end
1033
1068
 
1034
- libgumbo_recipe = process_recipe("libgumbo", "1.0.0-nokogiri", static_p, cross_build_p, false) do |recipe|
1035
- recipe.configure_options = []
1069
+ if arg_config("--gumbo-dev")
1070
+ message("DEV MODE ENABLED: build libgumbo as packaged source")
1071
+ ext_dir = File.dirname(__FILE__)
1072
+ Dir.chdir(ext_dir) do
1073
+ $srcs = Dir["*.c", "../../gumbo-parser/src/*.c"]
1074
+ $hdrs = Dir["*.h", "../../gumbo-parser/src/*.h"]
1075
+ end
1076
+ $INCFLAGS << " -I$(srcdir)/../../gumbo-parser/src"
1077
+ $VPATH << "$(srcdir)/../../gumbo-parser/src"
1078
+ find_header("nokogiri_gumbo.h") || abort("nokogiri_gumbo.h not found")
1079
+ else
1080
+ libgumbo_recipe = process_recipe("libgumbo", "1.0.0-nokogiri", static_p, cross_build_p, false) do |recipe|
1081
+ recipe.configure_options = []
1036
1082
 
1037
- class << recipe
1038
- def downloaded?
1039
- true
1040
- end
1083
+ class << recipe
1084
+ def downloaded?
1085
+ true
1086
+ end
1041
1087
 
1042
- def extract
1043
- target = File.join(tmp_path, "gumbo-parser")
1044
- output("Copying gumbo-parser files into #{target}...")
1045
- FileUtils.mkdir_p(target)
1046
- FileUtils.cp(Dir.glob(File.join(PACKAGE_ROOT_DIR, "gumbo-parser/src/*")), target)
1047
- end
1088
+ def extract
1089
+ target = File.join(tmp_path, "gumbo-parser")
1090
+ output("Copying gumbo-parser files into #{target}...")
1091
+ FileUtils.mkdir_p(target)
1092
+ FileUtils.cp(Dir.glob(File.join(PACKAGE_ROOT_DIR, "gumbo-parser/src/*")), target)
1093
+ end
1048
1094
 
1049
- def configured?
1050
- true
1051
- end
1095
+ def configured?
1096
+ true
1097
+ end
1052
1098
 
1053
- def install
1054
- lib_dir = File.join(port_path, "lib")
1055
- inc_dir = File.join(port_path, "include")
1056
- FileUtils.mkdir_p([lib_dir, inc_dir])
1057
- FileUtils.cp(File.join(work_path, "libgumbo.a"), lib_dir)
1058
- FileUtils.cp(Dir.glob(File.join(work_path, "*.h")), inc_dir)
1059
- end
1099
+ def install
1100
+ lib_dir = File.join(port_path, "lib")
1101
+ inc_dir = File.join(port_path, "include")
1102
+ FileUtils.mkdir_p([lib_dir, inc_dir])
1103
+ FileUtils.cp(File.join(work_path, "libgumbo.a"), lib_dir)
1104
+ FileUtils.cp(Dir.glob(File.join(work_path, "*.h")), inc_dir)
1105
+ end
1060
1106
 
1061
- def compile
1062
- cflags = concat_flags(ENV["CFLAGS"], "-fPIC", "-O2", "-g")
1107
+ def compile
1108
+ cflags = concat_flags(ENV["CFLAGS"], "-fPIC", "-O2", "-g")
1063
1109
 
1064
- env = { "CC" => gcc_cmd, "CFLAGS" => cflags }
1065
- if config_cross_build?
1066
- if host.include?("darwin")
1067
- env["AR"] = "#{host}-libtool"
1068
- env["ARFLAGS"] = "-o"
1069
- else
1070
- env["AR"] = "#{host}-ar"
1110
+ env = { "CC" => gcc_cmd, "CFLAGS" => cflags }
1111
+ if config_cross_build?
1112
+ if host.include?("darwin")
1113
+ env["AR"] = "#{host}-libtool"
1114
+ env["ARFLAGS"] = "-o"
1115
+ else
1116
+ env["AR"] = "#{host}-ar"
1117
+ end
1118
+ env["RANLIB"] = "#{host}-ranlib"
1119
+ if windows?
1120
+ # NOTE: that in any particular windows gem package, we only ever compile against either
1121
+ # msvcrt (ruby <= 3.0) or ucrt (ruby > 3.0), so even though this gets evaluated only once
1122
+ # per gem (and not per-version-of-ruby), it's OK.
1123
+ env["CFLAGS"] = if RbConfig::CONFIG["RUBY_SO_NAME"].include?("msvcrt")
1124
+ concat_flags(env["CFLAGS"], "-D_RUBY_MSVCRT")
1125
+ else
1126
+ concat_flags(env["CFLAGS"], "-D_RUBY_UCRT")
1127
+ end
1128
+ end
1071
1129
  end
1072
- env["RANLIB"] = "#{host}-ranlib"
1073
- end
1074
1130
 
1075
- execute("compile", make_cmd, { env: env })
1131
+ execute("compile", make_cmd, { env: env })
1132
+ end
1076
1133
  end
1077
1134
  end
1135
+ append_cppflags("-I#{File.join(libgumbo_recipe.path, "include")}")
1136
+ $libs = $libs + " " + File.join(libgumbo_recipe.path, "lib", "libgumbo.a")
1137
+ $LIBPATH = $LIBPATH | [File.join(libgumbo_recipe.path, "lib")]
1138
+ ensure_func("gumbo_parse_with_options", "nokogiri_gumbo.h")
1078
1139
  end
1079
- append_cppflags("-I#{File.join(libgumbo_recipe.path, "include")}")
1080
- $libs = $libs + " " + File.join(libgumbo_recipe.path, "lib", "libgumbo.a")
1081
- $LIBPATH = $LIBPATH | [File.join(libgumbo_recipe.path, "lib")]
1082
- ensure_func("gumbo_parse_with_options", "nokogiri_gumbo.h")
1083
-
1084
- have_func("xmlHasFeature") || abort("xmlHasFeature() is missing.") # introduced in libxml 2.6.21
1085
- have_func("xmlFirstElementChild") # introduced in libxml 2.7.3
1086
- have_func("xmlRelaxNGSetParserStructuredErrors") # introduced in libxml 2.6.24
1087
- have_func("xmlRelaxNGSetValidStructuredErrors") # introduced in libxml 2.6.21
1088
- have_func("xmlSchemaSetValidStructuredErrors") # introduced in libxml 2.6.23
1089
- have_func("xmlSchemaSetParserStructuredErrors") # introduced in libxml 2.6.23
1140
+
1141
+ have_func("xmlCtxtSetOptions") # introduced in libxml2 2.13.0
1142
+ have_func("xmlCtxtGetOptions") # introduced in libxml2 2.14.0
1143
+ have_func("xmlSwitchEncodingName") # introduced in libxml2 2.13.0
1090
1144
  have_func("rb_category_warning") # introduced in Ruby 3.0
1091
1145
 
1092
1146
  other_library_versions_string = OTHER_LIBRARY_VERSIONS.map { |k, v| [k, v].join(":") }.join(",")
@@ -1118,7 +1172,7 @@ if config_clean?
1118
1172
  mk.print(<<~EOF)
1119
1173
 
1120
1174
  all: clean-ports
1121
- clean-ports: $(DLLIB)
1175
+ clean-ports: $(TARGET_SO)
1122
1176
  \t-$(Q)$(RUBY) $(srcdir)/extconf.rb --clean --#{static_p ? "enable" : "disable"}-static
1123
1177
  EOF
1124
1178
  end