aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2020-05-15 10:52:11 -0700
committerNicholas Noll <nbnoll@eml.cc>2020-05-15 10:52:11 -0700
commit66eb918a13b6607cc7bb615350a0e26f3670cd54 (patch)
tree91a9f9c3e086e778fc754aa299f223e59dad429c
parent463ed852261da4d1dd1b859fa717a1d683306c9d (diff)
factored out the common code of makefiles
-rw-r--r--rules.mk25
-rw-r--r--share/paths.mk15
-rw-r--r--share/pop.mk4
-rw-r--r--share/push.mk3
-rw-r--r--sys/libbio/io/rules.mk28
-rw-r--r--sys/libbio/rules.mk27
-rw-r--r--sys/libc/rules.mk27
-rwxr-xr-xsys/libmath/gen2.py122
-rw-r--r--sys/libmath/rules.mk32
-rw-r--r--sys/libn/rules.mk38
-rw-r--r--sys/rules.mk3
11 files changed, 128 insertions, 196 deletions
diff --git a/rules.mk b/rules.mk
index ce74da2..ff12fdb 100644
--- a/rules.mk
+++ b/rules.mk
@@ -1,7 +1,6 @@
# Standard housekeeping
-.PHONY: all debug release clean install
+.PHONY: all debug release clean target install
.SUFFIXES:
-.SUFFIXES: .s .c .o
all: targets
@@ -18,6 +17,7 @@ DEPS :=
LIBS :=
BINS :=
+TSTS :=
# Iterate through directory tree
DIR := sys
@@ -25,40 +25,33 @@ include $(DIR)/rules.mk
# Generic rules
%.a: %.o
- @echo AR $@ $^
+ @echo AR $^
@$(ARCHIVE)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
- @echo CC $^
+ @echo CC $^
@$(COMPILE)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.s
- @echo AS $^
+ @echo AS $^
@$(ASSEMBLE)
%: %.o
- @echo CC $^
+ @echo CC $^
@$(LINK)
$(OBJ_DIR)/%: $(SRC_DIR)/%.c
- @echo CC $^
+ @echo CC $^
@$(COMPLNK)
-.PHONY: targets
-targets: $(LIBS) $(BINS)
+targets: $(LIBS) $(BINS) $(TSTS)
-.PHONY: database
-database: $(LIBS) $(BINS)
- gentags
- ctags -R sys
-
-.PHONY: clean
clean:
rm -f $(OBJS)
rm -f $(DEPS)
rm -f $(LIBS)
rm -f $(BINS)
+ rm -f $(TSTS)
-.PHONY: install
install: targets
echo "TODO"
diff --git a/share/paths.mk b/share/paths.mk
new file mode 100644
index 0000000..e2cee4f
--- /dev/null
+++ b/share/paths.mk
@@ -0,0 +1,15 @@
+OBJS_$(d) := $(SRCS_$(d):.c=.o)
+OBJS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(OBJS_$(d)))
+DEPS_$(d) := $(OBJS_$(d):.o=.d)
+
+OBJS := $(OBJS) $(OBJS_$(d))
+DEPS := $(DEPS) $(DEPS_$(d))
+
+LIBS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(LIBS_$(d)))
+LIBS := $(LIBS) $(LIBS_$(d))
+
+BINS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(BINS_$(d)))
+BINS := $(BINS) $(BINS_$(d))
+
+TSTS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(TSTS_$(d)))
+TSTS := $(TSTS) $(TSTS_$(d))
diff --git a/share/pop.mk b/share/pop.mk
new file mode 100644
index 0000000..cee9e65
--- /dev/null
+++ b/share/pop.mk
@@ -0,0 +1,4 @@
+-include $(DEPS_$(d))
+
+d := $(DIRSTACK_$(SP))
+SP := $(basename $(SP))
diff --git a/share/push.mk b/share/push.mk
new file mode 100644
index 0000000..4ea661d
--- /dev/null
+++ b/share/push.mk
@@ -0,0 +1,3 @@
+SP := $(SP).x
+DIRSTACK_$(SP) := $(d)
+d := $(DIR)
diff --git a/sys/libbio/io/rules.mk b/sys/libbio/io/rules.mk
index 9ef6d00..a4277fc 100644
--- a/sys/libbio/io/rules.mk
+++ b/sys/libbio/io/rules.mk
@@ -1,31 +1,14 @@
-# ---- Push on stack ----
-SP := $(SP).x
-DIRSTACK_$(SP) := $(d)
-d := $(DIR)
+include share/push.mk
# Iterate through subdirectory tree
# Local sources
SRCS_$(d) := $(wildcard $(d)/*.c)
-OBJS_$(d) := $(SRCS_$(d):.c=.o)
-OBJS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(OBJS_$(d)))
-DEPS_$(d) := $(OBJS_$(d):.o=.d)
-
-OBJS := $(OBJS) $(OBJS_$(d))
-DEPS := $(DEPS) $(DEPS_$(d))
-
-# Local targets
LIBS_$(d) :=
-LIBS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(LIBS_$(d)))
-LIBS := $(LIBS) $(LIBS_$(d))
-
BINS_$(d) :=
-BINS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(BINS_$(d)))
-BINS := $(BINS) $(BINS_$(d))
+TSTS_$(d) :=
-# Local rules
-# $(LIBS_$(d)) = TCFLAGS :=
-# $(LIBS_$(d)) = TCINCS :=
+include share/paths.mk
$(LIBS_$(d)): $(OBJS_$(d))
$(ARCHIVE)
@@ -35,7 +18,4 @@ $(BINS_$(d)): $(OBJS_$(d))
$(LINK)
# ---- Pop off stack ----
--include $(DEPS_$(d))
-
-d := $(DIRSTACK_$(SP))
-SP := $(basename $(SP))
+include share/pop.mk
diff --git a/sys/libbio/rules.mk b/sys/libbio/rules.mk
index ff71746..fbba7df 100644
--- a/sys/libbio/rules.mk
+++ b/sys/libbio/rules.mk
@@ -1,7 +1,4 @@
-# ---- Push on stack ----
-SP := $(SP).x
-DIRSTACK_$(SP) := $(d)
-d := $(DIR)
+include share/push.mk
# Iterate through subdirectory tree
DIR := $(d)/io
@@ -9,21 +6,11 @@ include $(DIR)/rules.mk
# Local sources
SRCS_$(d) := $(wildcard $(d)/*.c)
-OBJS_$(d) := $(SRCS_$(d):.c=.o)
-OBJS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(OBJS_$(d)))
-DEPS_$(d) := $(OBJS_$(d):.o=.d)
-
-OBJS := $(OBJS) $(OBJS_$(d))
-DEPS := $(DEPS) $(DEPS_$(d))
-
-# Local targets
LIBS_$(d) := $(d)/libbio.a
-LIBS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(LIBS_$(d)))
-LIBS := $(LIBS) $(LIBS_$(d))
+BINS_$(d) :=
+TSTS_$(d) := $(d)/test $(d)/simulate
-BINS_$(d) := $(d)/test $(d)/simulate
-BINS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(BINS_$(d)))
-BINS := $(BINS) $(BINS_$(d))
+include share/paths.mk
# Local rules
# $(LIBS_$(d)) = TCFLAGS :=
@@ -38,8 +25,4 @@ $(BINS_$(d)): $(LIBS_$(d)) $(OBJ_DIR)/libn/libn.a
@echo BIN $@
@$(LINK)
-# ---- Pop off stack ----
--include $(DEPS_$(d))
-
-d := $(DIRSTACK_$(SP))
-SP := $(basename $(SP))
+include share/pop.mk
diff --git a/sys/libc/rules.mk b/sys/libc/rules.mk
index 36cf1a7..f017738 100644
--- a/sys/libc/rules.mk
+++ b/sys/libc/rules.mk
@@ -1,42 +1,23 @@
-# ---- Push on stack ----
-SP := $(SP).x
-DIRSTACK_$(SP) := $(d)
-d := $(DIR)
+include share/push.mk
# Iterate through subdirectory tree
# Local sources
SRCS_$(d) := $(wildcard $(d)/*.c)
-OBJS_$(d) := $(SRCS_$(d):.c=.o)
-OBJS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(OBJS_$(d)))
-DEPS_$(d) := $(OBJS_$(d):.o=.d)
-
-OBJS := $(OBJS) $(OBJS_$(d))
-DEPS := $(DEPS) $(DEPS_$(d))
-
-# Local targets
LIBS_$(d) := $(d)/libc.a
-LIBS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(LIBS_$(d)))
-LIBS := $(LIBS) $(LIBS_$(d))
-
BINS_$(d) :=
-BINS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(BINS_$(d)))
-BINS := $(BINS) $(BINS_$(d))
+
+include share/paths.mk
# Local rules
# $(LIBS_$(d)) = TGTINCS :=
# $(LIBS_$(d)) = TGTLIBS :=
$(LIBS_$(d)): TCFLAGS := -ffreestanding -fno-builtin -nostdlib
-
$(LIBS_$(d)): $(OBJS_$(d))
$(ARCHIVE)
$(BINS_$(d)): $(OBJ_DIR)/libn/test.o
$(LINK)
-# ---- Pop off stack ----
--include $(DEPS_$(d))
-
-d := $(DIRSTACK_$(SP))
-SP := $(basename $(SP))
+include share/pop.mk
diff --git a/sys/libmath/gen2.py b/sys/libmath/gen2.py
index 6ce2a12..2afbe1d 100755
--- a/sys/libmath/gen2.py
+++ b/sys/libmath/gen2.py
@@ -104,40 +104,50 @@ def DoubleLoop(top, bot, Kernel, Preamble=[], Postamble=[]):
])
)
-def TriangularLoop(top, bot, Kernel, Preamble=[], Postamble=[], upper=True):
- def Step(it, inc):
- if inc == 1:
- return Inc(it)
- else:
- return AddSet(it, I(inc))
-
- def Finish(j):
- if j == 0:
- return For(None, LE(bot.it, top.it), Inc(bot.it),
- Block(*[func for i in range(j, top.inc) for func in Kernel(top.it, bot.it, i, 1)])
- )
+def TriangularLoop(top, bot, Kernel, Preamble=[], Postamble=lambda i: None, upper=True):
+ # ---------------------------------------------------------------
+ # Helper functions
+
+ def Finish(j, upper=False):
+ if upper:
+ if j == 0:
+ return Block(For(None, GT(bot.it, top.it), Dec(bot.it),
+ Block(*[func for i in range(j, top.inc) for func in Kernel(top.it, bot.it, i, 1)])
+ ), Postamble(j)
+ )
+ return Block(*[func for i in range(j, top.inc) for func in Kernel(top.it, bot.it, i, 1)], Dec(bot.it), Postamble(j))
+ if not upper:
+ if j == 0:
+ return Block(For(None, LT(bot.it, top.it), Inc(bot.it),
+ Block(*[func for i in range(j, top.inc) for func in Kernel(top.it, bot.it, i, 1)])
+ ), Postamble(j))
+ return Block(*[func for i in range(j, top.inc) for func in Kernel(top.it, bot.it, i, 1)], Inc(bot.it), Postamble(j))
+
+ def Step(it, inc, down=False):
+ if not down:
+ if inc == 1:
+ return Inc(it)
+ else:
+ return AddSet(it, I(inc))
else:
- return Block(*[func for i in range(j, top.inc) for func in Kernel(top.it, bot.it, i, 1)], Inc(bot.it))
+ if inc == 1:
+ return Dec(it)
+ else:
+ return SubSet(it, I(inc))
- def Start(j, end):
- if j == end:
- return For(None, LT(bot.it, bot.end), Inc(bot.it),
- Block(*[func for i in range(j+1) for func in Kernel(top.it, bot.it, i, 1)])
- )
- else:
- return Block(*[func for i in range(j+1) for func in Kernel(top.it, bot.it, i, 1)], Inc(bot.it))
+ # ---------------------------------------------------------------
+ # Main body
if upper:
- return For(Set(top.it, I(0)), LT(top.it, top.end), Step(top.it, top.inc),
+ return For(Set(top.it, Sub(top.end, I(1))), GE(top.it, I(0)), Step(top.it, top.inc, down=True),
Block(*[
*[func(i) for func in Preamble for i in range(top.inc)],
- Set(bot.end, Add(Paren(EvenTo(Paren(Sub(top.end, top.it)), bot.inc)), top.it)),
- Set(bot.it, top.it),
- *[ Start(j, top.inc-1) for j in range(top.inc) if bot.inc > 1],
- For(None, LT(bot.it, bot.len), Step(bot.it, bot.inc),
+ Set(bot.end, Sub(Paren(EvenTo(Paren(Sub(top.it, Paren(Sub(bot.len, I(1))))), bot.inc)), Paren(Sub(bot.len, I(1))))),
+ For(Set(bot.it, Sub(bot.len, I(1))), GT(bot.it, bot.end), Step(bot.it, bot.inc, down=True),
Block(*[func for i in range(top.inc) for func in Kernel(top.it, bot.it, i, bot.inc)])
),
- *[func(i) for func in Postamble for i in range(bot.inc)]
+ *[ Finish(j, upper) if bot.inc > 1 else Postamble(j) for j in range(top.inc) ],
+ # *[func(i) for func in Postamble for i in range(bot.inc)]
])
)
else:
@@ -145,27 +155,33 @@ def TriangularLoop(top, bot, Kernel, Preamble=[], Postamble=[], upper=True):
Block(*[
*[func(i) for func in Preamble for i in range(top.inc)],
Set(bot.end, EvenTo(top.it, bot.inc)),
- For(Set(bot.it, I(0)), LE(bot.it, bot.end), Step(bot.it, bot.inc),
+ For(Set(bot.it, I(0)), LT(bot.it, bot.end), Step(bot.it, bot.inc),
Block(*[func for i in range(top.inc) for func in Kernel(top.it, bot.it, i, bot.inc)])
),
- *[ Finish(j) for j in range(top.inc) if bot.inc > 1],
- *[func(i) for func in Postamble for i in range(bot.inc)]
+ *[ Finish(j) if bot.inc > 1 else Postamble(j) for j in range(top.inc) ],
+ # *[func(i) for func in Postamble for i in range(bot.inc)]
])
)
+def Shift(x, i, uplo):
+ if uplo == "upper":
+ return Sub(x, I(i))
+ if uplo == "lower":
+ return Add(x, I(i))
+ raise ValueError("unrecognized value")
def ToKernel(name, loop):
vars = VarsUsed(StmtExpr(loop.init)) | VarsUsed(StmtExpr(loop.cond)) | \
VarsUsed(StmtExpr(loop.step)) | VarsUsed(loop.body)
-# def ExpandAdd(i: int, c: Emitter, inc: int):
-# offset = Add(c, I(0))
-# root = Mul(Index(Index(row, I(i)), offset), Index(x, offset))
-# for n in range(1, inc):
-# offset = Add(c, I(n))
-# root = Add(root, Mul(Index(Index(row, I(i)), offset), Index(x, offset)))
-# return root
+def ExpandAdd(row, x, i: int, c: Emitter, inc: int, uplo):
+ offset = Add(c, I(0))
+ root = Mul(Index(Index(row, I(i)), offset), Index(x, offset))
+ for n in range(1, inc):
+ offset = Shift(c, I(n), uplo)
+ root = Add(root, Mul(Index(Index(row, I(i)), offset), Index(x, offset)))
+ return root
# ------------------------------------------------------------------------
# Blas level 2 functions
@@ -181,20 +197,21 @@ def trsv(kind):
)
)
- r, c, nr, nc, row, res = F.variables("r", "c", "nr", "nc", "row", "res")
- flag, _len, a, m, incm, x = F.variables("flag", "len", "a", "m", "incm", "x")
- incx = F.variables("incx")
+ r, c, nr, nc, row, res = F.variables("r", "c", "nr", "nc", "row", "res")
+ flag, _len, m, incm, x = F.variables("flag", "len", "m", "incm", "x")
+ incx = F.variables("incx")
rows, cols = lambda inc_r: Iter(r, nr, _len, inc_r), lambda inc_c: Iter(c, nc, _len, inc_c)
- template = lambda inc_r, inc_c: TriangularLoop(rows(inc_r), cols(inc_c),
- Kernel = lambda r, c, i, inc: [AddSet(Index(Index(row, I(i)), Add(c, I(j))), Mul(Index(res, I(i)), Index(x, Add(c, I(j))))) for j in range(inc)],
- Preamble = [lambda i: Set(Index(row, I(i)), Add(m, Mul(Paren(Add(r, I(i))), incm))),
- lambda i: Set(Index(res, I(i)), Mul(a, Index(x, Add(r, I(i)))))],
- upper = True
+ template = lambda inc_r, inc_c, upper: TriangularLoop(rows(inc_r), cols(inc_c),
+ Kernel = lambda r, c, i, inc: [AddSet(Index(res, I(i)), ExpandAdd(row, x, i, c, inc, upper))],
+ Preamble = [lambda i: Set(Index(row, I(i)), Add(m, Mul(Paren(Shift(r, i, upper)), incm))),
+ lambda i: Set(Index(res, I(i)), I(0))],
+ Postamble = lambda i: Set(Index(x, Shift(c, I(0), upper)), Div(Index(res, I(i)), Index(Index(row, I(i)), Shift(c, I(0), upper)))),
+ upper = upper == "upper"
)
- loop = template(1, 1)
+ loop = template(1, 1, "upper")
loop.emit()
def syr(kind):
@@ -216,16 +233,16 @@ def syr(kind):
rows, cols = lambda inc_r: Iter(r, nr, _len, inc_r), lambda inc_c: Iter(c, nc, _len, inc_c)
template = lambda inc_r, inc_c, upper: TriangularLoop(rows(inc_r), cols(inc_c),
- Kernel = lambda r, c, i, inc: [AddSet(Index(Index(row, I(i)), Add(c, I(j))), Mul(Index(res, I(i)), Index(x, Add(c, I(j))))) for j in range(inc)],
- Preamble = [lambda i: Set(Index(row, I(i)), Add(m, Mul(Paren(Add(r, I(i))), incm))),
- lambda i: Set(Index(res, I(i)), Mul(a, Index(x, Add(r, I(i)))))],
+ Kernel = lambda r, c, i, inc: [AddSet(Index(Index(row, I(i)), Shift(c, j, upper)), Mul(Index(res, I(i)), Index(x, Shift(c, j, upper)))) for j in range(inc)],
+ Preamble = [lambda i: Set(Index(row, I(i)), Add(m, Mul(Paren(Shift(r, i, upper)), incm))),
+ lambda i: Set(Index(res, I(i)), Mul(a, Index(x, Shift(r, i, upper))))],
upper = upper == "upper"
)
blocks = []
for layout in ["lower", "upper"]:
- floop = template(1, 1, layout)
- sloop = template(1, 1, layout)
+ floop = template(2, 2, layout)
+ sloop = template(2, 2, layout)
sloop.body = AsStrided(sloop.body, x, c, incx)
fini = template(1, 1, layout)
@@ -240,7 +257,10 @@ def syr(kind):
Return(),
)
)
- F.execute(If(flag, blocks[0], blocks[1]))
+ F.execute(
+ Set(nr, EvenTo(_len, ROW)),
+ If(flag, blocks[0], blocks[1])
+ )
F.emit()
def ger(kind):
diff --git a/sys/libmath/rules.mk b/sys/libmath/rules.mk
index 73d63e3..c82361d 100644
--- a/sys/libmath/rules.mk
+++ b/sys/libmath/rules.mk
@@ -1,32 +1,14 @@
-# ---- Push on stack ----
-SP := $(SP).x
-DIRSTACK_$(SP) := $(d)
-d := $(DIR)
+include share/push.mk
# Iterate through subdirectory tree
# Local sources
SRCS_$(d) := $(wildcard $(d)/*.c)
-OBJS_$(d) := $(SRCS_$(d):.c=.o)
-OBJS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(OBJS_$(d)))
-DEPS_$(d) := $(OBJS_$(d):.o=.d)
-
-OBJS := $(OBJS) $(OBJS_$(d))
-DEPS := $(DEPS) $(DEPS_$(d))
-
-# Local targets
LIBS_$(d) :=
-LIBS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(LIBS_$(d)))
-LIBS := $(LIBS) $(LIBS_$(d))
+BINS_$(d) :=
+TSTS_$(d) := $(d)/blas
-BINS_$(d) := $(d)/blas
-BINS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(BINS_$(d)))
-BINS := $(BINS) $(BINS_$(d))
-
-# Local rules
-# $(LIBS_$(d)) = TCFLAGS :=
-# $(LIBS_$(d)) = TCINCS :=
-# $(LIBS_$(d)) = TCLIBS :=
+include share/paths.mk
GENERATE = python $^ > $@
$(d)/blas1.c: $(d)/gen1.py
@@ -42,8 +24,4 @@ $(BINS_$(d)): $(OBJS_$(d)) $(OBJ_DIR)/libn/libn.a $(LIB_DIR)/vendor/libblas.a
@echo BIN $@
@$(LINK)
-# ---- Pop off stack ----
--include $(DEPS_$(d))
-
-d := $(DIRSTACK_$(SP))
-SP := $(basename $(SP))
+include share/pop.mk
diff --git a/sys/libn/rules.mk b/sys/libn/rules.mk
index 7efcae6..bd3308a 100644
--- a/sys/libn/rules.mk
+++ b/sys/libn/rules.mk
@@ -1,37 +1,13 @@
-# ---- Push on stack ----
-SP := $(SP).x
-DIRSTACK_$(SP) := $(d)
-d := $(DIR)
-
-# Iterate through subdirectory tree
-# DIR := $(d)/bufio
-# include $(DIR)/rules.mk
-# ...
+include share/push.mk
# Local sources
SRCS_$(d) := $(wildcard $(d)/*.c)
ASMS_$(d) := $(wildcard $(d)/*.s)
-OBJS_$(d) := $(SRCS_$(d):.c=.o)
-OBJS_$(d) += $(ASMS_$(d):.s=.o)
-OBJS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(OBJS_$(d)))
-DEPS_$(d) := $(OBJS_$(d):.o=.d)
-
-OBJS := $(OBJS) $(OBJS_$(d))
-DEPS := $(DEPS) $(DEPS_$(d))
-
-# Local targets
LIBS_$(d) := $(d)/libn.a
-LIBS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(LIBS_$(d)))
-LIBS := $(LIBS) $(LIBS_$(d))
+BINS_$(d) :=
+TSTS_$(d) := $(d)/test
-BINS_$(d) := $(d)/test
-BINS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(BINS_$(d)))
-BINS := $(BINS) $(BINS_$(d))
-
-# Local rules
-# $(LIBS_$(d)) := TCFLAGS :=
-# $(LIBS_$(d)) := TCINCS :=
-# $(LIBS_$(d)) := TCLIBS :=
+include share/paths.mk
$(LIBS_$(d)): $(OBJS_$(d))
@echo LIB $@
@@ -42,8 +18,4 @@ $(BINS_$(d)): $(OBJ_DIR)/libn/test.o $(LIBS_$(d))
@echo BIN $@
@$(LINK)
-# ---- Pop off stack ----
--include $(DEPS_$(d))
-
-d := $(DIRSTACK_$(SP))
-SP := $(basename $(SP))
+include share/pop.mk
diff --git a/sys/rules.mk b/sys/rules.mk
index aac0aaa..d7535a7 100644
--- a/sys/rules.mk
+++ b/sys/rules.mk
@@ -17,6 +17,9 @@ include $(DIR)/rules.mk
DIR := $(d)/libbio
include $(DIR)/rules.mk
+DIR := $(d)/cmd
+include $(DIR)/rules.mk
+
# ---- Pop off stack ----
d := $(DIRSTACK_$(SP))
SP := $(basename $(SP))