diff options
Diffstat (limited to 'private')
| -rw-r--r-- | private/hhvm.rb | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/private/hhvm.rb b/private/hhvm.rb new file mode 100644 index 0000000..85e78b7 --- /dev/null +++ b/private/hhvm.rb @@ -0,0 +1,135 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# frozen_string_literal: true + +require 'pathname' +require 'digest/md5' +require 'net/http' +require_relative 'config/config' +require_relative 'lib/package' + +class Package + attr_reader :path, :version, :homepage, :requires + + def initialize(path, version:, homepage:, requires: []) + @path = path + @version = version + @homepage = homepage + @requires = requires + end + + def name + File.basename @path + end + + def name_version + "#{name}-#{@version}" + end +end + +module SlackBuilder + extend Rake::FileUtilsExt + + def self.clone(repo, tarball, tag_prefix = 'v') + `./bin/slackbuilder clone #{repo} #{tarball} #{tag_prefix}` + end +end + +namespace :hhvm do + def filter_set_hhvm_third_party_source_args(tokens) + args = tokens[0] + allowed_arguments = tokens[1..].each_slice(2) + .filter do |key, _value| + !key.end_with?('_URL') && !key.end_with?('_HASH') + end + + allowed_arguments + .flatten + .prepend(" #{args}") + .join("\n ") + end + + def split_set_hhvm_third_party_source_args(section_content) + section_content + .split("\n") + .map do |line| + hash_index = line.index '#' + line = line[...hash_index] unless hash_index.nil? + + line.strip + end + end + + def rewrite_set_hhvm_third_party_source_args(contents) + set_hhvm_start = contents.index 'SET_HHVM_THIRD_PARTY_SOURCE_ARGS(' + return nil if set_hhvm_start.nil? + + section_contents = contents[set_hhvm_start + 'SET_HHVM_THIRD_PARTY_SOURCE_ARGS('.length..] + set_hhvm_end = section_contents.index ')' + + lines = split_set_hhvm_third_party_source_args section_contents[...set_hhvm_end] + new_cmake_section = filter_set_hhvm_third_party_source_args lines.reject(&:blank?).join(' ').split + + contents[...set_hhvm_start] + + "SET_HHVM_THIRD_PARTY_SOURCE_ARGS(\n#{new_cmake_section}\n)\n" + + section_contents[set_hhvm_end..] + end + + desc 'Generates diffs with removed download URLs' + task :bundled_dependencies, [:version] do |_, arguments| + run_on_source arguments[:version] do |third_party| + c_make_lists = third_party + 'CMakeLists.txt' + next unless c_make_lists.exist? + + contents = c_make_lists.read + rewritten_cmake = rewrite_set_hhvm_third_party_source_args contents + next if rewritten_cmake.nil? + + puts Open3.capture2('diff', '-Nur', c_make_lists.to_path, '-', stdin_data: rewritten_cmake).first + end + end + + desc 'Generated SlackBuild code to prepare bundled dependencies' + task :bundled_code, [:version] do |_, arguments| + run_on_source arguments[:version] do |third_party| + c_make_lists = third_party + 'CMakeLists.txt' + next unless c_make_lists.exist? + + contents = c_make_lists.read + set_hhvm_start = contents.index 'SET_HHVM_THIRD_PARTY_SOURCE_ARGS(' + next if set_hhvm_start.nil? + + set_hhvm_end = contents.index ')', set_hhvm_start + set_hhvm_start += 'SET_HHVM_THIRD_PARTY_SOURCE_ARGS('.length + set_hhvm_end -= 1 + contents = contents[set_hhvm_start..set_hhvm_end].split[1..].map(&:strip) + + src = Pathname.new('third-party') + + third_party.basename + + "bundled_#{third_party.basename}-prefix" + 'src' + bundled = src + "bundled_#{third_party.basename}" + archive_name = contents[1][contents[1].rindex('/') + 1..-2] + + puts "mkdir -p #{bundled}" + puts "install -m 0644 -D $CWD/#{archive_name} #{src + archive_name}" + puts "tar -zxvf $CWD/#{archive_name} -C #{bundled}" + puts + end + end +end + +private + +def run_on_source(version, &block) + package = Package.new 'development/hhvm', + version: version, + homepage: 'https://hhvm.com/', + requires: %w[tbb glog libdwarf libmemcached dobule-conversion] + repository = SlackBuilder.clone 'https://github.com/facebook/hhvm.git', package, 'HHVM-' + + (repository + 'third-party').each_child do |third_party| + block.call third_party + end +end |
