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