def input(package)
require "net/http"
require "json"
if File.exist?(package)
moduledir = package
result = {}
else
result = search(package)
tarball = download(result, version)
moduledir = unpack(tarball)
end
if File.exist?(File.join(moduledir, "META.json"))
local_metadata = JSON.parse(File.read(File.join(moduledir, ("META.json"))))
elsif File.exist?(File.join(moduledir, ("META.yml")))
require "yaml"
local_metadata = YAML.load_file(File.join(moduledir, ("META.yml")))
elsif File.exist?(File.join(moduledir, "MYMETA.json"))
local_metadata = JSON.parse(File.read(File.join(moduledir, ("MYMETA.json"))))
elsif File.exist?(File.join(moduledir, ("MYMETA.yml")))
require "yaml"
local_metadata = YAML.load_file(File.join(moduledir, ("MYMETA.yml")))
end
metadata = result.merge(local_metadata || {})
if metadata.empty?
raise FPM::InvalidPackageConfiguration,
"Could not find package metadata. Checked for META.json, META.yml, and MetaCPAN API data"
end
self.version = metadata["version"]
self.description = metadata["abstract"]
self.license = case metadata["license"]
when Array; metadata["license"].first
when nil; "unknown"
else; metadata["license"]
end
unless metadata["distribution"].nil?
logger.info("Setting package name from 'distribution'",
:distribution => metadata["distribution"])
self.name = fix_name(metadata["distribution"])
else
logger.info("Setting package name from 'name'",
:name => metadata["name"])
self.name = fix_name(metadata["name"])
end
unless metadata["module"].nil?
metadata["module"].each do |m|
self.provides << cap_name(m["name"]) + " = #{self.version}"
end
end
self.vendor = case metadata["author"]
when String; metadata["author"]
when Array; metadata["author"].join(", ")
else
raise FPM::InvalidPackageConfiguration, "Unexpected CPAN 'author' field type: #{metadata["author"].class}. This is a bug."
end if metadata.include?("author")
self.url = metadata["resources"]["homepage"] rescue "unknown"
self.architecture = "all"
logger.info("Installing any build or configure dependencies")
if attributes[:cpan_sandbox_non_core?]
cpanm_flags = ["-L", build_path("cpan"), moduledir]
else
cpanm_flags = ["-l", build_path("cpan"), moduledir]
end
cpanm_flags += ["--installdeps"]
cpanm_flags += ["-n"] if !attributes[:cpan_test?]
cpanm_flags += ["--mirror", "#{attributes[:cpan_mirror]}"] if !attributes[:cpan_mirror].nil?
cpanm_flags += ["--mirror-only"] if attributes[:cpan_mirror_only?] && !attributes[:cpan_mirror].nil?
cpanm_flags += ["--force"] if attributes[:cpan_cpanm_force?]
safesystem(attributes[:cpan_cpanm_bin], *cpanm_flags)
if !attributes[:no_auto_depends?]
found_dependencies = {}
if metadata["requires"]
found_dependencies.merge!(metadata["requires"])
end
if metadata["prereqs"]
if metadata["prereqs"]["runtime"]
if metadata["prereqs"]["runtime"]["requires"]
found_dependencies.merge!(metadata["prereqs"]["runtime"]["requires"])
end
end
end
unless found_dependencies.empty?
found_dependencies.each do |dep_name, version|
if dep_name == "perl"
m = version.match(/^(\d)\.(\d{3})(\d{3})$/)
if m
version = m[1] + '.' + m[2].sub(/^0*/, '') + '.' + m[3].sub(/^0*/, '')
end
self.dependencies << "#{dep_name} >= #{version}"
next
end
dep = search(dep_name)
name = cap_name(dep_name)
if version.to_s == "0"
self.dependencies << "#{name}"
else
if version.is_a?(String)
version.split(/\s*,\s*/).each do |v|
if v =~ /\s*[><=]/
self.dependencies << "#{name} #{v}"
else
self.dependencies << "#{name} >= #{v}"
end
end
else
self.dependencies << "#{name} >= #{version}"
end
end
end
end
end
::Dir.chdir(moduledir) do
prefix = attributes[:prefix] || "/usr/local"
if File.exist?("Build.PL")
safesystem(attributes[:cpan_perl_bin],
"-Mlocal::lib=#{build_path("cpan")}",
"Build.PL")
safesystem(attributes[:cpan_perl_bin],
"-Mlocal::lib=#{build_path("cpan")}",
"./Build")
if attributes[:cpan_test?]
safesystem(attributes[:cpan_perl_bin],
"-Mlocal::lib=#{build_path("cpan")}",
"./Build", "test")
end
if attributes[:cpan_perl_lib_path]
perl_lib_path = attributes[:cpan_perl_lib_path]
safesystem("./Build install --install_path lib=#{perl_lib_path} \
--destdir #{staging_path} --prefix #{prefix} --destdir #{staging_path}")
else
safesystem("./Build", "install",
"--prefix", prefix, "--destdir", staging_path,
"--install_base", "")
end
elsif File.exist?("Makefile.PL")
if attributes[:cpan_perl_lib_path]
perl_lib_path = attributes[:cpan_perl_lib_path]
safesystem(attributes[:cpan_perl_bin],
"-Mlocal::lib=#{build_path("cpan")}",
"Makefile.PL", "PREFIX=#{prefix}", "LIB=#{perl_lib_path}",
"INSTALL_BASE=")
else
safesystem(attributes[:cpan_perl_bin],
"-Mlocal::lib=#{build_path("cpan")}",
"Makefile.PL", "PREFIX=#{prefix}",
"INSTALL_BASE=")
end
if attributes[:cpan_test?]
make = [ "env", "PERL5LIB=#{build_path("cpan/lib/perl5")}", "make" ]
else
make = [ "make" ]
end
safesystem(*make)
safesystem(*(make + ["test"])) if attributes[:cpan_test?]
safesystem(*(make + ["DESTDIR=#{staging_path}", "install"]))
else
raise FPM::InvalidPackageConfiguration,
"I don't know how to build #{name}. No Makefile.PL nor " \
"Build.PL found"
end
glob_prefix = attributes[:cpan_perl_lib_path] || prefix
::Dir.glob(File.join(staging_path, glob_prefix, "**/perllocal.pod")).each do |path|
logger.debug("Removing useless file.",
:path => path.gsub(staging_path, ""))
File.unlink(path)
end
::Dir.glob(File.join(staging_path, glob_prefix, "**/.packlist")).each do |path|
logger.debug("Removing useless file.",
:path => path.gsub(staging_path, ""))
File.unlink(path)
Pathname.new(path).parent.ascend do |parent|
if ::Dir.entries(parent).sort == ['.', '..'].sort
FileUtils.rmdir parent
else
break
end
end
end
end
self.architecture = "all"
Find.find(staging_path) do |path|
if path =~ /\.so$/
logger.info("Found shared library, setting architecture=native",
:path => path)
self.architecture = "native"
end
end
end