Archived
3
0

Initial, primitive APK support.

This commit is contained in:
Luka Vandervelden 2019-07-03 05:23:48 +02:00
parent 3d08c7ecff
commit 77632f59ab
5 changed files with 104 additions and 6 deletions

35
assemble-apk.sh Executable file
View 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

View File

@ -1,4 +1,20 @@
# FIXME: Where should this go? We cant 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 itll 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 shouldnt 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)

View File

@ -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."

View File

@ -1,6 +1,6 @@
class Package::Package class Package::Package
@recipe : Recipe getter recipe : Recipe
def initialize(@recipe) def initialize(@recipe)
end end

View File

@ -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