diff --git a/td-agent/Rakefile b/td-agent/Rakefile index 9c0ad718e..0373a687a 100644 --- a/td-agent/Rakefile +++ b/td-agent/Rakefile @@ -426,6 +426,18 @@ class BuildTask render_template(dest_path, template_file_path, config, {mode: 0755}) end + def apply_ruby_patches + return if BUNDLED_RUBY_PATCHES.nil? + BUNDLED_RUBY_PATCHES.each do |patch| + patch_name, version_condition = patch + dependency = Gem::Dependency.new('', version_condition) + if dependency.match?('', BUNDLED_RUBY_VERSION) + patch_path = File.join(__dir__, "patches", patch_name) + sh("patch", "-p1", "--input=#{patch_path}") + end + end + end + def build_ruby_from_source tarball = @download_task.file_ruby_source ruby_source_dir = tarball.sub(/\.tar\.gz$/, '') @@ -439,6 +451,7 @@ class BuildTask "--disable-install-doc", ] cd(ruby_source_dir) do + apply_ruby_patches sh("./configure #{configure_opts.join(' ')}") sh("make", "install", "-j#{Etc.nprocessors}", "DESTDIR=#{STAGING_DIR}") diff --git a/td-agent/config.rb b/td-agent/config.rb index 9f113fabd..29917d3ef 100644 --- a/td-agent/config.rb +++ b/td-agent/config.rb @@ -13,6 +13,11 @@ #BUNDLED_RUBY_VERSION = "2.7.0" #BUNDLED_RUBY_SOURCE_SHA256SUM = "8c99aa93b5e2f1bc8437d1bbbefd27b13e7694025331f77245d0c068ef1f8cbe" +BUNDLED_RUBY_PATCHES = [ + ["ruby-2.7/0001-Removed-the-old-executables-of-racc.patch", ["~> 2.7.0"]], + ["ruby-2.7/0002-Fixup-a6864f6d2f39bcd1ff04516591cc18d4027ab186.patch", ["~> 2.7.0"]], +] + # https://rubyinstaller.org/downloads/ (7-ZIP ARCHIVES) BUNDLED_RUBY_INSTALLER_X64_VERSION = "2.4.9-1" BUNDLED_RUBY_INSTALLER_X64_SHA256SUM = "b822c5b87e8baf8526c07496efa8fce595a75c82c7ebe549448958116a4dcb91" diff --git a/td-agent/patches/ruby-2.7/0001-Removed-the-old-executables-of-racc.patch b/td-agent/patches/ruby-2.7/0001-Removed-the-old-executables-of-racc.patch new file mode 100644 index 000000000..968313d55 --- /dev/null +++ b/td-agent/patches/ruby-2.7/0001-Removed-the-old-executables-of-racc.patch @@ -0,0 +1,634 @@ +From a6864f6d2f39bcd1ff04516591cc18d4027ab186 Mon Sep 17 00:00:00 2001 +From: Hiroshi SHIBATA +Date: Wed, 1 Jan 2020 07:42:42 +0900 +Subject: [PATCH 1/2] Removed the old executables of racc + + [ruby-core:93516][Feature #15982] + + https://github.com/ruby/racc/pull/123 +--- + bin/racc2y | 27 ---- + bin/y2racc | 27 ---- + libexec/racc2y | 195 ---------------------------- + libexec/y2racc | 339 ------------------------------------------------- + 4 files changed, 588 deletions(-) + delete mode 100755 bin/racc2y + delete mode 100755 bin/y2racc + delete mode 100755 libexec/racc2y + delete mode 100755 libexec/y2racc + +diff --git a/bin/racc2y b/bin/racc2y +deleted file mode 100755 +index a1e4352632..0000000000 +--- a/bin/racc2y ++++ /dev/null +@@ -1,27 +0,0 @@ +-#!/usr/bin/env ruby +-# +-# This file was generated by RubyGems. +-# +-# The application 'racc' is installed as part of a gem, and +-# this file is here to facilitate running it. +-# +- +-require 'rubygems' +- +-version = ">= 0.a" +- +-if ARGV.first +- str = ARGV.first +- str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding +- if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then +- version = $1 +- ARGV.shift +- end +-end +- +-if Gem.respond_to?(:activate_bin_path) +-load Gem.activate_bin_path('racc', 'racc2y', version) +-else +-gem "racc", version +-load Gem.bin_path("racc", "racc2y", version) +-end +diff --git a/bin/y2racc b/bin/y2racc +deleted file mode 100755 +index 023615f369..0000000000 +--- a/bin/y2racc ++++ /dev/null +@@ -1,27 +0,0 @@ +-#!/usr/bin/env ruby +-# +-# This file was generated by RubyGems. +-# +-# The application 'racc' is installed as part of a gem, and +-# this file is here to facilitate running it. +-# +- +-require 'rubygems' +- +-version = ">= 0.a" +- +-if ARGV.first +- str = ARGV.first +- str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding +- if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then +- version = $1 +- ARGV.shift +- end +-end +- +-if Gem.respond_to?(:activate_bin_path) +-load Gem.activate_bin_path('racc', 'y2racc', version) +-else +-gem "racc", version +-load Gem.bin_path("racc", "y2racc", version) +-end +diff --git a/libexec/racc2y b/libexec/racc2y +deleted file mode 100755 +index f88d73ed2c..0000000000 +--- a/libexec/racc2y ++++ /dev/null +@@ -1,195 +0,0 @@ +-#!/usr/local/bin/ruby +-# +-# $Id$ +-# +-# Copyright (c) 1999-2006 Minero Aoki +-# +-# This program is feee software. +-# You can distribute/modify this program under the terms of +-# the GNU LGPL, Lesser General Public License version 2.1. +-# For details of the LGPL, see the file "COPYING". +-# +- +-require 'racc/grammarfileparser' +-require 'racc/info' +-require 'optparse' +- +-def main +- @with_action = true +- with_header = false +- with_inner = false +- with_footer = false +- output = nil +- parser = OptionParser.new +- parser.banner = "Usage: #{File.basename($0)} [-AHIF] [-oFILENAME] GRAMMARFILE" +- parser.on('-o', '--output=FILENAME', 'output file name [.yacc]') {|name| +- output = name +- } +- parser.on('-A', '--without-action', 'Does not include actions.') { +- @with_action = false +- } +- parser.on('-H', '--with-header', 'Includes header part.') { +- with_header = true +- } +- parser.on('-I', '--with-inner', 'Includes inner part.') { +- with_inner = true +- } +- parser.on('-F', '--with-footer', 'Includes footer part.') { +- with_footer = true +- } +- parser.on('--version', 'Prints version and quit.') { +- puts "racc2y version #{Racc::Version}" +- exit 0 +- } +- parser.on('--copyright', 'Prints copyright and quit.') { +- puts Racc::Copyright +- exit 0 +- } +- parser.on('--help', 'Prints this message and quit.') { +- puts parser.help +- exit 1 +- } +- begin +- parser.parse! +- rescue OptionParser::ParseError => err +- $stderr.puts err.message +- $stderr.puts parser.help +- exit 1 +- end +- if ARGV.empty? +- $stderr.puts "no input file" +- exit 1 +- end +- unless ARGV.size == 1 +- $stderr.puts "too many inputs" +- exit 1 +- end +- input = ARGV[0] +- +- begin +- result = Racc::GrammarFileParser.parse_file(input) +- result.grammar.init +- File.open(output || "#{input}.yacc", 'w') {|f| +- f.puts "/* generated from #{input} */" +- if with_header +- f.puts +- f.puts '%{' +- print_user_codes f, result.params.header +- f.puts '%}' +- end +- f.puts +- print_terminals f, result.grammar +- f.puts +- print_precedence_table f, precedence_table(result.grammar) +- f.puts +- f.puts '%%' +- print_grammar f, result.grammar +- f.puts '%%' +- if with_inner +- f.puts '/*---- inner ----*/' +- print_user_codes f, result.params.inner +- end +- if with_footer +- f.puts '/*---- footer ----*/' +- print_user_codes f, result.params.footer +- end +- } +- rescue SystemCallError => err +- $stderr.puts err.message +- exit 1 +- end +-end +- +-def print_terminals(f, grammar) +- init_indent = '%token'.size +- f.print '%token' +- columns = init_indent +- grammar.symboltable.each_terminal do |t| +- next unless t.terminal? +- next if t.dummy? +- next if t == grammar.symboltable.anchor +- next if t == grammar.symboltable.error +- unless t.value.kind_of?(String) +- if columns > 60 +- f.puts +- f.print ' ' * init_indent +- columns = init_indent +- end +- columns += f.write(" #{yacc_symbol(t)}") +- end +- end +- f.puts +-end +- +-def precedence_table(grammar) +- table = [] +- grammar.symboltable.select {|sym| sym.precedence }.each do |sym| +- (table[sym.prec] ||= [sym.assoc]).push sym +- end +- table.compact +-end +- +-def print_precedence_table(f, table) +- return if table.empty? +- f.puts '/* precedance table */' +- table.each do |syms| +- assoc = syms.shift +- f.printf '%%%-8s ', assoc.to_s.downcase +- f.puts syms.map {|s| yacc_symbol(s) }.join(' ') +- end +- f.puts +-end +- +-def print_grammar(f, grammar) +- prev_target = nil +- indent = 10 +- embactions = [] +- grammar.each do |rule| +- if rule.target.dummy? +- embactions.push rule.action unless rule.action.empty? +- next +- end +- if rule.target == prev_target +- f.print ' ' * indent, '|' +- else +- prev_target = rule.target +- f.printf "\n%-10s:", yacc_symbol(prev_target) +- end +- rule.symbols.each do |s| +- if s.dummy? # target of dummy rule for embedded action +- f.puts +- print_action f, embactions.shift, indent +- f.print ' ' * (indent + 1) +- else +- f.print ' ', yacc_symbol(s) +- end +- end +- if rule.specified_prec +- f.print ' %prec ', yacc_symbol(rule.specified_prec) +- end +- f.puts +- unless rule.action.empty? +- print_action f, rule.action, indent +- end +- end +-end +- +-def print_action(f, action, indent) +- return unless @with_action +- f.print ' ' * (indent + 4), "{\n" +- f.print ' ' * (indent + 6), action.source.text.strip, "\n" +- f.print ' ' * (indent + 4) , "}\n" +-end +- +-def print_user_codes(f, srcs) +- return if srcs.empty? +- srcs.each do |src| +- f.puts src.text +- end +-end +- +-def yacc_symbol(s) +- s.to_s.gsub('"', "'") +-end +- +-main +diff --git a/libexec/y2racc b/libexec/y2racc +deleted file mode 100755 +index 7933f94153..0000000000 +--- a/libexec/y2racc ++++ /dev/null +@@ -1,339 +0,0 @@ +-#!/usr/local/bin/ruby +-# +-# $Id$ +-# +-# Copyright (c) 1999-2006 Minero Aoki +-# +-# This program is free software. +-# You can distribute/modify this program under the terms of +-# the GNU LGPL, Lesser General Public License version 2.1. +-# For details of the GNU LGPL, see the file "COPYING". +-# +- +-require 'racc/info' +-require 'strscan' +-require 'forwardable' +-require 'optparse' +- +-def main +- @with_action = true +- @with_header = false +- @with_usercode = false +- cname = 'MyParser' +- input = nil +- output = nil +- parser = OptionParser.new +- parser.banner = "Usage: #{File.basename($0)} [-Ahu] [-c ] [-o ] " +- parser.on('-o', '--output=FILENAME', 'output file name [.racc]') {|name| +- output = name +- } +- parser.on('-c', '--classname=NAME', "Name of the parser class. [#{cname}]") {|name| +- cname = name +- } +- parser.on('-A', '--without-action', 'Does not include actions.') { +- @with_action = false +- } +- parser.on('-h', '--with-header', 'Includes header (%{...%}).') { +- @with_header = true +- } +- parser.on('-u', '--with-user-code', 'Includes user code.') { +- @with_usercode = true +- } +- parser.on('--version', 'Prints version and quit.') { +- puts "y2racc version #{Racc::Version}" +- exit 0 +- } +- parser.on('--copyright', 'Prints copyright and quit.') { +- puts Racc::Copyright +- exit 0 +- } +- parser.on('--help', 'Prints this message and quit.') { +- puts parser.help +- exit 1 +- } +- begin +- parser.parse! +- rescue OptionParser::ParseError => err +- $stderr.puts err.message +- $stderr.puts parser.help +- exit 1 +- end +- if ARGV.empty? +- $stderr.puts 'no input' +- exit 1 +- end +- if ARGV.size > 1 +- $stderr.puts 'too many input' +- exit 1 +- end +- input = ARGV[0] +- +- begin +- result = YaccFileParser.parse_file(input) +- File.open(output || "#{input}.racc", 'w') {|f| +- convert cname, result, f +- } +- rescue SystemCallError => err +- $stderr.puts err.message +- exit 1 +- end +-end +- +-def convert(classname, result, f) +- init_indent = 'token'.size +- f.puts %<# Converted from "#{result.filename}" by y2racc version #{Racc::Version}> +- f.puts +- f.puts "class #{classname}" +- unless result.terminals.empty? +- f.puts +- f.print 'token' +- columns = init_indent +- result.terminals.each do |t| +- if columns > 60 +- f.puts +- f.print ' ' * init_indent +- columns = init_indent +- end +- columns += f.write(" #{t}") +- end +- f.puts +- end +- unless result.precedence_table.empty? +- f.puts +- f.puts 'preclow' +- result.precedence_table.each do |assoc, toks| +- f.printf " %-8s %s\n", assoc, toks.join(' ') unless toks.empty? +- end +- f.puts 'prechigh' +- end +- if result.start +- f.puts +- f.puts "start #{@start}" +- end +- +- f.puts +- f.puts 'rule' +- texts = @with_action ? result.grammar : result.grammar_without_actions +- texts.each do |text| +- f.print text +- end +- +- if @with_header and result.header +- f.puts +- f.puts '---- header' +- f.puts result.header +- end +- if @with_usercode and result.usercode +- f.puts +- f.puts '---- footer' +- f.puts result.usercode +- end +-end +- +-class ParseError < StandardError; end +- +-class StringScanner_withlineno +- def initialize(src) +- @s = StringScanner.new(src) +- @lineno = 1 +- end +- +- extend Forwardable +- def_delegator "@s", :eos? +- def_delegator "@s", :rest +- +- attr_reader :lineno +- +- def scan(re) +- advance_lineno(@s.scan(re)) +- end +- +- def scan_until(re) +- advance_lineno(@s.scan_until(re)) +- end +- +- def skip(re) +- str = advance_lineno(@s.scan(re)) +- str ? str.size : nil +- end +- +- def getch +- advance_lineno(@s.getch) +- end +- +- private +- +- def advance_lineno(str) +- @lineno += str.count("\n") if str +- str +- end +-end +- +-class YaccFileParser +- +- Result = Struct.new(:terminals, :precedence_table, :start, +- :header, :grammar, :usercode, :filename) +- class Result # reopen +- def initialize +- super +- self.terminals = [] +- self.precedence_table = [] +- self.start = nil +- self.grammar = [] +- self.header = nil +- self.usercode = nil +- self.filename = nil +- end +- +- def grammar_without_actions +- grammar().map {|text| text[0,1] == '{' ? '{}' : text } +- end +- end +- +- def YaccFileParser.parse_file(filename) +- new().parse(File.read(filename), filename) +- end +- +- def parse(src, filename = '-') +- @result = Result.new +- @filename = filename +- @result.filename = filename +- s = StringScanner_withlineno.new(src) +- parse_header s +- parse_grammar s +- @result +- end +- +- private +- +- COMMENT = %r +- CHAR = /'((?:[^'\\]+|\\.)*)'/ +- STRING = /"((?:[^"\\]+|\\.)*)"/ +- +- def parse_header(s) +- skip_until_percent s +- until s.eos? +- case +- when t = s.scan(/left/) +- @result.precedence_table.push ['left', scan_symbols(s)] +- when t = s.scan(/right/) +- @result.precedence_table.push ['right', scan_symbols(s)] +- when t = s.scan(/nonassoc/) +- @result.precedence_table.push ['nonassoc', scan_symbols(s)] +- when t = s.scan(/token/) +- list = scan_symbols(s) +- list.shift if /\A<(.*)>\z/ =~ list[0] +- @result.terminals.concat list +- when t = s.scan(/start/) +- @result.start = scan_symbols(s)[0] +- when s.skip(%r<(?: +- type | union | expect | thong | binary | +- semantic_parser | pure_parser | no_lines | +- raw | token_table +- )\b>x) +- skip_until_percent s +- when s.skip(/\{/) # header (%{...%}) +- str = s.scan_until(/\%\}/) +- str.chop! +- str.chop! +- @result.header = str +- skip_until_percent s +- when s.skip(/\%/) # grammar (%%...) +- return +- else +- raise ParseError, "#{@filename}:#{s.lineno}: scan error" +- end +- end +- end +- +- def skip_until_percent(s) +- until s.eos? +- s.skip /[^\%\/]+/ +- next if s.skip(COMMENT) +- return if s.getch == '%' +- end +- end +- +- def scan_symbols(s) +- list = [] +- until s.eos? +- s.skip /\s+/ +- if s.skip(COMMENT) +- ; +- elsif t = s.scan(CHAR) +- list.push t +- elsif t = s.scan(STRING) +- list.push t +- elsif s.skip(/\%/) +- break +- elsif t = s.scan(/\S+/) +- list.push t +- else +- raise ParseError, "#{@filename}:#{@lineno}: scan error" +- end +- end +- list +- end +- +- def parse_grammar(s) +- buf = [] +- until s.eos? +- if t = s.scan(/[^%'"{\/]+/) +- buf.push t +- break if s.eos? +- end +- if s.skip(/\{/) +- buf.push scan_action(s) +- elsif t = s.scan(/'(?:[^'\\]+|\\.)*'/) then buf.push t +- elsif t = s.scan(/"(?:[^"\\]+|\\.)*"/) then buf.push t +- elsif t = s.scan(COMMENT) then buf.push t +- elsif s.skip(/%prec\b/) then buf.push '=' +- elsif s.skip(/%%/) +- @result.usercode = s.rest +- break +- else +- buf.push s.getch +- end +- end +- @result.grammar = buf +- end +- +- def scan_action(s) +- buf = '{' +- nest = 1 +- until s.eos? +- if t = s.scan(%r<[^/{}'"]+>) +- buf << t +- break if s.eos? +- elsif t = s.scan(COMMENT) +- buf << t +- elsif t = s.scan(CHAR) +- buf << t +- elsif t = s.scan(STRING) +- buf << t +- else +- c = s.getch +- buf << c +- case c +- when '{' +- nest += 1 +- when '}' +- nest -= 1 +- return buf if nest == 0 +- end +- end +- end +- $stderr.puts "warning: unterminated action in #{@filename}" +- buf +- end +- +-end +- +-unless Object.method_defined?(:funcall) +- class Object +- alias funcall __send__ +- end +-end +- +- +-main +-- +2.20.1 + diff --git a/td-agent/patches/ruby-2.7/0002-Fixup-a6864f6d2f39bcd1ff04516591cc18d4027ab186.patch b/td-agent/patches/ruby-2.7/0002-Fixup-a6864f6d2f39bcd1ff04516591cc18d4027ab186.patch new file mode 100644 index 000000000..a7eb5c9fa --- /dev/null +++ b/td-agent/patches/ruby-2.7/0002-Fixup-a6864f6d2f39bcd1ff04516591cc18d4027ab186.patch @@ -0,0 +1,30 @@ +From 69731b248f12f52c3897584db914cdf04a8ce5ac Mon Sep 17 00:00:00 2001 +From: Hiroshi SHIBATA +Date: Wed, 1 Jan 2020 07:53:27 +0900 +Subject: [PATCH 2/2] Fixup a6864f6d2f39bcd1ff04516591cc18d4027ab186 + +--- + lib/racc/racc.gemspec | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/racc/racc.gemspec b/lib/racc/racc.gemspec +index 6beb16c5b4..6ed031bfe1 100644 +--- a/lib/racc/racc.gemspec ++++ b/lib/racc/racc.gemspec +@@ -16,11 +16,11 @@ + s.email = [nil, "aaron@tenderlovemaking.com"] + s.homepage = "http://i.loveruby.net/en/projects/racc/" + s.licenses = ["MIT"] +- s.executables = ["racc", "racc2y", "y2racc"] ++ s.executables = ["racc"] + s.files = [ + "COPYING", "ChangeLog", "DEPENDS", "Manifest.txt", + "README.ja.rdoc", "README.rdoc", "Rakefile", "TODO", "bin/racc", +- "bin/racc2y", "bin/y2racc", "ext/racc/MANIFEST", ++ "ext/racc/MANIFEST", + "ext/racc/com/headius/racc/Cparse.java", "ext/racc/cparse.c", + "ext/racc/depend", "ext/racc/extconf.rb", "fastcache/extconf.rb", + "fastcache/fastcache.c", "lib/racc.rb", "lib/racc/compat.rb", +-- +2.20.1 +