# -*- ruby -*-
#
# Copyright (C) 2013-2015 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
require "open-uri"
module GNOME2
module Rake
class ExternalPackage < Struct.new(:name,
:base_name,
:archive_base_name,
:label,
:version,
:download_site,
:download_base_url,
:compression_method,
:base_dir_in_package,
:windows,
:native,
:patches,
:need_autogen,
:need_autoreconf,
:build_concurrently,
:bundled_packages)
def initialize(properties)
super()
properties.each do |key, value|
send("#{key}=", value)
end
end
def compression_method
super || "gz"
end
def base_name
super || "#{name}-#{version}"
end
def archive_base_name
super || "#{base_name}.tar.#{compression_method}"
end
def archive_url
"#{download_base_url}/#{archive_base_name}"
end
def download_base_url
super || download_site_base_url
end
def patches
super || []
end
def need_autogen?
need_autogen
end
def need_autoreconf?
need_autoreconf
end
def base_dir_in_package
super || "."
end
def windows
super || WindowsConfiguration.new({})
end
def windows=(properties)
super(WindowsConfiguration.new(properties))
end
def native
super || NativeConfiguration.new({})
end
def native=(properties)
super(NativeConfiguration.new(properties))
end
def bundled_packages
super || []
end
def latest_version
case download_site
when :gnome
latest_version_gnome
when :freedesktop
latest_version_freedesktop
when :freedesktop_gstreamer
latest_version_freedesktop_gstreamer
when :webkitgtk
latest_version_webkitgtk
else
nil
end
end
private
def download_site_base_url
case download_site
when :gnome
base_url = gnome_base_url
release_series = version.gsub(/\A(\d+\.\d+)(?:[^\d].*)?\z/, '\1')
base_url << "/#{name}/#{release_series}"
when :freedesktop
base_url = freedesktop_base_url
base_url << "/#{name}/release"
when :freedesktop_gstreamer
base_url = freedesktop_gstreamer_base_url
base_url << "/#{name}"
when :gnu
base_url = "http://ftp.gnu.org/pub/gnu/#{name}"
when :webkitgtk
base_url = webkitgtk_base_url
else
base_url = nil
end
base_url
end
def gnome_base_url
"http://ftp.gnome.org/pub/gnome/sources"
end
def freedesktop_base_url
"https://www.freedesktop.org/software"
end
def freedesktop_gstreamer_base_url
"https://gstreamer.freedesktop.org/src"
end
def webkitgtk_base_url
"https://webkitgtk.org/releases"
end
def sort_versions(versions)
versions.sort_by do |version|
version.split(".").collect(&:to_i)
end
end
def latest_version_gnome
base_url = "#{gnome_base_url}/#{name}"
minor_versions = []
open(base_url) do |index|
index.read.scan(//) do |content,|
case content
when /href="(\d+(?:\.\d+)*)\/?"/
minor_version = $1
next if development_minor_version_gnome?(minor_version)
minor_versions << minor_version
end
end
end
return nil if minor_versions.empty?
latest_minor_version = sort_versions(minor_versions).last
versions = []
open("#{base_url}/#{latest_minor_version}") do |index|
index.read.scan(//) do |content,|
case content
when /href="#{Regexp.escape(name)}-
(\d+(?:\.\d+)*)
\.tar\.#{Regexp.escape(compression_method)}"/x
versions << $1
end
end
end
sort_versions(versions).last
end
def development_minor_version_gnome?(minor_version)
minor_version.split(".").last.to_i.odd?
end
def latest_version_freedesktop
base_url = "#{freedesktop_base_url}/#{name}/release"
versions = []
open(base_url) do |index|
index.read.scan(//) do |content,|
case content
when /href="#{Regexp.escape(name)}-
(\d+(?:\.\d+)*)
\.tar\.#{Regexp.escape(compression_method)}"/x
versions << $1
end
end
end
sort_versions(versions).last
end
def latest_version_freedesktop_gstreamer
base_url = "#{freedesktop_gstreamer_base_url}/#{name}"
versions = []
open(base_url) do |index|
index.read.scan(//) do |content,|
case content
when /href="#{Regexp.escape(name)}-
(\d+(?:\.\d+)*)
\.tar\.#{Regexp.escape(compression_method)}"/x
version = $1
next if development_version_freedesktop_gstreamer?(version)
versions << version
end
end
end
sort_versions(versions).last
end
def development_version_freedesktop_gstreamer?(version)
version.split(".")[1].to_i.odd?
end
def latest_version_webkitgtk
base_url = webkitgtk_base_url
versions = []
open(base_url) do |index|
index.read.scan(//) do |content,|
case content
when /href="#{Regexp.escape(name)}-
(\d+(?:\.\d+)*)
\.tar\.#{Regexp.escape(compression_method)}"/x
versions << $1
end
end
end
sort_versions(versions).last
end
class WindowsConfiguration < Struct.new(:build,
:include_paths,
:library_paths,
:configure_args,
:cmake_args,
:cc_args,
:patches,
:built_file,
:need_autogen,
:need_autoreconf,
:build_concurrently,
:use_cc_environment_variable,
:gobject_introspection_compiler_split_args,
:use_gobject_introspection)
def initialize(properties)
super()
properties.each do |key, value|
send("#{key}=", value)
end
end
def build?
build.nil? ? true : build
end
def include_paths
super || []
end
def library_paths
super || []
end
def configure_args
super || []
end
def cmake_args
super || []
end
def cc_args
super || []
end
def patches
super || []
end
def built_file
super || nil
end
def need_autogen?
need_autogen.nil? ? false : need_autogen
end
def need_autoreconf?
need_autoreconf.nil? ? false : need_autoreconf
end
def build_concurrently?
build_concurrently.nil? ? true : build_concurrently
end
def use_cc_environment_variable?
use_cc_environment_variable.nil? ? true : use_cc_environment_variable
end
def gobject_introspection_compiler_split_args?
gobject_introspection_compiler_split_args
end
def use_gobject_introspection?
use_gobject_introspection.nil? ? true : use_gobject_introspection
end
end
class NativeConfiguration < Struct.new(:build,
:configure_args,
:patches,
:built_file,
:need_autogen,
:need_autoreconf,
:build_concurrently)
def initialize(properties)
super()
properties.each do |key, value|
send("#{key}=", value)
end
end
def build?
build.nil? ? false : build
end
def configure_args
super || []
end
def patches
super || []
end
def built_file
super || nil
end
def need_autogen?
need_autogen.nil? ? false : need_autogen
end
def need_autoreconf?
need_autoreconf.nil? ? false : need_autoreconf
end
def build_concurrently?
build_concurrently.nil? ? true : build_concurrently
end
end
end
end
end