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