summaryrefslogtreecommitdiffstats
path: root/Makefile
blob: 577e904c8d404276fcb648f15d689abfe3b56ccc (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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115

export TSNIF_INCLUDE  = $(CURDIR)/include
export TSNIF_AUTOCONF = $(TSNIF_INCLUDE)/autoconf.make
include $(TSNIF_AUTOCONF)

# looks like DESTDIR is a standard, but prioritize ROOTDIR anyway
ifdef DESTDIR
ifndef ROOTDIR
ROOTDIR=$(DESTDIR)
endif
endif


ifneq ($(findstring $(MAKEFLAGS),w),w)
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

# nice output definition
# Mostly copied from kernel and git makefiles.

ifndef V
	QUIET_CC          = @echo "  CC" $@;
	QUIET_LD          = @echo "  LD" $@;
	QUIET_LEX         = @echo "  LE" $@;
	QUIET_YACC        = @echo "  YA" $@;
	QUIET_DEP         = @echo "  DEP" $@;
	QUIET_GEN         = @echo "  GEN" $@;
	QUIET_ASCIIDOC    = @echo "  ASCIIDOC" $@;
	QUIET_XMLTO       = @echo "  XMLTO" $@;

define install
	@echo -n "  INSTALL " `echo $(ROOTDIR)$2/$(notdir $1) | sed 's:[/]\+:/:g'` ; \
	mkdir -p $(ROOTDIR)$2; \
	install -m "ugo+$3" $1 $(ROOTDIR)$2; echo
endef
define remove
	@echo "  CLEAN  " $1; $(RM) -rf $1
endef
else
define remove
	$(RM) -rf $1
endef
define install
	mkdir -p $(ROOTDIR)$2; \
	install -m "ugo+$3" $1 $(ROOTDIR)$2; echo
endef
endif


.PHONY: all clean install tags cscope .FORCE-TSNIF-CFLAGS

all::

ifneq ($(MAKECMDGOALS),clean)
-include deps.make
endif

# main building schema
# Module subdir (src) are supposed to fill PROGRAMS and
# OBJS variables, and rule to link the module. The top makefile
# will do the rest.

PROGRAMS=
OBJS=

include src/Makefile

ALL_CFLAGS=-fPIC -Wall -Isrc -D_GNU_SOURCE -I$(TSNIF_INCLUDE)

%.o: %.c TSNIF-CFLAGS
	$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $<

all:: $(PROGRAMS) TSNIF-CFLAGS

clean::
	$(call remove, $(OBJS) $(PROGRAMS))
	$(call remove, deps.make)

mrproper::
	git clean -xdf


# dependencies
# The gcc -M depedencies generation needs to repaired to include
# subdirectory name within the target.. at least I haven't find any
# gcc option to do that.

deps.make:
	$(QUIET_DEP)$(RM) -f deps.make; \
	(for obj in $(OBJS); do \
	src=`echo $$obj | sed "s/\.o/.c/"`; \
	$(CC) $(ALL_CFLAGS) -M -MT$$obj $$src;  \
	done) > deps.make

# utilities
tags:
	$(QUIET_GEN)$(RM) -f tags; \
	$(FIND) . -name '*.[hc]' -print | xargs ctags -a

cscope:
	$(QUIET_GEN)$(RM) -f cscope*; \
	$(FIND) . -name '*.[hc]' -print > cscope.files; \
	cscope -b -icscope.files

# detect prefix and cflags changes
TRACK_CFLAGS = $(subst ','\'',$(ALL_CFLAGS)):\
             $(prefix):$(exec_prefix):$(bindir):$(libdir):$(sysconfdir) #'

TSNIF-CFLAGS: .FORCE-TSNIF-CFLAGS
	@FLAGS='$(TRACK_CFLAGS)'; \
	if test x"$$FLAGS" != x"`cat TSNIF-CFLAGS 2>/dev/null`" ; then \
		echo "$$FLAGS" >TSNIF-CFLAGS; \
	fi