1# Nathan's generic Makefile		-*- mode:Makefile -*-
2# Copyright (C) 2019-2020 Nathan Sidwell, nathan@acm.org
3# License: Apache v2.0
4
5srcdir := @srcdir@
6prefix := @prefix@
7exec_prefix := @exec_prefix@
8bindir := @bindir@
9libdir := @libdir@
10includedir := @includedir@
11# Linker options
12LDFLAGS := @LDFLAGS@
13LIBS := @LIBS@
14
15# We have to place the -I paths last, so that building will see -I paths to us
16CXX := $(filter-out -I%,@CXX@)
17AR := @AR@
18RANLIB := @RANLIB@
19INSTALL := $(srcdir)/build-aux/install-sh
20
21# C++ compiler options
22CXXFLAGS := @CXXFLAGS@
23CXXINC := $(filter -I%,@CXX@)
24CXXOPTS := $(CXXFLAGS) @PICFLAG@
25
26ifneq (@EXCEPTIONS@,yes)
27CXXOPTS += -fno-exceptions -fno-rtti
28endif
29
30# Config
31CXXOPTS += $(filter-out -DHAVE_CONFIG_H,@DEFS@) -include config.h
32
33# Linker options
34LDFLAGS := @LDFLAGS@
35LIBS := @LIBS@
36
37# Per-source & per-directory compile flags (warning: recursive)
38SRC_CXXFLAGS = $(CXXFLAGS$(patsubst $(srcdir)%,%,$1)) \
39	$(if $(filter-out $(srcdir)/,$1),\
40	  $(call $0,$(dir $(patsubst %/,%,$1))))
41
42ifneq ($(MAINTAINER),)
43override MAINTAINER += $1
44endif
45ifeq (@MAINTAINER@,yes)
46MAINTAINER = $2
47else
48MAINTAINER = \# --enable-maintainer-mode to rebuild $1, or make MAINTAINER=touch
49endif
50
51vpath %.in $(srcdir)
52vpath %.cc $(srcdir)
53
54.SUFFIXES: .o .cc
55
56%.o: %.cc
57	@mkdir -p $(dir $@)
58	$(CXX) $(strip $(CXXOPTS) $(call SRC_CXXFLAGS,$<) $(CXXINC)) \
59	  -MMD -MP -MF ${@:.o=.d} -c -o $@ $<
60
61all:: Makefile
62
63clean:: Makefile
64
65# FIXME: Delete
66revision.stamp: $(srcdir)/.
67	@revision=$$(git -C $(srcdir) rev-parse HEAD 2>/dev/null) ;\
68	if test -n "$$revision" ;\
69	then revision=git-$$revision ;\
70	  if git -C $(srcdir) status --porcelain 2>/dev/null | grep -vq '^  ' ;\
71	  then revision+=M ;\
72	  fi ;\
73	else revision=unknown ;\
74	fi ;\
75	echo $$revision > $@
76
77revision: revision.stamp
78	@cmp -s $< $@ || cp -f $< $@
79
80clean::
81	rm -f revision.stamp revision
82
83distclean:: clean
84	rm -f config.log config.status
85
86$(srcdir)/configure: $(srcdir)/configure.ac $(srcdir)/config.m4
87	$(call MAINTAINER,$@,cd $(@D) && autoconf -W all,error)
88
89$(srcdir)/config.h.in: $(srcdir)/configure.ac $(srcdir)/config.m4
90	$(call MAINTAINER,$@,cd $(@D) && autoheader -f -W all,error)
91
92config.h: config.status config.h.in
93	./$< --header=$@
94	touch $@
95
96ifeq ($(filter %clean,$(MAKECMDGOALS)),)
97Makefile: config.status Makefile.in
98	./$< --file=$@
99	touch $@
100endif
101
102config.status: $(srcdir)/configure $(srcdir)/config.h.in
103	if test -x $@; then ./$@ -recheck; else $< @configure_args@; fi
104
105distclean:: clean
106	rm -f config.h
107
108maintainer-clean:: distclean
109	rm -f $(srcdir)/config.h.in
110
111clean::
112	rm -f $(shell find $(srcdir) -name '*~')
113
114.PHONY: all check clean distclean maintainer-clean
115
116CXXFLAGS/ := -I$(srcdir)
117LIBCODY.O := buffer.o client.o fatal.o netclient.o netserver.o \
118	resolver.o packet.o server.o
119
120all:: libcody.a
121
122libcody.a: $(LIBCODY.O)
123	$(AR) -cr $@ $^
124	$(RANLIB) $@
125
126clean::
127	rm -f $(LIBCODY.O) $(LIBCODY.O:.o=.d)
128	rm -f libcody.a
129
130CXXFLAGS/fatal.cc = -DSRCDIR='"$(srcdir)"'
131
132fatal.o: Makefile revision
133
134install::
135	$(INSTALL) -d $(libdir) $(includedir)
136	$(INSTALL) libcody.a $(libdir)
137	$(INSTALL) $(srcdir)/cody.hh $(includedir)
138
139ifeq ($(filter clean%,$(MAKECMDGOALS)),)
140-include $(LIBCODY.O:.o=.d)
141endif
142