summaryrefslogtreecommitdiff
path: root/mk/deps.sh
blob: 06176396eba806952f2f304056984eda1af17d4e (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
#!/bin/sh
find_includes () {
	grep '#include.*_' $1 | sed -e 's/^.*"\(.\)/\1/;s/"$//'
}

SOURCE=$1
BASE=$(basename $SOURCE .c)
LIB=$(grep -F 'LINK(' $SOURCE | tr -d 'LINK()')
test -z "$LIB" && LIB="c"

if ! grep -q "^mk/$BASE.d:" mk/deps.mk 2>&1; then
	printf 'all: mk/%s.d\n' $BASE >> mk/deps.mk
	printf 'mk/%s.d: %s\n' $BASE $SOURCE >> mk/deps.mk
	printf '\tsh mk/deps.sh %s\n\n' $SOURCE >> mk/deps.mk
fi

if ! grep -q "include mk/$BASE.d" mk/all.mk 2>&1; then
	printf 'include mk/%s.d\n' $BASE >> mk/all.mk
fi

exec > mk/$BASE.d
#echo "#LIB: $LIB"
#echo "#BASE: $BASE"
#echo "#SOURCE: $SOURCE"

C=$(grep -F 'STDC(' $SOURCE | sed -e 's/STDC(//;s/,.*//;s/)$//g')
test -n "$C" && printf 'lib%s_C.%s: lib%s.a(%s.o)\n' $LIB $C $LIB $BASE
#echo "#C: $C"

CX1=$(grep -F 'CEXT1(' $SOURCE | sed -e 's/CEXT1(//;s/,.*//;s/)$//g')
test -n "$CX1" && printf 'lib%s_C_X1.%s: lib%s.a(%s.o)\n' $LIB $CX1 $LIB $BASE

P=$(grep -F 'POSIX(' $SOURCE | sed -e 's/POSIX(//;s/,.*//;s/)$//g')
test -n "$P" && printf 'lib%s_P.%s: lib%s.a(%s.o)\n' $LIB $P $LIB $BASE
#echo "#POSIX: $P"

X=$(grep -F 'XOPEN(' $SOURCE | sed -e 's/XOPEN(//;s/,.*//;s/)$//g')
test -n "$X" && printf 'lib%s_X.%s: lib%s.a(%s.o)\n' $LIB $X $LIB $BASE
#echo "#XOPEN: $X"

if [ -z "$C" ] && [ -z "$P" ] && [ -z "$X" ] && [ -z "$CX1" ]; then
	printf 'lib%s_C.0: lib%s.a(%s.o)\n' $LIB $LIB $BASE
fi

printf 'lib%s.a(%s.o): $(OBJDIR)/%s.o\n' $LIB $BASE $BASE
#printf '\t@echo "  [AR] $@($%%)"\n'
printf '\t@$(AR) $(ARFLAGS) $@ $(OBJDIR)/$%%\n\n'

printf '$(OBJDIR)/%s.o: %s\n' $BASE $SOURCE

#
# TODO: make this recursive
#
for INC in $(find_includes $SOURCE); do
	if [ -f src/$INC ]; then
		FILE=src/$INC
	else
		FILE=$(find src -name $INC)
	fi

	printf '$(OBJDIR)/%s.o: %s\n' $BASE $FILE
done

printf '$(OBJDIR)/%s.o:\n' $BASE
printf '\t@mkdir -p $(@D)\n'
printf '\t$(CC) -c -o $@ $(CFLAGS) %s\n' $SOURCE