mirror of
https://github.com/jordansissel/fpm
synced 2025-04-29 14:58:00 +02:00
copy of Jordan's prototype (1967)
This commit is contained in:
parent
31506109ff
commit
673474f8bd
243
lib/fpm/package/srpm.rb
Normal file
243
lib/fpm/package/srpm.rb
Normal file
@ -0,0 +1,243 @@
|
||||
require "fpm/namespace"
|
||||
require "fpm/package"
|
||||
require "fpm/errors"
|
||||
require "fpm/util"
|
||||
|
||||
# For handling conversion
|
||||
require "fpm/package/cpan"
|
||||
|
||||
class FPM::Package::SRPM < FPM::Package
|
||||
def output(output_path)
|
||||
source_archive = ::Dir.glob(build_path("*")).select(&File.method(:file?)).first
|
||||
source_archive_dirname = `tar -ztf #{Shellwords.escape(source_archive)}` \
|
||||
.split("\n").map { |path| path.split("/").first }.uniq.first
|
||||
|
||||
# Generate an rpm spec with Source0: <source_archive>
|
||||
rpmspec = template("srpm.erb").result(binding)
|
||||
|
||||
# Copied from rpm.rb ---
|
||||
%w(BUILD RPMS SRPMS SOURCES SPECS).each { |d| FileUtils.mkdir_p(build_path(d)) }
|
||||
args = ["rpmbuild", "-bs"]
|
||||
|
||||
if %x{uname -m}.chomp != self.architecture
|
||||
rpm_target = self.architecture
|
||||
end
|
||||
|
||||
# issue #309
|
||||
if !attributes[:rpm_os].nil?
|
||||
rpm_target = "#{architecture}-unknown-#{attributes[:rpm_os]}"
|
||||
end
|
||||
|
||||
# issue #707
|
||||
if !rpm_target.nil?
|
||||
args += ["--target", rpm_target]
|
||||
end
|
||||
|
||||
# set the rpm dist tag
|
||||
args += ["--define", "dist .#{attributes[:rpm_dist]}"] if attributes[:rpm_dist]
|
||||
|
||||
args += [
|
||||
"--define", "buildroot #{build_path}/BUILD",
|
||||
"--define", "_topdir #{build_path}",
|
||||
"--define", "_sourcedir #{build_path}",
|
||||
"--define", "_rpmdir #{build_path}/RPMS",
|
||||
"--define", "_tmppath #{attributes[:workdir]}"
|
||||
]
|
||||
|
||||
args += ["--sign"] if attributes[:rpm_sign?]
|
||||
|
||||
if attributes[:rpm_auto_add_directories?]
|
||||
fs_dirs_list = File.join(template_dir, "rpm", "filesystem_list")
|
||||
fs_dirs = File.readlines(fs_dirs_list).reject { |x| x =~ /^\s*#/}.map { |x| x.chomp }
|
||||
fs_dirs.concat((attributes[:auto_add_exclude_directories] or []))
|
||||
|
||||
Find.find(staging_path) do |path|
|
||||
next if path == staging_path
|
||||
if File.directory? path and !File.symlink? path
|
||||
add_path = path.gsub(/^#{staging_path}/,'')
|
||||
self.directories << add_path if not fs_dirs.include? add_path
|
||||
end
|
||||
end
|
||||
else
|
||||
self.directories = self.directories.map { |x| self.prefixed_path(x) }
|
||||
alldirs = []
|
||||
self.directories.each do |path|
|
||||
Find.find(File.join(staging_path, path)) do |subpath|
|
||||
if File.directory? subpath and !File.symlink? subpath
|
||||
alldirs << subpath.gsub(/^#{staging_path}/, '')
|
||||
end
|
||||
end
|
||||
end
|
||||
self.directories = alldirs
|
||||
end
|
||||
|
||||
# include external config files
|
||||
(attributes[:config_files] or []).each do |conf|
|
||||
dest_conf = File.join(staging_path, conf)
|
||||
|
||||
if File.exist?(dest_conf)
|
||||
logger.debug("Using --config-file from staging area", :path => conf)
|
||||
elsif File.exist?(conf)
|
||||
logger.info("Copying --config-file from local path", :path => conf)
|
||||
FileUtils.mkdir_p(File.dirname(dest_conf))
|
||||
FileUtils.cp_r conf, dest_conf
|
||||
else
|
||||
logger.error("Failed to find given --config-file", :path => conf)
|
||||
raise "Could not find config file '#{conf}' in staging area or on host. This can happen if you specify `--config-file '#{conf}'` but this file does not exist in the source package and also does not exist in filesystem."
|
||||
end
|
||||
end
|
||||
|
||||
# scan all conf file paths for files and add them
|
||||
allconfigs = []
|
||||
self.config_files.each do |path|
|
||||
cfg_path = File.join(staging_path, path)
|
||||
raise "Config file path #{cfg_path} does not exist" unless File.exist?(cfg_path)
|
||||
Find.find(cfg_path) do |p|
|
||||
allconfigs << p.gsub("#{staging_path}/", '') if File.file? p
|
||||
end
|
||||
end
|
||||
allconfigs.sort!.uniq!
|
||||
|
||||
self.config_files = allconfigs.map { |x| File.join("/", x) }
|
||||
|
||||
# add init script if present
|
||||
(attributes[:rpm_init_list] or []).each do |init|
|
||||
name = File.basename(init, ".init")
|
||||
dest_init = File.join(staging_path, "etc/init.d/#{name}")
|
||||
FileUtils.mkdir_p(File.dirname(dest_init))
|
||||
FileUtils.cp init, dest_init
|
||||
File.chmod(0755, dest_init)
|
||||
end
|
||||
|
||||
(attributes[:rpm_rpmbuild_define] or []).each do |define|
|
||||
args += ["--define", define]
|
||||
end
|
||||
|
||||
# copy all files from staging to BUILD dir
|
||||
# [#1538] Be sure to preserve the original timestamps.
|
||||
Find.find(staging_path) do |path|
|
||||
src = path.gsub(/^#{staging_path}/, '')
|
||||
dst = File.join(build_path, "BUILD", src)
|
||||
copy_entry(path, dst, preserve=true)
|
||||
end
|
||||
|
||||
specfile = File.join(build_path("SPECS"), "#{name}.spec")
|
||||
File.write(specfile, rpmspec)
|
||||
|
||||
edit_file(specfile) if attributes[:edit?]
|
||||
|
||||
args << specfile
|
||||
|
||||
logger.info("Running rpmbuild", :args => args)
|
||||
safesystem(*args)
|
||||
|
||||
::Dir["#{build_path}/SRPMS/**/*.rpm"].each do |rpmpath|
|
||||
# This should only output one rpm, should we verify this?
|
||||
FileUtils.cp(rpmpath, output_path)
|
||||
end
|
||||
end
|
||||
|
||||
def converted_from(origin)
|
||||
if origin == FPM::Package::CPAN
|
||||
# Fun hack to find the instance of the origin class
|
||||
# So we can find the build_path
|
||||
input = nil
|
||||
ObjectSpace.each_object { |x| input = x if x.is_a?(origin) }
|
||||
if input.nil?
|
||||
raise "Something bad happened. Couldn't find origin package in memory? This is a bug."
|
||||
end
|
||||
|
||||
# Pick the first file found, should be a tarball.
|
||||
source_archive = ::Dir.glob(File.join(input.build_path, "*")).select(&File.method(:file?)).first
|
||||
#FileUtils.copy_entry(source_archive, build_path)
|
||||
File.link(source_archive, build_path(File.basename(source_archive)))
|
||||
#FileUtils.copy_entry(source_archive, build_path)
|
||||
end
|
||||
end
|
||||
|
||||
def summary
|
||||
if !attributes[:rpm_summary]
|
||||
return @description.split("\n").find { |line| !line.strip.empty? } || "_"
|
||||
end
|
||||
|
||||
return attributes[:rpm_summary]
|
||||
end # def summary
|
||||
|
||||
def prefix
|
||||
if attributes[:prefix] and attributes[:prefix] != '/'
|
||||
return attributes[:prefix].chomp('/')
|
||||
else
|
||||
return "/"
|
||||
end
|
||||
end # def prefix
|
||||
|
||||
def to_s(format=nil)
|
||||
if format.nil?
|
||||
format = if attributes[:rpm_dist]
|
||||
"NAME-VERSION-ITERATION.DIST.src.rpm"
|
||||
else
|
||||
"NAME-VERSION-ITERATION.src.rpm"
|
||||
end
|
||||
end
|
||||
return super(format.gsub("DIST", to_s_dist))
|
||||
end # def to_s
|
||||
|
||||
def to_s_dist
|
||||
attributes[:rpm_dist] ? "#{attributes[:rpm_dist]}" : "DIST";
|
||||
end
|
||||
|
||||
# This method ensures a default value for iteration if none is provided.
|
||||
def iteration
|
||||
if @iteration.kind_of?(String) and @iteration.include?("-")
|
||||
logger.warn("Package iteration '#{@iteration}' includes dashes, converting" \
|
||||
" to underscores. rpmbuild does not allow the dashes in the package iteration (called 'Release' in rpm)")
|
||||
@iteration = @iteration.gsub(/-/, "_")
|
||||
end
|
||||
|
||||
return @iteration ? @iteration : 1
|
||||
end # def iteration
|
||||
|
||||
def version
|
||||
if @version.kind_of?(String) and @version.include?("-")
|
||||
logger.warn("Package version '#{@version}' includes dashes, converting" \
|
||||
" to underscores")
|
||||
@version = @version.gsub(/-/, "_")
|
||||
end
|
||||
|
||||
return @version
|
||||
end
|
||||
|
||||
# The default epoch value must be nil, see #381
|
||||
def epoch
|
||||
return @epoch if @epoch.is_a?(Numeric)
|
||||
|
||||
if @epoch.nil? or @epoch.empty?
|
||||
return nil
|
||||
end
|
||||
|
||||
return @epoch
|
||||
end # def epoch
|
||||
|
||||
# Handle any architecture naming conversions.
|
||||
# For example, debian calls amd64 what redhat calls x86_64, this
|
||||
# method fixes those types of things.
|
||||
def architecture
|
||||
case @architecture
|
||||
when nil
|
||||
return %x{uname -m}.chomp # default to current arch
|
||||
when "amd64" # debian and redhat disagree on architecture names
|
||||
return "x86_64"
|
||||
when "arm64" # debian and redhat disagree on architecture names
|
||||
return "aarch64"
|
||||
when "native"
|
||||
return %x{uname -m}.chomp # 'native' is current arch
|
||||
when "all"
|
||||
# Translate fpm "all" arch to what it means in RPM.
|
||||
return "noarch"
|
||||
else
|
||||
return @architecture
|
||||
end
|
||||
end # def architecture
|
||||
|
||||
public(:output)
|
||||
end # class FPM::Target::Deb
|
233
templates/srpm.erb
Normal file
233
templates/srpm.erb
Normal file
@ -0,0 +1,233 @@
|
||||
# Hello packaging friend!
|
||||
|
||||
# Allow building noarch packages that contain binaries
|
||||
%define _binaries_in_noarch_packages_terminate_build 0
|
||||
|
||||
<% (attributes[:rpm_filter_from_requires] or []).each do |reqfilter| -%>
|
||||
%filter_from_requires <%= reqfilter %>
|
||||
<% end -%>
|
||||
<% (attributes[:rpm_filter_from_provides] or []).each do |provfilter| -%>
|
||||
%filter_from_provides <%= provfilter %>
|
||||
<% end -%>
|
||||
<% if !(attributes[:rpm_filter_from_requires] or []).empty? or !(attributes[:rpm_filter_from_provides] or []).empty?-%>
|
||||
%filter_setup
|
||||
<% end -%>
|
||||
|
||||
Name: <%= name %>
|
||||
Version: <%= version %>
|
||||
<% if epoch -%>
|
||||
Epoch: <%= epoch %>
|
||||
<% end -%>
|
||||
Release: <%= iteration or 1 %><%= "%{?dist}" if attributes[:rpm_dist] %>
|
||||
<%# use the first line of the description as the summary -%>
|
||||
Summary: <%= summary %>
|
||||
<% if !attributes[:rpm_autoreqprov?] -%>
|
||||
AutoReqProv: no
|
||||
<% else -%>
|
||||
AutoReqProv: yes
|
||||
<% end -%>
|
||||
<% if attributes[:rpm_autoreq?] -%>
|
||||
AutoReq: yes
|
||||
<% end -%>
|
||||
<% if attributes[:rpm_autoprov?] -%>
|
||||
AutoProv: yes
|
||||
<% end -%>
|
||||
# Seems specifying BuildRoot is required on older rpmbuild (like on CentOS 5)
|
||||
# fpm passes '--define buildroot ...' on the commandline, so just reuse that.
|
||||
BuildRoot: %buildroot
|
||||
<% if !prefix.nil? and !prefix.empty? %>
|
||||
Prefix: <%= prefix %>
|
||||
<% end -%>
|
||||
|
||||
Group: <%= category %>
|
||||
<%# Sometimes the 'license' field has multiple lines... Hack around it.
|
||||
# While technically yes this means we are 'modifying' the license,
|
||||
# since the job of FPM is to get shit done and that this is only
|
||||
# modifying whitespace, it should be reasonably OK. -%>
|
||||
License: <%= license.gsub("\n", " ") %>
|
||||
<% if !vendor.nil? and !vendor.empty? -%>
|
||||
Vendor: <%= vendor %>
|
||||
<% end -%>
|
||||
<% if !url.nil? and !url.empty? -%>
|
||||
URL: <%= url %>
|
||||
<%else -%>
|
||||
URL: http://nourlgiven.example.com/
|
||||
<% end -%>
|
||||
Packager: <%= maintainer %>
|
||||
|
||||
Source0: <%= source_archive %>
|
||||
|
||||
<% if !attributes[:no_depends?] -%>
|
||||
<% dependencies.each do |req| -%>
|
||||
Requires: <%= req %>
|
||||
<% end -%>
|
||||
<% (attributes[:rpm_tag] or []).each do |tag| -%>
|
||||
<%= tag %>
|
||||
<% end -%>
|
||||
<% end -%>
|
||||
<% provides.each do |prov| -%>
|
||||
Provides: <%= prov %>
|
||||
<% end -%>
|
||||
<% conflicts.each do |conflict| -%>
|
||||
Conflicts: <%= conflict %>
|
||||
<% end -%>
|
||||
<% replaces.each do |repl| -%>
|
||||
<%# The closes equivalent in RPM to "replaces" is "Obsoletes" -%>
|
||||
Obsoletes: <%= repl %>
|
||||
<% end -%>
|
||||
<%# rpm rejects descriptions with blank lines (even between content), so hack
|
||||
around it by replacing blank lines with ' .' -%>
|
||||
%description
|
||||
<%= description.gsub(/^\s*$/, " .") %>
|
||||
|
||||
%prep
|
||||
%autosetup -n <%= source_archive_dirname %>
|
||||
|
||||
%build
|
||||
mkdir -p ./cpan
|
||||
cpanm -L ./cpan . --installdeps
|
||||
|
||||
perl Makefile.PL
|
||||
make
|
||||
|
||||
%install
|
||||
%make_install
|
||||
|
||||
<%# This next section puts any %pre, %post, %preun, %postun, %verifyscript, %pretrans or %posttrans scripts %>
|
||||
<%
|
||||
scriptmap = {
|
||||
:rpm_verifyscript => "verifyscript",
|
||||
:rpm_posttrans => "posttrans",
|
||||
:rpm_pretrans => "pretrans"
|
||||
}
|
||||
-%>
|
||||
<% if script?(:before_upgrade) or script?(:after_upgrade) -%>
|
||||
<% if script?(:before_upgrade) or script?(:before_install) -%>
|
||||
%pre <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end %>
|
||||
upgrade() {
|
||||
<%# Making sure that at least one command is in the function -%>
|
||||
<%# avoids a lot of potential errors, including the case that -%>
|
||||
<%# the script is non-empty, but just whitespace and/or comments -%>
|
||||
:
|
||||
<% if script?(:before_upgrade) -%>
|
||||
<%= script(:before_upgrade) %>
|
||||
<% end -%>
|
||||
}
|
||||
_install() {
|
||||
<%# Making sure that at least one command is in the function -%>
|
||||
<%# avoids a lot of potential errors, including the case that -%>
|
||||
<%# the script is non-empty, but just whitespace and/or comments -%>
|
||||
:
|
||||
<% if script?(:before_install) -%>
|
||||
<%= script(:before_install) %>
|
||||
<% end -%>
|
||||
}
|
||||
if [ "${1}" -eq 1 ]
|
||||
then
|
||||
# "before install" goes here
|
||||
_install
|
||||
elif [ "${1}" -gt 1 ]
|
||||
then
|
||||
# "before upgrade" goes here
|
||||
upgrade
|
||||
fi
|
||||
<% end -%>
|
||||
<% if script?(:after_upgrade) or script?(:after_install) -%>
|
||||
%post <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end %>
|
||||
upgrade() {
|
||||
<%# Making sure that at least one command is in the function -%>
|
||||
<%# avoids a lot of potential errors, including the case that -%>
|
||||
<%# the script is non-empty, but just whitespace and/or comments -%>
|
||||
:
|
||||
<% if script?(:after_upgrade) -%>
|
||||
<%= script(:after_upgrade) %>
|
||||
<% end -%>
|
||||
}
|
||||
_install() {
|
||||
<%# Making sure that at least one command is in the function -%>
|
||||
<%# avoids a lot of potential errors, including the case that -%>
|
||||
<%# the script is non-empty, but just whitespace and/or comments -%>
|
||||
:
|
||||
<% if script?(:after_install) -%>
|
||||
<%= script(:after_install) %>
|
||||
<% end -%>
|
||||
}
|
||||
if [ "${1}" -eq 1 ]
|
||||
then
|
||||
# "after install" goes here
|
||||
_install
|
||||
elif [ "${1}" -gt 1 ]
|
||||
then
|
||||
# "after upgrade" goes here
|
||||
upgrade
|
||||
fi
|
||||
<% end -%>
|
||||
<% if script?(:before_remove) -%>
|
||||
%preun <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end %>
|
||||
if [ "${1}" -eq 0 ]
|
||||
then
|
||||
<%# Making sure that at least one command is in the function -%>
|
||||
<%# avoids a lot of potential errors, including the case that -%>
|
||||
<%# the script is non-empty, but just whitespace and/or comments -%>
|
||||
:
|
||||
<%= script(:before_remove) %>
|
||||
fi
|
||||
<% end -%>
|
||||
<% if script?(:after_remove) -%>
|
||||
%postun <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end %>
|
||||
if [ "${1}" -eq 0 ]
|
||||
then
|
||||
<%# Making sure that at least one command is in the function -%>
|
||||
<%# avoids a lot of potential errors, including the case that -%>
|
||||
<%# the script is non-empty, but just whitespace and/or comments -%>
|
||||
:
|
||||
<%= script(:after_remove) %>
|
||||
fi
|
||||
<% end -%>
|
||||
<% else
|
||||
other_scriptmap = {
|
||||
:before_install => "pre",
|
||||
:after_install => "post",
|
||||
:before_remove => "preun",
|
||||
:after_remove => "postun"
|
||||
}
|
||||
scriptmap.merge!(other_scriptmap)
|
||||
end
|
||||
-%>
|
||||
<% scriptmap.each do |name, rpmname| -%>
|
||||
<% if script?(name) -%>
|
||||
%<%= rpmname -%> <%= ' -e' if attributes[:rpm_macro_expansion?] %>
|
||||
<%= script(name) %>
|
||||
<% end -%>
|
||||
<% end -%>
|
||||
|
||||
<%# This section adds any triggers, as ordered in the command line -%>
|
||||
<%
|
||||
triggermap = {
|
||||
:before_install => "prein",
|
||||
:after_install => "in",
|
||||
:before_uninstall => "un",
|
||||
:after_target_uninstall => "postun"
|
||||
}
|
||||
triggermap.each do |name, rpmtype|
|
||||
(attributes["rpm_trigger_#{name}".to_sym] or []).each do |trigger_name, trigger_script, trigger_scriptprog| -%>
|
||||
%trigger<%= rpmtype -%> <%= trigger_scriptprog -%> -- <%= trigger_name %>
|
||||
<%= trigger_script %>
|
||||
<% end -%>
|
||||
<% end -%>
|
||||
|
||||
%files
|
||||
%defattr(<%= attributes[:rpm_defattrfile] %>,<%= attributes[:rpm_user] || "root" %>,<%= attributes[:rpm_group] || "root" %>,<%= attributes[:rpm_defattrdir] %>)
|
||||
<%# Output config files and then regular files. -%>
|
||||
<% config_files.each do |path| -%>
|
||||
%config(noreplace) <%= rpm_file_entry(path) %>
|
||||
<% end -%>
|
||||
<%# list directories %>
|
||||
<% directories.each do |path| -%>
|
||||
%dir <%= rpm_file_entry(path) %>
|
||||
<% end -%>
|
||||
<%# list only files, not directories? -%>
|
||||
/
|
||||
|
||||
%changelog
|
||||
<%= attributes[:rpm_changelog] %>
|
Loading…
Reference in New Issue
Block a user