New title screen featuring Roxanne (Psiweapon, #7832)
[crawl:crawl.git] / crawl-ref / source / Makefile
1 # vim:set ts=8 sw=4 noexpandtab:
2 #
3 # Dungeon Crawl Stone Soup
4 # GNU Makefile
5 #
6 # largely written by Steven Noonan <steven@uplinklabs.net>
7 #    (if something breaks, blame him.)
8 #
9
10 # Typical targets:
11 #    make
12 #    make debug
13 #    make debug-lite    # Like "make debug", but without all the spew.
14 #    make install
15 #    make debug install
16 #    -- note, unlike most programs, you need to specify build type when
17 #       installing even if you just built it.
18 # Typical parameters:
19 #    TILES         -- set to anything to enable tiles build
20 #
21 #    CROSSHOST     -- target system, eg, i386-pc-msdosdjgpp or i586-mingw32msvc
22 #
23 #    prefix        -- installation base.  Specify eg. /usr/local on Unix systems.
24 #    DESTDIR       -- installation staging area (the dir you intend to pack)
25 #    DATADIR       -- place to hold immutable files.  Can be either relative to
26 #                     "prefix" or absolute.
27 #    SAVEDIR       -- place to hold writeable data (saves, database, morgue
28 #                     dumps).  Can be relative to "prefix", absolute or placed
29 #                     in the user's home dir (~).  Remember to protect the ~
30 #                     from your shell!
31 #                     Warning, as of 0.8, directories shared between
32 #                     multiple system users are no longer supported.
33 #    SHAREDDIR     -- place to hold writeable data common to multiple
34 #                     versions of Crawl (scores, the logfile, ghosts).  Will
35 #                     be placed inside the SAVEDIR if not specified.
36 #       Layout examples:
37 #         prefix=~/crawl DATADIR=data/ SAVEDIR=saves/
38 #                  -- everything under ~/crawl
39 #         prefix=/usr/local
40 #                  -- system-wide installation
41 #
42 #    V             -- set to anything to enable verbose build
43 #
44 #    USE_ICC       -- set to use Intel's compiler
45 #    LTO           -- set for better optimization but slower compilation,
46 #                     requires gcc4.6+
47 #    NOASSERTS     -- set to disable assertion checks (ignored in debug mode)
48 #    NOWIZARD      -- set to disable wizard mode.  Use if you have untrusted
49 #                     remote players without DGL.
50 #
51 #    PROPORTIONAL_FONT -- set to a .ttf file you want to use for a proportional
52 #                         font; if not set, a copy of Bitstream Vera Sans
53 #                         shipped with Crawl will be used
54 #    MONOSPACED_FONT   -- monospaced font; Bitstream Vera Mono Sans
55 #    COPY_FONTS    -- force installing fonts
56 #
57 #    WEBTILES      -- set to anything to compile for Webtiles
58 #    WEBDIR        -- place to hold the Webtiles client data. Can be either
59 #                     relative to prefix or absolute.
60 #
61 #    ANDROID       -- perform an Android build (see docs/develop/android.txt)
62 #    TOUCH_UI      -- enable UI behaviour more compatible with touch-screens
63 #
64 #
65 # Requirements:
66 #    For tile builds, you need pkg-config.
67 #    You also need libpng, sdl, sdl-image and libfreetype -- if you got your
68 #    source from git, you can 'git submodule update' to fetch them; you can also
69 #    ask for a package with convenience libraries instead -- we'll try to provide
70 #    them somewhere in the near future.
71
72 GAME = crawl
73
74 # Disable GNU Make implicit rules and variables. Leaving them enabled will slow
75 # down MinGW and Cygwin builds by a very VERY noticeable degree. Besides, we have
76 # _explicit_ rules defined for everything. So we don't need them.
77 MAKEFLAGS += -rR # This only works for recursive makes, i.e. contribs ...
78 .SUFFIXES:       # ... so zap the suffix list to neutralize most predifined rules, too
79
80 .PHONY: all test install clean clean-contrib clean-rltiles clean-android \
81         distclean debug debug-lite profile package-source source \
82         build-windows package-windows rest docs greet api android
83
84 include Makefile.obj
85
86 #
87 # Compiler Flags
88 #
89 # The compiler flag variables are separated into their individual
90 # purposes, making it easier to deal with the various tools involved
91 # in a compile.
92 #
93 # These are also divided into global vs. local flags. So for instance,
94 # CFOPTIMIZE affects Crawl, Lua, and SQLite, while CFOPTIMIZE_L only
95 # affects Crawl.
96 #
97 # The variables are as follows:
98 # CFOPTIMIZE(_L) - Optimization flags
99 # CFWARN(_L) - Warning flags
100 # CFOTHERS(_L) - Anything else
101 #
102
103
104 CFOTHERS := -pipe $(EXTERNAL_FLAGS)
105 CFWARN := -Wall -Wformat-security
106 CFWARN_L := -Wundef
107
108 DEFINES := $(EXTERNAL_DEFINES)
109
110 ifdef ANDROID
111 LDFLAGS := $(EXTERNAL_LDFLAGS) $(LDFLAGS)
112 else
113 LDFLAGS := $(EXTERNAL_LDFLAGS)
114 endif
115
116 #
117 # The GCC and GXX variables are set later.
118 #
119 AR = ar
120 RANLIB = ranlib
121 CC = $(GCC)
122 CXX = $(GXX)
123 RM = rm -f
124 COPY = cp
125 COPY_R = cp -r
126 STRIP = strip -s
127 WINDRES = windres
128 CHMOD = chmod 2>/dev/null
129 CHOWN = chown 2>/dev/null
130 PNGCRUSH = $(COPY)
131 PNGCRUSH_LABEL = COPY
132 ADVPNG = advpng -z -4
133 PKGCONFIG = pkg-config
134 DOXYGEN = doxygen
135 DOXYGEN_SIMPLE_CONF = crawl_simple.doxy
136 DOXYGEN_ALL_CONF = crawl_all.doxy
137 DOXYGEN_HTML_GEN = html/
138
139 export AR
140 export RANLIB
141 export RM
142 export CC
143 export CXX
144 export CFLAGS
145 export MAKEFLAGS
146 export CONFIGURE_FLAGS
147 export uname_S
148
149 #
150 # Platform Detection
151 #
152 uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
153 uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not')
154 uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
155 uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not')
156 uname_P := $(shell sh -c 'uname -p 2>/dev/null || echo not')
157 uname_V := $(shell sh -c 'uname -v 2>/dev/null || echo not')
158
159 HOST := $(shell sh -c 'cc -dumpmachine || echo unknown')
160 ARCH := $(HOST)
161
162 ifdef CROSSHOST
163         ARCH := $(CROSSHOST)
164         ifneq (,$($shell which $(ARCH)-pkg-config 2>/dev/null))
165           PKGCONFIG = $(ARCH)-pkg-config
166         else
167           ifneq (,$(wildcard /usr/$(ARCH)/lib/pkgconfig))
168             PKGCONFIG = PKG_CONFIG_LIBDIR=/usr/$(ARCH)/lib/pkgconfig pkg-config
169           else
170             NO_PKGCONFIG = YesPlease
171             BUILD_LUA = yes
172             BUILD_SQLITE = yes
173             BUILD_ZLIB = YesPlease
174           endif
175         endif
176         NO_AUTO_OPT = YesPlease
177         CONFIGURE_FLAGS += --host=$(CROSSHOST)
178
179         # If needed, override uname_S so we get the appropriate
180         # things compiled.
181         ifneq (,$(findstring mingw,$(CROSSHOST)))
182                 uname_S=MINGW32
183         endif
184
185 endif
186 ifneq (,$(findstring MINGW,$(uname_S)))
187         GAME = crawl.exe
188         bin_prefix = .
189         WIN32 = Yes
190         NO_RDYNAMIC = YesPlease
191         NO_NCURSES = YesPlease
192         NEED_LIBW32C = YesPlease
193         BUILD_PCRE = YesPlease
194         BUILD_ZLIB = YesPlease
195         DEFINES_L += -DWINMM_PLAY_SOUNDS
196         EXTRA_LIBS += -lwinmm
197         ifdef TILES
198                 EXTRA_LIBS += -lmingw32 -lgdi32 -lwinmm contrib/install/$(ARCH)/lib/libSDLmain.a -mwindows
199                 BUILD_FREETYPE = YesPlease
200                 BUILD_SDL = YesPlease
201                 BUILD_SDLIMAGE = YesPlease
202                 BUILD_LIBPNG = YesPlease
203         endif
204         ifeq ($(shell gcc -v -static -static-libstdc++ 2>&1 | grep 'unrecognized option'),)
205                 EXTRA_LIBS += -static -static-libgcc -static-libstdc++
206         endif
207         COPY_FONTS = yes
208 endif
209 ifeq ($(uname_S),Darwin)
210         STRIP := strip -x
211         NEED_APPKIT = YesPlease
212         LIBNCURSES_IS_UNICODE = Yes
213         NO_PKGCONFIG = Yes
214         BUILD_SQLITE = YesPlease
215         BUILD_ZLIB = YesPlease
216         ifdef TILES
217                 EXTRA_LIBS += -framework AppKit -framework AudioUnit -framework Carbon -framework IOKit -framework OpenGL contrib/install/$(ARCH)/lib/libSDLmain.a
218                 BUILD_FREETYPE = YesPlease
219                 BUILD_SDL = YesPlease
220                 BUILD_SDLIMAGE = YesPlease
221                 BUILD_LIBPNG = YesPlease
222         endif
223         COPY_FONTS = yes
224 endif
225 ifdef USE_ICC
226         NO_RDYNAMIC := YesPlease
227 endif
228 ifneq (,$(findstring CYGWIN,$(uname_S)))
229         GAME = crawl.exe
230         NO_RDYNAMIC = YesPlease
231         BUILD_PCRE = YesPlease
232 endif
233
234 ifdef BUILD_ALL
235         BUILD_FREETYPE = YesPlease
236         BUILD_PCRE = YesPlease
237         BUILD_SDL = YesPlease
238         BUILD_SDLIMAGE = YesPlease
239         BUILD_SQLITE = YesPlease
240         BUILD_LUA = YesPlease
241         BUILD_LIBPNG = YesPlease
242         BUILD_ZLIB = YesPlease
243 endif
244
245 # Should be the first rule, but must come after $(GAME) is set.
246 all: greet check-fonts $(GAME) docs webserver
247
248 LIBPCRE := contrib/install/$(ARCH)/lib/libpcre.a
249 LIBSDL := contrib/install/$(ARCH)/lib/libSDL.a
250 LIBPNG := contrib/install/$(ARCH)/lib/libpng.a
251 LIBSDLIMAGE := contrib/install/$(ARCH)/lib/libSDL_image.a
252 LIBFREETYPE := contrib/install/$(ARCH)/lib/libfreetype.a
253 LIBSQLITE := contrib/install/$(ARCH)/lib/libsqlite3.a
254 ifdef USE_LUAJIT
255 LIBLUA := contrib/install/$(ARCH)/lib/libluajit.a
256 else
257 LIBLUA := contrib/install/$(ARCH)/lib/liblua.a
258 endif
259 LIBZ := contrib/install/$(ARCH)/lib/libz.a
260
261 ifndef CROSSHOST
262         SQLITE_INCLUDE_DIR := /usr/include
263 else
264         # This is totally wrong, works only with some old-style setups, and
265         # on some architectures of Debian/new FHS multiarch -- excluding, for
266         # example, i386.  Fortunately, i386 is rarely cross-compiled to.
267         # There's no support for /usr/local/ too, without thorough handholding.
268         # It's still an improvement over Crawl 0.8 which had no cross-compiling
269         # to non-win32 at all.
270         #
271         # Needs to be replaced by compile checks.  Guessing the paths is fragile,
272         # while the compiler knows them already.
273         SQLITE_INCLUDE_DIR := /usr/$(ARCH)/include
274 endif
275 SQLITE_LIB := -lsqlite3
276
277 #
278 # Set up the TILES variant
279 #
280 ifdef TILES
281 TILES_ANY = YesPlease
282 OBJECTS += $(TILES_OBJECTS) $(GLTILES_OBJECTS)
283   ifdef WEBTILES
284     OBJECTS += $(error Web and local tiles are exclusive)
285   endif
286 endif
287
288 ifdef WEBTILES
289 TILES_ANY = YesPlease
290 OBJECTS += $(TILES_OBJECTS) $(WEBTILES_OBJECTS)
291 endif
292
293 #
294 # Check for an Apple-released compiler.
295 #
296 ifndef NO_APPLE_GCC
297 ifeq ($(uname_S),Darwin)
298 ifneq ($(shell gcc -v 2>&1 | grep Apple),)
299 APPLE_GCC = YesPlease
300 endif
301 endif
302 endif
303
304
305 ifdef WIN32
306 EXTRA_OBJECTS += icon.o
307 else
308 ifndef ANDROID
309 EXTRA_LIBS += -pthread
310 endif
311 endif
312
313 ifndef TILES
314 ifdef NEED_LIBW32C
315 OBJECTS += libw32c.o
316 else
317 OBJECTS += libunix.o
318 endif
319 endif
320
321 # To get stack trace symbols.
322 # Note that MinGW doesn't support -rdynamic.
323 ifndef NO_RDYNAMIC
324 LDFLAGS += -rdynamic
325 endif
326
327 ifdef USE_MERGE_BASE
328 MERGE_BASE := $(shell git merge-base HEAD $(USE_MERGE_BASE))
329 endif
330
331 ifdef USE_DGAMELAUNCH
332 # Permissions to set on the game executable.
333 MCHMOD := 755
334
335 # Permissions to set on the save directory.
336 MCHMOD_SAVEDIR := 775
337 MCHMOD_LOGS := 664
338
339 # The user:group to install the game as.
340 INSTALL_UGRP := games:games
341 endif
342
343 chroot_prefix :=
344 prefix        :=
345
346 ifeq ($(patsubst %/local,%,$(patsubst %/,%,$(prefix))),/usr)
347 FHS := yes
348 endif
349
350 ifeq (,$(bin_prefix))
351 ifneq ($(patsubst %/,%,$(prefix)),/usr)
352 bin_prefix    := bin
353 else
354 bin_prefix    := games
355 endif
356 endif
357
358 # If you're installing Crawl for multiple users, you *must* set this to a
359 # valid path before building Crawl. This is not necessary if you are building
360 # Crawl for a single user.
361 # If you're installing to /usr, /usr/local or /opt, we have sane defaults.
362
363 # SAVEDIR := saves/
364 # DATADIR := data/
365 ifneq (,$(FHS))
366 DATADIR       := share/crawl
367 SAVEDIR       := ~/.crawl
368 endif
369
370 ifneq ($(patsubst /opt%,%,$(prefix)),$(prefix))
371 DATADIR := data
372 SAVEDIR := ~/.crawl
373 endif
374
375
376 INCLUDES_L += -Icontrib/install/$(ARCH)/include
377 LIBS += -Lcontrib/install/$(ARCH)/lib
378
379 INCLUDES_L += -Iutil -I.
380
381 ifdef APPLE_GCC
382
383 MARCH := $(uname_M)
384
385
386 ifndef NO_AUTO_SDK
387
388 # The SDK locations were moved in 10.8; this snippet tries to find them
389 # there first, then reverts to the original location.
390 ifeq ($(shell test -e /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer || echo NOPE),)
391 DEVELOPER_PATH := /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer
392 else
393 DEVELOPER_PATH := /Developer
394 endif
395
396 # Find the oldest SDK available, in attempt to make this build as
397 # backward-compatible as we possibly can.
398 SDK_VER := $(shell ls $(DEVELOPER_PATH)/SDKs | sort -n | head -1 | perl -pe 's/^MacOSX//g;s/.sdk$$//g')
399
400 ifeq ($(SDK_VER),10.4u)
401 SDK_VER := 10.4
402 endif
403
404 ifndef SDK_VER
405 $(error You do not seem to have any Mac OS X SDKs installed! This build is doomed to fail)
406 endif
407
408 endif
409
410 ifndef SDK_VER
411 ifeq ($(MARCH),ppc)
412 SDK_VER := 10.4
413 endif
414 ifeq ($(MARCH),i386)
415 SDK_VER := 10.4
416 endif
417 ifeq ($(MARCH),x86_64)
418 ifdef TILES
419 SDK_VER := 10.6
420 else
421 SDK_VER := 10.5
422 endif
423 endif
424 endif
425
426 # Mac OS X 10.4 adds a 'u' on the end of the SDK name. Everything
427 # else is much easier to predict the name of.
428 ifeq ($(SDK_VER),10.4)
429 GCC_VER := 4.0
430 SDKROOT := $(DEVELOPER_PATH)/SDKs/MacOSX$(SDK_VER)u.sdk
431 else
432 SDKROOT := $(DEVELOPER_PATH)/SDKs/MacOSX$(SDK_VER).sdk
433 endif
434
435 ifneq ($(shell test -d $(SDKROOT) || echo NOPE),)
436 $(error The Mac OS X $(SDK_VER) SDK seems missing)
437 endif
438
439 ifdef BUILD_UNIVERSAL
440 # [ds] 10.4 SDK g++-4.0 + x86_64 runs into SDL compile issues.
441 CFLAGS_ARCH := -arch i386 -arch ppc -faltivec
442 CFLAGS_DEPCC_ARCH := -arch i386
443 NO_INLINE_DEPGEN := YesPlease
444 else
445 CFLAGS_ARCH := -arch $(MARCH)
446 endif
447
448 CC = $(GCC) $(CFLAGS_ARCH) -isysroot $(SDKROOT) -mmacosx-version-min=$(SDK_VER)
449 CXX = $(GXX) $(CFLAGS_ARCH) -isysroot $(SDKROOT) -mmacosx-version-min=$(SDK_VER)
450 DEPCC = $(GCC) $(or $(CFLAGS_DEPCC_ARCH),$(CFLAGS_ARCH)) -isysroot $(SDKROOT) -mmacosx-version-min=$(SDK_VER)
451 DEPCXX = $(GXX) $(or $(CFLAGS_DEPCC_ARCH),$(CFLAGS_ARCH)) -isysroot $(SDKROOT) -mmacosx-version-min=$(SDK_VER)
452
453 ifdef USE_ICC
454 CC += -gcc-name=gcc-$(GCC_VER) -gxx-name=g++-$(GCC_VER)
455 CXX += -gcc-name=gcc-$(GCC_VER) -gxx-name=g++-$(GCC_VER)
456 endif
457
458 ifndef CROSSHOST
459 # Don't need a universal build of host tools, so use DEPCC.
460 HOSTCC = $(DEPCC)
461 HOSTCXX = $(DEPCXX)
462 export HOSTCC
463 export HOSTCXX
464 endif
465
466 endif # MacOS
467
468 ifndef CROSSHOST
469
470 ifneq ($(GCC_VER),)
471 # We do this in a separate variable because if we
472 # specify GCC_VER on the make command-line, the
473 # variable is immutable, and we can't add the dash.
474 GCC_VER_SUFFIX:=-$(GCC_VER)
475 endif
476
477 # Attempt to use a full compiler name, to make
478 # distcc builds work nicely.
479 LMACH := $(shell gcc -dumpmachine)-
480 ifeq ($(LMACH),-)
481 LMACH :=
482 endif
483 ifeq ($(shell which $(LMACH)gcc$(GCC_VER_SUFFIX) > /dev/null 2> /dev/null && echo "Yes"),)
484 LMACH :=
485 endif
486
487 GCC := $(LMACH)$(GCC_VER_PREFIX)gcc$(GCC_VER_SUFFIX)
488 GXX := $(LMACH)$(GCC_VER_PREFIX)g++$(GCC_VER_SUFFIX)
489
490 else
491
492 # Cross-compiling is a weird case.
493 GCC := $(CROSSHOST)-gcc
494 GXX := $(CROSSHOST)-g++
495 AR := $(CROSSHOST)-ar
496 RANLIB := $(CROSSHOST)-ranlib
497 STRIP := $(CROSSHOST)-strip
498 WINDRES := $(CROSSHOST)-windres
499
500 endif
501
502 # Define this to automatically generate code optimized for your machine
503 # (GCC only as of now).
504 #
505 # NOTE: Don't use this with a release build, since the generated code
506 # won't work for all machines.
507 ifdef HURRY
508 NO_AUTO_OPT = YesPlease
509 endif
510
511 ifdef AUTO_OPT
512 ifndef NO_AUTO_OPT
513 CFOPTIMIZE += -march=native
514 endif
515 endif
516
517 ifdef USE_ICC
518 # If you have a Core 2 processor, this _really_ makes things fly:
519 #CFOPTIMIZE := -O2 -parallel -xT
520
521 # Optionally enable the 'ipo' feature, to facilitate inlining
522 # across object file bounds.
523 #CFOPTIMIZE_L := -ipo
524
525 # Some very good optimization flags.
526   CFOPTIMIZE := -O2 -parallel
527 else
528
529   ifneq (,$(shell $(GXX) --version|grep 'g++.*4\.2\.'))
530     # OS X uses a buggy ancient version of gcc without fixes from even
531     # subsequent point releases of 4.2.
532     CFOPTIMIZE := -O0
533   else
534     CFOPTIMIZE := -O2
535   endif
536 endif
537
538 ifdef LTO
539   ifeq ($(shell $(GXX) -v 2>&1|grep clang),)
540     CFOPTIMIZE += -flto=jobserver -fwhole-program
541     # FIXME: this check is fragile, and should be done via a full compile test.
542     ifeq ($(shell $(GXX) -x c++ /dev/null -fno-fat-lto-objects 2>&1 | grep 'unrecognized command line option'),)
543       CFOPTIMIZE += -fno-fat-lto-objects
544     endif
545   else
546     # Clang uses a different syntax than gcc, using -O4 instead.  This means
547     # you can't select a different level of optimization to go with LTO.
548     CFOPTIMIZE := $(patsubst -O%,,$(CFOPTIMIZE)) -O4
549   endif
550 endif
551
552 # Okay, we have to assume we're on something else that
553 # uses standard UNIX-like methods for finding libs.
554 #
555 # For instance, on Linux and most other UNIX-likes,
556 # the app pkg-config can provide the appropriate
557 # CFLAGS and LDFLAGS.
558 #
559
560 ifndef NO_PKGCONFIG
561 ifeq ($(shell which pkg-config 2> /dev/null),)
562 NO_PKGCONFIG = YesPlease
563 endif
564 endif
565
566 ifdef ANDROID
567   BUILD_LUA=
568   BUILD_SQLITE=
569   BUILD_ZLIB=
570   BUILD_SDL=
571   BUILD_FREETYPE=
572   NO_PKGCONFIG=Y
573 else
574
575 ifndef BUILD_LUA
576   ifdef NO_PKGCONFIG
577     BUILD_LUA = yes
578   endif
579 endif
580 ifndef BUILD_LUA
581   ifneq ($(USE_LUAJIT),)
582     ifeq ($(shell $(PKGCONFIG) luajit --exists || echo no),)
583       LUA_PACKAGE = luajit
584     else
585       BUILD_LUA = yes
586     endif
587   else
588     ifneq ($(shell $(PKGCONFIG) lua5.1 --exists || echo no),)
589       ifneq ($(shell $(PKGCONFIG) lua --exists || echo no),)
590         BUILD_LUA = yes
591       else
592         ifeq ($(shell $(PKGCONFIG) lua --modversion | head -c 3),5.1)
593           LUA_PACKAGE = lua
594         else
595           BUILD_LUA = yes
596         endif
597       endif
598     else
599       LUA_PACKAGE = lua5.1
600     endif
601   endif
602 endif
603 ifndef BUILD_LUA
604   ifndef LUA_PACKAGE
605     LUA_PACKAGE = lua5.1
606   endif
607   INCLUDES_L += $(shell $(PKGCONFIG) $(LUA_PACKAGE) --cflags-only-I)
608   CFLAGS_L  += $(shell $(PKGCONFIG) $(LUA_PACKAGE) --cflags-only-other)
609   LIBS += $(shell $(PKGCONFIG) $(LUA_PACKAGE) --libs)
610 endif
611
612 ifndef BUILD_SQLITE
613   ifeq ($(shell grep -q sqlite3_prepare $(SQLITE_INCLUDE_DIR)/sqlite3.h 2>/dev/null && echo yes),yes)
614     INCLUDES_L += -I$(SQLITE_INCLUDE_DIR)
615     LIBS += $(SQLITE_LIB)
616     ifneq ($(shell grep -q sqlite3_prepare_v2 $(SQLITE_INCLUDE_DIR)/sqlite3.h 2>/dev/null && echo yes),yes)
617       DEFINES_L += -DANCIENT_SQLITE
618     endif
619   else
620     BUILD_SQLITE = yes
621   endif
622 endif
623
624 ifndef BUILD_ZLIB
625   LIBS += -lz
626 else
627   LIBS += $(LIBZ)
628 endif
629 endif #ANDROID
630
631 RLTILES = rltiles
632 INCLUDES_L += -I$(RLTILES)
633
634 ifdef WEBTILES
635 DEFINES_L += -DUSE_TILE
636 DEFINES_L += -DUSE_TILE_WEB
637 endif
638
639 #
640 # Tiles build stuff
641 #
642 ifdef TILES
643
644 DEFINES_L += -DUSE_TILE
645 DEFINES_L += -DUSE_TILE_LOCAL
646
647 ifdef TOUCH_UI
648 DEFINES_L += -DTOUCH_UI
649 endif
650
651 ifdef BUILD_SDL
652 INCLUDES_L += -Icontrib/install/$(ARCH)/include/SDL
653 endif
654 ifdef BUILD_FREETYPE
655 INCLUDES_L += -Icontrib/install/$(ARCH)/include/freetype2
656 endif
657
658 DEFINES_L += -DUSE_SDL -DUSE_GL -DUSE_FT
659
660 ifdef GLES
661 DEFINES_L += -DUSE_GLES
662 endif
663
664 ifndef NO_PKGCONFIG
665
666 # If pkg-config is available, it's the surest way to find where
667 # the contributing libraries are located.
668 #
669
670 FREETYPE_INCLUDE := $(shell $(PKGCONFIG) freetype2 --cflags-only-I)
671 FREETYPE_CFLAGS  := $(shell $(PKGCONFIG) freetype2 --cflags-only-other)
672 FREETYPE_LDFLAGS := $(shell $(PKGCONFIG) freetype2 --libs-only-L) $(shell $(PKGCONFIG) freetype2 --libs-only-l)
673
674 SDL_INCLUDE := $(shell $(PKGCONFIG) sdl --cflags-only-I)
675 SDL_CFLAGS  := $(shell $(PKGCONFIG) sdl --cflags-only-other)
676 SDL_LDFLAGS := $(shell $(PKGCONFIG) sdl --libs-only-L) $(shell $(PKGCONFIG) sdl --libs-only-l)
677
678 LIBS += -lSDL_image $(SDL_LDFLAGS) $(FREETYPE_LDFLAGS)
679
680 endif # pkg-config
681
682 ifdef GLES
683 ifndef ANDROID
684 LIBS += -lSDL_gles -lEGL -lGLES_CM
685 endif
686 else
687 ifneq ($(uname_S),Darwin)
688 ifeq (,$(findstring MINGW,$(uname_S)))
689 LIBS += -lGL -lGLU
690 else
691 LIBS += -lopengl32 -lglu32
692 endif
693 endif
694 endif
695
696 DEFINES_L += $(PNG_CFLAGS) $(FREETYPE_CFLAGS) $(SDL_CFLAGS)
697 INCLUDES_L += $(PNG_INCLUDE) $(FREETYPE_INCLUDE) $(SDL_INCLUDE)
698
699 endif # TILES
700
701 # On clang, unknown -Wfoo is merely a warning, thus -Werror.
702 CFWARN_L += $(shell w=-Wno-array-bounds;echo|$(GXX) -E -x c++ - -Werror $$w >/dev/null 2>&1 && echo $$w)
703 CFWARN_L += $(shell w=-Wno-format-zero-length;echo|$(GXX) -E -x c++ - -Werror $$w >/dev/null 2>&1 && echo $$w)
704 CFWARN   += $(shell w=-Wmissing-declarations;echo|$(GXX) -E -x c++ - -Werror $$w >/dev/null 2>&1 && echo $$w)
705
706 CFWARN_L += -Wno-parentheses -Wno-unused-parameter -Wwrite-strings -Wshadow
707 CFOTHERS_L = $(EXTERNAL_FLAGS_L) $(EXTRA_FLAGS) $(DEFINES) $(SDL_CFLAGS)
708
709 ifndef NO_LUA_BINDINGS
710 CFOTHERS_L += -DCLUA_BINDINGS
711 endif
712
713 ifdef EUCLIDEAN
714 DEFINES_L += -DEUCLIDEAN
715 endif
716
717 #
718 # Figure out the build settings for this type of build
719 #
720
721 # Debug
722 # No optimization, full debugging.
723 ifneq (,$(filter debug,$(MAKECMDGOALS)))
724         FULLDEBUG=YesPlease
725         DEBUG=YesPlease
726         NO_OPTIMIZE=YesPlease
727 endif
728
729 # Debug-Lite
730 # No optimization, but little/no debugging spew.
731 ifneq (,$(filter debug-lite,$(MAKECMDGOALS)))
732         DEBUG=YesPlease
733         NO_OPTIMIZE=YesPlease
734 endif
735
736 # Profile
737 # Optimized, with full debugging.
738 ifneq (,$(filter profile,$(MAKECMDGOALS)))
739         FULLDEBUG=YesPlease
740         DEBUG=YesPlease
741 endif
742
743 ifdef HURRY
744         NO_OPTIMIZE=YesPlease
745 endif
746
747 ifdef FULLDEBUG
748 DEFINES += -DFULLDEBUG
749 endif
750 ifdef DEBUG
751 CFOTHERS := -ggdb $(CFOTHERS)
752 DEFINES += -DDEBUG
753 endif
754 ifndef NOWIZARD
755 DEFINES += -DWIZARD
756 endif
757 ifdef NO_OPTIMIZE
758 CFOPTIMIZE  := -O0
759 endif
760
761 ifdef PCH
762 CFWARN_L += -Winvalid-pch
763
764 ifdef PCH_BYTHEBOOK
765 # Follow the suggestions in ccache(1)
766 CFOTHERS_L += -fpch-preprocess
767 export CCACHE_SLOPPINESS = time_macros
768 # ... for everything but version.cc, which uses __DATE__ and __TIME__
769 version.o: CCACHE_SLOPPINESS =
770 else
771 # Just keep ccache blisfully ignorant of the precompiled header
772 export CCACHE_CPP2 = yes
773 endif
774 endif
775
776 ifndef NOASSERTS
777 DEFINES += -DASSERTS
778 endif
779
780 # Cygwin has a panic attack if we do this...
781 ifndef NO_OPTIMIZE
782 CFWARN_L += -Wuninitialized
783 endif
784
785 ifneq ($(strip $(chroot_prefix)),)
786         USE_CHROOT=YesPlease
787 endif
788
789 ifdef USE_DGAMELAUNCH
790         CFOTHERS_L += -DDGAMELAUNCH
791 endif
792
793 ifdef USE_CHROOT
794         prefix_fp := $(abspath $(strip $(DESTDIR)$(chroot_prefix))/$(strip $(prefix)))
795 else
796         prefix_fp := $(abspath $(strip $(DESTDIR)$(prefix)))
797 endif
798
799 ifneq ($(strip $(SAVEDIR)),)
800   ifneq ($(filter ~%,$(SAVEDIR)),)
801     CFOTHERS_L += -DSAVE_DIR_PATH=\"$(SAVEDIR)\"
802     savedir_fp :=
803     shareddir_fp :=
804   else
805     ifeq ($(filter /%,$(SAVEDIR)),)
806       ifneq ($(prefix),)
807         override SAVEDIR := $(strip $(prefix))/$(strip $(SAVEDIR))
808       endif
809     endif
810     CFOTHERS_L += -DSAVE_DIR_PATH=\"$(abspath $(SAVEDIR))\"
811     savedir_fp := $(abspath $(strip $(DESTDIR))$(strip $(SAVEDIR)))
812     shareddir_fp := $(savedir_fp)/saves
813   endif
814 endif
815
816 ifneq ($(strip $(SHAREDDIR)),)
817   ifneq ($(filter ~%,$(SHAREDDIR)),)
818     CFOTHERS_L += -DSHARED_DIR_PATH=\"$(SHAREDDIR)\"
819     shareddir_fp :=
820   else
821     ifeq ($(filter /%,$(SHAREDDIR)),)
822       ifneq ($(prefix),)
823         override SHAREDDIR := $(strip $(prefix))/$(strip $(SHAREDDIR))
824       endif
825     endif
826     CFOTHERS_L += -DSHARED_DIR_PATH=\"$(abspath $(SHAREDDIR))\"
827     shareddir_fp := $(abspath $(strip $(DESTDIR))$(strip $(SHAREDDIR)))
828   endif
829 endif
830
831 ifneq ($(strip $(DATADIR)),)
832   ifeq ($(filter /%,$(DATADIR)),)
833     #relative DATADIR
834     ifneq ($(prefix),)
835         override DATADIR := $(strip $(prefix))/$(strip $(DATADIR))
836     endif
837   endif
838   CFOTHERS_L += -DDATA_DIR_PATH=\"$(abspath $(DATADIR))/\"
839   FONTDIR = $(abspath $(DATADIR))/dat/tiles/
840 else
841   ifneq ($(prefix),)
842         DATADIR := $(strip $(prefix))/$(strip $(DATADIR))
843         FONTDIR = $(strip $(prefix))/$(strip $(DATADIR))/dat/tiles/
844   else
845     ifneq ($(DESTDIR),)
846         FONTDIR = dat/tiles/
847     else
848         FONTDIR = contrib/fonts/
849     endif
850   endif
851 endif
852 datadir_fp := $(abspath $(strip $(DESTDIR))$(strip $(DATADIR)))
853
854 ifneq ($(strip $(WEBDIR)),)
855   ifeq ($(filter /%,$(WEBDIR)),)
856     #relative WEBDIR
857     ifneq ($(prefix),)
858         override WEBDIR := $(strip $(prefix))/$(strip $(WEBDIR))
859     endif
860   endif
861   CFOTHERS_L += -DWEB_DIR_PATH=\"$(abspath $(WEBDIR))/\"
862 else
863   ifneq ($(prefix),)
864         WEBDIR := $(strip $(prefix))/$(strip $(WEBDIR))
865   endif
866 endif
867 webdir_fp := $(abspath $(strip $(DESTDIR))$(strip $(WEBDIR)))
868
869
870 # Fonts.
871 ifdef TILES
872
873 OUR_PROPORTIONAL_FONT=DejaVuSans.ttf
874 OUR_MONOSPACED_FONT=DejaVuSansMono.ttf
875
876 ifdef PROPORTIONAL_FONT
877   DEFINES += -DPROPORTIONAL_FONT=\"$(PROPORTIONAL_FONT)\"
878   ifneq (,$(COPY_FONTS))
879     INSTALL_FONTS += $(PROPORTIONAL_FONT)
880   endif
881 else
882   SYS_PROPORTIONAL_FONT = $(shell dir=/usr/share/fonts; [ -d $$dir ] && find $$dir -iname $(OUR_PROPORTIONAL_FONT)|head -n 1)
883   ifeq (,$(SYS_PROPORTIONAL_FONT))
884     SYS_PROPORTIONAL_FONT = $(shell dir=/usr/local/share/fonts ; [ -d $$dir ] && find $$dir -iname $(OUR_PROPORTIONAL_FONT)|head -n 1)
885   endif
886   ifneq (,$(SYS_PROPORTIONAL_FONT))
887     ifeq (,$(COPY_FONTS))
888       DEFINES += -DPROPORTIONAL_FONT=\"$(SYS_PROPORTIONAL_FONT)\"
889     else
890       DEFINES += -DPROPORTIONAL_FONT=\"$(FONTDIR)$(OUR_PROPORTIONAL_FONT)\"
891       INSTALL_FONTS += $(SYS_PROPORTIONAL_FONT)
892     endif
893   else
894     DEFINES += -DPROPORTIONAL_FONT=\"$(FONTDIR)$(OUR_PROPORTIONAL_FONT)\"
895     INSTALL_FONTS += contrib/fonts/$(OUR_PROPORTIONAL_FONT)
896   endif
897 endif
898
899 ifdef MONOSPACED_FONT
900   DEFINES += -DMONOSPACED_FONT=\"$(MONOSPACED_FONT)\"
901   ifneq (,$(COPY_FONTS))
902     INSTALL_FONTS += $(MONOSPACED_FONT)
903   endif
904 else
905   SYS_MONOSPACED_FONT = $(shell dir=/usr/share/fonts; [ -d $$dir ] && find $$dir -iname $(OUR_MONOSPACED_FONT)|head -n 1)
906   ifeq (,$(SYS_MONOSPACED_FONT))
907     SYS_MONOSPACED_FONT = $(shell dir=/usr/local/share/fonts; [ -d $$dir ] && find $$dir -iname $(OUR_MONOSPACED_FONT)|head -n 1)
908   endif
909   ifneq (,$(SYS_MONOSPACED_FONT))
910     ifeq (,$(COPY_FONTS))
911       DEFINES += -DMONOSPACED_FONT=\"$(SYS_MONOSPACED_FONT)\"
912     else
913       DEFINES += -DMONOSPACED_FONT=\"$(FONTDIR)$(OUR_MONOSPACED_FONT)\"
914       INSTALL_FONTS += $(SYS_MONOSPACED_FONT)
915     endif
916   else
917     DEFINES += -DMONOSPACED_FONT=\"$(FONTDIR)$(OUR_MONOSPACED_FONT)\"
918     INSTALL_FONTS += contrib/fonts/$(OUR_MONOSPACED_FONT)
919   endif
920 endif
921
922 endif
923
924
925 ifndef NO_NCURSES
926
927 ifndef CROSSHOST
928         NC_PREFIX = /usr
929 else
930         NC_PREFIX = /usr/$(ARCH)
931 endif
932
933 # Include path for (n)curses with Unicode support.
934
935 # Your ncurses library may include Unicode support, and you may not have a
936 # separate libncursesw; this is the case on Mac OS/Darwin.
937 ifdef LIBNCURSES_IS_UNICODE
938 NC_LIB = ncurses
939 NC_INCLUDE = $(NC_PREFIX)/include/ncurses
940 else
941 NC_LIB = ncursesw
942 NC_INCLUDE = $(NC_PREFIX)/include/ncursesw
943 endif
944
945 INCLUDES_L += -I$(NC_INCLUDE)
946
947 ifndef TILES
948 LIBS += -L$(NC_PREFIX)/lib -l$(NC_LIB)
949 endif
950
951 endif
952
953 ifdef BUILD_PCRE
954 DEFINES += -DREGEX_PCRE
955 LIBS += -lpcre
956 endif
957
958 ifdef USE_ICC
959 NO_INLINE_DEPGEN := YesPlease
960 GCC := icc
961 GXX := icpc
962 AR  := xiar
963 RANLIB := true
964 LIBS += -lguide -lpthread
965 CFWARN := -wd383,810,869,981,1418 -we14,193,304
966 CFWARN_L :=
967 endif
968
969 ifeq (,$(shell echo 'int main(){return 1;}'|$(GXX) -x c++ - -o /dev/null -fuse-ld=gold 2>&1))
970   LDFLAGS += -fuse-ld=gold
971 endif
972
973 LDFLAGS += $(CFOPTIMIZE) $(CFOPTIMIZE_L)
974
975 ifdef REPORT
976 CFOTHERS += -ftime-report
977 endif
978
979 ifdef ANDROID
980 CFLAGS   := $(CFOPTIMIZE) $(CFOTHERS) $(CFWARN) $(CFLAGS)
981 else
982 CFLAGS   := $(CFOPTIMIZE) $(CFOTHERS) $(CFWARN)
983 endif
984 CFLAGS_L := $(CFOPTIMIZE_L) $(DEFINES_L) $(CFWARN_L) $(INCLUDES_L) $(CFOTHERS_L)
985 ALL_CFLAGS := $(CFLAGS) $(CFLAGS_L)
986 YACC_CFLAGS  := $(ALL_CFLAGS) -Wno-unused-function -Wno-sign-compare -DYYENABLE_NLS=0 -DYYLTYPE_IS_TRIVIAL=0
987
988 UTIL = util/
989
990 EXTRA_OBJECTS += $(YACC_OBJECTS)
991
992 LEX := $(shell which flex 2> /dev/null)
993 YACC := $(shell which bison 2> /dev/null)
994
995 ifeq ($(strip $(LEX)),)
996 NO_YACC = YesPlease
997 endif
998 ifeq ($(strip $(YACC)),)
999 NO_YACC = YesPlease
1000 endif
1001
1002 ifneq ($(findstring $(MAKEFLAGS),s),s)
1003 ifndef V
1004         QUIET_CC       = @echo '   ' CC $@;
1005         QUIET_CXX      = @echo '   ' CXX $@;
1006         QUIET_PCH      = @echo '   ' PCH $@;
1007         QUIET_LINK     = @echo '   ' LINK $@;
1008         QUIET_GEN      = @echo '   ' GEN $@;
1009         QUIET_COPY     = @echo '   ' COPY $@;
1010         QUIET_DEPEND   = @echo '   ' DEPEND $@;
1011         QUIET_WINDRES  = @echo '   ' WINDRES $@;
1012         QUIET_HOSTCC   = @echo '   ' HOSTCC $@;
1013         QUIET_PNGCRUSH = @echo '   ' $(PNGCRUSH_LABEL) $@;
1014         QUIET_ADVPNG   = @echo '   ' ADVPNG $@;
1015         export V
1016 endif
1017 endif
1018
1019 TILEIMAGEFILES := floor wall feat main player gui icons
1020 TILEDEFS = $(TILEIMAGEFILES) dngn unrand
1021 TILEDEFPRES = $(TILEDEFS:%=$(RLTILES)/tiledef-%)
1022 TILEDEFOBJS = $(TILEDEFPRES:%=%.o)
1023 TILEDEFSRCS = $(TILEDEFPRES:%=%.cc)
1024 TILEDEFHDRS = $(TILEDEFPRES:%=%.h)
1025
1026 TILEFILES = $(TILEIMAGEFILES:%=%.png)
1027 ORIGTILEFILES = $(TILEFILES:%=$(RLTILES)/%)
1028 DESTTILEFILES = $(TILEFILES:%=dat/tiles/%)
1029
1030 OBJECTS += $(TILEDEFOBJS)
1031
1032 ifdef TILES_ANY
1033 ifndef NO_OPTIMIZE
1034   ifneq (,$(shell which advpng))
1035     USE_ADVPNG = y
1036   else
1037     ifneq (,$(shell which pngcrush))
1038       PNGCRUSH = pngcrush -q -m 113
1039       PNGCRUSH_LABEL = PNGCRUSH
1040     endif
1041   endif
1042 endif
1043 endif
1044
1045 ifdef BUILD_PCRE
1046 CONTRIBS += pcre
1047 CONTRIB_LIBS += $(LIBPCRE)
1048 endif
1049 ifdef BUILD_FREETYPE
1050 CONTRIBS += freetype
1051 CONTRIB_LIBS += $(LIBFREETYPE)
1052 endif
1053 ifdef BUILD_SDLIMAGE
1054 CONTRIBS += sdl-image
1055 CONTRIB_LIBS += $(LIBSDLIMAGE)
1056 endif
1057 ifdef BUILD_SDL
1058 CONTRIBS += sdl
1059 CONTRIB_LIBS += $(LIBSDL)
1060 endif
1061 ifdef BUILD_LIBPNG
1062 CONTRIBS += libpng
1063 CONTRIB_LIBS += $(LIBPNG)
1064 endif
1065 ifdef BUILD_ZLIB
1066 CONTRIBS += zlib
1067 CONTRIB_LIBS += $(LIBZ)
1068 endif
1069 ifdef BUILD_LUA
1070 ifdef USE_LUAJIT
1071 CONTRIBS += luajit/src
1072 CFOTHER_L += -DUSE_LUAJIT
1073 else
1074 CONTRIBS += lua/src
1075 endif
1076 CONTRIB_LIBS += $(LIBLUA)
1077 endif
1078 ifdef BUILD_SQLITE
1079 CONTRIBS += sqlite
1080 CONTRIB_LIBS += $(LIBSQLITE)
1081 endif
1082
1083 EXTRA_OBJECTS += version.o
1084
1085 LIBS += $(CONTRIB_LIBS) $(EXTRA_LIBS)
1086
1087 DOC_BASE        := ../docs
1088 DOC_TEMPLATES   := $(DOC_BASE)/template
1089 GENERATED_DOCS  := $(DOC_BASE)/aptitudes.txt $(DOC_BASE)/FAQ.html $(DOC_BASE)/crawl_manual.txt
1090 GENERATED_HEADERS := art-enum.h config.h mon-mst.h #the rest are private
1091 GENERATED_FILES := $(GENERATED_HEADERS) art-data.h mi-enum.h \
1092                    $(RLTILES)/dc-unrand.txt build.h compflag.h dat/dlua/tags.lua \
1093                    cmd-name.h
1094
1095 LANGUAGES = $(filter-out en, $(notdir $(wildcard dat/descript/??)))
1096 SRC_PKG_BASE  := stone_soup
1097 SRC_VERSION   := $(shell git describe --tags $(MERGE_BASE) 2>/dev/null || cat util/release_ver)
1098 MAJOR_VERSION = $(shell echo "$(SRC_VERSION)"|sed -r 's/-.*//;s/^([^.]+\.[^.]+).*/\1/')
1099
1100 export SRC_VERSION
1101
1102 PKG_SRC_DIR   := $(SRC_PKG_BASE)-$(SRC_VERSION)
1103 SRC_PKG_TAR   := $(PKG_SRC_DIR).tar.xz
1104 SRC_PKG_TAR_NODEPS := $(PKG_SRC_DIR)-nodeps.tar.xz
1105 SRC_PKG_ZIP   := $(PKG_SRC_DIR).zip
1106
1107 greet:
1108         @if [ ! -e $(GAME) ]; then\
1109                 printf '  * %s\n' "If you experience any problems building Crawl, please take a second look"\
1110                                   "at INSTALL.txt: the solution to your problem just might be in there!";\
1111         fi
1112
1113 docs: $(GENERATED_DOCS)
1114
1115
1116 # Webtiles data
1117 .PHONY: webserver clean-webserver
1118
1119 webserver/static/%.png: dat/tiles/%.png
1120         $(QUIET_COPY)$(COPY) $< webserver/static/
1121
1122 webserver/game_data/static/%.png: dat/tiles/%.png
1123         $(QUIET_COPY)$(COPY) $< webserver/game_data/static/
1124
1125 TILEINFOJS = $(TILEIMAGEFILES) dngn
1126 TITLEIMGS = denzi_dragon denzi_kitchen_duty denzi_summoner \
1127             denzi_undead_warrior omndra_zot_demon firemage \
1128             shadyamish_octm denzi_evil_mage denzi_invasion \
1129             psiweapon_kiku white_noise_entering_the_dungeon \
1130             white_noise_grabbing_the_orb pooryurik_knight \
1131             psiweapon_roxanne
1132
1133 STATICFILES = $(TILEIMAGEFILES:%=webserver/game_data/static/%.png) \
1134               webserver/static/stone_soup_icon-32x32.png \
1135               $(TITLEIMGS:%=webserver/static/title_%.png) \
1136               $(TILEINFOJS:%=webserver/game_data/static/tileinfo-%.js)
1137
1138 $(TILEINFOJS:%=$(RLTILES)/tileinfo-%.js): build-rltiles
1139
1140 webserver/game_data/static/%.js: $(RLTILES)/%.js
1141         $(QUIET_COPY)$(COPY) $< webserver/game_data/static/
1142
1143 clean-webserver:
1144         $(RM) $(STATICFILES) webserver/*.pyc
1145
1146 ifdef WEBTILES
1147 webserver: $(STATICFILES)
1148 else
1149 webserver:
1150 endif
1151
1152
1153 # There might not have been any goals passed on the commandline, so...
1154 GOALS = $(or $(MAKECMDGOALS),$(.DEFAULT_GOAL))
1155 # Unless these are the only goals...
1156 ifneq ($(GOALS),$(filter clean test %-windows,$(GOALS)))
1157
1158 #
1159 # CFLAGS difference check
1160 #
1161 # Check for flag changes between the previous build and the current one,
1162 # because any CFLAGS change could result in an inconsistent build if the
1163 # person building it isn't careful.
1164 #
1165 # This should eliminate an annoying need to use 'make clean' every time.
1166 #
1167
1168 TRACK_CFLAGS = $(strip $(subst ','\'',$(CC) $(CXX) $(ALL_CFLAGS)))
1169         # (stray ' for highlights)
1170 OLD_CFLAGS = $(strip $(subst ','\'',$(shell cat .cflags 2>/dev/null)))
1171         # (stray ' for highlights)
1172
1173 ifneq ($(TRACK_CFLAGS),$(OLD_CFLAGS))
1174   NEED_REBUILD = y
1175 endif
1176
1177 .cflags: .force-cflags
1178 ifdef NEED_REBUILD
1179         @echo "    * rebuilding crawl: new build flags or prefix"
1180         @echo 'TRACK_CFLAGS = $(TRACK_CFLAGS) #EOL'
1181         @echo 'OLD_CFLAGS   = $(OLD_CFLAGS) #EOL'
1182         @echo '$(TRACK_CFLAGS)' > .cflags
1183 endif
1184
1185 .PHONY: .force-cflags
1186
1187 endif
1188
1189 ##########################################################################
1190 # Dependencies
1191
1192 DEPS := $(ALL_OBJECTS:.o=.d)
1193
1194 # Any stale .d files are worse than useless, as they can break builds by
1195 # telling make a header or file no longer present is needed.  This is very
1196 # likely to happen if the compilation mode changes (normal vs debug, tiles
1197 # vs console vs webtiles) or if the compiler itself changes (gcc vs
1198 # gcc-snapshot vs clang, or x86_64-linux-gnu-gcc vs x86_64-w64-mingw32-g++).
1199 #
1200 # In such cases, the dependency forces a rebuild of that file.
1201 ifndef NEED_REBUILD
1202   VALID_DEPS := $(shell for x_d in $(DEPS); do \
1203                           x="$${x_d%%.d}"; x_cc="$${x}.cc"; \
1204                           if [ "$$x_cc" -ot "$$x_d" \
1205                                -a "$$x_d" -nt .cflags ]; \
1206                           then echo "$$x_d"; \
1207                           fi; \
1208                         done)
1209 endif
1210 -include $(VALID_DEPS)
1211
1212
1213 # This information is included in crash reports, and is printed with
1214 # "crawl -version"
1215 compflag.h: $(OBJECTS:.o=.cc) util/gen-cflg.pl .cflags
1216         $(QUIET_GEN)util/gen-cflg.pl compflag.h "$(ALL_CFLAGS)" "$(LDFLAGS)" "$(HOST)" "$(ARCH)"
1217
1218 build.h: $(OBJECTS:.o=.cc) util/gen_ver.pl
1219         $(QUIET_GEN)util/gen_ver.pl $@ $(MERGE_BASE)
1220
1221 version.o: build.h compflag.h
1222
1223 ##########################################################################
1224 # Documentation
1225 #
1226 $(DOC_BASE)/aptitudes.txt: $(DOC_TEMPLATES)/apt-tmpl.txt species.cc aptitudes.h \
1227                                                    util/gen-apt.pl
1228         $(QUIET_GEN)./util/gen-apt.pl $@ $^
1229
1230 $(DOC_BASE)/FAQ.html: dat/database/FAQ.txt util/FAQ2html.pl
1231         $(QUIET_GEN)./util/FAQ2html.pl $< $@
1232
1233 rest:
1234         wget -O - https://crawl.develz.org/wiki/doku.php?id=dcss:manual:rest \
1235         | sed -f util/undoku.sed > $(DOC_BASE)/crawl_manual.reST
1236
1237 $(DOC_BASE)/crawl_manual.txt: $(DOC_BASE)/crawl_manual.reST util/unrest.pl
1238         $(QUIET_GEN)util/unrest.pl <$< >$@
1239
1240 CLUA_MODULE_SOURCES = $(filter l_%,$(OBJECTS:%.o=%.cc))
1241 api: $(CLUA_MODULE_SOURCES)
1242         mkdir -p luadoc
1243         luadoc --doclet util.html_doclet --taglet util.taglet -d luadoc $^
1244
1245
1246 ##########################################################################
1247 # The level compiler
1248 #
1249
1250 $(YACC_OBJECTS): $(CONTRIB_LIBS)
1251
1252 ifndef NO_YACC
1253
1254 prebuildyacc:   $(UTIL)levcomp.tab.cc $(UTIL)levcomp.tab.h $(UTIL)levcomp.lex.cc
1255                 $(QUIET_COPY)$(COPY) $^ prebuilt/
1256
1257 $(UTIL)levcomp.tab.cc: $(UTIL)levcomp.ypp
1258                 +@$(MAKE) -C $(UTIL) levcomp.tab.cc
1259
1260 $(UTIL)levcomp.lex.cc: $(UTIL)levcomp.lpp $(UTIL)levcomp.tab.cc
1261                 +@$(MAKE) -C $(UTIL) levcomp.lex.cc
1262
1263 $(UTIL)levcomp.tab.h: $(UTIL)levcomp.tab.cc
1264
1265 else
1266
1267 prebuildyacc:
1268                 @echo "**** yacc is not installed, aborting."; false
1269
1270 # Pull the level-compiler stuff up from prebuilt/
1271
1272 $(UTIL)levcomp.tab.cc: prebuilt/levcomp.tab.cc
1273                 $(QUIET_COPY)$(COPY) prebuilt/*.h $(UTIL)
1274                 $(QUIET_COPY)$(COPY) $< $@
1275
1276 $(UTIL)levcomp.lex.cc: prebuilt/levcomp.lex.cc
1277                 $(QUIET_COPY)$(COPY) $< $@
1278
1279 endif
1280
1281 ##########################################################################
1282
1283
1284 ##########################################################################
1285 # The actual build targets
1286 #
1287 ifdef ANDROID
1288   # during build, data goes in a different directory to when crawl runs!
1289   prefix_fp = ..
1290   datadir_fp = ../AndroidData
1291   savedir_fp = ../AndroidData
1292   shareddir_fp =
1293 endif
1294
1295 install: all
1296 ifeq ($(DESTDIR)$(prefix),)
1297         @echo Neither "DESTDIR" nor "prefix" defined -- nowhere to install to, aborting.
1298         @exit 1
1299 endif
1300         [ -d $(prefix_fp)/$(bin_prefix) ] || mkdir -p $(prefix_fp)/$(bin_prefix)
1301         $(COPY) $(GAME) $(prefix_fp)/$(bin_prefix)/
1302         $(STRIP) $(prefix_fp)/$(bin_prefix)/$(GAME)
1303         mkdir -p $(datadir_fp)/dat/des
1304         mkdir -p $(datadir_fp)/dat/dlua
1305         mkdir -p $(datadir_fp)/dat/clua
1306         mkdir -p $(datadir_fp)/dat/database
1307         mkdir -p $(datadir_fp)/dat/defaults
1308         mkdir -p $(datadir_fp)/dat/descript
1309         for LANG in $(LANGUAGES); \
1310                 do mkdir -p $(datadir_fp)/dat/descript/$$LANG; \
1311         done
1312         mkdir -p $(datadir_fp)/docs/develop
1313         mkdir -p $(datadir_fp)/docs/develop/levels
1314         mkdir -p $(datadir_fp)/docs/license
1315         mkdir -p $(datadir_fp)/settings
1316         $(COPY_R) dat/des/* $(datadir_fp)/dat/des/
1317         $(COPY_R) dat/dlua/* $(datadir_fp)/dat/dlua/
1318         echo "-- Autogenerated list of maps to load and compile:" \
1319             >$(datadir_fp)/dat/dlua/loadmaps.lua
1320         find dat -name '*.des'|sed s:dat/::| \
1321           while read x; \
1322             do echo "dgn.load_des_file('$$x')"; \
1323             done >>$(datadir_fp)/dat/dlua/loadmaps.lua
1324         $(COPY)   dat/clua/*.lua $(datadir_fp)/dat/clua/
1325         $(COPY_R) dat/database/* $(datadir_fp)/dat/database/
1326         $(COPY_R) dat/defaults/* $(datadir_fp)/dat/defaults/
1327         $(COPY) dat/descript/*.txt $(datadir_fp)/dat/descript/
1328         for LANG in $(LANGUAGES); \
1329                 do $(COPY) dat/descript/$$LANG/*.txt $(datadir_fp)/dat/descript/$$LANG; \
1330         done
1331         $(COPY) ../docs/*.txt $(datadir_fp)/docs/
1332         $(COPY) ../docs/develop/*.txt $(datadir_fp)/docs/develop/
1333         $(COPY) ../docs/develop/levels/*.txt $(datadir_fp)/docs/develop/levels/
1334         $(COPY) ../docs/license/*.txt $(datadir_fp)/docs/license/
1335         $(COPY) ../CREDITS.txt $(datadir_fp)/docs/
1336         util/columnise-credits.pl $(datadir_fp)/docs/CREDITS.txt
1337         $(COPY) ../settings/* $(datadir_fp)/settings/
1338 ifeq ($(GAME),crawl.exe)
1339         sed -i 's/$$/\r/' `find $(datadir_fp) -iname '*.txt' -o -iname '*.des'`
1340 endif
1341 ifdef TILES
1342         mkdir -p $(datadir_fp)/dat/tiles
1343         $(COPY) dat/tiles/*.png $(datadir_fp)/dat/tiles/
1344 ifneq (,$(INSTALL_FONTS))
1345         $(COPY) $(INSTALL_FONTS) $(datadir_fp)/dat/tiles/
1346 endif
1347 endif
1348 ifdef WEBTILES
1349         mkdir -p $(webdir_fp)
1350         $(COPY_R) webserver/game_data/* $(webdir_fp)/
1351 endif
1352 ifneq ($(savedir_fp),)
1353         mkdir -p $(savedir_fp)/saves
1354         mkdir -p $(savedir_fp)/morgue
1355 ifeq ($(USE_DGAMELAUNCH),)
1356         $(CHOWN) $(INSTALL_UGRP) $(prefix_fp)/$(bin_prefix)/$(GAME) || true
1357         $(CHMOD) $(MCHMOD) $(prefix_fp)/$(bin_prefix)/$(GAME) || true
1358         $(CHOWN) -R $(INSTALL_UGRP) $(datadir_fp) || true
1359         $(CHOWN) -R $(INSTALL_UGRP) $(savedir_fp) || true
1360         $(CHMOD) $(MCHMOD_SAVEDIR) $(savedir_fp) || true
1361         $(CHMOD) $(MCHMOD_SAVEDIR) $(savedir_fp)/saves || true
1362         $(CHMOD) $(MCHMOD_SAVEDIR) $(savedir_fp)/morgue || true
1363 endif
1364 endif
1365 ifneq ($(shareddir_fp),)
1366         mkdir -p $(shareddir_fp)
1367 ifneq ($(patsubst /var/%,%,$(shareddir_fp)),$(shareddir_fp))
1368 # Only if we're being installed for real.  Installations to a staging dir
1369 # which are then packaged would trample existing files; these need to be
1370 # handled by packagers themselves.
1371         touch $(shareddir_fp)/logfile
1372         touch $(shareddir_fp)/scores
1373 endif
1374 ifeq ($(USE_DGAMELAUNCH),)
1375         $(CHOWN) -R $(INSTALL_UGRP) $(shareddir_fp) || true
1376         $(CHMOD) $(MCHMOD_SAVEDIR) $(shareddir_fp) || true
1377         $(CHMOD) $(MCHMOD_LOGS) $(shareddir_fp)/logfile || true
1378         $(CHMOD) $(MCHMOD_LOGS) $(shareddir_fp)/scores || true
1379 endif
1380 endif
1381
1382 clean: clean-rltiles clean-webserver clean-android
1383         +$(MAKE) -C $(UTIL) clean
1384         $(RM) $(GAME) $(GAME).exe $(GENERATED_FILES) $(EXTRA_OBJECTS) libw32c.o\
1385             libunix.o $(ALL_OBJECTS) $(ALL_OBJECTS:.o=.d) *.ixx  \
1386             .contrib-libs .cflags AppHdr.h.gch AppHdr.h.d util/fake_pty \
1387             rltiles/tiledef-unrand.cc
1388         $(RM) -r build-win
1389         $(RM) -r build
1390
1391 clean-contrib:
1392         +$(MAKE) -C contrib clean
1393
1394 clean-android:
1395         $(RM) ../icon.png ../libapplication.so
1396         $(RM) -r ../AndroidData
1397         $(RM) -r ../bin
1398
1399 distclean: clean clean-contrib clean-rltiles
1400         $(RM) -r morgue saves
1401         $(RM) scores $(GAME) core $(DEPENDENCY_MKF)
1402         $(RM) -r mac-app-zips
1403         $(RM) -r $(DOXYGEN_HTML_GEN)
1404
1405 $(GAME): $(OBJECTS) $(EXTRA_OBJECTS) $(CONTRIB_LIBS) dat/dlua/tags.lua
1406         +$(QUIET_LINK)$(CXX) $(LDFLAGS) $(EXTRA_OBJECTS) $(OBJECTS) -o $(GAME) $(LIBS)
1407
1408 debug: all
1409 debug-lite: all
1410 profile: all
1411
1412 doxy-simple: doxygen-simple
1413 doxygen-simple:
1414         $(DOXYGEN) $(DOXYGEN_SIMPLE_CONF)
1415
1416 doxy-all: doxygen-all
1417 doxygen-all:
1418         $(DOXYGEN) $(DOXYGEN_ALL_CONF)
1419
1420 # Dependency generation
1421 #
1422 ifndef NO_INLINE_DEPGEN
1423 # See info node: (gcc) Preprocessor Options
1424 INLINE_DEPGEN_CFLAGS = -MMD
1425 endif
1426
1427 $(DEPS): %.d: %.cc
1428
1429 # Precompiled headers
1430 #
1431 ifdef PCH
1432 -include AppHdr.h.d
1433 %.gch: % .cflags $(CONTRIB_LIBS)
1434 # This needs -MD, not -MMD, lest we be haunted by the ghosts of stale
1435 # system headers.
1436         $(QUIET_PCH)$(CXX) $(ALL_CFLAGS) -MD -c $< -o $@
1437
1438 CC_DEP := AppHdr.h.gch
1439 endif
1440
1441 # Plain old compilation
1442 #
1443
1444 $(OBJECTS:%.o=%.cc): $(CONTRIB_LIBS)
1445
1446 $(UTIL)%.o: ALL_CFLAGS=$(YACC_CFLAGS)
1447
1448 # The "|" designates "order-only" dependancies. See: (make) Prerequisite Types.
1449 #
1450 # This ensures that we update these headers before building anything
1451 # that might depend on them without our knowing it yet, but lets the
1452 # .d files take care of *whether* or not to rebuild.
1453 #
1454 # This is kind of important when building without ccache.
1455
1456 %.o: %.m .cflags | $(GENERATED_HEADERS)
1457         $(QUIET_CC)$(CC) $(ALL_CFLAGS) $(INLINE_DEPGEN_CFLAGS) -c $< -o $@
1458
1459 %.o: %.cc %.d .cflags $(CC_DEP) | $(GENERATED_HEADERS) $(TILEDEFHDRS)
1460 ifdef NO_INLINE_DEPGEN
1461         $(QUIET_DEPEND)$(or $(DEPCXX),$(CXX)) -MM $(ALL_CFLAGS) -MT $*.o $< > $*.d
1462 endif
1463         $(QUIET_CXX)$(CXX) $(ALL_CFLAGS) $(INLINE_DEPGEN_CFLAGS) -c $< -o $@
1464 ifndef NO_INLINE_DEPGEN
1465         @if [ -f $(@:%.o=%.d) ]; then touch -r $@ $(@:%.o=%.d); fi
1466 endif
1467
1468 icon.o: util/crawl.rc util/crawl.ico .cflags
1469         $(QUIET_WINDRES)$(WINDRES) util/crawl.rc icon.o
1470
1471 config.h: util/configure .cflags
1472         ${QUIET_GEN}util/configure "$(CXX)" $(ALL_CFLAGS)
1473
1474 #
1475 # Contribs
1476 #
1477
1478 $(CONTRIB_LIBS): .contrib-libs
1479         @:
1480
1481 .contrib-libs: .cflags
1482 ifneq (,$(CONTRIBS))
1483         @echo "    * Need to build contribs: $(CONTRIBS)"
1484         +@$(MAKE) -C contrib $(CONTRIBS) ARCH=$(ARCH)
1485 endif
1486         @touch $@
1487
1488 $(foreach t,$(CONTRIB_LIBS),$(if $(wildcard $t),,$(shell rm -f .contrib-libs)))
1489
1490 #############################################################################
1491 # Build unrandart data
1492 art-data.h: art-data.txt util/art-data.pl art-func.h
1493         util/art-data.pl
1494 art-enum.h rltiles/dc-unrand.txt rltiles/tiledef-unrand.cc: art-data.h
1495
1496 mon-mst.h: mon-spll.h util/gen-mst.pl
1497         $(QUIET_GEN)util/gen-mst.pl
1498
1499 cmd-name.h: enum.h util/cmd-name.pl
1500         $(QUIET_GEN)util/cmd-name.pl
1501
1502 dat/dlua/tags.lua: tag-version.h util/gen-luatags.pl
1503         $(QUIET_GEN)util/gen-luatags.pl
1504
1505 mi-enum.h: mon-info.h util/gen-mi-enum
1506         $(QUIET_GEN)util/gen-mi-enum
1507
1508 $(RLTILES)/dc-unrand.txt: art-data.h
1509
1510 artefact.o: art-data.h art-enum.h
1511 mon-util.o: mon-mst.h
1512 mon-util.d: mon-mst.h
1513 l_moninf.o: mi-enum.h
1514 macro.o: cmd-name.h
1515
1516 #############################################################################
1517 # RLTiles
1518 #
1519
1520 #.PHONY: build-rltiles
1521 build-rltiles: .contrib-libs $(RLTILES)/dc-unrand.txt
1522 ifdef ANDROID
1523         # force submake to run properly
1524         +$(MAKE) -C $(RLTILES) all ANDROID=1 TILES=1 V=1
1525         # prove that tiles were generated properly
1526         grep tile_info rltiles/*.cc| head
1527 else
1528         +$(MAKE) -C $(RLTILES) all ARCH=$(ARCH) TILES=$(TILES)$(WEBTILES)
1529 endif
1530
1531 $(TILEDEFSRCS) $(TILEDEFHDRS) $(ORIGTILEFILES): build-rltiles
1532
1533 dat/tiles/%.png: $(RLTILES)/%.png
1534         $(QUIET_PNGCRUSH)$(PNGCRUSH) $< $@
1535 ifdef USE_ADVPNG
1536         $(QUIET_ADVPNG)$(ADVPNG) $@
1537 endif
1538
1539 clean-rltiles:
1540         $(RM) $(DESTTILEFILES)
1541         +$(MAKE) -C $(RLTILES) distclean
1542
1543 ifdef TILES_ANY
1544 $(GAME): $(DESTTILEFILES)
1545 endif
1546
1547 .PHONY: check-fonts
1548 check-fonts:
1549 ifneq (,$(INSTALL_FONTS))
1550         @for x in $(INSTALL_FONTS); do if [ ! -e "$$x" ]; then echo \
1551         "Font file $${x##contrib/fonts/} not found. Please install it (possibly via contribs)."; \
1552         exit 1; fi; done
1553 endif
1554
1555 #############################################################################
1556 # Packaging a source tarball for release
1557 #
1558
1559 # To package, you *must* have lex and yacc to generate the intermediates.
1560 BSRC = build/crawl-ref/source/
1561 source: removeold prebuildyacc
1562         @git branch >/dev/null 2>/dev/null || (echo You can package source only from git. && false)
1563         rm -rf build
1564         mkdir build
1565         (cd ../..;git ls-files| \
1566                 grep -v -f crawl-ref/source/misc/src-pkg-excludes.lst| \
1567                 tar cf - -T -)|tar xf - -C build
1568         for x in lua pcre sqlite libpng freetype sdl sdl-image zlib fonts; \
1569           do \
1570            mkdir -p $(BSRC)contrib/$$x; \
1571            (cd contrib/$$x;git ls-files|tar cf - -T -)| \
1572                 tar xf - -C $(BSRC)contrib/$$x; \
1573           done
1574         find build -name .gitignore -execdir rm -f '{}' +
1575         git describe --tags $(MERGE_BASE) > $(BSRC)util/release_ver
1576         util/columnise-credits.pl build/crawl-ref/CREDITS.txt
1577         mv build/crawl-ref build/$(PKG_SRC_DIR)
1578
1579 package-tarball-deps: source
1580         cd build && tar cfJ ../../../$(SRC_PKG_TAR) $(PKG_SRC_DIR)
1581
1582 package-zipball-deps: source
1583         @if which zip >/dev/null; then \
1584           echo "cd build && zip -rq ../../../$(SRC_PKG_ZIP) $(PKG_SRC_DIR)"; \
1585           cd build && zip -rq ../../../$(SRC_PKG_ZIP) $(PKG_SRC_DIR); \
1586         else \
1587           echo "**** No ZIP installed -- not creating the zipball."; \
1588         fi
1589
1590 package-tarball-nodeps: source
1591         cd build && tar cfJ ../../../$(SRC_PKG_TAR_NODEPS) --exclude contrib $(PKG_SRC_DIR)
1592
1593 package-source: package-tarball-deps package-zipball-deps package-tarball-nodeps
1594         rm -rf build
1595
1596 removeold:
1597         if [ -f ../../$(SRC_PKG_TAR) ]; then $(RM) ../../$(SRC_PKG_TAR); fi
1598         if [ -f ../../$(SRC_PKG_ZIP) ]; then $(RM) ../../$(SRC_PKG_ZIP); fi
1599
1600 #############################################################################
1601 # Building the unified Windows package.
1602 #
1603
1604 # You need to have NSIS installed.
1605 package-windows:
1606 ifneq (x$(SRC_VERSION),x$(shell cat build-win/version.txt 2>/dev/null))
1607         +$(MAKE) build-windows
1608 endif
1609         if $(GXX) -dumpmachine|grep -q x86_64; \
1610           then WINARCH=win64; else WINARCH=win32; fi; \
1611         makensis -NOCD -DVERSION=$(SRC_VERSION) -DWINARCH="$$WINARCH" util/crawl.nsi
1612
1613 build-windows:
1614 ifneq ($(GAME),crawl.exe)
1615         @echo "This is only for Windows; please specify CROSSHOST.";false
1616 endif
1617         +$(MAKE) clean
1618         +$(MAKE) TILES=y DESTDIR=build-win SAVEDIR='~/crawl' install
1619         mv build-win/crawl.exe build-win/crawl-tiles.exe
1620         +$(MAKE) TILES=  DESTDIR=build-win SAVEDIR='~/crawl' install
1621         mv build-win/crawl.exe build-win/crawl-console.exe
1622         mv build-win/docs/CREDITS.txt build-win/
1623         echo $(SRC_VERSION) >build-win/version.txt
1624
1625 ZIP_DOCS=../README.txt ../licence.txt
1626 package-windows-zips:
1627 ifneq ($(GAME),crawl.exe)
1628         @echo "This is only for Windows; please specify CROSSHOST.";false
1629 endif
1630         +$(MAKE) clean
1631         +$(MAKE) TILES=y DESTDIR=build-win/stone_soup-tiles-$(MAJOR_VERSION) install
1632         cp -p $(ZIP_DOCS) build-win/stone_soup-tiles-$(MAJOR_VERSION)/
1633         cd build-win && zip -9r ../stone_soup-$(SRC_VERSION)-tiles-win32.zip *
1634         rm -rf build-win
1635         +$(MAKE) DESTDIR=build-win/stone_soup-$(MAJOR_VERSION) install
1636         cp -p $(ZIP_DOCS) build-win/stone_soup-$(MAJOR_VERSION)/
1637         cd build-win && zip -9r ../stone_soup-$(SRC_VERSION)-win32.zip *
1638         rm -rf build-win
1639         if which advzip >/dev/null;then advzip -z4 stone_soup-$(SRC_VERSION)*-win32.zip;fi
1640
1641 #############################################################################
1642 # Building Mac app bundles
1643 #
1644
1645 mac-app-tiles: all
1646         +$(MAKE) -j1 -C mac -f Makefile.app-bundle tiles
1647
1648 mac-app-console: all
1649         +$(MAKE) -j1 -C mac -f Makefile.app-bundle
1650
1651 #############################################################################
1652 # Building the Android package
1653 #
1654 PROJECT_DIR=contrib/sdl-android/project
1655 SRC_LINK=$(PROJECT_DIR)/jni/application/src
1656 ifeq (,$(wildcard $(PROJECT_DIR)/ant.properties))
1657         GENERATED_APK=project/bin/MainActivity-debug.apk
1658 else
1659         GENERATED_APK=project/bin/MainActivity-release.apk
1660 endif
1661
1662 android:
1663         if [ ! -e $(SRC_LINK) ]; then \
1664                 ln -s `cd ..; pwd` $(SRC_LINK); \
1665         fi
1666         @cd contrib/sdl-android && ./build.sh && \
1667         mv $(GENERATED_APK) ../../crawl_tiles_android-$(SRC_VERSION).apk
1668
1669 #############################################################################
1670 # Canned tests
1671 #
1672
1673 TESTS=test woken_rest unwoken_rest fireworks cerebov pan_lords miscasts kraken
1674 test: $(foreach i, $(TESTS), test-$(i))
1675
1676 test-%: $(GAME) util/fake_pty builddb
1677         util/fake_pty test/stress/run $*
1678         @echo "Finished: $*"
1679
1680 util/fake_pty: util/fake_pty.c
1681         $(QUIET_HOSTCC)$(if $(HOSTCC),$(HOSTCC),$(CC)) -Wall $< -o $@ -lutil
1682
1683 # Should be not needed, but the race condition in bug #6509 is hard to fix.
1684 builddb: $(GAME)
1685         ./$(GAME) --builddb
1686 .PHONY: builddb