summaryrefslogtreecommitdiff
path: root/private/hhvm.rb
diff options
context:
space:
mode:
Diffstat (limited to 'private/hhvm.rb')
-rw-r--r--private/hhvm.rb135
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