diff options
Diffstat (limited to 'crawl-ref/source/makefile')
-rw-r--r-- | crawl-ref/source/makefile | 615 |
1 files changed, 578 insertions, 37 deletions
diff --git a/crawl-ref/source/makefile b/crawl-ref/source/makefile index 03861c74db..39e5af50db 100644 --- a/crawl-ref/source/makefile +++ b/crawl-ref/source/makefile @@ -1,55 +1,596 @@ -#Makefile chooser. Choose one: +# +# Dungeon Crawl Stone Soup +# GNU Makefile +# +# largely written by Steven Noonan <steven@uplinklabs.net> +# (if something breaks, blame him.) +# -MAKEFILE ?= makefile.unix -#MAKEFILE ?= makefile.dos -#MAKEFILE ?= makefile.osx -#MAKEFILE ?= makefile.mgw -#MAKEFILE ?= makefile_tiles.mgw -#MAKEFILE ?= makefile_tiles.unix +GAME = crawl -#These are for cross-compiling purposes on crawl.develz.org, here for convenience: +CC = gcc +CXX = g++ +DELETE = rm -f +COPY = cp -#MAKEFILE ?= makefile.mgw_unix -#MAKEFILE ?= makefile_tiles.mgw_unix +# +# Platform Detection +# +# Use the variable OSNAME if you need to add something that's +# platform-specific. +# The valid OSNAME values are currently: +# 'WIN32': alias for MinGW and Cygwin +# 'MacOS': alias for Darwin (Mac OS X) +# and non-translated values from other platforms (values from +# 'uname -s' call). So Linux is simply 'Linux', etc. +# +UNAME_S := $(shell uname -s | cut -d'_' -f1) +OSNAME = +ifeq ($(UNAME_S),MINGW32) +OSNAME = WIN32 +endif +ifeq ($(UNAME_S),CYGWIN) +OSNAME = WIN32 +endif +ifeq ($(UNAME_S),Darwin) +OSNAME = MacOS +endif +ifeq ($(OSNAME),) +OSNAME = $(UNAME_S) +endif -all: - +$(MAKE) -f $(MAKEFILE) +ifeq ($(OSNAME),WIN32) +GAME = crawl.exe +endif -profile: - +$(MAKE) -f $(MAKEFILE) EXTRA_FLAGS='-pg' +TILES = n -noopt: - +$(MAKE) -f $(MAKEFILE) +# +# Set up object file dependencies for $(GAME) target. +# +include makefile.obj -install: - +$(MAKE) -f $(MAKEFILE) install +# Works for Mac OS X and Linux. +OBJECTS += crash-u.o + +ifneq ($(TILES),n) +OBJECTS += libgui.o tile2.o tilereg.o tilepick.o tilesdl.o tilefont.o tiletex.o tilemcache.o tilebuf.o +else +ifneq ($(UNAME_S),MINGW32) +OBJECTS += libunix.o +else +OBJECTS += libw32c.o +endif +endif + +# To get stack trace symbols. +# Note that MinGW doesn't support -rdynamic. +ifeq ($(OSNAME),WIN32) +LDFLAGS := +else +LDFLAGS := -rdynamic +endif + +# Change this to y (case-sensitive!) if you want to use Unicode glyphs +# in the map, and you have libncursesw available. +UNICODE_GLYPHS = n + +# If you're using UNICODE_GLYPHS=y, 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 = + +# If you have lex and yacc, set DOYACC to y (lowercase y). +DOYACC := y + +# 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 + +INSTALLDIR := /usr/games/crawl + +# 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. + +# SAVEDIR := /usr/games/crawl/saves/ +# DATADIR := /usr/games/crawl/data/ + +PCH := n + +# libpcre +PCRESRC := util/pcre/ +PCRELIB := pcre +PCRELIBA := lib$(PCRELIB).a +FPCRELIBA := $(PCRESRC)$(PCRELIBA) + +# LUA +LUASRC := util/lua/src/ +LUALIB := lua +LUALIBA := lib$(LUALIB).a +FLUALIBA := $(LUASRC)$(LUALIBA) + +# SQLite +SQLSRC := util/sqlite/ +SQLLIB := sqlite3 +SQLLIBA := lib$(SQLLIB).a +FSQLLIBA := $(SQLSRC)$(SQLLIBA) + +LIBDBM := $(FSQLLIBA) +EXTRA_INCLUDES += -I$(SQLSRC) +EXTRA_DEPENDS += $(FSQLLIBA) + +LIB := -L$(LUASRC) -l$(LUALIB) $(LIBDBM) + +INCLUDES += -Iutil -I. -I$(LUASRC) $(EXTRA_INCLUDES) + + +ifneq ($(TILES),n) +RLTILES = rltiles + +ifneq ($(shell which pkg-config 2> /dev/null),) + +# If pkg-config is available, it's the surest way to find where +# the contributing libraries are located. +# +PNG_INCLUDE := $(shell pkg-config libpng --cflags-only-I) +PNG_CFLAGS := $(shell pkg-config libpng --cflags-only-other) +PNG_LDFLAGS := $(shell pkg-config libpng --libs) + +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) + +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) + +else # pkg-config + +# Ugh, pkg-config isn't available. We're probably on MinGW, Cygwin, +# or some other stupid platform. We've got to assume that the +# libraries are either in the standard paths or are in /opt/<lib>/. +# +PNG_INCLUDE := -I/opt/libpng/include +PNG_CFLAGS := +PNG_LDFLAGS := -L/opt/libpng/lib -lpng + +FREETYPE_INCLUDE := -I/opt/freetype/include +FREETYPE_CFLAGS := +FREETYPE_LDFLAGS := -L/opt/freetype/lib -lfreetype + +ifneq ($(which sdl-config 2> /dev/null),) + +# sdl-config is our second best bet... +# +SDL_INCLUDE := $(shell sdl-config --cflags | tr ' ' '\n' | grep ^[-]I | tr '\n' ' ') +SDL_CFLAGS := $(shell sdl-config --cflags | tr ' ' '\n' | grep -v ^[-]I | tr '\n' ' ') +SDL_LDFLAGS := $(shell sdl-config --libs) + +else # sdl-config + +# Fine, we have to make some REALLY ugly assumptions... +# +SDL_INCLUDE := -I/opt/sdl/include/SDL +SDL_CFLAGS := +SDL_LDFLAGS := -L/opt/sdl/lib -lSDL -lSDLmain + +endif # sdl-config +endif # pkg-config + +LIB += $(PNG_LDFLAGS) $(FREETYPE_LDFLAGS) $(SDL_LDFLAGS) -lSDL_image +ifeq ($(OSNAME),MacOS) +LIB += -framework OpenGL -framework AppKit +else +LIB += -lGL -lGLU +endif + +EXTRA_FLAGS += -DUSE_TILE $(PNG_CFLAGS) $(FREETYPE_CFLAGS) $(SDL_CFLAGS) +INCLUDES += -I$(RLTILES) $(PNG_INCLUDE) $(FREETYPE_INCLUDE) $(SDL_INCLUDE) +endif # TILES + + +CFWARN := -Wall -Wno-parentheses -Wwrite-strings -Wshadow -pedantic +CFOTHERS = -fno-strict-aliasing -fsigned-char $(EXTRA_FLAGS) -DCLUA_BINDINGS -pipe $(SDL_CFLAGS) + +# +# Figure out the build settings for this type of build +# + +# Crawl defaults +# Optimized, no debugging. +FULLDEBUG=n +WIZARD=n +DEBUG=n +OPTIMIZE=y + +# Debug +# No optimization, full debugging. +ifeq ($(MAKECMDGOALS),debug) +FULLDEBUG=y +WIZARD=y +DEBUG=y +OPTIMIZE=n +endif + +# Wizard +# Optimized, with wizard mode. +ifeq ($(MAKECMDGOALS),wizard) +FULLDEBUG=n +WIZARD=y +DEBUG=y +OPTIMIZE=y +endif + +# Profile +# Optimized, with full debugging. +ifeq ($(MAKECMDGOALS),profile) +FULLDEBUG=y +WIZARD=y +DEBUG=y +OPTIMIZE=y +endif + +ifeq ($(FULLDEBUG),y) +EXTRA_FLAGS += -DFULLDEBUG +endif +ifeq ($(DEBUG),y) +EXTRA_FLAGS += -ggdb +endif +ifeq ($(WIZARD),y) +EXTRA_FLAGS += -DWIZARD +endif +ifeq ($(OPTIMIZE),y) +CFOPTIMIZE := -O2 +else +CFOPTIMIZE := -O0 +endif +ifneq ($(PCH),n) +CFWARN += -Winvalid-pch +endif + +# Cygwin has a panic attack if we do this... +ifneq ($(UNAME_S),CYGWIN) +CFWARN += -Wuninitialized +else +CFWARN += -Wno-uninitialized +endif + +ifneq ($(strip $(SAVEDIR)),) +CFOTHERS += '-DSAVE_DIR_PATH="$(strip $(SAVEDIR))"' +endif + +ifneq ($(strip $(DATADIR)),) +CFOTHERS += '-DDATA_DIR_PATH="$(strip $(DATADIR))"' +endif + +ifeq ($(strip $(UNICODE_GLYPHS)),y) +# Include path for (n)curses with Unicode support. +INCLUDES += -I/usr/include/ncursesw + +# Your ncurses library may include Unicode support, and you may not have a +# separate libncursesw; in that case, change this line accordingly. +LIBCURS = ncursesw +CFOTHERS += -DUNICODE_GLYPHS + +ifneq ($(strip $(UNICODE_LOCALE)),) +ifneq ($(strip $(UNICODE_LOCALE)),.) +CFOTHERS += -DUNICODE_LOCALE=\"$(strip $(UNICODE_LOCALE))\" +else +CFOTHERS += -DUNICODE_LOCALE=\"\" +endif +endif + +# The standard ncurses library also supports Unicode on Mac OS/Darwin. +ifeq ($(shell uname),Darwin) +LIBCURS = ncurses +endif + +else +# Include path for curses or ncurses (non-Unicode). +INCLUDES += -I/usr/include/ncurses +LIBCURS = ncurses +endif + +ifeq ($(OSNAME),WIN32) +ifneq ($(TILES),n) +CFOTHERS += -DWIN32TILES +else +CFOTHERS += -DWIN32CONSOLE +endif +endif + +ifeq ($(OSNAME),WIN32) +INCLUDES += -Iutil/pcre +LIB += $(FPCRELIBA) +else +LIB += -l$(LIBCURS) +endif + +CFLAGS := $(CFOPTIMIZE) $(CFWARN) $(INCLUDES) $(CFOTHERS) +YCFLAGS := $(CFOPTIMIZE) $(CFOTHERS) $(INCLUDES) + +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)),) +DOYACC := n +endif +ifeq ($(strip $(YACC)),) +DOYACC := n +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_COPY = @echo ' ' COPY $@; + QUIET_DEPEND = @echo ' ' DEPEND $@; + export V +endif +endif + +ifneq ($(TILES),n) +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/%) + +EXTRA_DEPENDS += $(DESTTILEFILES) +OBJECTS += $(TILEDEFOBJS) +endif + +GAME_DEPENDS := $(LUASRC)$(LUALIBA) $(EXTRA_DEPENDS) $(OBJECTS) +SRC_PKG_BASE := stone_soup +SRC_VERSION := $(shell egrep 'VER_NUM *".*"' version.h | cut -d'"' -f2) +PKG_SRC_DIR := $(SRC_PKG_BASE)-$(SRC_VERSION)-src +SRC_PKG_TAR := $(PKG_SRC_DIR).tbz2 +SRC_PKG_ZIP := $(PKG_SRC_DIR).zip + +ifeq ($(UNAME_S),MINGW32) +GAME_DEPENDS += $(FPCRELIBA) +endif + +PKG_TIDY_LIST := $(UTIL)*.o $(LEVCOMP) *.o \ + $(UTIL)*.tab.cc $(UTIL)*.tab.h $(UTIL)*.lex.cc *.ixx +PKG_EXCLUDES := $(PWD)/misc/src-pkg-excludes.lst + +########################################################################## + +all: $(GAME) + +test: $(GAME) + $(PWD)/$(GAME) -test + +########################################################################## +# Dependencies + +DEPENDENCY_MKF := makefile.dep + +ifeq ($(shell which fastdep 2> /dev/null),) +depend: $(OBJECTS:.o=.cc) + rm -f $(DEPENDENCY_MKF).tmp + @for i in $^; do \ + echo ' ' DEP $$i; \ + $(CXX) -MM $(CFLAGS) $$i >>$(DEPENDENCY_MKF).tmp 2>/dev/null; \ + done + mv -f $(DEPENDENCY_MKF).tmp $(DEPENDENCY_MKF) +else +depend: $(DEPENDENCY_MKF) + +%.dep: $(OBJECTS:.o=.cc) + $(QUIET_DEPEND)fastdep $(INCLUDES) *.h $(OBJECTS:.o=.cc) > $@ +endif + +-include $(DEPENDENCY_MKF) + +########################################################################## +# The level compiler +# + +ifeq ($(strip $(DOYACC)),y) + +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 + +@$(MAKE) -C $(UTIL) levcomp.lex.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: $(GAME) +ifeq ($(DATADIR),) + $(error DATADIR not set! Set DATADIR and run make clean install again) +endif + [ -d $(INSTALLDIR) ] || mkdir -p $(INSTALLDIR) + $(COPY) $(GAME) $(INSTALLDIR) + chown $(INSTALL_UGRP) $(INSTALLDIR)/$(GAME) + chmod $(MCHMOD) $(INSTALLDIR)/$(GAME) + mkdir -p $(DATADIR)/dat + mkdir -p $(DATADIR)/dat/lua + mkdir -p $(DATADIR)/dat/clua + mkdir -p $(DATADIR)/dat/descript + mkdir -p $(DATADIR)/dat/database + $(COPY) dat/*.des $(DATADIR)/dat + $(COPY) dat/lua/*.lua $(DATADIR)/dat/lua + $(COPY) dat/clua/*.lua $(DATADIR)/dat/clua + $(COPY) dat/descript/*.txt $(DATADIR)/dat/descript + $(COPY) dat/database/*.txt $(DATADIR)/dat/database + mkdir -p $(DATADIR)/settings + $(COPY) ../settings/* $(DATADIR)/settings/ + mkdir -p $(DATADIR)/docs + $(COPY) ../docs/*.txt $(DATADIR)/docs + chown -R $(INSTALL_UGRP) $(DATADIR) +ifneq ($(SAVEDIR),) + mkdir -p $(SAVEDIR) + chown $(INSTALL_UGRP) $(SAVEDIR) + chmod $(MCHMOD_SAVEDIR) $(SAVEDIR) +endif clean: - +$(MAKE) -f $(MAKEFILE) clean + +$(MAKE) -C $(UTIL) clean + $(DELETE) *.o + $(DELETE) *.ixx + +clean-lua: + +$(MAKE) -C $(LUASRC) clean + +clean-sql: + +$(MAKE) -C $(SQLSRC) clean + +distclean: clean clean-lua clean-sql clean-rltiles + $(DELETE) bones.* + $(DELETE) morgue.txt + $(DELETE) scores + $(DELETE) $(GAME) + $(DELETE) *.sav + $(DELETE) core + $(DELETE) *.0* + $(DELETE) *.lab + $(DELETE) $(DEPENDENCY_MKF) + +$(GAME): $(GAME_DEPENDS) + $(QUIET_LINK)$(CXX) $(LDFLAGS) $(CFLAGS) $(OBJECTS) -o $(GAME) $(LIB) + +.PHONY : debug profile wizard + +debug: $(GAME) +profile: $(GAME) +wizard: $(GAME) + +# [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 + $(QUIET_CXX)$(CXX) $(YCFLAGS) -o $@ -c $< + +ifneq ($(PCH),n) +%.h.gch: %.h + $(QUIET_PCH)$(CXX) $(CFLAGS) -c $< -o $@ + +CC_DEP := AppHdr.h.gch +endif + +$(OBJECTS:%.o=%.cc): $(CC_DEP) $(TILEDEFHDRS) + +%.o: %.m + $(QUIET_CXX)$(CC) $(CFLAGS) -c $< -o $@ + +%.o: %.cc + $(QUIET_CXX)$(CXX) $(CFLAGS) -c $< -o $@ + +############################################################################# +# Build PCRE + +$(FPCRELIBA): + +@$(MAKE) -C $(PCRESRC) + +############################################################################# +# Build Lua + +$(FLUALIBA): + +@$(MAKE) -C $(LUASRC) crawl_unix + +############################################################################# +# Build SQLite + +$(FSQLLIBA): + +@$(MAKE) -C $(SQLSRC) + +############################################################################# +# 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: + $(MAKE) -C $(RLTILES) -f makefile.unix all + +$(TILEDEFSRCS): rltile-build +$(TILEDEFHDRS): rltile-build +$(ORIGTILEFILES): rltile-build + +dat/tiles/%.png: $(RLTILES)/%.png + $(QUIET_COPY)$(COPY) $< $@ -distclean: - +$(MAKE) -f $(MAKEFILE) distclean +clean-rltiles: + +$(MAKE) -C $(RLTILES) -f makefile.unix distclean -depend: - +$(MAKE) -f $(MAKEFILE) depend +############################################################################# +# Packaging a source tarball for release +# -# WIZARD mode currently includes asserts, bounds checking, item checking and -# monster checking. -wizard: - +$(MAKE) -f $(MAKEFILE) debug EXTRA_FLAGS='-g -DWIZARD -DDEBUG -DDEBUG_ITEM_SCAN -DDEBUG_MONS_SCAN' +# To package, you *must* have lex and yacc to generate the intermediates. +ifeq ($(DOYACC),y) +package-source: distclean prebuildyacc pkgtidy depend removeold vlink \ + pkgtarbz2 pkgzip -# DEBUG mode includes WIZARD mode as well as copious debugging input -debug: - +$(MAKE) -f $(MAKEFILE) DEBUG_CRAWL=y debug EXTRA_FLAGS='-g -DFULLDEBUG -DWIZARD' +pkgtidy: + $(DELETE) $(PKG_TIDY_LIST) -# [dshaligram] The individual makefile need not necessarily support -# package-source; only makefile.unix does at the moment. -package-source: - +$(MAKE) -f $(MAKEFILE) package-source +removeold: + if [ -f ../../$(SRC_PKG_TAR) ]; then $(DELETE) ../../$(SRC_PKG_TAR); fi + if [ -f ../../$(SRC_PKG_ZIP) ]; then $(DELETE) ../../$(SRC_PKG_ZIP); fi -prebuildyacc: - +$(MAKE) -f $(MAKEFILE) prebuildyacc +# [ds] Existing directory names could produce a bad package! +vlink: + cd .. && WHERE=$$PWD && cd .. && \ + ( [ -e $(PKG_SRC_DIR) ] || ln -sf $$WHERE $(PKG_SRC_DIR) ) -# DO NOT DELETE THIS LINE -- $(MAKE) depend depends on it. +pkgtarbz2: + cd ../.. && tar -ch --bzip2 -f $(SRC_PKG_TAR) \ + -X $(PKG_EXCLUDES) $(PKG_SRC_DIR) +pkgzip: + cd ../.. && zip -rq $(SRC_PKG_ZIP) $(PKG_SRC_DIR) \ + -x@$(PKG_EXCLUDES) +endif |