1##
2## Gophernicus server Makefile
3##
4
5#
6# Variables and default configuration
7#
8NAME     = gophernicus
9PACKAGE  = $(NAME)
10BINARY   = $(NAME)
11VERSION  = 3.0.1
12CODENAME = Dungeon Edition
13AUTHOR   = h9bnks and fosslinux
14EMAIL    = gophernicus@gophernicus.org
15STARTED  = 2009
16
17SOURCES = $(NAME).c file.c menu.c string.c platform.c session.c options.c
18HEADERS = functions.h files.h
19OBJECTS = $(SOURCES:.c=.o)
20README  = README.md
21DOCS    = LICENSE README.md INSTALL.md TODO changelog README.Gophermap gophertag
22
23INSTALL = PATH=$$PATH:/usr/sbin ./install-sh -o 0 -g 0
24DESTDIR = /usr
25OSXDEST = /usr/local
26SBINDIR = $(DESTDIR)/sbin
27DOCDIR  = $(DESTDIR)/share/doc/$(PACKAGE)
28
29ROOT    = /var/gopher
30OSXROOT = /Library/GopherServer
31WRTROOT = /gopher
32MAP     = gophermap
33
34INETD   = /etc/inetd.conf
35XINETD  = /etc/xinetd.d
36INETLIN = "gopher	stream	tcp	nowait	nobody	$(SBINDIR)/$(BINARY)	$(BINARY) -h `hostname`"
37INETPID = /var/run/inetd.pid
38LAUNCHD = /Library/LaunchDaemons
39PLIST   = org.$(NAME).server.plist
40NET_SRV = /boot/common/settings/network/services
41SYSTEMD = /lib/systemd/system /usr/lib/systemd/system
42HAS_STD = /run/systemd/system
43SYSCONF = /etc/sysconfig
44DEFAULT = /etc/default
45
46CC      = gcc
47HOSTCC	= $(CC)
48CFLAGS  = -O2 -Wall
49LDFLAGS =
50
51IPCRM   = /usr/bin/ipcrm
52
53
54#
55# Platform support, compatible with both BSD and GNU make
56#
57all: headers
58	@case `uname` in \
59		Darwin)	$(MAKE) ROOT="$(OSXROOT)" DESTDIR="$(OSXDEST)" $(BINARY); ;; \
60		Haiku)	$(MAKE) EXTRA_LIBS="-lnetwork" $(BINARY); ;; \
61		*)	if [ -f "/usr/include/tcpd.h" ]; then $(MAKE) withwrap; else $(MAKE) $(BINARY); fi; ;; \
62	esac
63
64generic: $(BINARY)
65
66withwrap:
67	$(MAKE) EXTRA_CFLAGS="-DHAVE_LIBWRAP" EXTRA_LIBS="-lwrap" $(BINARY)
68
69
70#
71# Special targets
72#
73deb:
74	dpkg-buildpackage -rfakeroot -uc -us
75
76#
77# Building
78#
79$(NAME).c: headers $(NAME).h
80
81$(BINARY): $(OBJECTS)
82	$(CC) $(LDFLAGS) $(EXTRA_LDFLAGS) $(OBJECTS) $(EXTRA_LIBS) -o $@
83
84.c.o:
85	$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) -DVERSION="\"$(VERSION)\"" -DCODENAME="\"$(CODENAME)\"" -DDEFAULT_ROOT="\"$(ROOT)\"" $< -o $@
86
87
88headers: $(HEADERS)
89	@echo
90
91functions.h:
92	echo "/* Automatically generated function definitions */" > $@
93	echo >> $@
94	grep -h "^[a-z]" $(SOURCES) | \
95		grep -v "int main" | \
96		grep -v "strlc" | \
97		grep -v "[a-z]:" | \
98		sed -e "s/ =.*$$//" -e "s/ *$$/;/" >> $@
99	@echo
100
101bin2c: bin2c.c
102	$(HOSTCC) bin2c.c -o $@
103	@echo
104
105README: $(README)
106	cat $(README) > $@
107
108files.h: bin2c README
109	sed -e '/^(end of option list)/,$$d' README > README.options
110	./bin2c -0 -n README README.options > $@
111	./bin2c -0 LICENSE >> $@
112	./bin2c -n ERROR_GIF error.gif >> $@
113	@echo
114
115
116#
117# Cleanup after building
118#
119clean: clean-build clean-deb
120
121clean-build:
122	rm -f $(BINARY) $(OBJECTS) $(HEADERS) README.options README bin2c
123
124clean-deb:
125	if [ -d debian/$(PACKAGE) ]; then fakeroot debian/rules clean; fi
126
127clean-shm:
128	if [ -x $(IPCRM) ]; then $(IPCRM) -M `awk '/SHM_KEY/ { print $$3 }' $(NAME).h` || true; fi
129
130
131#
132# Install targets
133#
134install: clean-shm
135	@case `uname` in \
136		Darwin)  $(MAKE) ROOT="$(OSXROOT)" DESTDIR="$(OSXDEST)" install-files install-docs install-root install-osx install-done; ;; \
137		Haiku)   $(MAKE) SBINDIR=/boot/common/bin DOCDIR=/boot/common/share/doc/$(PACKAGE) \
138		                 install-files install-docs install-root install-haiku install-done; ;; \
139		*)       $(MAKE) install-files install-docs install-root; ;; \
140	esac
141	@if [ -d "$(HAS_STD)" ]; then $(MAKE) install-systemd install-done; \
142	elif [ -d "$(XINETD)" ]; then $(MAKE) install-xinetd install-done; \
143	elif [ -f "$(INETD)"  ]; then $(MAKE) install-inetd install-done; fi
144
145.PHONY: install
146
147install-done:
148	@echo
149	@echo "======================================================================"
150	@echo
151	@echo "If there were no errors shown above,"
152	@echo "Gophernicus has now been succesfully installed. To try it out, launch"
153	@echo "your favorite gopher browser and navigate to your gopher root."
154	@echo
155	@echo "Gopher URL...: gopher://`hostname`/"
156	@for CONFFILE in /etc/sysconfig/gophernicus \
157		/etc/default/gophernicus \
158		/Library/LaunchDaemons/org.gophernicus.server.plist \
159		/boot/common/settings/network/services \
160		/lib/systemd/system/gophernicus\@.service \
161		/etc/xinetd.d/gophernicus \
162		/etc/inetd.conf; do \
163			if [ -f $$CONFFILE ]; then echo "Configuration: $$CONFFILE"; break; fi; done;
164	@echo
165	@echo "======================================================================"
166	@echo
167
168install-files: $(BINARY)
169	mkdir -p $(SBINDIR)
170	$(INSTALL) -s -m 755 $(BINARY) $(SBINDIR)
171	@echo
172
173install-docs:
174	mkdir -p $(DOCDIR)
175	$(INSTALL) -m 644 $(DOCS) $(DOCDIR)
176	@echo
177
178install-root:
179	if [ ! -d "$(ROOT)" -o ! -f "$(ROOT)/$(MAP)" ]; then \
180		mkdir -p $(ROOT); \
181		$(INSTALL) -m 644 $(MAP) $(ROOT); \
182		ln -s $(DOCDIR) $(ROOT)/docs; \
183	fi
184	@echo
185
186install-inetd: install-files install-docs install-root
187	@if update-inetd --add $(INETLIN); then \
188		echo update-inetd install worked ; \
189	else if grep '^gopher' $(INETD) >/dev/null 2>&1 ; then \
190		echo "::::: Gopher entry in $(INETD) already present -- please check! :::::"; \
191		else echo "Trying to add gopher entry to $(INETD)" ; \
192			echo "$(INETLIN)" >> $(INETD) ; \
193			if [ -r $(INETPID) ] ; then kill -HUP `cat $(INETPID)` ; \
194				else echo "::::: No PID for inetd found, not restarted -- please check! :::::" ; fi ; \
195		fi ; \
196	fi
197	@echo
198
199install-xinetd: install-files install-docs install-root
200	if [ -d "$(XINETD)" -a ! -f "$(XINETD)/$(NAME)" ]; then \
201		sed -e "s/@HOSTNAME@/`hostname`/g" $(NAME).xinetd > $(XINETD)/$(NAME); \
202		[ -x /sbin/service ] && /sbin/service xinetd reload; \
203	fi
204	@echo
205
206install-osx:
207	if [ -d "$(LAUNCHD)" -a ! -f "$(LAUNCHD)/$(PLIST)" ]; then \
208		sed -e "s/@HOSTNAME@/`hostname`/g" $(PLIST) > $(LAUNCHD)/$(PLIST); \
209		launchctl load $(LAUNCHD)/$(PLIST); \
210	fi
211	@echo
212	chown -h root:admin $(ROOT) $(ROOT)/*
213	chmod -h 0775 $(ROOT) $(ROOT)/docs
214	@echo
215
216install-haiku:
217	if [ -f "$(NET_SRV)" -a ! "`grep -m1 gopher $(NET_SRV)`" ]; then \
218		(echo ""; \
219		echo "service gopher {"; \
220		echo "	family inet"; \
221		echo "	protocol tcp"; \
222		echo "	port 70"; \
223		echo "	launch $(BINARY) -h `hostname`"; \
224		echo "}") >> $(NET_SRV); \
225	fi
226	@echo
227	chown user:root $(DOCDIR)/* $(SBINDIR)/$(BINARY) $(ROOT)/$(MAP)
228	@echo
229	ps | grep net_server | grep -v grep | awk '{ print $$2 }' | xargs kill
230	nohup /boot/system/servers/net_server >/dev/null 2>/dev/null &
231	@echo
232
233install-systemd: install-files install-docs install-root
234	if [ -d "$(HAS_STD)" ]; then \
235		if [ -d "$(SYSCONF)" -a ! -f "$(SYSCONF)/$(NAME)" ]; then \
236			$(INSTALL) -m 644 $(NAME).env $(SYSCONF)/$(NAME); \
237		fi; \
238		if [ ! -d "$(SYSCONF)" -a -d "$(DEFAULT)" -a ! -f $(DEFAULT)/$(NAME) ]; then \
239			$(INSTALL) -m 644 $(NAME).env $(DEFAULT)/$(NAME); \
240		fi; \
241		for DIR in $(SYSTEMD); do \
242			if [ -d "$$DIR" ]; then \
243				$(INSTALL) -m 644 $(NAME).socket $(NAME)\@.service $$DIR; \
244				break; \
245			fi; \
246		done; \
247		if pidof systemd ; then \
248			systemctl daemon-reload; \
249			systemctl enable $(NAME).socket; \
250			systemctl start $(NAME).socket; \
251		fi; \
252	fi
253	@echo
254
255#
256# Uninstall targets
257#
258uninstall: uninstall-xinetd uninstall-launchd uninstall-systemd uninstall-inetd
259	rm -f $(SBINDIR)/$(BINARY)
260	for DOC in $(DOCS); do rm -f $(DOCDIR)/$$DOC; done
261	rmdir -p $(SBINDIR) $(DOCDIR) 2>/dev/null || true
262	@echo
263
264uninstall-inetd:
265	@if [ -f "$(INETD)" ] && update-inetd --remove "^gopher.*gophernicus" ; then \
266		echo update-inetd remove worked ; \
267	else if grep '^gopher' $(INETD) >/dev/null 2>&1 && \
268		sed -i .bak -e 's/^gopher/#gopher/' $(INETD) ; then \
269			echo "commented out gopher entry in $(INETD), reloading inetd" ; \
270			[ -r $(INETPID) ] && kill -HUP `cat $(INETPID)` ; \
271		else echo "::::: could not find gopher entry in $(INETD) :::::" ; \
272		fi ; \
273	fi
274	@echo
275
276uninstall-xinetd:
277	if grep -q $(BINARY) "$(XINETD)/gopher" 2>/dev/null; then \
278		rm -f $(XINETD)/gopher; \
279		[ -x /sbin/service ] && service xinetd reload; \
280	fi
281	@echo
282
283uninstall-launchd:
284	if [ -f $(LAUNCHD)/$(PLIST) ]; then \
285		launchctl unload $(LAUNCHD)/$(PLIST); \
286		rm -f $(LAUNCHD)/$(PLIST); \
287	fi
288	if [ -L $(ROOT) ]; then \
289		rm -f $(ROOT); \
290	fi
291	@echo
292
293uninstall-systemd:
294	if [ -d "$(HAS_STD)" ]; then \
295		for DIR in $(SYSTEMD); do \
296			if [ -f "$$DIR/$(NAME).socket" ]; then \
297				systemctl stop $(NAME).socket; \
298				systemctl disable $(NAME).socket; \
299				rm -f $$DIR/$(NAME).socket $$DIR/$(NAME)\@.service $(SYSCONF)/$(NAME) $(DEFAULT)/$(NAME); \
300				systemctl daemon-reload; \
301				break; \
302			fi; \
303		done; \
304	fi
305	@echo
306
307
308#
309# List all C defines
310#
311defines: functions.h files.h
312	$(CC) -dM -E $(NAME).c
313
314
315#
316# LOC
317#
318loc:
319	@wc -l *.c
320
321
322#
323# Fix copyright notes
324#
325copyright: README
326	sed -i .stupid -e "s/Copyright .c. 2.*$$/Copyright (c) $(STARTED)-`date +%Y` $(AUTHOR) <$(EMAIL)>/" *.c *.h LICENSE $(README) debian/copyright
327	sed -i .stupid -e "s/Maintainer: .*$$/Maintainer: $(AUTHOR) <$(EMAIL)>/" debian/control
328	rm -f *.stupid debian/*.stupid
329
330