Makefile
changeset 0 29654efe3188
child 32 bc861ea6d23b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Makefile	Mon Aug 09 17:04:08 2004 +0000
@@ -0,0 +1,615 @@
+# This Makefile is partially based on "a completely generic Makefile",
+# originally created by Justin Husted <husted@cs>
+#
+# Rewrite and sane dependencies support by Petr Baudis <pasky@ucw.cz>
+# Cygwin support and configuration by Jaen Saul <slowbyte@hot.ee>
+# A lot of modifications by Bjarni Corfitzen <bjarni@openttd.com>
+#
+# Last modified by: $Author: strigeus $
+# On: $Date: 2004/03/11 19:15:06 $
+
+
+##############################################################################
+#
+# Usage
+#
+
+# Synopsis:
+#
+# make WITH_ZLIB=1 UNIX=1 MANUAL_CONFIG=1
+#
+# (See below for the list of possible options.)
+#
+# Alternately, you can run make without the MANUAL_CONFIG part. It then
+# generates Makefile.config, where you can customize all the options.
+# However beware that for all subsequent calls the option values from
+# Makefile.config take precedence to the commandline options.
+#
+# (That means that you probably want to either specify the options on command
+# line together with MANUAL_CONFIG=1 or you want to specify no commandline
+# options at all.)
+
+# Targets:
+#
+# Defaults to building binary
+# clean: remove intermediate build files
+# mrproper: remove intermediate files and makefile configuration
+# upgradeconf: add new options to old Makefile.config
+# osx: OS X application
+
+# Options:
+#
+# Summary of OS choice defines
+# WIN32: building on Windows
+# UNIX: building on *nix derivate (Linux, FreeBSD)
+# OSX: building on Mac OS X
+# MORPHOS: building on MorphOS
+#
+# Summary of library choice defines
+# WITH_ZLIB: savegames using zlib
+# WITH_PNG: screenshots using PNG
+# WITH_SDL: SDL video driver support
+#
+# Summary of other defines:
+# MANUAL_CONFIG: do not use Makefile.config, config options set manually
+# DEBUG: build in debug mode
+# PROFILE: build in profile mode, disables -s and -fomit-frame-pointer
+# DISPLAY_WARNINGS: when off, some errors are not displayed while compiling
+# TRANSLATOR: build in translator mode (untranslated strings are prepended by
+#             a <TODO> mark)
+# RELEASE: this will be the released version number. It replaces all places
+#          where it normally would print the revision number
+# MIDI: if set, it will use it as custom path to midi player. 
+#  If unset, it will use the hardcoded path in the c code
+#
+# DATA_DIR_PREFIX: This sets the dir OpenTTD looks for the needed files. 
+#   MUST END WITH / if defined
+#
+# STATIC: link statically
+# CYGWIN: build in Cygwin environment
+# MINGW: build with MingW compiler, link with MingW libraries
+#
+# Experimental (does not work properly):
+# WITH_NETWORK: enable networking
+# WITH_DIRECTMUSIC: enable DirectMusic MIDI support
+
+
+##############################################################################
+#
+# Configuration
+#
+
+# CONFIG_WRITER have to be found even for manual configuration
+CONFIG_WRITER=makefiledir/Makefile.config_writer
+
+ifndef MANUAL_CONFIG
+# Automatic configuration
+MAKE_CONFIG:=Makefile.config
+MAKEFILE:=Makefile
+LIB_DETECTION=makefiledir/Makefile.libdetection
+CONFIG_WRITER=makefiledir/Makefile.config_writer
+
+# Apply automatic configuration
+# See target section for how this is built, suppress errors
+# since first time it isn't found but make reads this twice
+-include $(MAKE_CONFIG)
+else
+CONFIG_INCLUDED:=1
+endif
+
+# tests if makefile.config contains the new needed SDL-CONFIG
+# it updates makefile.config if needed. Flags like ENABLE_NETWORK are remembered
+ifndef SDL-CONFIG
+ifdef WITH_SDL
+ifndef MANUAL_CONFIG
+#network is enabled by default
+ENABLE_NETWORK:=1
+UPDATECONFIG:=upgradeconf
+CONFIG_INCLUDED:=
+else
+# this should define SDL-CONFIG for manual configuration
+ifeq ($(shell uname),FreeBSD)
+SDL-CONFIG:=sdl11-config
+else
+SDL-CONFIG:=sdl-config
+endif
+endif
+endif
+endif
+
+ifndef CONFIG_INCLUDED
+-include $(LIB_DETECTION)
+endif
+
+ifdef DISPLAY_WARNINGS
+WARNING_DISPLAY:=-fstrict-aliasing
+else
+WARNING_DISPLAY:=-fno-strict-aliasing
+endif
+
+ifdef STATIC
+ifndef WIN32
+ifndef OSX
+ifndef MORPHOS
+ifndef SKIP_STATIC_CHECK
+$(error Static is only known to work on MorphOS and MacOSX!!! --- Check makefile.config for more info and howto bypass this check)
+endif
+endif
+endif
+endif
+endif
+
+
+# Force SDL on UNIX platforms
+ifndef WITH_SDL
+ifdef UNIX
+$(error You need to have SDL installed in order to run OpenTTD on UNIX.)
+endif
+endif
+
+
+
+##############################################################################
+#
+# Compiler configuration
+#
+
+CC=gcc
+CXX=g++
+
+ifdef MORPHOS
+CC += -noixemul -pipe
+CXX += -noixemul -pipe
+endif
+
+# Executable file extension
+ifdef WIN32
+EXE=.exe
+else
+EXE=
+endif
+
+# Set output executable names
+TTD=ttd$(EXE)
+STRGEN=strgen/strgen$(EXE)
+OSXAPP="OpenTTD.app"
+
+# What revision are we compiling, if we have an idea?
+REV_NUMBER := $(shell if test -d .svn; then svnversion . | tr -dc 0-9; fi)
+
+ifdef RELEASE
+REV:=$(RELEASE)
+else
+REV := $(shell if test -d .svn; then echo -n r; svnversion .; fi)
+tmp_test:=$(shell echo "$(REV)" | grep "M" )
+ifdef tmp_test
+REV_NUMBER:=1
+endif
+endif
+
+ifndef REV_NUMBER
+REV_NUMBER:=0
+endif
+
+# MorphOS needs builddate
+BUILDDATE=`date +%d.%m.%y`
+
+# AMD64 needs a little more settings to work
+ifeq ($(shell uname -m), x86_64)
+endwarnings:=endwarnings
+64_bit_warnings:=64_bit_warnings
+BASECFLAGS += -m64 -D_LITTLE_ENDIAN
+endif
+
+
+# When calling the compiler, use these flags
+# -g	debugging symbols
+# -Wall	all warnings
+# -s    automatic strip
+#
+# You may also want:
+# -O	optimize or -O2 fully optimize (O's above 2 are not recommended)
+# -pg	profile - generate profiling data.  See "man gprof" to use this.
+
+CFLAGS=-Wall -Wno-multichar
+CDEFS=-DWITH_REV
+LDFLAGS=
+LIBS=
+
+ifdef DEBUG
+# Debug mode
+CDEFS += -D_DEBUG
+BASECFLAGS += -g
+else
+ifdef PROFILE
+BASECFLAGS += -pg
+else
+# Release mode
+ifndef MORPHOS
+# automatical strip breaks under morphos
+BASECFLAGS += -s
+LDFLAGS += -s
+endif
+endif
+
+ifdef OSX
+# these compilerflags makes the app run as fast as possible without making the app unstable. It works on G3 or newer
+BASECFLAGS += -O3 -funroll-loops -fsched-interblock -falign-loops=16 -falign-jumps=16 -falign-functions=16 -falign-jumps-max-skip=15 -falign-loops-max-skip=15 -mdynamic-no-pic -mpowerpc-gpopt -force_cpusubtype_ALL $(WARNING_DISPLAY)
+else
+ifdef MORPHOS
+BASECFLAGS += -O2 -funroll-loops -fexpensive-optimizations -mstring -mmultiple $(WARNING_DISPLAY)
+else
+BASECFLAGS += -O2 $(WARNING_DISPLAY)
+endif
+ifndef PROFILE
+BASECFLAGS += -fomit-frame-pointer
+endif
+endif
+endif
+
+ifdef STATIC
+ifndef OSX	# OSX can't build static if -static flag is used
+LDFLAGS += -static
+endif
+endif
+
+# If building on Cygwin/MingW don't link with Cygwin libs
+ifdef WIN32
+ifdef MINGW
+ifdef CYGWIN
+BASECFLAGS += -mno-cygwin
+LDFLAGS += -mno-cygwin
+endif
+endif
+endif
+
+CFLAGS += $(BASECFLAGS)
+
+ifdef UNIX
+CDEFS += -DUNIX
+endif
+
+# SDL config
+ifdef WITH_SDL
+CDEFS += -DWITH_SDL
+CFLAGS += `$(SDL-CONFIG) --cflags`
+ifdef STATIC
+LIBS += `$(SDL-CONFIG) --static-libs`
+else
+LIBS += `$(SDL-CONFIG) --libs`
+endif
+endif
+
+
+# zlib config
+ifdef WITH_ZLIB
+	CDEFS +=  -DWITH_ZLIB
+	ifdef STATIC
+		ifdef OSX
+# zlib is default on OSX, so everybody have it. No need for static linking
+			LIBS += -lz
+		else
+			ifndef STATIC_ZLIB_PATH
+				ifndef MANUAL_CONFIG
+					# updates makefile.config with the zlib path
+					UPDATECONFIG:=upgradeconf
+				endif
+				TEMP:=$(shell ls /lib 2>/dev/null | grep "zlib.a")$(shell ls /lib 2>/dev/null | grep "libz.a")
+				ifdef TEMP
+					STATIC_ZLIB_PATH:=/lib/$(TEMP)
+				else
+					TEMP:=$(shell ls /usr/lib 2>/dev/null | grep "zlib.a")$(shell ls /usr/lib 2>/dev/null | grep "libz.a")
+					ifdef TEMP
+						STATIC_ZLIB_PATH:=/usr/lib/$(TEMP)
+					else
+						TEMP:=$(shell ls /usr/local/lib 2>/dev/null | grep "zlib.a")$(shell ls /usr/local/lib 2>/dev/null | grep "libz.a")
+						ifdef TEMP
+							STATIC_ZLIB_PATH:=/usr/local/lib/$(TEMP)
+						endif
+					endif
+				endif
+			endif
+			LIBS += $(STATIC_ZLIB_PATH)
+		endif
+	else
+		LIBS += -lz
+	endif
+endif
+
+# libpng config
+ifdef WITH_PNG
+CDEFS += -DWITH_PNG
+# FreeBSD doesn't use libpng-config
+ifdef FREEBSD
+LIBS += -lpng
+else
+CFLAGS += `libpng-config --cflags`
+ifdef OSX
+ifdef STATIC
+# Seems like we need a tiny hack for OSX static to work
+LIBS += `libpng-config --prefix`/lib/libpng.a
+else
+LIBS += `libpng-config  --libs`
+endif
+else
+# seems like older libpng versions are broken and need this
+PNGCONFIG_FLAGS = --ldflags --libs
+ifdef STATIC
+LIBS += `libpng-config --static $(PNGCONFIG_FLAGS)`
+else
+LIBS += `libpng-config  $(PNGCONFIG_FLAGS)`
+endif
+endif
+endif
+endif
+
+
+ifdef TRANSLATOR
+STRGEN_FLAGS=-t
+else
+STRGEN_FLAGS=
+endif
+
+# file paths setup
+ifdef GAME_DATA_DIR
+CDEFS += -DGAME_DATA_DIR=\"$(GAME_DATA_DIR)\"
+endif
+
+ifdef PERSONAL_DIR
+CDEFS += -DPERSONAL_DIR=\"$(PERSONAL_DIR)\"
+endif
+
+ifdef USE_HOMEDIR
+CDEFS += -DUSE_HOMEDIR
+endif
+
+# MIDI setup
+ifdef OSX
+ifndef MIDI
+MIDI:=$(OSXAPP)/contents/macos/track_starter
+endif
+endif
+
+ifdef MIDI
+CDEFS += -DEXTERNAL_PLAYER=\"$(MIDI)\"
+ifdef MIDI_ARG
+CDEFS += -DMIDI_ARG=\"$(MIDI_ARG)\"
+endif
+endif
+
+# Experimental
+ifdef WITH_NETWORK
+CDEFS += -DENABLE_NETWORK
+ifdef UNIX
+ifndef OSX
+ifndef MORPHOS
+# this have caused problems on many platforms and disabling it didn't break anything
+# now we test if disabling it as a general breaks it for anybody
+#LIBS += -lresolv
+endif
+endif
+endif
+endif
+
+ifdef WITH_DIRECTMUSIC
+CDEFS += -DWIN32_ENABLE_DIRECTMUSIC_SUPPORT
+endif
+
+ifdef WIN32
+LIBS += -lws2_32 -lwinmm -lgdi32 -ldxguid -lole32 -lstdc++
+TTDLDFLAGS += -Wl,--subsystem,windows
+endif
+
+# sets up the paths for use for make install
+ifdef BINARY_DIR
+BINARY_INSTALL:=$(BINARY_DIR)$(TTD)
+else
+BINARY_INSTALL:=$(INSTALL_DIR)$(TTD)
+endif
+ifdef DATA_DIR_PREFIX
+DATA_DIR:=$(DATA_DIR_PREFIX)
+else
+DATA_DIR:=$(INSTALL_DIR)
+endif
+
+##############################################################################
+#
+# What to compile
+# (users do not want to modify anything below)
+#
+
+
+### Sources
+
+ttd_SOURCES = \
+	ai.c aircraft_cmd.c aircraft_gui.c airport.c airport_gui.c bridge_gui.c \
+	clear_cmd.c command.c disaster_cmd.c dock_gui.c dummy_land.c economy.c \
+	engine.c engine_gui.c fileio.c gfx.c graph_gui.c industry_cmd.c \
+	industry_gui.c intro_gui.c landscape.c main_gui.c misc.c misc_cmd.c \
+	misc_gui.c music_gui.c namegen.c network.c news_gui.c oldloader.c \
+	order_cmd.c order_gui.c pathfind.c player_gui.c players.c rail_cmd.c \
+	rail_gui.c road_cmd.c road_gui.c roadveh_cmd.c roadveh_gui.c saveload.c \
+	settings_gui.c ship_cmd.c ship_gui.c smallmap_gui.c sound.c \
+	spritecache.c station_cmd.c station_gui.c strings.c subsidy_gui.c \
+	texteff.c town_cmd.c town_gui.c train_cmd.c train_gui.c tree_cmd.c \
+	ttd.c tunnelbridge_cmd.c unmovable_cmd.c vehicle.c viewport.c \
+	water_cmd.c widget.c window.c minilzo.c screenshot.c settings.c rev.c \
+	grfspecial.c terraform_gui.c network_gui.c
+
+ifdef WITH_SDL
+ttd_SOURCES += sdl.c
+endif
+
+ifdef WIN32
+ttd_SOURCES += win32.c w32dm.c
+else
+ttd_SOURCES += extmidi.c unix.c
+endif
+
+ttd_OBJS = $(ttd_SOURCES:%.c=%.o)
+
+ifdef WIN32
+# Resource file
+ttd_OBJS += winres.o
+endif
+
+ifdef WITH_DIRECTMUSIC
+ttd_SOURCES += w32dm2.cpp
+ttd_OBJS += w32dm2.o
+endif
+
+ttd_DEPS1 = $(foreach obj,$(ttd_OBJS),.deps/$(obj))
+ttd_DEPS = $(ttd_DEPS1:%.o=%.P)
+
+LANG_TXT = $(filter-out %.unfinished.txt,$(wildcard lang/*.txt))
+LANGS = $(LANG_TXT:%.txt=%.lng)
+
+C_COMPILE = $(CC) $(CFLAGS) $(CDEFS)
+CXX_COMPILE = $(CXX) $(CFLAGS) $(CDEFS)
+
+C_BUILD = $(C_COMPILE) -c
+CXX_BUILD = $(CXX_COMPILE) -c
+
+C_LINK = $(CC) $(LDFLAGS) -o
+
+
+##############################################################################
+#
+# Targets
+#
+
+
+### Normal build rules
+
+
+ifdef OSX
+OSX:=OSX
+endif
+
+
+all: $(UPDATECONFIG) $(TTD) $(OSX) $(endwarnings)
+
+
+$(TTD): table/strings.h $(ttd_OBJS) $(LANGS) $(MAKE_CONFIG)
+	$(C_LINK) $@ $(TTDLDFLAGS) $(ttd_OBJS) $(LIBS)
+
+$(OSX):
+	@mkdir -p $(OSXAPP)/Contents/MacOS
+	@mkdir -p $(OSXAPP)/Contents/Resources
+	@echo "APPL????" > $(OSXAPP)/Contents/PkgInfo
+	@cp os/macos/ttd.icns $(OSXAPP)/Contents/Resources/
+	@os/macos/plistgen.sh $(OSXAPP) $(REV)
+	@cp os/macos/track_starter $(OSXAPP)/contents/macos
+	@ls os/macos | grep -q "\.class" || \
+	javac os/macos/OpenTTDMidi.java
+	@cp os/macos/OpenTTDMidi.class $(OSXAPP)/contents/macos
+	@cp $(TTD) $(OSXAPP)/Contents/MacOS/ttd
+
+$(endwarnings): $(64_bit_warnings)
+
+$(64_bit_warnings):
+	$(warning 64 bit CPUs will get some 64 bit specific bugs!)
+	$(warning If you see any bugs, include in your bug report that you use a 64 bit CPU)
+
+$(STRGEN): strgen/strgen.c rev.o
+	$(CC) $(BASECFLAGS) $(CDEFS) -o $@ $^
+
+lang/english.lng: lang/english.txt $(STRGEN)
+	$(STRGEN)
+	
+table/strings.h: lang/english.lng
+
+lang/%.lng: lang/%.txt $(STRGEN)
+	$(STRGEN) $(STRGEN_FLAGS) $<
+
+winres.o: ttd.rc
+	windres -o $@ $<
+
+
+rev.c: FORCE
+	@# setting the revision number in a place, there the binary can read it
+	@echo 'const char _openttd_revision[] = "'$(REV)'";' >>rev.c.new
+	@echo 'const int _revision_number = $(REV_NUMBER);' >>rev.c.new
+	@# some additions for MorphOS versions tag
+	@echo '#ifdef __MORPHOS__'  >>rev.c.new
+	@echo 'const char morphos_versions_tag[] = "\\0$$VER: OpenTTD '$(REV)' ('${BUILDDATE}') © OpenTTD Team [MorphOS, PowerPC]";'  >>rev.c.new
+	@echo '#endif' >>rev.c.new
+	@# Only update the real rev.c if it actually changed, to prevent
+	@# useless rebuilds.
+	@cmp -s rev.c rev.c.new 2>/dev/null || mv rev.c.new rev.c
+	@rm -f rev.c.new
+
+FORCE:
+
+
+clean:
+	rm -rf .deps *~ $(TTD) $(STRGEN) core table/strings.h $(LANGS) $(ttd_OBJS)
+
+mrproper: clean
+	rm -rf $(MAKE_CONFIG)
+
+ifndef OSX
+ifndef MORPHOS
+install:
+	@if [ "$(INSTALL)" == "" ]; then $(error make install is highly experimental at his state and not\
+	tested very much - use at your own risk - to use run \"make install INSTALL:=1\" - make sure makefile.config\
+	is set correctly up - run \"make upgradeconf\")
+	@if [ "$(DATA_DIR)" == "" ]; then $(error no install path set - check makefile.config)
+	mkdir -p $(DATA_DIR)/lang
+	mkdir -p $(DATA_DIR)/data
+	cp $(TTD) $(BINARY_INSTALL)
+	cp lang/*.lng $(DATA_DIR)/lang
+	cp data/*.grf $(DATA_DIR)/data
+else	#MorphOS
+install:
+	$(error make install is not supported on MorphOS)
+endif
+else	# OSX
+install:
+	$(error make install is not supported on MacOSX)
+endif
+
+
+love:
+	@echo "YES! I thought you would never ask. We will have a great time. You can keep me turned on all night"
+
+.PHONY: clean all $(OSX) install $(64_bit_warnings) $(endwarnings) love
+
+
+### Automatic configuration
+-include $(CONFIG_WRITER)
+	
+
+# Export all variables set to subprocesses (a bit dirty)
+.EXPORT_ALL_VARIABLES:
+upgradeconf: $(MAKE_CONFIG)
+	rm $(MAKE_CONFIG)
+	$(MAKE) $(MAKE_CONFIG)
+
+.PHONY: upgradeconf
+
+
+### Internal build rules
+
+# This makes sure the .deps dir is always around.
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+# Introduce the dependencies
+-include $(ttd_DEPS)
+
+# This compiles the object file as well as silently updating its dependencies
+# list at the same time. It is not an issue that they aren't around during the
+# first compilation round as we just build everything at that time anyway,
+# therefore we do not need to watch deps.
+%.o: %.c $(MAKE_CONFIG)
+	@echo '$(C_BUILD) $<'; \
+		$(C_BUILD) $< -Wp,-MD,.deps/$(*F).pp
+	@-cp .deps/$(*F).pp .deps/$(*F).P; \
+		tr ' ' '\012' < .deps/$(*F).pp \
+		| sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+		>> .deps/$(*F).P; \
+	rm .deps/$(*F).pp
+
+# For DirectMusic build
+%.o: %.cpp  $(MAKE_CONFIG)
+	$(CXX_BUILD) $<