aboutsummaryrefslogtreecommitdiffstats
path: root/blind.mk
blob: 1e5de6a03f67aadc0911f4c440cc91d068eff2b5 (plain) (blame)
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
100
101
102
103
104
105
.POSIX:

CONFIGFILE = config.mk

SCRIPTS    = $(SH_SCRIPTS) $(KSH_SCRIPTS)
BOBJ       = $(BIN:=.bo)
OBJ        = $(BIN:=.o) $(COMMON_OBJ)
C_DEPS     = $(HDR) build/platform.h

DIST_MAN   = $(MAN1) $(MAN7)
DIST_MISC  = $(HDR) $(SRC) $(SCRIPTS) $(MISCFILES) $(EXAMPLEFILES)

include build/files.mk
include build/common-files.mk
include $(CONFIGFILE)

all: $(BIN)
mcb: blind-mcb

$(BIN): $(@:=.o) $(COMMON_OBJ)
.o:
	$(CC) -o $@ $< $(COMMON_OBJ) $(LDFLAGS)
	-@rm $@.o

$(OBJ): src/$(@:.o=:c) $(C_DEPS)
$(OBJ):
	$(CC) $(CFLAGS) -c -o $$$$.$@ src/$*.c && mv $$$$.$@ $@

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

$(BOBJ): src/$(@:.bo=:c) $(C_DEPS)
$(BOBJ):
	$(CC) $(CFLAGS) -Dmain="$$(printf 'main_%s\n' $* | tr -- - _)" -c -o $@ src/$*.c

build/blind-mcb.c: build/files.mk
	mkdir -p $(@D)
	printf '#include <%s.h>\n' stdio string > $@
	printf 'int main_%s(int argc, char *argv[]);\n' $(BIN) | tr -- - _ >> $@
	printf 'int main(int argc, char *argv[]) {\n' >> $@
	printf 'char *cmd = strrchr(*argv, '"'/'"');\n' >> $@
	printf 'cmd = cmd ? &cmd[1] : *argv;\n' >> $@
	set -e && for c in $(BIN); do \
		printf 'if (!strcmp(cmd, "%s"))\n\treturn main_%s(argc, argv);\n' "$$c" "$$c" | \
			sed '/^\t/s/-/_/g'; \
	done >> $@
	printf 'fprintf(stderr, "Invalid command: %%s\\n", cmd);\n' >> $@
	printf 'return 1;\n' >> $@
	printf '}\n' >> $@

blind-mcb: build/blind-mcb.o $(BOBJ) $(COMMON_OBJ)
	$(CC) -o $@ build/blind-mcb.o $(BOBJ) $(COMMON_OBJ) $(LDFLAGS)

build/generate-macros: src/generate-macros.c
	@mkdir -p -- $(@D)
	$(CC) $(CFLAGS) -o $@.$$$$ src/generate-macros.c $(LDFLAGS) && mv $@.$$$$ $@

src/../build/platform.h: build/platform.h
build/platform.h: build/generate-macros
	@mkdir -p -- $(@D)
	build/generate-macros > $@.$$$$ && mv $@.$$$$ $@

install: all install-common
	cp -f -- $(BIN) "$(DESTDIR)$(PREFIX)/bin"
	cd -- "$(DESTDIR)$(PREFIX)/bin" && chmod 755 $(BIN)

install-mcb: mcb install-common
	for c in $(BIN); do \
		$(LN) -f -- blind-single-colour "$(DESTDIR)$(PREFIX)/bin/$$c"; done
	rm -f -- "$(DESTDIR)$(PREFIX)/bin/blind-single-colour"
	cp -f -- blind-mcb "$(DESTDIR)$(PREFIX)/bin/blind-single-colour"
	cd -- "$(DESTDIR)$(PREFIX)/bin" && chmod 755 -- blind-single-colour

install-common:
	mkdir -p -- "$(DESTDIR)$(PREFIX)/bin"
	mkdir -p -- "$(DESTDIR)$(MANPREFIX)/man1"
	mkdir -p -- "$(DESTDIR)$(MANPREFIX)/man7"
	cp -f -- $(SCRIPTS) "$(DESTDIR)$(PREFIX)/bin"
	cd -- "$(DESTDIR)$(PREFIX)/bin" && sed -i '1s:bash$$:$(KORN_SHELL):' $(KSH_SCRIPTS)
	cd -- "$(DESTDIR)$(PREFIX)/bin" && chmod 755 -- $(SCRIPTS)
	set -e && for m in $(MAN); do \
		sed '1s/ blind$$/ " blind $(VERSION)"/g' \
		< "man/$$(basename $$m)" > "$(DESTDIR)$(MANPREFIX)/$$m"; \
	done
	cd -- "$(DESTDIR)$(MANPREFIX)" && chmod 644 $(MAN)

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

dist:
	-rm -rf "blind-$(VERSION)"
	mkdir -p "blind-$(VERSION)"
	cd "blind-$(VERSION)" && mkdir -p src/util man $(EXAMPLEDIRS)
	cd man && cp $(DIST_MAN) "../blind-$(VERSION)/man"
	set -e && for s in $(DIST_MISC); do cp "$$s" "../blind-$(VERSION)/$$s"; done
	tar -cf "blind-$(VERSION).tar" "blind-$(VERSION)"
	gzip -9 "blind-$(VERSION).tar"
	rm -rf "blind-$(VERSION)"

.SUFFIXES:
.SUFFIXES: .o .bo .c

.PHONY: all mcb install install-mcb install-common uninstall dist
.PRECIOUS: $(COMMON_OBJ) $(BOBJ) build/platform.h