Initial, primitive APK support.
This commit is contained in:
parent
3d08c7ecff
commit
77632f59ab
35
assemble-apk.sh
Executable file
35
assemble-apk.sh
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/zsh
|
||||||
|
|
||||||
|
# This script transforms the current directory into a full-blown apk package.
|
||||||
|
# It still requires a .PKGINFO file though.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Output package name.
|
||||||
|
apk="$1"
|
||||||
|
|
||||||
|
# data.tar.gz
|
||||||
|
echo "Compressing data..."
|
||||||
|
set -- *
|
||||||
|
|
||||||
|
tar --xattrs -f - -c * | \
|
||||||
|
abuild-tar --hash | \
|
||||||
|
gzip -9 > data.tar.gz
|
||||||
|
|
||||||
|
echo "Create checksum..."
|
||||||
|
# append the hash for data.tar.gz
|
||||||
|
local sha256=$(sha256sum data.tar.gz | cut -f1 -d' ')
|
||||||
|
echo "datahash = $sha256" >> .PKGINFO
|
||||||
|
|
||||||
|
# control.tar.gz
|
||||||
|
cd "$dir"
|
||||||
|
metafiles=.PKGINFO
|
||||||
|
[ -f .metafiles ] && metafiles=$(cat .metafiles)
|
||||||
|
|
||||||
|
tar -f - -c ${metafiles[@]} | abuild-tar --cut \
|
||||||
|
| gzip -9 > control.tar.gz
|
||||||
|
#abuild-sign -q control.tar.gz || exit 1
|
||||||
|
|
||||||
|
echo "Create $apk"
|
||||||
|
cat control.tar.gz data.tar.gz > $apk
|
||||||
|
|
@ -1,4 +1,20 @@
|
|||||||
|
|
||||||
|
# FIXME: Where should this go? We can’t just leave it here. :(
|
||||||
|
def pkginfo(package)
|
||||||
|
du = `du -sk #{package.fake_root_directory}`
|
||||||
|
size = du.sub(/[ \t].*/, "").to_i * 1024
|
||||||
|
|
||||||
|
%{ # Generated by `package`.
|
||||||
|
pkgname = #{package.name}
|
||||||
|
pkgver = #{package.version}-r#{package.release}
|
||||||
|
url = #{package.url || ""}
|
||||||
|
size = #{size}
|
||||||
|
origin = #{package.recipe.name}
|
||||||
|
buildtype = host
|
||||||
|
builddate = #{Time.utc.to_unix}
|
||||||
|
}.gsub /^ */m, ""
|
||||||
|
end
|
||||||
|
|
||||||
class Package::Backend::Packaging
|
class Package::Backend::Packaging
|
||||||
getter name : String
|
getter name : String
|
||||||
|
|
||||||
@ -19,14 +35,40 @@ class Package::Context
|
|||||||
getter packaging_backends = [] of Backend::Packaging
|
getter packaging_backends = [] of Backend::Packaging
|
||||||
getter building_backends = [] of Backend::Building
|
getter building_backends = [] of Backend::Building
|
||||||
|
|
||||||
|
# Well, this will need configuration, auto-detection and conversion,
|
||||||
|
# but it’ll be kind of enough for now.
|
||||||
|
property architecture = "x86_64"
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@packaging_backends << Backend::Packaging.new "pkgutils" do |package|
|
@packaging_backends << Backend::Packaging.new "pkgutils" do |package|
|
||||||
puts "#{package.fake_root_directory} -> #{packages_directory}/#{package.name}##{package.version}.pkg.tar.xz"
|
puts "#{package.fake_root_directory} -> #{packages_directory}/#{package.name}##{package.version}-#{package.release}.pkg.tar.xz"
|
||||||
pp! r = run package.fake_root_directory, "tar", ["cJf", "#{packages_directory}/#{package.name}##{package.version}.pkg.tar.xz", "."]
|
pp! r = run package.fake_root_directory, "tar", ["cJf", "#{packages_directory}/#{package.name}##{package.version}.pkg.tar.xz", "."]
|
||||||
|
|
||||||
r.exit_status == 0
|
r.exit_status == 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@packaging_backends << Backend::Packaging.new "apk" do |package|
|
||||||
|
# FIXME: This needs to have access to architecture (from Context?)
|
||||||
|
# to work properly.
|
||||||
|
old_cwd = Dir.current
|
||||||
|
|
||||||
|
puts "#{package.fake_root_directory} -> #{packages_directory}/#{package.name}-#{package.version}-r#{package.release}.apk"
|
||||||
|
|
||||||
|
run package.fake_root_directory, "find", [".."]
|
||||||
|
|
||||||
|
puts pkginfo package
|
||||||
|
File.write "#{package.fake_root_directory}/.PKGINFO", pkginfo package
|
||||||
|
|
||||||
|
# Create data.tar.gz here.
|
||||||
|
package_target = "#{packages_directory}/#{package.name}-#{package.version}-r#{package.release}.apk"
|
||||||
|
# FIXME: This shouldn’t have to be in users’ PATH. libexec?
|
||||||
|
r = run package.fake_root_directory, "assemble-apk.sh", [
|
||||||
|
package_target
|
||||||
|
]
|
||||||
|
|
||||||
|
r.exit_status == 0
|
||||||
|
end
|
||||||
|
|
||||||
@selected_packaging_backend = @packaging_backends[0]
|
@selected_packaging_backend = @packaging_backends[0]
|
||||||
|
|
||||||
@building_backends << Backend::Building.new "configure", "autotools" do |context, recipe|
|
@building_backends << Backend::Building.new "configure", "autotools" do |context, recipe|
|
||||||
@ -60,6 +102,22 @@ class Package::Context
|
|||||||
BuildStatus::Failed
|
BuildStatus::Failed
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@building_backends << Backend::Building.new "install", "make" do |context, recipe|
|
||||||
|
Dir.cd recipe.dirname
|
||||||
|
|
||||||
|
unless File.exists? "Makefile"
|
||||||
|
next BuildStatus::Pass
|
||||||
|
end
|
||||||
|
|
||||||
|
child = context.run "make", ["install", "DESTDIR=#{recipe.fake_root_directory}"]
|
||||||
|
|
||||||
|
if child.exit_status == 0
|
||||||
|
BuildStatus::Success
|
||||||
|
else
|
||||||
|
BuildStatus::Failed
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def packaging_backend=(name : String)
|
def packaging_backend=(name : String)
|
||||||
|
11
src/main.cr
11
src/main.cr
@ -6,15 +6,20 @@ extend Package
|
|||||||
|
|
||||||
# FIXME: recipe.clean? context autoclean?
|
# FIXME: recipe.clean? context autoclean?
|
||||||
Context.new().tap do |context|
|
Context.new().tap do |context|
|
||||||
context.packaging_backend = "pkgutils"
|
context.packaging_backend = "apk"
|
||||||
|
|
||||||
# FIXME: context.new_recipe? context.recipe?
|
# FIXME: context.new_recipe? context.recipe?
|
||||||
Recipe.new(context, "hello", "2.10").tap do |recipe|
|
Recipe.new(context, "hello", "2.10").tap do |recipe|
|
||||||
recipe.sources << "https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz"
|
recipe.sources << "https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz"
|
||||||
|
|
||||||
#recipe.instructions.configure << "cd hello-#{recipe.version} && ./configure"
|
# This is a voluntary mix of automatic and manual build
|
||||||
|
# instructions.
|
||||||
|
# Also, installing in /package makes testing with a real-life
|
||||||
|
# package manager trivial and reduces the damage done in case
|
||||||
|
# of… containment failure. ]:->
|
||||||
|
recipe.instructions.configure << "cd hello-#{recipe.version} && ./configure --prefix=/package"
|
||||||
#recipe.instructions.build << "cd hello-#{recipe.version} && make"
|
#recipe.instructions.build << "cd hello-#{recipe.version} && make"
|
||||||
recipe.instructions.install << "cd hello-#{recipe.version} && make DESTDIR='${PKG}' install"
|
#recipe.instructions.install << "cd hello-#{recipe.version} && make DESTDIR='${PKG}' install"
|
||||||
|
|
||||||
recipe.url = "https://www.gnu.org/software/hello/"
|
recipe.url = "https://www.gnu.org/software/hello/"
|
||||||
recipe.description = "The GNU Hello program produces a familiar, friendly greeting."
|
recipe.description = "The GNU Hello program produces a familiar, friendly greeting."
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
class Package::Package
|
class Package::Package
|
||||||
@recipe : Recipe
|
getter recipe : Recipe
|
||||||
|
|
||||||
def initialize(@recipe)
|
def initialize(@recipe)
|
||||||
end
|
end
|
||||||
|
@ -60,7 +60,7 @@ class Package::Recipe
|
|||||||
end
|
end
|
||||||
|
|
||||||
def working_directory
|
def working_directory
|
||||||
@context.working_directory
|
"#{@context.working_directory}/#{@working_uuid}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def building_directory
|
def building_directory
|
||||||
|
Reference in New Issue
Block a user