summaryrefslogtreecommitdiff
path: root/Makefile
blob: 8d6fe49f51ca291524cc413c1df6cbf571c466f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
include config.mk

.SUFFIXES:
.SUFFIXES: .o .c

HDR =\
	arg.h\
	util.h

LIBUTIL = libutil.a
LIBUTILSRC =\
	libutil/eprintf.c

LIB = $(LIBUTF) $(LIBUTIL)

BIN =\
	more\
	hexdump\
	ifconfig\
	ping\
	rmmod

LIBUTILOBJ = $(LIBUTILSRC:.c=.o)
OBJ = $(BIN:=.o) $(LIBUTFOBJ) $(LIBUTILOBJ)
SRC = $(BIN:=.c)
MAN = $(BIN:=.1)

all: $(BIN)

$(BIN): $(LIB) $(@:=.o)

$(OBJ): $(HDR) config.mk

.o:
	$(CC) $(LDFLAGS) -o $@ $< $(LIB)

.c.o:
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ -c $<

$(LIBUTIL): $(LIBUTILOBJ)
	$(AR) rc $@ $?
	$(RANLIB) $@

install: all
	mkdir -p $(DESTDIR)$(PREFIX)/bin
	cp -f $(BIN) $(DESTDIR)$(PREFIX)/bin
	mkdir -p $(DESTDIR)$(MANPREFIX)/man1
	for m in $(MAN); do sed "s/^\.Os abase/.Os abase $(VERSION)/g" < "$$m" > $(DESTDIR)$(MANPREFIX)/man1/"$$m"; done
	cd $(DESTDIR)$(MANPREFIX)/man1 && chmod 644 $(MAN)

uninstall:
	cd $(DESTDIR)$(PREFIX)/bin && rm -f $(BIN)
	cd $(DESTDIR)$(MANPREFIX)/man1 && rm -f $(MAN)

dist: clean
	mkdir -p abase-$(VERSION)
	cp -r LICENSE Makefile README TODO config.mk $(SRC) $(MAN) libutil $(HDR) abase-$(VERSION)
	tar -cf abase-$(VERSION).tar abase-$(VERSION)
	gzip abase-$(VERSION).tar
	rm -rf abase-$(VERSION)

abase-box: $(LIB) $(SRC)
	mkdir -p build
	cp $(HDR) build
	for f in $(SRC); do sed "s/^main(/$$(echo "$${f%.c}" | sed s/-/_/g)_&/" < $$f > build/$$f; done
	echo '#include <libgen.h>'                                                                                                     > build/$@.c
	echo '#include <stdio.h>'                                                                                                     >> build/$@.c
	echo '#include <stdlib.h>'                                                                                                    >> build/$@.c
	echo '#include <string.h>'                                                                                                    >> build/$@.c
	echo '#include "util.h"'                                                                                                      >> build/$@.c
	for f in $(SRC); do echo "int $$(echo "$${f%.c}" | sed s/-/_/g)_main(int, char **);"; done                                    >> build/$@.c
	echo 'int main(int argc, char *argv[]) { char *s = basename(argv[0]);'                                                        >> build/$@.c
	echo 'if(!strcmp(s,"abase-box")) { argc--; argv++; s = basename(argv[0]); } if(0) ;'                                          >> build/$@.c
	for f in $(SRC); do echo "else if(!strcmp(s, \"$${f%.c}\")) return $$(echo "$${f%.c}" | sed s/-/_/g)_main(argc, argv);"; done >> build/$@.c
	echo 'else {'                                                                                                                 >> build/$@.c
	for f in $(SRC); do echo "fputs(\"$${f%.c} \", stdout);"; done                                                                >> build/$@.c
	echo 'putchar(0xa); }; return 0; }'                                                                                           >> build/$@.c
	$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ build/*.c $(LIB)
	rm -r build

abase-box-install: abase-box
	mkdir -p $(DESTDIR)$(PREFIX)/bin
	cp -f abase-box $(DESTDIR)$(PREFIX)/bin
	chmod 755 $(DESTDIR)$(PREFIX)/bin/abase-box
	for f in $(BIN); do ln -sf abase-box $(DESTDIR)$(PREFIX)/bin/"$$f"; done
	mkdir -p $(DESTDIR)$(MANPREFIX)/man1
	for m in $(MAN); do sed "s/^\.Os abase/.Os abase $(VERSION)/g" < "$$m" > $(DESTDIR)$(MANPREFIX)/man1/"$$m"; done
	cd $(DESTDIR)$(MANPREFIX)/man1 && chmod 644 $(MAN)

abase-box-uninstall: uninstall
	cd $(DESTDIR)$(PREFIX)/bin && rm -f abase-box

clean:
	rm -f $(BIN) $(OBJ) $(LIB) abase-box abase-$(VERSION).tar.gz

.gitignore:
	{ printf '*.o\n' ; printf '/%s\n' $(LIB) $(BIN) ; } > $@

.PHONY: all install uninstall dist abase-box-install abase-box-uninstall clean .gitignore