mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-02-11 16:54:42 +00:00
In 10 years there was no active development on DOS. Although it turned out to still work, the FPS was very bad. There is little interest in the current community to look into this. Further more, we like to switch to c++11 functions for threads, which are not implemented by DJGPP, the only current compiler for DOS. Additionally, DOS is the only platform which does not support networking. It is the reason we have tons of #ifdefs to support disabling networking. By removing DOS support, we can both use c++11 functions for threads, and remove all the code related to disabling network. Sadly, this means we have to see DOS go. Of course, if you feel up for the task, simply revert this commit, and implement stub c++11 functions for threads and stub functions for networking. We are more than happy to accept such Pull Request.
297 lines
11 KiB
Makefile
297 lines
11 KiB
Makefile
# $Id$
|
|
|
|
# This file is part of OpenTTD.
|
|
# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
|
# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
CC_HOST = !!CC_HOST!!
|
|
CXX_HOST = !!CXX_HOST!!
|
|
CC_BUILD = !!CC_BUILD!!
|
|
CXX_BUILD = !!CXX_BUILD!!
|
|
WINDRES = !!WINDRES!!
|
|
STRIP = !!STRIP!!
|
|
CFLAGS = !!CFLAGS!!
|
|
CFLAGS_BUILD = !!CFLAGS_BUILD!!
|
|
CXXFLAGS = !!CXXFLAGS!!
|
|
CXXFLAGS_BUILD = !!CXXFLAGS_BUILD!!
|
|
LIBS = !!LIBS!!
|
|
LDFLAGS = !!LDFLAGS!!
|
|
LDFLAGS_BUILD = !!LDFLAGS_BUILD!!
|
|
ROOT_DIR = !!ROOT_DIR!!
|
|
BIN_DIR = !!BIN_DIR!!
|
|
LANG_DIR = !!LANG_DIR!!
|
|
SRC_OBJS_DIR = !!SRC_OBJS_DIR!!
|
|
LANG_OBJS_DIR = !!LANG_OBJS_DIR!!
|
|
SETTING_OBJS_DIR= !!SETTING_OBJS_DIR!!
|
|
SRC_DIR = !!SRC_DIR!!
|
|
SCRIPT_SRC_DIR = !!SCRIPT_SRC_DIR!!
|
|
MEDIA_DIR = !!MEDIA_DIR!!
|
|
TTD = !!TTD!!
|
|
STRGEN = !!STRGEN!!
|
|
DEPEND = !!DEPEND!!
|
|
OS = !!OS!!
|
|
STAGE = !!STAGE!!
|
|
MAKEDEPEND = !!MAKEDEPEND!!
|
|
CFLAGS_MAKEDEP = !!CFLAGS_MAKEDEP!!
|
|
SORT = !!SORT!!
|
|
AWK = !!AWK!!
|
|
CONFIG_CACHE_COMPILER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_COMPILER!!
|
|
CONFIG_CACHE_LINKER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_LINKER!!
|
|
CONFIG_CACHE_SOURCE = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_SOURCE!!
|
|
CONFIG_CACHE_VERSION = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_VERSION!!
|
|
|
|
OBJS_C := !!OBJS_C!!
|
|
OBJS_CPP := !!OBJS_CPP!!
|
|
OBJS_MM := !!OBJS_MM!!
|
|
OBJS_RC := !!OBJS_RC!!
|
|
OBJS := $(OBJS_C) $(OBJS_CPP) $(OBJS_MM) $(OBJS_RC)
|
|
SRCS := !!SRCS!!
|
|
|
|
# All C-files depend on those 3 files
|
|
FILE_DEP := $(CONFIG_CACHE_COMPILER)
|
|
# Create all dirs and subdirs
|
|
RES := $(shell mkdir -p $(BIN_DIR) $(sort $(dir $(OBJS))))
|
|
|
|
CFLAGS += -I $(SRC_OBJS_DIR) -I $(LANG_OBJS_DIR) -I $(SETTING_OBJS_DIR)
|
|
CFLAGS_MAKEDEP += -I $(SRC_OBJS_DIR) -I $(LANG_OBJS_DIR) -I $(SETTING_OBJS_DIR)
|
|
ifdef SCRIPT_SRC_DIR
|
|
CFLAGS_MAKEDEP += -I $(SCRIPT_SRC_DIR)
|
|
endif
|
|
|
|
# Check if we want to show what we are doing
|
|
ifdef VERBOSE
|
|
Q =
|
|
E = @true
|
|
else
|
|
Q = @
|
|
E = @echo
|
|
endif
|
|
|
|
# Our default target
|
|
all: $(BIN_DIR)/$(TTD)
|
|
|
|
# This are 2 rules that are pointing back to STRGEN stuff.
|
|
# There is not really a need to have them here, but in case
|
|
# some weirdo wants to run 'make' in the 'src' dir and expects
|
|
# the languages to be recompiled, this catches that case and
|
|
# takes care of it nicely.
|
|
$(LANG_OBJS_DIR)/$(STRGEN):
|
|
$(MAKE) -C $(LANG_OBJS_DIR) $(STRGEN)
|
|
|
|
$(LANG_OBJS_DIR)/table/strings.h: $(LANG_DIR)/english.txt $(LANG_OBJS_DIR)/$(STRGEN)
|
|
$(MAKE) -C $(LANG_OBJS_DIR) table/strings.h
|
|
|
|
# Always run version detection, so we always have an accurate modified
|
|
# flag
|
|
VERSIONS := $(shell AWK="$(AWK)" "$(ROOT_DIR)/findversion.sh")
|
|
MODIFIED := $(shell echo "$(VERSIONS)" | cut -f 3 -d' ')
|
|
|
|
# Use autodetected revisions
|
|
VERSION := $(shell echo "$(VERSIONS)" | cut -f 1 -d' ')
|
|
ISODATE := $(shell echo "$(VERSIONS)" | cut -f 2 -d' ')
|
|
GITHASH := $(shell echo "$(VERSIONS)" | cut -f 4 -d' ')
|
|
ISTAG := $(shell echo "$(VERSIONS)" | cut -f 5 -d' ')
|
|
ISSTABLETAG := $(shell echo "$(VERSIONS)" | cut -f 6 -d' ')
|
|
|
|
# Make sure we have something in VERSION and ISODATE
|
|
ifeq ($(VERSION),)
|
|
VERSION := norev000
|
|
endif
|
|
ifeq ($(ISODATE),)
|
|
ISODATE := 00000000
|
|
endif
|
|
|
|
# This helps to recompile if flags change
|
|
RES := $(shell if [ "`cat $(CONFIG_CACHE_COMPILER) 2>/dev/null`" != "$(CFLAGS) $(CXXFLAGS)" ]; then echo "$(CFLAGS) $(CXXFLAGS)" > $(CONFIG_CACHE_COMPILER); fi )
|
|
RES := $(shell if [ "`cat $(CONFIG_CACHE_LINKER) 2>/dev/null`" != "$(LDFLAGS) $(LIBS)" ]; then echo "$(LDFLAGS) $(LIBS)" > $(CONFIG_CACHE_LINKER); fi )
|
|
|
|
# If there is a change in the source-file-list, make sure we recheck the deps
|
|
RES := $(shell if [ "`cat $(CONFIG_CACHE_SOURCE) 2>/dev/null`" != "$(SRCS)" ]; then echo "$(SRCS)" > $(CONFIG_CACHE_SOURCE); fi )
|
|
# If there is a change in the revision, make sure we recompile rev.cpp
|
|
RES := $(shell if [ "`cat $(CONFIG_CACHE_VERSION) 2>/dev/null`" != "$(VERSION) $(MODIFIED)" ]; then echo "$(VERSION) $(MODIFIED)" > $(CONFIG_CACHE_VERSION); fi )
|
|
|
|
ifndef MAKEDEPEND
|
|
# The slow, but always correct, dep-check
|
|
DEP_MASK := %.d
|
|
DEPS := $(OBJS:%.o=%.d)
|
|
|
|
# Only include the deps if we are compiling everything
|
|
ifeq ($(filter %.o clean mrproper, $(MAKECMDGOALS)),)
|
|
-include $(DEPS)
|
|
else
|
|
# In case we want to compile a single target, include the .d file for it
|
|
ifneq ($(filter %.o, $(MAKECMDGOALS)),)
|
|
SINGLE_DEP := $(filter %.o, $(MAKECMDGOALS))
|
|
-include $(SINGLE_DEP:%.o=%.d)
|
|
endif
|
|
endif
|
|
|
|
# Find the deps via GCC. Rarely wrong, but a bit slow
|
|
|
|
$(OBJS_C:%.o=%.d): %.d: $(SRC_DIR)/%.c $(FILE_DEP)
|
|
$(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.c=%.c)'
|
|
$(Q)$(CC_HOST) $(CFLAGS) -MM $< | sed 's@^$(@F:%.d=%.o):@$@ $(@:%.d=%.o):@' > $@
|
|
|
|
$(OBJS_CPP:%.o=%.d): %.d: $(SRC_DIR)/%.cpp $(FILE_DEP)
|
|
$(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
|
$(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -MM $< | sed 's@^$(@F:%.d=%.o):@$@ $(@:%.d=%.o):@' > $@
|
|
|
|
$(OBJS_MM:%.o=%.d): %.d: $(SRC_DIR)/%.mm $(FILE_DEP)
|
|
$(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.mm=%.mm)'
|
|
$(Q)$(CC_HOST) $(CFLAGS) -MM $< | sed 's@^$(@F:%.d=%.o):@$@ $(@:%.d=%.o):@' > $@
|
|
|
|
$(OBJS_RC:%.o=%.d): %.d: $(SRC_DIR)/%.rc $(FILE_DEP)
|
|
$(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.rc=%.rc)'
|
|
$(Q)touch $@
|
|
|
|
else
|
|
# The much faster, but can be wrong, dep-check
|
|
DEP_MASK :=
|
|
DEPS := Makefile.dep
|
|
|
|
# Only include the deps if we are not cleaning
|
|
ifeq ($(filter depend clean mrproper, $(MAKECMDGOALS)),)
|
|
-include Makefile.dep
|
|
endif
|
|
|
|
ifeq ("$(SRC_OBJS_DIR)/$(DEPEND)","$(MAKEDEPEND)")
|
|
DEP := $(MAKEDEPEND)
|
|
$(SRC_OBJS_DIR)/$(DEPEND): $(SRC_DIR)/depend/depend.cpp
|
|
$(E) '$(STAGE) Compiling and linking $(DEPEND)'
|
|
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) -o $@ $<
|
|
endif
|
|
|
|
# Macro for invoking a command on groups of 100 words at a time
|
|
# (analogous to xargs(1)). The macro invokes itself recursively
|
|
# until the list of words is depleted.
|
|
#
|
|
# Usage: $(call xargs,COMMAND,LIST)
|
|
#
|
|
# COMMAND should be a shell command to which the words will be
|
|
# appended as arguments in groups of 100.
|
|
define xargs
|
|
$(1) $(wordlist 1,100,$(2))
|
|
$(if $(word 101,$(2)),$(call xargs,$(1),$(wordlist 101,$(words $(2)),$(2))))
|
|
endef
|
|
|
|
# Make sure that only 'make depend' ALWAYS triggers a recheck
|
|
ifeq ($(filter depend, $(MAKECMDGOALS)),)
|
|
Makefile.dep: $(FILE_DEP) $(SRCS:%=$(SRC_DIR)/%) $(CONFIG_CACHE_SOURCE) $(DEP)
|
|
else
|
|
Makefile.dep: $(FILE_DEP) $(SRCS:%=$(SRC_DIR)/%) $(DEP) FORCE
|
|
endif
|
|
$(E) '$(STAGE) DEP CHECK (all files)'
|
|
$(Q)rm -f Makefile.dep.tmp
|
|
$(Q)touch Makefile.dep.tmp
|
|
|
|
# Calculate the deps via makedepend
|
|
$(call xargs,$(Q)$(MAKEDEPEND) -f$(SRC_OBJS_DIR)/Makefile.dep.tmp -o.o -Y -v -a -- $(CFLAGS_MAKEDEP) -- 2>/dev/null,$(SRCS:%=$(SRC_DIR)/%))
|
|
|
|
# Remove all comments and includes that don't start with $(SRC_DIR)
|
|
# Remove $(SRC_DIR) from object-file-name
|
|
@$(AWK) ' \
|
|
/^# DO NOT/ { print $$0 ; next} \
|
|
/^#/ {next} \
|
|
/: / { \
|
|
left = NF - 1; \
|
|
for (n = 2; n <= NF; n++) { \
|
|
if (match($$n, "^$(ROOT_DIR)") == 0) { \
|
|
$$n = ""; \
|
|
left--; \
|
|
} \
|
|
} \
|
|
gsub("$(SRC_DIR)/", "", $$1); \
|
|
if (left > 0) { \
|
|
print $$0; \
|
|
$$1 = "Makefile.dep:"; \
|
|
print $$0; \
|
|
} \
|
|
next \
|
|
} \
|
|
{ \
|
|
print $$0 \
|
|
} \
|
|
' < Makefile.dep.tmp | sed 's@ *@ @g;s@ $$@@' | LC_ALL=C $(SORT) > Makefile.dep
|
|
|
|
$(Q)rm -f Makefile.dep.tmp Makefile.dep.tmp.bak
|
|
|
|
endif
|
|
|
|
# Avoid problems with deps if a .h/.hpp/.hpp.sq file is deleted without the deps
|
|
# being updated. Now the Makefile continues, the deps are recreated
|
|
# and all will be fine.
|
|
%.h %.hpp %.hpp.sq:
|
|
@true
|
|
|
|
|
|
# Compile all the files according to the targets
|
|
|
|
$(OBJS_C): %.o: $(SRC_DIR)/%.c $(DEP_MASK) $(FILE_DEP)
|
|
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.c=%.c)'
|
|
$(Q)$(CC_HOST) $(CFLAGS) -c -o $@ $<
|
|
|
|
$(filter-out %sse2.o, $(filter-out %ssse3.o, $(filter-out %sse4.o, $(OBJS_CPP)))): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP)
|
|
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
|
$(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -o $@ $<
|
|
|
|
$(filter %sse2.o, $(OBJS_CPP)): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP)
|
|
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
|
$(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -msse2 -o $@ $<
|
|
|
|
$(filter %ssse3.o, $(OBJS_CPP)): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP)
|
|
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
|
$(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -mssse3 -o $@ $<
|
|
|
|
$(filter %sse4.o, $(OBJS_CPP)): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP)
|
|
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
|
$(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -msse4.1 -o $@ $<
|
|
|
|
$(OBJS_MM): %.o: $(SRC_DIR)/%.mm $(DEP_MASK) $(FILE_DEP)
|
|
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.mm=%.mm)'
|
|
$(Q)$(CC_HOST) $(CFLAGS) -c -o $@ $<
|
|
|
|
$(OBJS_RC): %.o: $(SRC_DIR)/%.rc $(FILE_DEP)
|
|
$(E) '$(STAGE) Compiling resource $(<:$(SRC_DIR)/%.rc=%.rc)'
|
|
$(Q)$(WINDRES) -o $@ $<
|
|
|
|
$(BIN_DIR)/$(TTD): $(TTD)
|
|
$(Q)cp $(TTD) $(BIN_DIR)/$(TTD)
|
|
ifeq ($(OS), UNIX)
|
|
$(Q)cp $(MEDIA_DIR)/openttd.32.bmp $(BIN_DIR)/baseset/
|
|
endif
|
|
ifeq ($(OS), OSX)
|
|
$(Q)cp $(ROOT_DIR)/os/macosx/splash.png $(BIN_DIR)/baseset/
|
|
endif
|
|
|
|
$(TTD): $(OBJS) $(CONFIG_CACHE_LINKER)
|
|
$(E) '$(STAGE) Linking $@'
|
|
$(Q)+$(CXX_HOST) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
|
|
ifdef STRIP
|
|
$(Q)$(STRIP) $@
|
|
endif
|
|
|
|
# Revision files
|
|
|
|
$(SRC_DIR)/rev.cpp: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/rev.cpp.in
|
|
$(Q)cat $(SRC_DIR)/rev.cpp.in | sed "s@\!\!ISODATE\!\!@$(ISODATE)@g;s@!!VERSION!!@$(VERSION)@g;s@!!MODIFIED!!@$(MODIFIED)@g;s@!!DATE!!@`date +%d.%m.%y`@g;s@!!GITHASH!!@$(GITHASH)@g;s@!!ISTAG!!@$(ISTAG)@g;s@!!ISSTABLETAG!!@$(ISSTABLETAG)@g" > $(SRC_DIR)/rev.cpp
|
|
|
|
$(SRC_DIR)/os/windows/ottdres.rc: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/os/windows/ottdres.rc.in
|
|
$(Q)cat $(SRC_DIR)/os/windows/ottdres.rc.in | sed "s@\!\!ISODATE\!\!@$(ISODATE)@g;s@!!VERSION!!@$(VERSION)@g;s@!!DATE!!@`date +%d.%m.%y`@g;s@!!GITHASH!!@$(GITHASH)@g;s@!!ISTAG!!@$(ISTAG)@g;s@!!ISSTABLETAG!!@$(ISSTABLETAG)@g" > $(SRC_DIR)/os/windows/ottdres.rc
|
|
|
|
FORCE:
|
|
|
|
depend: $(DEPS)
|
|
|
|
clean:
|
|
$(E) '$(STAGE) Cleaning up object files'
|
|
$(Q)rm -f $(DEPS) $(OBJS) $(TTD) $(DEPEND) $(TTD:%=$(BIN_DIR)/%) $(BIN_DIR)/baseset/openttd.32.bmp $(CONFIG_CACHE_COMPILER) $(CONFIG_CACHE_LINKER) $(CONFIG_CACHE_SOURCE)
|
|
|
|
mrproper: clean
|
|
$(Q)rm -f $(SRC_DIR)/rev.cpp $(SRC_DIR)/os/windows/ottdres.rc
|
|
|
|
%.o:
|
|
@echo '$(STAGE) No such source-file: $(@:%.o=%).[c|cpp|mm|rc]'
|
|
|
|
.PHONY: all mrproper depend clean FORCE
|