ap: initial implementation
ap is a helper script to parse APKBUILD and calculate build time dependencies.
This commit is contained in:
parent
a111620bc8
commit
ce0e95607d
9
Makefile
9
Makefile
@ -7,8 +7,11 @@ sysconfdir ?= /etc
|
|||||||
datadir ?= $(prefix)/share/$(PACKAGE)
|
datadir ?= $(prefix)/share/$(PACKAGE)
|
||||||
abuildrepo ?= ~/.cache/apks
|
abuildrepo ?= ~/.cache/apks
|
||||||
|
|
||||||
|
LUA_VERSION = 5.1
|
||||||
|
LUA_SHAREDIR ?= $(prefix)/share/lua/$(LUA_VERSION)/
|
||||||
|
|
||||||
SCRIPTS := abuild devbuild buildrepo abuild-keygen \
|
SCRIPTS := abuild devbuild buildrepo abuild-keygen \
|
||||||
abuild-sign newapkbuild abump
|
abuild-sign newapkbuild abump ap
|
||||||
USR_BIN_FILES := $(SCRIPTS) abuild-tar
|
USR_BIN_FILES := $(SCRIPTS) abuild-tar
|
||||||
SAMPLES := sample.APKBUILD sample.initd sample.confd \
|
SAMPLES := sample.APKBUILD sample.initd sample.confd \
|
||||||
sample.pre-install sample.post-install
|
sample.pre-install sample.post-install
|
||||||
@ -65,7 +68,7 @@ help:
|
|||||||
@echo "usage: make install [ DESTDIR=<path> ]"
|
@echo "usage: make install [ DESTDIR=<path> ]"
|
||||||
@echo " make dist"
|
@echo " make dist"
|
||||||
|
|
||||||
install: $(USR_BIN_FILES) $(SAMPLES) abuild.conf functions.sh
|
install: $(USR_BIN_FILES) $(SAMPLES) abuild.conf functions.sh aports.lua
|
||||||
mkdir -p $(DESTDIR)/$(prefix)/bin $(DESTDIR)/$(sysconfdir) \
|
mkdir -p $(DESTDIR)/$(prefix)/bin $(DESTDIR)/$(sysconfdir) \
|
||||||
$(DESTDIR)/$(datadir)
|
$(DESTDIR)/$(datadir)
|
||||||
for i in $(USR_BIN_FILES); do\
|
for i in $(USR_BIN_FILES); do\
|
||||||
@ -76,6 +79,8 @@ install: $(USR_BIN_FILES) $(SAMPLES) abuild.conf functions.sh
|
|||||||
fi
|
fi
|
||||||
cp $(SAMPLES) $(DESTDIR)/$(prefix)/share/abuild
|
cp $(SAMPLES) $(DESTDIR)/$(prefix)/share/abuild
|
||||||
cp functions.sh $(DESTDIR)/$(datadir)/
|
cp functions.sh $(DESTDIR)/$(datadir)/
|
||||||
|
mkdir -p $(DESTDIR)$(LUA_SHAREDIR)
|
||||||
|
cp aports.lua $(DESTDIR)$(LUA_SHAREDIR)/
|
||||||
|
|
||||||
dist: $(P).tar.bz2
|
dist: $(P).tar.bz2
|
||||||
|
|
||||||
|
147
ap.in
Executable file
147
ap.in
Executable file
@ -0,0 +1,147 @@
|
|||||||
|
#!/usr/bin/lua
|
||||||
|
|
||||||
|
require("aports")
|
||||||
|
|
||||||
|
-- subcommands -----------------------
|
||||||
|
subcmd = {}
|
||||||
|
subcmd.revdep = {
|
||||||
|
desc = "Print reverse dependencies",
|
||||||
|
usage = "PKG...",
|
||||||
|
run = function(opts)
|
||||||
|
local i
|
||||||
|
local apkdb, rev = aports.init_apkdb(repodirs)
|
||||||
|
for i = 2, #opts do
|
||||||
|
local pkg = opts[i]
|
||||||
|
local _,p
|
||||||
|
for _,p in ipairs(rev[pkg] or {}) do
|
||||||
|
print(p.pkgname)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
subcmd.list = {
|
||||||
|
desc = "Print all packages built from aports tree",
|
||||||
|
usage = "",
|
||||||
|
run = function()
|
||||||
|
local apkdb = aports.init_apkdb(repodirs)
|
||||||
|
local k,v
|
||||||
|
for k,v in pairs(apkdb) do
|
||||||
|
print(k)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
subcmd.recursdeps = {
|
||||||
|
desc = "Recursively print all make dependencies for given packages",
|
||||||
|
usage = "PKG...",
|
||||||
|
run = function (opts)
|
||||||
|
local i
|
||||||
|
local visited = {}
|
||||||
|
local apkdb, rev = aports.init_apkdb(repodirs)
|
||||||
|
function recurs(pn)
|
||||||
|
if pn == nil or visited[pn] or apkdb[pn] == nil then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
visited[pn] = true
|
||||||
|
local i,d, p
|
||||||
|
for i,p in ipairs(apkdb[pn]) do
|
||||||
|
local _, d
|
||||||
|
for _, d in ipairs(p.depends) do
|
||||||
|
recurs(d)
|
||||||
|
end
|
||||||
|
for _, d in ipairs(p.makedepends) do
|
||||||
|
recurs(d)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
print(pn)
|
||||||
|
end
|
||||||
|
for i = 2, #opts do
|
||||||
|
recurs(opts[i])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
subcmd.builddirs = {
|
||||||
|
desc = "Print the build dirs for given packages in build order",
|
||||||
|
usage = "PKG...",
|
||||||
|
run = function(opts)
|
||||||
|
local i, _
|
||||||
|
local visited = {}
|
||||||
|
local dir_visited = {}
|
||||||
|
local apkdb, rev = aports.init_apkdb(repodirs)
|
||||||
|
local to_print = {}
|
||||||
|
function recursdir(pn)
|
||||||
|
if pn == nil or visited[pn] or apkdb[pn] == nil then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
visited[pn] = true
|
||||||
|
local i, p
|
||||||
|
for i,p in pairs(apkdb[pn]) do
|
||||||
|
if not dir_visited[p.dir] then
|
||||||
|
dir_visited[p.dir] = true
|
||||||
|
local _, d
|
||||||
|
for _, d in pairs(p.depends) do
|
||||||
|
recursdir(d)
|
||||||
|
end
|
||||||
|
for _, d in pairs(p.makedepends) do
|
||||||
|
recursdir(d)
|
||||||
|
end
|
||||||
|
if to_print[pn] then
|
||||||
|
print(p.dir)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for i = 2, #opts do
|
||||||
|
to_print[opts[i]] = true
|
||||||
|
end
|
||||||
|
for i = 2, #opts do
|
||||||
|
recursdir(opts[i])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function print_usage()
|
||||||
|
io.write("usage: ap SUBCOMMAND [options]\n\nSubcommands are:\n")
|
||||||
|
local k,v
|
||||||
|
for k in pairs(subcmd) do
|
||||||
|
print(" "..k)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- those should be read from some config file
|
||||||
|
repodirs = {}
|
||||||
|
|
||||||
|
|
||||||
|
-- parse args
|
||||||
|
i = 1
|
||||||
|
opts = {}
|
||||||
|
help = false
|
||||||
|
while i <= #arg do
|
||||||
|
if arg[i] == "-d" then
|
||||||
|
i = i + 1
|
||||||
|
repodirs[#repodirs + 1] = arg[i]
|
||||||
|
elseif arg[i] == "-h" then
|
||||||
|
help = true
|
||||||
|
else
|
||||||
|
opts[#opts + 1] = arg[i]
|
||||||
|
end
|
||||||
|
i = i + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
cmd = opts[1]
|
||||||
|
|
||||||
|
if cmd == nil then
|
||||||
|
print_usage()
|
||||||
|
-- usage
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if subcmd[cmd] and type(subcmd[cmd].run) == "function" then
|
||||||
|
subcmd[cmd].run(opts)
|
||||||
|
else
|
||||||
|
io.stderr:write(cmd..": invalid subcommand\n")
|
||||||
|
end
|
||||||
|
|
105
aports.lua
Executable file
105
aports.lua
Executable file
@ -0,0 +1,105 @@
|
|||||||
|
module(..., package.seeall)
|
||||||
|
|
||||||
|
function split(str)
|
||||||
|
local t = {}
|
||||||
|
local e
|
||||||
|
if (str == nil) then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
for e in string.gmatch(str, "%S+") do
|
||||||
|
t[#t + 1] = string.gsub(e, ":.*", "")
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
|
||||||
|
function split_apkbuild(line)
|
||||||
|
local r = {}
|
||||||
|
local dir,pkgname, pkgver, pkgrel, arch, depends, makedepends, subpackages, source = string.match(line, "([^|]*)|([^|]*)|([^|]*)|([^|]*)|([^|]*)|([^|]*)|([^|]*)|([^|]*)")
|
||||||
|
r.dir = dir
|
||||||
|
r.pkgname = pkgname
|
||||||
|
r.pkgver = pkgver
|
||||||
|
r.pkgrel = pkgrel
|
||||||
|
r.depends = split(depends)
|
||||||
|
r.makedepends = split(makedepends)
|
||||||
|
r.subpackages = split(subpackages)
|
||||||
|
r.source = split(source)
|
||||||
|
return r
|
||||||
|
end
|
||||||
|
|
||||||
|
-- parse the APKBUILDs and return an iterator
|
||||||
|
function parse_apkbuilds(dirs)
|
||||||
|
local i,v, p
|
||||||
|
local str=""
|
||||||
|
if dirs == nil then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
--expand repos
|
||||||
|
for i,v in ipairs(dirs) do
|
||||||
|
str = str..v.."/*/APKBUILD "
|
||||||
|
end
|
||||||
|
|
||||||
|
local p = io.popen([[
|
||||||
|
for i in ]]..str..[[; do
|
||||||
|
pkgname=
|
||||||
|
pkgver=
|
||||||
|
pkgrel=
|
||||||
|
arch=
|
||||||
|
depends=
|
||||||
|
makedepends=
|
||||||
|
subpackages=
|
||||||
|
source=
|
||||||
|
dir="${i%/APKBUILD}"
|
||||||
|
cd "$dir"
|
||||||
|
. ./APKBUILD
|
||||||
|
echo $dir\|$pkgname\|$pkgver\|$pkgrel\|$arch\|$depends\|$makedepends\|$subpackages\|$source
|
||||||
|
done
|
||||||
|
]])
|
||||||
|
return function()
|
||||||
|
local line = p:read("*line")
|
||||||
|
if line == nil then
|
||||||
|
p:close()
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
return split_apkbuild(line)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function target_packages(pkgdb, pkgname)
|
||||||
|
local i,v
|
||||||
|
local t = {}
|
||||||
|
for i,v in ipairs(pkgdb[pkgname]) do
|
||||||
|
table.insert(t, pkgname.."-"..v.pkgver.."-r"..v.pkgrel..".apk")
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
|
||||||
|
function init_apkdb(repodirs)
|
||||||
|
local pkgdb = {}
|
||||||
|
local revdeps = {}
|
||||||
|
local a
|
||||||
|
for a in parse_apkbuilds(repodirs) do
|
||||||
|
-- io.write(a.pkgname.." "..a.pkgver.."\t"..a.dir.."\n")
|
||||||
|
if pkgdb[a.pkgname] == nil then
|
||||||
|
pkgdb[a.pkgname] = {}
|
||||||
|
end
|
||||||
|
table.insert(pkgdb[a.pkgname], a)
|
||||||
|
-- add subpackages to package db
|
||||||
|
local k,v
|
||||||
|
for k,v in pairs(a.subpackages) do
|
||||||
|
if pkgdb[v] == nil then
|
||||||
|
pkgdb[v] = {}
|
||||||
|
end
|
||||||
|
table.insert(pkgdb[v], a)
|
||||||
|
end
|
||||||
|
-- add to reverse dependencies
|
||||||
|
for k,v in pairs(a.makedepends) do
|
||||||
|
if revdeps[v] == nil then
|
||||||
|
revdeps[v] = {}
|
||||||
|
end
|
||||||
|
table.insert(revdeps[v], a)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return pkgdb, revdeps
|
||||||
|
end
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user