From 2a37bf36fb8289d4062c2a82e609e6954b7a98a1 Mon Sep 17 00:00:00 2001 From: Takuro Ashie Date: Thu, 9 Apr 2020 10:49:45 +0900 Subject: [PATCH] Add patches to remove old executable of racc in Ruby 2.7 They take along with unexpected dependency since they contain wrong shebang. In addition, they are already removed at upstream. See also: * https://bugs.ruby-lang.org/issues/15982 * https://github.com/ruby/racc/pull/123 * https://src.fedoraproject.org/rpms/ruby/c/baf046a6a4d17fa309c9d20fa3db949f6c24aacf?branch=master * https://github.com/clear-code/td-agent-builder/pull/24 Signed-off-by: Takuro Ashie --- td-agent/Rakefile | 13 + td-agent/config.rb | 5 + ...-Removed-the-old-executables-of-racc.patch | 634 ++++++++++++++++++ ...4f6d2f39bcd1ff04516591cc18d4027ab186.patch | 30 + 4 files changed, 682 insertions(+) create mode 100644 td-agent/patches/ruby-2.7/0001-Removed-the-old-executables-of-racc.patch create mode 100644 td-agent/patches/ruby-2.7/0002-Fixup-a6864f6d2f39bcd1ff04516591cc18d4027ab186.patch 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 +