Storing track in sectors is problematic, because we need to update adjacent sectors when updating a sector in a way that changes its capability to extend railway into its neighbors. This invalidates cached adjacent sectors, and calling code may not be prepared for that. Specifically, bridge building caches the bridge head, and writes it back later, wiping out the track update. Replace struct sctstr member sct_track by new sct_rail_track(). Make selector track virtual. Remove the code to keep sct_track up-to-date: set_railway(), update_railway(). Unfortunately, this causes cyclic dependencies between link libraries: the virtual selector needs to be referenced from src/lib/global/nsc.c, and it needs to reference stuff from src/lib/common/file.c. Hack around it in Make.mk for now.
415 lines
12 KiB
Makefile
415 lines
12 KiB
Makefile
#
|
|
# Empire - A multi-player, client/server Internet based war game.
|
|
# Copyright (C) 1986-2008, Dave Pare, Jeff Bailey, Thomas Ruschak,
|
|
# Ken Stevens, Steve McClure
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
#
|
|
# ---
|
|
#
|
|
# See files README, COPYING and CREDITS in the root of the source
|
|
# tree for related information and legal notices. It is expected
|
|
# that future projects/authors will amend these files as needed.
|
|
#
|
|
# ---
|
|
#
|
|
# Make.mk: The real Makefile, included by GNUmakefile
|
|
#
|
|
# Known contributors to this file:
|
|
# Markus Armbruster, 2005-2008
|
|
#
|
|
|
|
# This makefile was inspired by `Recursive Make Considered Harmful',
|
|
# Peter Miller, 1997.
|
|
# http://www.pcug.org.au/~millerp/rmch/recu-make-cons-harm.html
|
|
|
|
# Recursively expanded variables are occasionally useful, but can be
|
|
# slow and tricky. Do not use them gratuitously. If you don't
|
|
# understand this, always use `:=' rather than `='.
|
|
|
|
# Default goal
|
|
all:
|
|
|
|
# Delete target on error. Every Makefile should have this.
|
|
.DELETE_ON_ERROR:
|
|
|
|
# Source files
|
|
ifeq ($(revctrl),git)
|
|
src := $(shell cd $(srcdir) && git-ls-files)
|
|
else
|
|
include $(srcdir)/sources.mk
|
|
endif
|
|
dirs := $(sort $(dir $(src)))
|
|
csrc := $(filter %.c, $(src))
|
|
tsrc := $(filter %.t, $(src))
|
|
man6 := $(filter man/%.6, $(src))
|
|
builtins := $(filter src/lib/global/%.config, $(src))
|
|
|
|
# Info subjects (automatically generated)
|
|
-include subjects.mk
|
|
|
|
# Abbreviations
|
|
topics := $(patsubst %.t,%,$(notdir $(tsrc)))
|
|
info := $(topics) $(subjects) all TOP
|
|
subjects.html := $(addprefix info.html/, $(addsuffix .html, $(subjects)))
|
|
topics.html := $(addprefix info.html/, $(addsuffix .html, $(topics)))
|
|
scripts := $(srcdir)/src/scripts
|
|
depcomp := $(SHELL) $(srcdir)/depcomp
|
|
tarball := $(SHELL) -e $(scripts)/tarball
|
|
econfig := $(sysconfdir)/empire/econfig
|
|
schedule := $(sysconfdir)/empire/schedule
|
|
gamedir := $(localstatedir)/empire
|
|
builtindir := $(datadir)/empire/builtin
|
|
einfodir := $(datadir)/empire/info.nr
|
|
ehtmldir := $(datadir)/empire/info.html
|
|
|
|
# How to substitute Autoconf output variables
|
|
# Recursively expanded so that $@ and $< work.
|
|
subst.in = sed \
|
|
-e 's?@configure_input\@?$(notdir $@): Generated from $(notdir $<) by make.?g' \
|
|
-e 's?@builtindir\@?$(builtindir)?g' \
|
|
-e 's?@econfig\@?$(econfig)?g' \
|
|
-e 's?@einfodir\@?$(einfodir)?g' \
|
|
-e 's?@gamedir\@?$(gamedir)?g' \
|
|
-e 's/@EMPIREHOST\@/$(EMPIREHOST)/g' \
|
|
-e 's/@EMPIREPORT\@/$(EMPIREPORT)/g'
|
|
|
|
# Generated files
|
|
# See `Cleanliness' below
|
|
mk := subjects.mk
|
|
ifeq ($(revctrl),git)
|
|
mk += sources.mk
|
|
else
|
|
ifneq ($(srcdir),.)
|
|
mk += sources.mk
|
|
endif
|
|
endif
|
|
# Generated by Autoconf, not distributed:
|
|
ac := config.h config.log config.status info.html info.nr lib stamp-h
|
|
ac += $(basename $(filter %.in, $(src)))
|
|
ac += $(srcdir)/autom4te.cache $(srcdir)/src/client/autom4te.cache
|
|
# distributed by dist-source from $(srcdir):
|
|
acdist := aclocal.m4 config.h.in configure stamp-h.in
|
|
# distributed by dist-client from $(srcdir):
|
|
acdistcli := $(addprefix src/client/, aclocal.m4 config.h.in configure)
|
|
# Object files:
|
|
obj := $(csrc:.c=.o) $(filter %.o, $(ac:.c=.o))
|
|
# Dependencies:
|
|
deps := $(obj:.o=.d)
|
|
# Library archives:
|
|
libs := $(addprefix lib/, libcommon.a libas.a libgen.a libglobal.a)
|
|
# Programs:
|
|
util := $(addprefix src/util/, $(addsuffix $(EXEEXT), empdump empsched fairland files pconfig))
|
|
client := src/client/empire$(EXEEXT)
|
|
server := src/server/emp_server$(EXEEXT)
|
|
# Info subjects:
|
|
tsubj := $(addprefix info/, $(addsuffix .t, $(subjects)))
|
|
ttop := info/TOP.t
|
|
# Formatted info:
|
|
info.nr := $(addprefix info.nr/, $(info))
|
|
info.html := $(addprefix info.html/, $(addsuffix .html, $(info)))
|
|
|
|
# Conditionally generated files:
|
|
empth_obj := src/lib/empthread/io.o
|
|
empth_lib :=
|
|
ifeq ($(empthread),LWP)
|
|
empth_obj += src/lib/empthread/lwp.o src/lib/empthread/posix.o
|
|
empth_lib += lib/liblwp.a
|
|
endif
|
|
ifeq ($(empthread),POSIX)
|
|
empth_obj += src/lib/empthread/pthread.o src/lib/empthread/posix.o
|
|
endif
|
|
ifeq ($(empthread),Windows)
|
|
empth_obj += src/lib/empthread/ntthread.o
|
|
endif
|
|
|
|
ifeq ($(empthread),Windows) # really: W32, regardless of thread package
|
|
libs += lib/libw32.a
|
|
endif
|
|
|
|
# Cleanliness
|
|
# Each generated file should be in one of the following sets.
|
|
# Removed by clean:
|
|
clean := $(obj) $(deps) $(libs) $(util) $(client) $(server) $(tsubj) \
|
|
$(ttop) $(info.nr) $(info.html) $(empth_obj) $(empth_lib)
|
|
# Removed by distclean:
|
|
distclean := $(ac) $(mk)
|
|
# Distributed by dist-source from $(srcdir)
|
|
src_distgen := $(acdist)
|
|
# Distributed by dist-source from .
|
|
bld_distgen := sources.mk
|
|
# Distributed by dist-client from $(srcdir)/src/client
|
|
cli_distgen := $(acdistcli)
|
|
|
|
# Compiler flags
|
|
CPPFLAGS += -I$(srcdir)/include -I.
|
|
ifeq ($(empthread),Windows) # really: W32, regardless of thread package
|
|
CPPFLAGS += -I$(srcdir)/src/lib/w32
|
|
endif
|
|
ifeq ($(have_gcc),yes)
|
|
CFLAGS += -fno-builtin-carg # conflicts with our carg()
|
|
CFLAGS += -fno-common
|
|
CFLAGS += -Wall -W -Wno-unused-parameter -Wpointer-arith \
|
|
-Wstrict-prototypes -Wmissing-prototypes -Wnested-externs \
|
|
-Wredundant-decls
|
|
endif
|
|
LDLIBS += -lm
|
|
$(client): LDLIBS += $(termlibs)
|
|
|
|
### Advertized goals
|
|
|
|
.PHONY: all
|
|
all: $(util) $(client) $(server) info
|
|
|
|
.PHONY: info html
|
|
info: $(info.nr)
|
|
html: $(info.html)
|
|
|
|
.PHONY: clean
|
|
clean:
|
|
rm -f $(clean)
|
|
|
|
.PHONY: distclean
|
|
distclean: clean
|
|
rm -rf $(distclean)
|
|
|
|
.PHONY: install
|
|
install: all installdirs
|
|
$(INSTALL_PROGRAM) $(util) $(server) $(sbindir)
|
|
$(INSTALL_PROGRAM) $(client) $(bindir)
|
|
$(INSTALL) -m 444 $(addprefix $(srcdir)/, $(builtins)) $(builtindir)
|
|
$(INSTALL_DATA) $(info.nr) $(einfodir)
|
|
$(INSTALL_DATA) $(addprefix $(srcdir)/, $(man6)) $(mandir)/man6
|
|
sed -e '1,/^$$/d' -e 's/^/# /g' <$(srcdir)/doc/schedule >$(schedule).dist
|
|
echo >>$(schedule).dist
|
|
echo 'every 10 minutes' >>$(schedule).dist
|
|
[ -e $(schedule) ] || mv $(schedule).dist $(schedule)
|
|
if [ -e $(econfig) ]; then \
|
|
echo "Attempting to update your econfig"; \
|
|
if src/util/pconfig $(econfig) >$(econfig).dist; then \
|
|
if cmp -s $(econfig) $(econfig).dist; then \
|
|
echo "$(econfig) unchanged"; \
|
|
rm $(econfig).dist; \
|
|
fi; \
|
|
else \
|
|
echo "Your $(econfig) doesn't work"; \
|
|
src/util/pconfig >$(econfig).dist; \
|
|
fi; \
|
|
if [ -e $(econfig).dist ]; then \
|
|
echo "Check out $(econfig).dist"; \
|
|
fi; \
|
|
else \
|
|
src/util/pconfig >$(econfig); \
|
|
fi
|
|
|
|
.PHONY: installdirs
|
|
installdirs:
|
|
mkdir -p $(sbindir) $(bindir) $(builtindir) $(einfodir) $(mandir)/man6 $(dir $(econfig)) $(gamedir)
|
|
|
|
.PHONY: install-html
|
|
install-html: html
|
|
mkdir -p $(ehtmldir)
|
|
$(INSTALL_DATA) $(info.html) $(ehtmldir)
|
|
|
|
.PHONY: uninstall
|
|
uninstall:
|
|
rm -f $(addprefix $(sbindir)/, $(notdir $(util) $(server)))
|
|
rm -f $(addprefix $(bindir)/, $(notdir $(client)))
|
|
rm -rf $(builtindir) $(einfodir)
|
|
rm -f $(addprefix $(mandir)/man6/, $(notdir $(man6)))
|
|
@echo "$(dir $(econfig)) and $(gamedir) not removed, you may wish to remove it manually."
|
|
|
|
.PHONY: dist
|
|
dist: dist-source dist-client dist-info
|
|
|
|
|
|
### Implicit rules
|
|
|
|
# Compile with dependencies as side effect, i.e. create %.d in
|
|
# addition to %.o.
|
|
ifeq ($(how_to_dep),fast)
|
|
%.o: %.c
|
|
$(COMPILE.c) -MT $@ -MMD -MP $(OUTPUT_OPTION) $< \
|
|
|| { rm -f $(@:.o=.d) $@; false; }
|
|
# Why the rm? If gcc's preprocessor chokes, it leaves an empty
|
|
# dependency file behind, and doesn't touch the object file. If an
|
|
# old object file exists, and is newer than the .c file, make will
|
|
# then consider the object file up-to-date.
|
|
endif
|
|
ifeq ($(how_to_dep),depcomp)
|
|
%.o: %.c
|
|
source='$<' object='$@' depfile='$(@:.o=.d)' $(CCDEPMODE) $(depcomp) \
|
|
$(COMPILE.c) $(OUTPUT_OPTION) $<
|
|
endif
|
|
# Cancel the rule to compile %.c straight to %, it interferes with
|
|
# automatic dependency generation
|
|
%: %.c
|
|
|
|
# Work around MinGW Make's broken built-in link rule:
|
|
%$(EXEEXT): %.o
|
|
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
|
|
|
|
|
|
info.nr/%: info/%.t
|
|
$(NROFF) $(filter %.MAC, $^) $< | $(AWK) -f $(filter %/Blank.awk, $^) >$@
|
|
# Pipes in make are a pain. Catch obvious errors:
|
|
@test -s $@
|
|
|
|
info.html/%.html: info/%.t
|
|
perl $(filter %.pl, $^) $< >$@
|
|
|
|
|
|
### Explicit rules
|
|
|
|
# Compilation
|
|
|
|
$(server): $(filter src/server/% src/lib/commands/% src/lib/player/% src/lib/subs/% src/lib/update/%, $(obj)) $(empth_obj) $(empth_lib) $(libs)
|
|
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
|
|
|
|
$(client): $(filter src/client/%, $(obj)) src/lib/global/version.o
|
|
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
|
|
ifeq ($(empthread),Windows)
|
|
$(client): src/lib/w32/getopt.o
|
|
endif
|
|
|
|
$(util): src/lib/common/move.o # FIXME hack for opt_RAILWAYS
|
|
$(util): $(libs)
|
|
|
|
lib/libas.a: $(filter src/lib/as/%, $(obj))
|
|
lib/libcommon.a: $(filter src/lib/common/%, $(obj))
|
|
lib/libgen.a: $(filter src/lib/gen/%, $(obj))
|
|
lib/libglobal.a: $(filter src/lib/global/%, $(obj))
|
|
lib/liblwp.a: $(filter src/lib/lwp/%, $(obj))
|
|
lib/libw32.a: $(filter src/lib/w32/%, $(obj))
|
|
|
|
$(libs) $(empth_lib):
|
|
$(AR) rc $@ $?
|
|
$(RANLIB) $@
|
|
|
|
# Info formatting
|
|
|
|
# FIXME Remaking subjects doesn't work correctly when info sources get
|
|
# removed or subjects get dropped.
|
|
|
|
subjects.mk: info/findsubj.pl $(tsrc)
|
|
perl $(srcdir)/info/findsubj.pl $(filter %.t, $^)
|
|
|
|
$(tsubj): info/mksubj.pl
|
|
perl $(srcdir)/info/mksubj.pl $@ $(filter %.t, $^)
|
|
|
|
$(ttop): $(tsubj)
|
|
perl $(srcdir)/info/mktop.pl $@ $(filter %.t, $^)
|
|
|
|
info.nr/all: $(filter-out info.nr/all, $(info.nr))
|
|
>$@
|
|
(cd info.nr && LC_ALL=C ls -C $(info)) >>$@
|
|
|
|
info.html/all.html: info.nr/all info/ls2html.pl
|
|
expand $< | perl $(srcdir)/info/ls2html.pl >$@
|
|
|
|
$(info.nr): info/CRT.MAC info/INFO.MAC info/Blank.awk
|
|
|
|
$(subjects.html) info.html/TOP.html: info/subj2html.pl
|
|
$(topics.html): info/emp2html.pl
|
|
|
|
info.ps: info/TROFF.MAC info/INFO.MAC $(ttop) $(tsubj) $(tsrc)
|
|
groff $^ >$@
|
|
|
|
# List of source files
|
|
|
|
# Note: $(srcdir)/sources.mk is only used when the source tree came
|
|
# from a tarball rather than git. The following rules create a
|
|
# sources.mk to put into the tarball. It is not used otherwise in
|
|
# this build.
|
|
|
|
ifeq ($(revctrl),git)
|
|
sources.mk:
|
|
echo "src := $(src)" >sources.mk
|
|
else
|
|
ifneq ($(srcdir),.)
|
|
sources.mk: $(srcdir)/sources.mk
|
|
cp -f $^ $@
|
|
endif
|
|
endif
|
|
|
|
# Distributing
|
|
|
|
.PHONY: dist-source
|
|
dist-source: $(src_distgen) $(bld_distgen)
|
|
$(tarball) $(TARNAME)-$(VERSION) $(bld_distgen) -C $(srcdir) $(src_distgen) $(src)
|
|
|
|
.PHONY: dist-client
|
|
dist-client: $(cli_distgen)
|
|
$(tarball) $(TARNAME)-client-$(VERSION) \
|
|
-C $(srcdir)/src/client \
|
|
$(notdir $(filter src/client/%, $(src)) $(cli_distgen)) \
|
|
-C $(srcdir)/include proto.h version.h \
|
|
-C $(srcdir)/src/lib/global version.c \
|
|
-C $(srcdir)/src/lib/w32 getopt.h getopt.c \
|
|
-C $(srcdir)/man empire.6 \
|
|
-C $(srcdir) COPYING INSTALL install-sh
|
|
|
|
.PHONY: dist-info
|
|
dist-info: info html
|
|
$(tarball) $(TARNAME)-info-text-$(VERSION) -C info.nr $(info)
|
|
$(tarball) $(TARNAME)-info-html-$(VERSION) -C info.html $(addsuffix .html, $(info))
|
|
|
|
ifneq ($(deps),)
|
|
-include $(deps)
|
|
endif
|
|
|
|
|
|
# Automatic remake of configuration
|
|
# See (autoconf)Automatic Remaking.
|
|
# This requires sufficiently recent versions of autoconf and automake
|
|
|
|
$(srcdir)/configure: configure.ac aclocal.m4
|
|
cd $(srcdir) && autoconf
|
|
|
|
# autoheader might not change config.h.in, so touch a stamp file.
|
|
$(srcdir)/config.h.in: stamp-h.in
|
|
$(srcdir)/stamp-h.in: configure.ac aclocal.m4
|
|
cd $(srcdir) && autoheader
|
|
touch $@
|
|
|
|
$(srcdir)/aclocal.m4: $(filter m4/%.m4, $(src))
|
|
cd $(srcdir) && aclocal -I m4
|
|
|
|
# config.status might not change config.h; use the stamp file.
|
|
config.h: stamp-h
|
|
stamp-h: config.h.in config.status
|
|
./config.status config.h stamp-h
|
|
|
|
GNUmakefile: GNUmakefile.in config.status
|
|
./config.status $@
|
|
|
|
config.status: configure
|
|
./config.status --recheck
|
|
|
|
src/lib/global/path.c src/client/ipglob.c: %: %.in GNUmakefile Make.mk
|
|
$(subst.in) <$< >$@
|
|
|
|
|
|
# Make files for standalone client distribution
|
|
|
|
$(srcdir)/src/client/configure: src/client/configure.ac src/client/aclocal.m4
|
|
cd $(dir $@) && autoconf
|
|
|
|
$(srcdir)/src/client/config.h.in: src/client/configure.ac src/client/aclocal.m4
|
|
cd $(dir $@) && autoheader
|
|
touch $@
|
|
|
|
$(srcdir)/src/client/aclocal.m4: m4/lib_socket_nsl.m4
|
|
cp -f $< $@
|