1# The default target of this Makefile is...
2all::
3
4# Section starts with '###'.
5#
6# Define V=1 to have a more verbose compile.
7
8### Defaults
9
10BASIC_CFLAGS = -std=c99 -Wall -I./argparse
11BASIC_LDFLAGS = -lm -lsodium
12
13# Guard against environment variables
14LIB_H =
15LIB_OBJS =
16DEP_LIBS =
17
18# Having this variable in your environment would break pipelines because you
19# case "cd" to echo its destination to stdout.
20unexport CDPATH
21
22### Configurations
23
24uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
25uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not')
26uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
27uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not')
28uname_P := $(shell sh -c 'uname -p 2>/dev/null || echo not')
29uname_V := $(shell sh -c 'uname -v 2>/dev/null || echo not')
30
31# CFLAGS and LDFLAGS are for users to override
32CFLAGS ?= -g -O2 -Wall
33LDFLAGS ?=
34STRIP ?= strip
35
36# We use ALL_* variants
37ALL_CFLAGS = $(BASIC_CFLAGS) $(CFLAGS)
38ALL_LDFLAGS = $(BASIC_LDFLAGS) $(LDFLAGS)
39
40ifdef PREFIX
41	prefix = $(PREFIX)
42else
43	prefix = /usr/local
44endif
45bindir = $(prefix)/bin
46sbindir = $(prefix)/sbin
47sharedir = $(prefix)/share
48mandir = share/man
49infodir = share/info
50export prefix bindir sbindir sharedir
51
52CC = cc
53RM = rm -rf
54INSTALL = install
55
56ifeq ($(uname_S),Linux)
57	ALL_LDFLAGS += -lrt
58endif
59
60ifeq ($(uname_S),OpenBSD)
61	BASIC_LDFLAGS += -levent_core
62else
63	BASIC_LDFLAGS += -levent
64endif
65
66ifneq ($(findstring $(MAKEFLAGS),s), s)
67ifndef V
68	QUIET_CC   = @echo ' ' CC   $@;
69	QUIET_AR   = @echo ' ' AR   $@;
70	QUIET_LINK = @echo ' ' LINK $@;
71	QUIET_GEN  = @echo ' ' GEN  $@;
72endif
73endif
74
75# configuration generated by ./configure script
76-include config.mak.autogen
77# manual configuration
78-include config.mak
79
80### Dependencies
81
82LIB_H = dnscrypt.h udp_request.h edns.h logger.h argparse/argparse.h
83
84LIB_OBJS += dnscrypt.o
85LIB_OBJS += udp_request.o
86LIB_OBJS += tcp_request.o
87LIB_OBJS += edns.o
88LIB_OBJS += logger.o
89LIB_OBJS += rfc1035.o
90LIB_OBJS += safe_rw.o
91LIB_OBJS += cert.o
92LIB_OBJS += pidfile.o
93LIB_OBJS += debug.o
94LIB_OBJS += fpst.o
95LIB_OBJS += block.o
96
97DEP_LIBS += argparse/libargparse.a
98
99### Automatically dependencies rules
100
101OBJECTS := $(LIB_OBJS) main.o
102
103ifndef COMPUTE_HEADER_DEPENDENCIES
104COMPUTE_HEADER_DEPENDENCIES = auto
105endif
106
107ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto)
108dep_check = $(shell $(CC) \
109	-c -MF /dev/null -MMD -MP -x c /dev/null -o /dev/null 2>&1; \
110	echo $$?)
111ifeq ($(dep_check),0)
112override COMPUTE_HEADER_DEPENDENCIES = yes
113else
114override COMPUTE_HEADER_DEPENDENCIES = no
115endif
116endif
117
118ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
119USE_COMPUTED_HEADER_DEPENDENCIES = YesPlease
120else
121ifneq ($(COMPUTE_HEADER_DEPENDENCIES),no)
122$(error please set COMPUTE_HEADER_DEPENDENCIES to yes, no, or auto \
123(not "$(COMPUTE_HEADER_DEPENDENCIES)"))
124endif
125endif
126
127dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
128dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
129
130ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
131$(dep_dirs):
132	@mkdir -p $@
133missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
134dep_file = $(dir $@).depend/$(notdir $@).d
135dep_args = -MF $(dep_file) -MMD -MP
136endif
137
138ifdef USE_COMPUTED_HEADER_DEPENDENCIES
139# Take advantage of gcc's on-the-fly dependency generation
140# See <http://gcc.gnu.org/gcc-3.0/features.html>.
141dep_files_present := $(wildcard $(dep_files))
142ifneq ($(dep_files_present),)
143include $(dep_files_present)
144endif
145else
146$(OBJECTS): $(LIB_H)
147endif
148
149### Build rules
150
151configure: configure.ac
152	$(QUIET_GEN)autoconf -o $@ $<
153
154ifdef AUTOCONFIGURED
155config.status: configure
156	$(QUIET_GEN)if test -f config.status; then \
157		./config.status --recheck; \
158	else \
159		./configure; \
160	fi
161reconfigure config.mak.autogen: config.status
162	$(QUIET_LINK)./config.status
163.PHONY: reconfigure # This is a convenience target.
164endif
165
166argparse/libargparse.a: argparse/argparse.h
167	@$(MAKE) -C argparse libargparse.a
168
169argparse/argparse.h:
170	git submodule update --init argparse
171
172$(LIB_OBJS): $(LIB_H)
173
174TRACK_CFLAGS = $(CC):$(subst ','\'',$(ALL_CFLAGS))
175
176MAIN-CFLAGS: FORCE
177	@FLAGS='$(TRACK_CFLAGS)'; \
178	if test x"$$FLAGS" != x"`cat MAIN-CFLAGS 2>/dev/null`"; then \
179		echo "$$FLAGS" > $@; \
180	fi
181
182TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS))
183
184MAIN-LDFLAGS: FORCE
185	@FLAGS='$(TRACK_LDFLAGS)'; \
186	if test x"$$FLAGS" != x"`cat MAIN-LDFLAGS 2>/dev/null`"; then \
187		echo "$$FLAGS" > $@; \
188	fi
189
190$(OBJECTS): %.o: %.c $(missing_dep_dirs) MAIN-CFLAGS
191	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $<
192
193dnscrypt-wrapper: $(OBJECTS) $(DEP_LIBS) MAIN-LDFLAGS
194	$(QUIET_LINK)$(CC) -o $@ $(filter %.o %.a,$^) $(ALL_LDFLAGS)
195
196main.o: version.h
197
198all:: dnscrypt-wrapper
199
200version.h: FORCE
201	@./gen-version.sh
202
203install: all
204	$(INSTALL) -d -m 755 '$(DESTDIR)$(sbindir)'
205	$(INSTALL) -p dnscrypt-wrapper '$(DESTDIR)$(sbindir)'
206
207uninstall:
208	$(RM) $(sbindir)/dnscrypt-wrapper
209
210clean:
211	$(RM) dnscrypt-wrapper
212	$(RM) $(LIB_OBJS)
213	make -C argparse clean
214
215.PHONY: all install uninstall clean FORCE
216