#
# Dungeon Crawl Stone Soup
# GNU Makefile
#
# largely written by Steven Noonan <steven@uplinklabs.net>
# (if something breaks, blame him.)
#
# Typical targets:
# make
# make wizard
# make debug
# make install
# make wizard install
# make debug install
# -- note, unlike most programs, you need to specify build type when
# installing even if you just built it.
# Typical parameters:
# TILES -- set to anything to enable tiles build
#
# CROSSHOST -- target system, eg, i386-pc-msdosdjgpp or i586-mingw32msvc
#
# prefix -- installation base. Specify eg. /usr/local on Unix systems.
# DESTDIR -- installation staging area (the dir you intend to pack)
# DATADIR -- place to hold immutable files. Can be either relative to
# "prefix" or absolute.
# SAVEDIR -- place to hold writeable data (saves, database, morgue
# dumps). Can be relative to "prefix" or absolute.
# Layout examples:
# prefix=~/crawl DATADIR=data/ SAVEDIR=saves/
# -- everything under ~/crawl
# prefix=/usr/local
# -- a typical multiuser installation
#
# V -- set to anything to enable verbose build
#
# USE_ICC -- set to use Intel's compiler
#
#
# Requirements:
# For tile builds, you need pkg-config.
# You also need libpng, sdl, sdl-image and libfreetype -- if you got your
# source from git, you can 'git submodule update' to fetch them; you can also
# ask for a package with convenience libraries instead -- we'll try to provide
# them somewhere in the near future.
GAME = crawl
#
# Compiler Flags
#
# The compiler flag variables are separated into their individual
# purposes, making it easier to deal with the various tools involved
# in a compile.
#
# These are also divided into global vs. local flags. So for instance,
# CFOPTIMIZE affects Crawl, Lua, and SQLite, while CFOPTIMIZE_L only
# affects Crawl.
#
# The variables are as follows:
# CFOPTIMIZE(_L) - Optimization flags
# CFWARN(_L) - Warning flags
# CFOTHERS(_L) - Anything else
#
# These are really good options for the Intel C++ compiler:
#CFOPTIMIZE := -O2 -parallel
CFOPTIMIZE := -O2
CFOTHERS := -fno-strict-aliasing -pipe $(EXTERNAL_FLAGS)
CFOTHERS_L := -fsigned-char
CFWARN := -Wall
DEFINES := $(EXTERNAL_DEFINES)
#
# The GCC and GXX variables are set later.
#
AR = ar
RANLIB = ranlib
CC = $(GCC)
CXX = $(GXX)
RM = rm -f
COPY = cp
STRIP = strip
WINDRES = windres
CHMOD = chmod 2>/dev/null
CHOWN = chown 2>/dev/null
export AR
export RANLIB
export RM
export CC
export CXX
export CFLAGS
export MAKEFLAGS
export CONFIGURE_FLAGS
export uname_S
LIBPCRE := contrib/install/lib/libpcre.a
LIBSDL := contrib/install/lib/libSDL.a
LIBPNG := contrib/install/lib/libpng.a
LIBSDLIMAGE := contrib/install/lib/libSDL_image.a
LIBFREETYPE := contrib/install/lib/libfreetype.a
LIBSQLITE := contrib/install/lib/libsqlite3.a
LIBLUA := contrib/install/lib/liblua.a
LIBZ := contrib/install/lib/libz.a
#
# Platform Detection
#
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not')
uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not')
uname_P := $(shell sh -c 'uname -p 2>/dev/null || echo not')
uname_V := $(shell sh -c 'uname -v 2>/dev/null || echo not')
ifdef CROSSHOST
NO_PKGCONFIG = YesPlease
NO_AUTO_OPT = YesPlease
NEED_STATIC = YesPlease
CONFIGURE_FLAGS += --host=$(CROSSHOST)
BUILD_LUA = yes
BUILD_SQLITE = yes
# If needed, override uname_S so we get the appropriate
# things compiled.
ifneq (,$(findstring mingw,$(CROSSHOST)))
uname_S=MINGW32
endif
ifneq (,$(findstring djgpp,$(CROSSHOST)))
uname_S=DOS
endif
endif
ifneq (,$(findstring MINGW,$(uname_S)))
GAME = crawl.exe
bin_prefix = .
WIN32 = Yes
NO_RDYNAMIC = YesPlease
NO_NCURSES = YesPlease
NEED_LIBW32C = YesPlease
BUILD_PCRE = YesPlease
ifdef TILES
EXTRA_LIBS += -lmingw32 -lgdi32 -lwinmm contrib/install/lib/libSDLmain.a -mwindows
BUILD_FREETYPE = YesPlease
BUILD_SDL = YesPlease
BUILD_SDLIMAGE = YesPlease
BUILD_LIBPNG = YesPlease
BUILD_ZLIB = YesPlease
endif
endif
ifeq ($(uname_S),DOS)
GAME = crawl.exe
bin_prefix = .
NO_NCURSES = yes
NO_UNICODE = yes
NEED_LIBDOS = yes
BUILD_PCRE = yes
NO_RDYNAMIC = yes
endif
ifeq ($(uname_S),Darwin)
NEED_APPKIT = YesPlease
LIBNCURSES_IS_UNICODE = Yes
NO_PKGCONFIG = Yes
ifndef NO_APPLE_GCC
APPLE_GCC = YesPlease
endif
BUILD_SQLITE = YesPlease
ifdef TILES
EXTRA_LIBS += -framework AppKit -framework AudioUnit -framework Carbon -framework IOKit -framework OpenGL contrib/install/lib/libSDLmain.a
BUILD_FREETYPE = YesPlease
BUILD_SDL = YesPlease
BUILD_SDLIMAGE = YesPlease
BUILD_LIBPNG = YesPlease
BUILD_ZLIB = YesPlease
endif
endif
ifneq (,$(findstring CYGWIN,$(uname_S)))
GAME = crawl.exe
NO_RDYNAMIC = YesPlease
BUILD_PCRE = YesPlease
endif
ifeq (,$(findstring .exe,$(GAME)))
DEFINES += -DUSE_TAR
else
DEFINES += -DUSE_ZIP
endif
ifdef BUILD_ALL
BUILD_FREETYPE = YesPlease
BUILD_PCRE = YesPlease
BUILD_SDL = YesPlease
BUILD_SDLIMAGE = YesPlease
BUILD_SQLITE = YesPlease
BUILD_LUA = YesPlease
BUILD_LIBPNG = YesPlease
BUILD_ZLIB = YesPlease
endif
#
# Set up object file dependencies for $(GAME) target.
#
include makefile.obj
# Just a quick hack to make it clean up
# tiles-specific object files too.
ifneq (,$(findstring clean,$(MAKECMDGOALS)))
TILES := YesPlease
endif
# Works for Mac OS X and Linux.
OBJECTS += crash-u.o
ifdef WIN32
EXTRA_OBJECTS += icon.o
endif
ifdef TILES
OBJECTS += libgui.o tile2.o tilereg.o tilepick.o tilesdl.o tilefont.o tiletex.o tilemcache.o tilebuf.o
else
ifdef NEED_LIBW32C
OBJECTS += libw32c.o
else
ifdef NEED_LIBDOS
OBJECTS += libdos.o
else
OBJECTS += libunix.o
endif
endif
endif
# To get stack trace symbols.
# Note that MinGW doesn't support -rdynamic.
ifndef NO_RDYNAMIC
LDFLAGS := -rdynamic
endif
ifdef NEED_STATIC
LDFLAGS += -static
endif
ifdef USE_MERGE_BASE
MERGE_BASE := $(shell git merge-base HEAD $(USE_MERGE_BASE))
endif
# Permissions to set on the game executable.
MCHMOD := 2755
# Permissions to set on the save directory.
MCHMOD_SAVEDIR := 775
# The user:group to install the game as.
INSTALL_UGRP := games:games
chroot_prefix :=
prefix :=
ifeq ($(patsubst %/local,%,$(patsubst %/,%,$(prefix))),/usr)
FHS := yes
endif
ifeq (,$(bin_prefix))
ifneq ($(patsubst %/,%,$(prefix)),/usr)
bin_prefix := bin
else
bin_prefix := games
endif
endif
# If you're installing Crawl for multiple users, you *must* set this to a
# valid path before building Crawl. This is not necessary if you are building
# Crawl for a single user.
# If you're installing to /usr or /usr/local, we have sane defaults.
# SAVEDIR := saves/
# DATADIR := data/
ifneq (,$(FHS))
DATADIR := share/crawl
SAVEDIR := /var/games/crawl
endif
INCLUDES_L += -Icontrib/install/include
LIBS += -Lcontrib/install/lib
INCLUDES_L += -Iutil -I.
ifdef APPLE_GCC
# Compatibility level for Mac OS X
#
SDK_VER := 10.4
GCC_VER := 4.0
ARCHS := $(shell arch)
export ARCHS
CF_ARCHS := $(patsubst %,-arch %,$(ARCHS))
# Mac OS X 10.4 adds a 'u' on the end of the SDK name. Everything
# else is much easier to predict the name of.
ifeq ($(SDK_VER),10.4)
SDKROOT := /Developer/SDKs/MacOSX$(SDK_VER)u.sdk
else
SDKROOT := /Developer/SDKs/MacOSX$(SDK_VER).sdk
endif
CC = $(GCC) $(CF_ARCHS) -isysroot $(SDKROOT) -mmacosx-version-min=$(SDK_VER)
CXX = $(GXX) $(CF_ARCHS) -isysroot $(SDKROOT) -mmacosx-version-min=$(SDK_VER)
endif # MacOS
ifndef CROSSHOST
ifneq ($(GCC_VER),)
# We do this in a separate variable because if we
# specify GCC_VER on the make command-line, the
# variable is immutable, and we can't add the dash.
GCC_VER_SUFFIX:=-$(GCC_VER)
endif
# Attempt to use a full compiler name, to make
# distcc builds work nicely.
LMACH := $(shell gcc -dumpmachine)-
ifeq ($(LMACH),-)
LMACH :=
endif
ifeq ($(shell which $(LMACH)gcc$(GCC_VER_SUFFIX) 2> /dev/null),)
LMACH :=
endif
GCC := $(LMACH)gcc$(GCC_VER_SUFFIX)
GXX := $(LMACH)g++$(GCC_VER_SUFFIX)
else
# Cross-compiling is a weird case.
GCC := $(CROSSHOST)-gcc
GXX := $(CROSSHOST)-g++
AR := $(CROSSHOST)-ar
RANLIB := $(CROSSHOST)-ranlib
STRIP := $(CROSSHOST)-strip
WINDRES := $(CROSSHOST)-windres
endif
GCC_GTE_4_0_0 := $(shell util/gcc-gte.pl $(GCC) 4.0.0)
GCC_GTE_4_3_0 := $(shell util/gcc-gte.pl $(GCC) 4.3.0)
# Define this to automatically generate code optimized for your machine
# (GCC only as of now).
#
# NOTE: Don't use this with a release build, since the generated code
# won't work for all machines.
ifdef HURRY
NO_AUTO_OPT = YesPlease
endif
ifdef AUTO_OPT
ifndef NO_AUTO_OPT
CFOPTIMIZE += $(shell util/gcc-opt.pl $(GCC))
endif
endif
ifndef BUILD_LUA
ifeq (,$(wildcard /usr/include/lua5.1))
BUILD_LUA = yes
else
INCLUDES_L += -I/usr/include/lua5.1
LIBS += -llua5.1
endif
endif
ifndef BUILD_SQLITE
ifneq ($(shell grep -q sqlite3_prepare_v2 /usr/include/sqlite3.h 2>/dev/null && echo yes),yes)
BUILD_SQLITE = yes
else
LIBS += -lsqlite3
endif
endif
RLTILES = rltiles
#
# Tiles build stuff
#
ifdef TILES
DEFINES_L += -DUSE_TILE
INCLUDES_L += -I$(RLTILES)
ifdef BUILD_SDL
INCLUDES_L += -Icontrib/install/include/SDL
endif
ifdef BUILD_FREETYPE
INCLUDES_L += -Icontrib/install/include/freetype2
endif
# Okay, we have to assume we're on something else that
# uses standard UNIX-like methods for finding libs.
#
# For instance, on Linux and most other UNIX-likes,
# the app pkg-config can provide the appropriate
# CFLAGS and LDFLAGS.
#
ifndef NO_PKGCONFIG
ifneq ($(shell which pkg-config 2> /dev/null),)
PKGCONFIG = YesPlease
endif
endif
ifdef PKGCONFIG
# If pkg-config is available, it's the surest way to find where
# the contributing libraries are located.
#
FREETYPE_INCLUDE := $(shell pkg-config freetype2 --cflags-only-I)
FREETYPE_CFLAGS := $(shell pkg-config freetype2 --cflags-only-other)
FREETYPE_LDFLAGS := $(shell pkg-config freetype2 --libs-only-L) $(shell pkg-config freetype2 --libs-only-l)
SDL_INCLUDE := $(shell pkg-config sdl --cflags-only-I)
SDL_CFLAGS := $(shell pkg-config sdl --cflags-only-other)
SDL_LDFLAGS := $(shell pkg-config sdl --libs-only-L) $(shell pkg-config sdl --libs-only-l)
LIBS += -lSDL_image $(SDL_LDFLAGS) $(FREETYPE_LDFLAGS)
endif # pkg-config
ifneq ($(uname_S),Darwin)
ifeq (,$(findstring MINGW,$(uname_S)))
LIBS += -lGL -lGLU
else
LIBS += -lopengl32 -lglu32
endif
endif
DEFINES_L += $(PNG_CFLAGS) $(FREETYPE_CFLAGS) $(SDL_CFLAGS)
INCLUDES_L += $(PNG_INCLUDE) $(FREETYPE_INCLUDE) $(SDL_INCLUDE)
endif # TILES
ifeq ($(GCC_GTE_4_3_0),1)
CFWARN_L += -Wno-array-bounds
endif
CFWARN_L += -Wno-parentheses -Wwrite-strings -Wshadow -pedantic -D_FORTIFY_SOURCE=0
CFOTHERS_L = $(EXTERNAL_FLAGS_L) $(EXTRA_FLAGS) $(DEFINES) $(SDL_CFLAGS)
ifndef NO_LUA_BINDINGS
CFOTHERS_L += -DCLUA_BINDINGS
endif
#
# Figure out the build settings for this type of build
#
# Debug
# No optimization, full debugging.
ifneq (,$(findstring debug,$(MAKECMDGOALS)))
FULLDEBUG=YesPlease
WIZARD=YesPlease
DEBUG=YesPlease
NO_OPTIMIZE=YesPlease
endif
# Wizard
# Optimized, with wizard mode.
ifneq (,$(findstring wizard,$(MAKECMDGOALS)))
WIZARD=YesPlease
DEBUG=YesPlease
endif
# Profile
# Optimized, with full debugging.
ifneq (,$(findstring profile,$(MAKECMDGOALS)))
FULLDEBUG=YesPlease
WIZARD=YesPlease
DEBUG=YesPlease
endif
ifdef HURRY
NO_OPTIMIZE=YesPlease
endif
ifdef FULLDEBUG
DEFINES += -DFULLDEBUG
endif
ifdef DEBUG
CFOTHERS := -ggdb $(CFOTHERS)
DEFINES += -DDEBUG
endif
ifdef WIZARD
DEFINES += -DWIZARD
endif
ifdef NO_OPTIMIZE
CFOPTIMIZE := -O0
endif
ifdef PCH
CFWARN_L += -Winvalid-pch
endif
# Cygwin has a panic attack if we do this...
ifndef NO_OPTIMIZE
ifneq ($(GCC_GTE_4_0_0),0)
CFWARN_L += -Wuninitialized
else
CFWARN_L += -Wno-uninitialized
endif
endif
ifneq ($(strip $(chroot_prefix)),)
USE_CHROOT=YesPlease
endif
ifdef USE_DGAMELAUNCH
CFOTHERS_L += -DDGAMELAUNCH
endif
ifdef USE_CHROOT
prefix_fp := $(abspath $(strip $(DESTDIR)$(chroot_prefix))/$(strip $(prefix)))
else
prefix_fp := $(abspath $(strip $(DESTDIR)$(prefix)))
endif
ifneq ($(strip $(SAVEDIR)),)
ifeq ($(filter /%,$(SAVEDIR)),)
ifneq ($(prefix),)
override SAVEDIR := $(strip $(prefix))/$(strip $(SAVEDIR))
endif
endif
CFOTHERS_L += -DSAVE_DIR_PATH=\"$(abspath $(SAVEDIR))\"
savedir_fp := $(abspath $(strip $(DESTDIR))$(strip $(SAVEDIR)))
endif
ifneq ($(strip $(DATADIR)),)
ifeq ($(filter /%,$(DATADIR)),)
#relative DATADIR
ifneq ($(prefix),)
override DATADIR := $(strip $(prefix))/$(strip $(DATADIR))
endif
endif
CFOTHERS_L += -DDATA_DIR_PATH=\"$(abspath $(DATADIR))/\"
else
ifneq ($(prefix),)
DATADIR := $(strip $(prefix))/$(strip $(DATADIR))
endif
endif
datadir_fp := $(abspath $(strip $(DESTDIR))$(strip $(DATADIR)))
ifndef NO_NCURSES
NC_LIB = ncurses
NC_PREFIX = /usr
NC_INCLUDE = $(NC_PREFIX)/include/ncurses
# Usually, it can be autodetected for you:
ifndef NO_UNICODE
ifneq ($(shell ls $(NC_PREFIX)/include/ncursesw 2> /dev/null),)
NC_INCLUDE = $(NC_PREFIX)/include/ncursesw
USE_UNICODE = YesPlease
endif
endif
# If you have USE_UNICODE set, and have a preferred Unicode
# (UTF-8) locale you want Crawl to use, you can set it here. The
# default is en_US.UTF-8. If you'd prefer that Crawl use the locale
# as set in your environment LC_* variables, use UNICODE_LOCALE = .
UNICODE_LOCALE =
INCLUDES_L += -I$(NC_INCLUDE)
ifdef USE_UNICODE
# Include path for (n)curses with Unicode support.
# Your ncurses library may include Unicode support, and you may not have a
# separate libncursesw; in that case, change this line accordingly.
NC_LIB = ncursesw
CFOTHERS_L += -DUNICODE_GLYPHS
ifneq ($(strip $(UNICODE_LOCALE)),)
ifneq ($(strip $(UNICODE_LOCALE)),.)
CFOTHERS_L += -DUNICODE_LOCALE=\"$(strip $(UNICODE_LOCALE))\"
else
CFOTHERS_L += -DUNICODE_LOCALE=\"\"
endif
endif
# The standard ncurses library also supports Unicode on Mac OS/Darwin.
ifdef LIBNCURSES_IS_UNICODE
NC_LIB = ncurses
endif
endif
ifndef TILES
LIBS += -L$(NC_PREFIX)/lib -l$(NC_LIB)
endif
endif
ifdef BUILD_PCRE
DEFINES += -DREGEX_PCRE
LIBS += -lpcre
endif
ifdef USE_ICC
GCC := icc
GXX := icpc
AR := xiar rcu
LIBS += -lguide -lpthread
CFWARN := -wd383,810,869,981,1418 -we14,193,304
CFWARN_L :=
endif
ifdef REPORT
CFOTHERS += -ftime-report
endif
CFLAGS := $(CFOPTIMIZE) $(CFOTHERS) $(CFWARN)
CFLAGS_L := $(CFOPTIMIZE_L) $(DEFINES_L) $(CFWARN_L) $(INCLUDES_L) $(CFOTHERS_L)
ALL_CFLAGS := $(CFLAGS) $(CFLAGS_L)
YACC_CFLAGS := $(ALL_CFLAGS) -w -DYYENABLE_NLS=0 -DYYLTYPE_IS_TRIVIAL=0
UTIL = util/
OBJECTS := $(UTIL)levcomp.tab.o $(UTIL)levcomp.lex.o $(OBJECTS)
LEX := $(shell which flex 2> /dev/null)
YACC := $(shell which bison 2> /dev/null)
ifeq ($(strip $(LEX)),)
NO_YACC = YesPlease
endif
ifeq ($(strip $(YACC)),)
NO_YACC = YesPlease
endif
ifneq ($(findstring $(MAKEFLAGS),s),s)
ifndef V
QUIET_CC = @echo ' ' CC $@;
QUIET_CXX = @echo ' ' CXX $@;
QUIET_PCH = @echo ' ' PCH $@;
QUIET_LINK = @echo ' ' LINK $@;
QUIET_GEN = @echo ' ' GEN $@;
QUIET_COPY = @echo ' ' COPY $@;
QUIET_DEPEND = @echo ' ' DEPEND $@;
QUIET_WINDRES = @echo ' ' WINDRES $@;
export V
endif
endif
ifdef TILES
TILEDEFS = dngn main player gui unrand
TILEDEFPRES = $(TILEDEFS:%=$(RLTILES)/tiledef-%)
TILEDEFTXTS = $(TILEDEFPRES:%=%.txt)
TILEDEFOBJS = $(TILEDEFPRES:%=%.o)
TILEDEFSRCS = $(TILEDEFPRES:%=%.cc)
TILEDEFHDRS = $(TILEDEFPRES:%=%.h)
TILEFILES = \
main.png \
player.png \
dngn.png \
gui.png
ORIGTILEFILES = $(TILEFILES:%=$(RLTILES)/%)
DESTTILEFILES = $(TILEFILES:%=dat/tiles/%)
OBJECTS += $(TILEDEFOBJS)
endif
ifdef BUILD_PCRE
CONTRIBS += pcre
CONTRIB_LIBS += $(LIBPCRE)
endif
ifdef BUILD_FREETYPE
CONTRIBS += freetype
CONTRIB_LIBS += $(LIBFREETYPE)
endif
ifdef BUILD_SDLIMAGE
CONTRIBS += sdl-image
CONTRIB_LIBS += $(LIBSDLIMAGE)
endif
ifdef BUILD_SDL
CONTRIBS += sdl
CONTRIB_LIBS += $(LIBSDL)
endif
ifdef BUILD_LIBPNG
CONTRIBS += libpng
CONTRIB_LIBS += $(LIBPNG)
endif
ifdef BUILD_ZLIB
CONTRIBS += zlib
CONTRIB_LIBS += $(LIBZ)
endif
ifdef BUILD_LUA
CONTRIBS += lua/src
CONTRIB_LIBS += $(LIBLUA)
endif
ifdef BUILD_SQLITE
CONTRIBS += sqlite
CONTRIB_LIBS += $(LIBSQLITE)
endif
EXTRA_OBJECTS += version.o
LIBS += $(CONTRIB_LIBS) $(EXTRA_LIBS)
DOC_BASE := ../docs
DOC_TEMPLATES := $(DOC_BASE)/template
GENERATE_DOCS := $(DOC_BASE)/aptitudes.txt
GAME_DEPENDS := $(DESTTILEFILES) $(OBJECTS) $(EXTRA_OBJECTS) $(CONTRIB_LIBS)
SRC_PKG_BASE := stone_soup
SRC_VERSION := $(shell git describe --tags --long 2>/dev/null || cat util/release_ver)
PKG_SRC_DIR := $(SRC_PKG_BASE)-$(SRC_VERSION)
SRC_PKG_TAR := $(PKG_SRC_DIR).tar.bz2
SRC_PKG_ZIP := $(PKG_SRC_DIR).zip
.PHONY: all test install clean clean-contrib distclean debug profile wizard package-source source
all: $(GAME) $(GENERATE_DOCS)
test:
./$(GAME) -test > /dev/null
ifeq (,$(findstring clean,$(MAKECMDGOALS)))
#
# CFLAGS difference check
#
# Check for flag changes between the previous build and the current one,
# because any CFLAGS change could result in an inconsistent build if the
# person building it isn't careful.
#
# This should eliminate an annoying need to use 'make clean' every time.
#
TRACK_CFLAGS = $(subst ','\'',$(CC) $(CXX) $(ALL_CFLAGS)) # (stray ' for highlights)
.cflags: .force-cflags
@FLAGS='$(TRACK_CFLAGS)'; \
if test x"$$FLAGS" != x"`cat .cflags 2>/dev/null`" ; then \
echo " * rebuilding crawl: new build flags or prefix"; \
echo "$$FLAGS" > .cflags; \
fi
.PHONY: .force-cflags
##########################################################################
# Dependencies
DEPS := $(shell ls $(OBJECTS:.o=.d) 2> /dev/null)
-include $(DEPS)
endif
# This information is included in crash reports, and is printed with
# "crawl -version"
compflag.h: $(OBJECTS:.o=.cc)
$(QUIET_GEN)util/gen-cflg.pl compflag.h "$(ALL_CFLAGS)" "$(LDFLAGS)"
build.h: $(OBJECTS:.o=.cc)
$(QUIET_GEN)util/gen_ver.pl $@ $(MERGE_BASE)
version.cc: build.h compflag.h
##########################################################################
# Documentation
#
$(DOC_BASE)/aptitudes.txt: $(DOC_TEMPLATES)/apt-tmpl.txt player.cc skills2.cc \
util/gen-apt.pl
$(QUIET_GEN)./util/gen-apt.pl $@ $^
##########################################################################
# The level compiler
#
$(UTIL)levcomp.tab.cc: $(CONTRIB_LIBS)
$(UTIL)levcomp.lex.cc: $(CONTRIB_LIBS)
ifndef NO_YACC
prebuildyacc: $(UTIL)levcomp.tab.cc $(UTIL)levcomp.tab.h $(UTIL)levcomp.lex.cc
$(QUIET_COPY)$(COPY) $^ prebuilt/
$(UTIL)levcomp.tab.cc: $(UTIL)levcomp.ypp
+@$(MAKE) -C $(UTIL) levcomp.tab.cc
$(UTIL)levcomp.lex.cc: $(UTIL)levcomp.lpp $(UTIL)levcomp.tab.cc
+@$(MAKE) -C $(UTIL) levcomp.lex.cc
$(UTIL)levcomp.tab.h: $(UTIL)levcomp.tab.cc
else
# Pull the level-compiler stuff up from prebuilt/
$(UTIL)levcomp.tab.cc: prebuilt/levcomp.tab.cc
$(QUIET_COPY)$(COPY) prebuilt/*.h $(UTIL)
$(QUIET_COPY)$(COPY) $< $@
$(UTIL)levcomp.lex.cc: prebuilt/levcomp.lex.cc
$(QUIET_COPY)$(COPY) $< $@
endif
##########################################################################
##########################################################################
# The actual build targets
#
install: all
ifeq ($(DESTDIR)$(prefix),)
@echo Neither "DESTDIR" nor "prefix" defined -- nowhere to install to, aborting.
@exit 1
endif
[ -d $(prefix_fp)/$(bin_prefix) ] || mkdir -p $(prefix_fp)/$(bin_prefix)
$(COPY) $(GAME) $(prefix_fp)/$(bin_prefix)/
$(STRIP) -s $(prefix_fp)/$(bin_prefix)/$(GAME)
$(CHOWN) $(INSTALL_UGRP) $(prefix_fp)/$(bin_prefix)/$(GAME) || true
$(CHMOD) $(MCHMOD) $(prefix_fp)/$(bin_prefix)/$(GAME) || true
mkdir -p $(datadir_fp)/dat/clua
mkdir -p $(datadir_fp)/dat/lua
mkdir -p $(datadir_fp)/dat/database
mkdir -p $(datadir_fp)/dat/descript
mkdir -p $(datadir_fp)/docs/develop
mkdir -p $(datadir_fp)/docs/develop/levels
mkdir -p $(datadir_fp)/docs/license
mkdir -p $(datadir_fp)/settings
$(COPY) dat/*.des $(datadir_fp)/dat/
$(COPY) dat/clua/*.lua $(datadir_fp)/dat/clua/
$(COPY) dat/lua/*.lua $(datadir_fp)/dat/lua/
$(COPY) dat/database/*.txt $(datadir_fp)/dat/database/
$(COPY) dat/descript/*.txt $(datadir_fp)/dat/descript/
$(COPY) ../docs/*.txt $(datadir_fp)/docs/
$(COPY) ../docs/develop/*.txt $(datadir_fp)/docs/develop/
$(COPY) ../docs/develop/levels/*.txt $(datadir_fp)/docs/develop/levels/
$(COPY) ../docs/license/*.txt $(datadir_fp)/docs/license/
$(COPY) ../settings/* $(datadir_fp)/settings/
ifdef TILES
mkdir -p $(datadir_fp)/dat/tiles
$(COPY) dat/tiles/*.png dat/tiles/*.ttf $(datadir_fp)/dat/tiles/
endif
ifeq ($(USE_DGAMELAUNCH),)
$(CHOWN) -R $(INSTALL_UGRP) $(datadir_fp) || true
endif
ifneq ($(SAVEDIR),)
mkdir -p $(savedir_fp)/saves
mkdir -p $(savedir_fp)/morgue
ifeq ($(USE_DGAMELAUNCH),)
$(CHOWN) -R $(INSTALL_UGRP) $(savedir_fp) || true
$(CHMOD) -R $(MCHMOD_SAVEDIR) $(savedir_fp) || true
endif
endif
clean:
+$(MAKE) -C $(UTIL) clean
+$(MAKE) -C $(RLTILES) -f makefile.unix clean
$(RM) $(GAME) $(GAME).exe $(EXTRA_OBJECTS) libw32c.o libunix.o $(OBJECTS) $(OBJECTS:.o=.d) *.ixx build.h compflag.h .contrib-libs .cflags
clean-contrib:
+$(MAKE) -C contrib clean
distclean: clean clean-contrib clean-rltiles
$(RM) -r morgue saves
$(RM) scores $(GAME) core $(DEPENDENCY_MKF)
$(GAME): $(GAME_DEPENDS)
$(QUIET_LINK)$(CXX) $(LDFLAGS) $(EXTRA_OBJECTS) $(OBJECTS) -o $(GAME) $(LIBS)
debug: all
profile: all
wizard: all
# [ds] Note we don't use the standard CFLAGS here; that's intentional, most
# flex/bison combos I've tried don't produce code that passes the warnings
# test.
$(UTIL)%.o: $(UTIL)%.cc .cflags
$(QUIET_CXX)$(CXX) $(YACC_CFLAGS) -Wp,-MD,$(UTIL)$*.d -c $< -o $(UTIL)$*.o
ifdef PCH
%.h.gch: %.h
$(QUIET_PCH)$(CXX) $(ALL_CFLAGS) -c $< -o $@
CC_DEP := AppHdr.h.gch
endif
$(OBJECTS:%.o=%.cc): $(CC_DEP) $(TILEDEFHDRS) $(CONTRIB_LIBS)
%.d: %.cc .cflags
$(QUIET_DEPEND)$(CXX) -MM $(ALL_CFLAGS) $< > $*.d
%.o: %.m .cflags
$(QUIET_CC)$(CC) $(ALL_CFLAGS) -Wp,-MD,$*.d -c $< -o $*.o
%.o: %.cc .cflags
$(QUIET_CXX)$(CXX) $(ALL_CFLAGS) -Wp,-MD,$*.d -c $< -o $*.o
icon.o: util/crawl.rc util/crawl.ico
$(QUIET_WINDRES)$(WINDRES) util/crawl.rc icon.o
#
# Contribs
#
$(CONTRIB_LIBS): .contrib-libs
@:
.contrib-libs: .cflags
ifneq (,$(CONTRIBS))
+@$(MAKE) -C contrib $(CONTRIBS)
endif
@touch $@
$(foreach t,$(CONTRIB_LIBS),$(if $(wildcard $t),,$(shell rm -f .contrib-libs)))
#############################################################################
# Build unrandart data
art-data.h: art-data.txt util/art-data.pl art-func.h
util/art-data.pl
#############################################################################
# RLTiles
#
.PHONY: rltile-build
rltile-build: .contrib-libs
+$(MAKE) -C $(RLTILES) -f makefile.unix all
$(TILEDEFSRCS): rltile-build
$(TILEDEFHDRS): rltile-build
$(ORIGTILEFILES): rltile-build
dat/tiles/%.png: $(RLTILES)/%.png
$(QUIET_COPY)$(COPY) $< $@
clean-rltiles:
$(RM) $(DESTTILEFILES)
+$(MAKE) -C $(RLTILES) -f makefile.unix distclean
#############################################################################
# Packaging a source tarball for release
#
# To package, you *must* have lex and yacc to generate the intermediates.
BSRC = build/crawl-ref/source/
package-source: prebuildyacc
+@$(MAKE) source
source: depend removeold
@git branch >/dev/null 2>/dev/null || (echo You can package source only from git. && false)
rm -rf build
mkdir build
(cd ../..;git ls-files| \
grep -v -f crawl-ref/source/misc/src-pkg-excludes.lst| \
tar cf - -T -)|tar xf - -C build
cp -p *.d $(BSRC)
for x in lua pcre sqlite; \
do \
mkdir -p $(BSRC)contrib/$$x; \
(cd contrib/$$x;git ls-files|tar cf - -T -)| \
tar xf - -C $(BSRC)contrib/$$x; \
done
find build -name .gitignore -execdir rm -f '{}' +
(git describe --tags --long $(MERGE_BASE) 2> /dev/null || \
git describe --tags $(MERGE_BASE) 2> /dev/null) \
> $(BSRC)util/release_ver
cd build && mv crawl-ref $(PKG_SRC_DIR)
cd build && tar cfj ../../../$(SRC_PKG_TAR) $(PKG_SRC_DIR)
@if which zip >/dev/null; then \
@echo "cd build && zip -rq ../../../$(SRC_PKG_ZIP) $(PKG_SRC_DIR)"; \
cd build && zip -rq ../../../$(SRC_PKG_ZIP) $(PKG_SRC_DIR); \
else \
echo "**** No ZIP installed -- not creating the zipball."; \
fi
rm -rf build
removeold:
if [ -f ../../$(SRC_PKG_TAR) ]; then $(RM) ../../$(SRC_PKG_TAR); fi
if [ -f ../../$(SRC_PKG_ZIP) ]; then $(RM) ../../$(SRC_PKG_ZIP); fi