rubidium@5475: CC_HOST = !!CC_HOST!! rubidium@5475: CXX_HOST = !!CXX_HOST!! rubidium@5475: CC_BUILD = !!CC_BUILD!! rubidium@5587: CXX_BUILD = !!CXX_BUILD!! rubidium@5475: WINDRES = !!WINDRES!! rubidium@5475: STRIP = !!STRIP!! rubidium@5475: CC_CFLAGS = !!CC_CFLAGS!! rubidium@5475: CFLAGS = !!CFLAGS!! rubidium@5475: CFLAGS_BUILD = !!CFLAGS_BUILD!! rubidium@5475: LIBS = !!LIBS!! rubidium@5475: LDFLAGS = !!LDFLAGS!! matthijs@10085: ROOT_DIR = !!ROOT_DIR!! rubidium@5475: BIN_DIR = !!BIN_DIR!! rubidium@5475: LANG_DIR = !!LANG_DIR!! rubidium@5475: SRC_OBJS_DIR = !!SRC_OBJS_DIR!! rubidium@5475: LANG_OBJS_DIR= !!LANG_OBJS_DIR!! rubidium@5475: SRC_DIR = !!SRC_DIR!! rubidium@5475: MEDIA_DIR = !!MEDIA_DIR!! rubidium@5475: TTD = !!TTD!! rubidium@5475: STRGEN = !!STRGEN!! rubidium@5475: ENDIAN_CHECK = !!ENDIAN_CHECK!! rubidium@5475: ENDIAN_FORCE = !!ENDIAN_FORCE!! rubidium@5475: OS = !!OS!! rubidium@5475: STAGE = !!STAGE!! rubidium@5475: MAKEDEPEND = !!MAKEDEPEND!! rubidium@5475: CFLAGS_MAKEDEP= !!CFLAGS_MAKEDEP!! rubidium@5475: SORT = !!SORT!! rubidium@5535: REVISION = !!REVISION!! truelight@6081: AWK = !!AWK!! truelight@6523: GCC295 = !!GCC295!! rubidium@5475: CONFIG_CACHE_COMPILER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_COMPILER!! rubidium@5475: CONFIG_CACHE_LINKER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_LINKER!! rubidium@5475: CONFIG_CACHE_ENDIAN = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_ENDIAN!! rubidium@5475: CONFIG_CACHE_SOURCE = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_SOURCE!! rubidium@5475: CONFIG_CACHE_VERSION = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_VERSION!! rubidium@5475: rubidium@5475: OBJS_C := !!OBJS_C!! rubidium@5475: OBJS_CPP := !!OBJS_CPP!! bjarni@5941: OBJS_MM := !!OBJS_MM!! rubidium@5475: OBJS_RC := !!OBJS_RC!! bjarni@5941: OBJS := $(OBJS_C) $(OBJS_CPP) $(OBJS_MM) $(OBJS_RC) rubidium@5475: SRCS := !!SRCS!! rubidium@5475: rubidium@5475: # All C-files depend on those 3 files rubidium@5475: FILE_DEP := $(CONFIG_CACHE_COMPILER) $(LANG_OBJS_DIR)/table/strings.h endian_target.h rubidium@5475: # Create all dirs and subdirs rubidium@5475: RES := $(shell mkdir -p $(BIN_DIR) $(sort $(dir $(OBJS)))) rubidium@5475: rubidium@5475: # Make sure endian_target.h is reasable as if it was in the src/ dir rubidium@5475: CFLAGS += -I $(SRC_OBJS_DIR) -I $(LANG_OBJS_DIR) rubidium@5475: rubidium@5475: ENDIAN_TARGETS := endian_target.h $(ENDIAN_CHECK) rubidium@5475: truelight@6523: # This 'sed' basicly just removes 'const' from the line if it is a 2+D array truelight@6523: # For more information, please check: truelight@6523: # http://maillist.openttd.org/pipermail/devs/2007-April/000284.html truelight@6523: # http://maillist.openttd.org/pipermail/devs/2007-February/000248.html smatz@10239: GCC295_FIX=sed -r 's~^(\t*)(.*)( const )([A-Za-z0-9_ ]+(\[.*\]){2,})(( = \{)|(;))(.*)$$~\1\2 \4\6\8\9~g' truelight@6523: # This 'sed' removes the 3rd '4' in the # lines of the -E output of truelight@6523: # gcc 2.95.3 and lower, as it should indicate that it is a C-linkage, but the truelight@6523: # compiler can't handle that information (just don't ask). So we remove it truelight@6523: # and then it compiles happily and without bitching :) rubidium@7256: # Furthermore gcc 2.95 has some trouble with protected and private when rubidium@7256: # accessing the protected/private stuff of the enclosing class (or the rubidium@7256: # super class of the enclosing class). smatz@10239: GCC295_FIX_2=sed -e 's~\(^\# [0-9][0-9]* "[^"]*"[ 0-9]*\) 4$$~\1~g;s~private:~public:~g;s~protected:~public:~g' truelight@6523: rubidium@5475: # Check if we want to show what we are doing rubidium@5475: ifdef VERBOSE rubidium@5475: Q = rubidium@5475: E = @true rubidium@5475: else rubidium@5475: Q = @ rubidium@5475: E = @echo rubidium@5475: endif rubidium@5475: rubidium@5475: # Our default target rubidium@5610: all: $(BIN_DIR)/$(TTD) rubidium@5475: rubidium@5475: # This are 2 rules that are pointing back to STRGEN stuff. rubidium@5475: # There is not really a need to have them here, but in case rubidium@5475: # some weirdo wants to run 'make' in the 'src' dir and expects rubidium@5475: # the languages to be recompiled, this catches that case and rubidium@5475: # takes care of it nicely. rubidium@5475: $(LANG_OBJS_DIR)/$(STRGEN): rubidium@5475: $(MAKE) -C $(LANG_OBJS_DIR) $(STRGEN) rubidium@5475: rubidium@5475: $(LANG_OBJS_DIR)/table/strings.h: $(LANG_DIR)/english.txt $(LANG_OBJS_DIR)/$(STRGEN) rubidium@5475: $(MAKE) -C $(LANG_OBJS_DIR) table/strings.h rubidium@5475: matthijs@10085: # Always run version detection, so we always have an accurate modified matthijs@10085: # flag matthijs@10085: VERSIONS := $(shell AWK="$(AWK)" "$(ROOT_DIR)/findversion.sh") matthijs@10091: MODIFIED := $(shell echo "$(VERSIONS)" | cut -f 3 -d' ') smatz@9457: rubidium@5475: ifdef REVISION matthijs@10085: # Use specified revision (which should be of the form "r000"). rubidium@5475: REV := $(REVISION) smatz@10239: REV_NR := $(shell echo $(REVISION) | sed "s~[^0-9]~~g") rubidium@5475: else matthijs@10085: # Use autodetected revisions matthijs@10091: REV := $(shell echo "$(VERSIONS)" | cut -f 1 -d' ') matthijs@10091: REV_NR := $(shell echo "$(VERSIONS)" | cut -f 2 -d' ') rubidium@6812: endif rubidium@6812: smatz@9765: # Make sure we have something in REV and REV_NR rubidium@5475: ifeq ($(REV),) rubidium@5475: REV := norev000 smatz@9765: endif smatz@9765: ifeq ($(REV_NR),) rubidium@7780: REV_NR := 0 rubidium@5475: endif rubidium@5475: rubidium@5475: # This helps to recompile if flags change rubidium@5475: RES := $(shell if [ "`cat $(CONFIG_CACHE_COMPILER) 2>/dev/null`" != "$(CC_CFLAGS) $(CFLAGS)" ]; then echo "$(CC_CFLAGS) $(CFLAGS)" > $(CONFIG_CACHE_COMPILER); fi ) rubidium@5475: RES := $(shell if [ "`cat $(CONFIG_CACHE_LINKER) 2>/dev/null`" != "$(LDFLAGS) $(LIBS)" ]; then echo "$(LDFLAGS) $(LIBS)" > $(CONFIG_CACHE_LINKER); fi ) rubidium@5475: RES := $(shell if [ "`cat $(CONFIG_CACHE_ENDIAN) 2>/dev/null`" != "$(ENDIAN_FORCE)" ]; then echo "$(ENDIAN_FORCE)" > $(CONFIG_CACHE_ENDIAN); fi ) rubidium@5475: rubidium@5475: # If there is a change in the source-file-list, make sure we recheck the deps rubidium@5475: RES := $(shell if [ "`cat $(CONFIG_CACHE_SOURCE) 2>/dev/null`" != "$(SRCS)" ]; then echo "$(SRCS)" > $(CONFIG_CACHE_SOURCE); fi ) rubidium@5587: # If there is a change in the revision, make sure we recompile rev.cpp smatz@9766: RES := $(shell if [ "`cat $(CONFIG_CACHE_VERSION) 2>/dev/null`" != "$(REV) $(MODIFIED)" ]; then echo "$(REV) $(MODIFIED)" > $(CONFIG_CACHE_VERSION); fi ) rubidium@5475: rubidium@5475: ifndef MAKEDEPEND rubidium@5475: # The slow, but always correct, dep-check rubidium@5475: DEP_MASK := %.d rubidium@5475: DEPS := $(OBJS:%.o=%.d) rubidium@5475: rubidium@5475: # Only include the deps if we are compiling everything rubidium@5475: ifeq ($(filter $(ENDIAN_TARGETS) %.o clean mrproper, $(MAKECMDGOALS)),) rubidium@5475: -include $(DEPS) rubidium@5475: else rubidium@5475: # In case we want to compile a single target, include the .d file for it rubidium@5475: ifneq ($(filter %.o, $(MAKECMDGOALS)),) rubidium@5475: SINGLE_DEP := $(filter %.o, $(MAKECMDGOALS)) rubidium@5475: -include $(SINGLE_DEP:%.o=%.d) rubidium@5475: endif rubidium@5475: endif rubidium@5475: rubidium@5475: # Find the deps via GCC. Rarely wrong, but a bit slow rubidium@5475: rubidium@5475: $(OBJS_C:%.o=%.d): %.d: $(SRC_DIR)/%.c $(FILE_DEP) rubidium@5475: $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.c=%.c)' smatz@10239: $(Q)$(CC_HOST) $(CC_CFLAGS) $(CFLAGS) -MM $< | sed 's~^$(@F:%.d=%.o):~$@ $(@:%.d=%.o):~' > $@ rubidium@5475: rubidium@5475: $(OBJS_CPP:%.o=%.d): %.d: $(SRC_DIR)/%.cpp $(FILE_DEP) rubidium@5475: $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.cpp=%.cpp)' smatz@10239: $(Q)$(CXX_HOST) $(CFLAGS) -MM $< | sed 's~^$(@F:%.d=%.o):~$@ $(@:%.d=%.o):~' > $@ rubidium@5475: bjarni@5941: $(OBJS_MM:%.o=%.d): %.d: $(SRC_DIR)/%.mm $(FILE_DEP) bjarni@5941: $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.mm=%.mm)' smatz@10239: $(Q)$(CC_HOST) $(CFLAGS) -MM $< | sed 's~^$(@F:%.d=%.o):~$@ $(@:%.d=%.o):~' > $@ rubidium@5475: truelight@5478: $(OBJS_RC:%.o=%.d): %.d: $(SRC_DIR)/%.rc $(FILE_DEP) bjarni@5941: $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.mm=%.mm)' truelight@5478: $(Q)touch $@ truelight@5478: rubidium@5475: else rubidium@5475: # The much faster, but can be wrong, dep-check rubidium@5475: DEP_MASK := rubidium@5475: DEPS := Makefile.dep rubidium@5475: rubidium@5475: # Only include the deps if we are not cleaning rubidium@5475: ifeq ($(filter $(ENDIAN_TARGETS) depend clean mrproper, $(MAKECMDGOALS)),) rubidium@5475: -include Makefile.dep rubidium@5475: endif rubidium@5475: rubidium@5475: # Make sure that only 'make depend' ALWAYS triggers a recheck rubidium@5475: ifeq ($(filter depend, $(MAKECMDGOALS)),) rubidium@5475: Makefile.dep: $(FILE_DEP) $(SRCS:%=$(SRC_DIR)/%) $(CONFIG_CACHE_SOURCE) rubidium@5475: else rubidium@5475: Makefile.dep: FORCE rubidium@5475: endif rubidium@5475: $(E) '$(STAGE) DEP CHECK (all files)' rubidium@5475: $(Q)rm -f Makefile.dep.tmp rubidium@5475: $(Q)touch Makefile.dep.tmp rubidium@5475: rubidium@5475: # Calculate the deps via makedepend rubidium@5475: $(Q)$(MAKEDEPEND) -f$(SRC_OBJS_DIR)/Makefile.dep.tmp -o.o -Y -v -- $(CFLAGS_MAKEDEP) -- $(SRCS:%=$(SRC_DIR)/%) 2>/dev/null rubidium@5475: rubidium@5475: # Convert x:/... paths to /x/... for mingw rubidium@5475: ifeq ($(OS), MINGW) smatz@10239: @cat Makefile.dep.tmp | sed 's~\([a-zA-Z]\):\/~\/\1\/~g' > Makefile.dep.tmp.mingw rubidium@5475: @cp Makefile.dep.tmp.mingw Makefile.dep.tmp rubidium@5475: @rm -f Makefile.dep.tmp.mingw rubidium@5475: endif rubidium@5475: rubidium@5475: # Remove all comments and includes that don't start with $(SRC_DIR) rubidium@5475: # Remove $(SRC_DIR) from object-file-name truelight@6081: @$(AWK) ' \ rubidium@5475: /^# DO NOT/ { print $$0 ; next} \ rubidium@5475: /^#/ {next} \ rubidium@5475: /:/ { \ rubidium@5475: left = NF - 1; \ rubidium@5475: for (n = 2; n <= NF; n++) { \ rubidium@5475: if (match($$n, "^$(SRC_DIR)") == 0) { \ rubidium@5475: $$n = ""; \ rubidium@5475: left--; \ rubidium@5475: } \ rubidium@5475: } \ rubidium@5475: gsub("$(SRC_DIR)/", "", $$1); \ rubidium@5475: if (left > 0) { \ rubidium@5475: print $$0; \ rubidium@5475: $$1 = "Makefile.dep:"; \ rubidium@5475: print $$0; \ rubidium@5475: } \ rubidium@5475: next \ rubidium@5475: } \ rubidium@5475: { \ rubidium@5475: print $$0 \ rubidium@5475: } \ smatz@10239: ' < Makefile.dep.tmp | sed 's~ *~ ~g;s~ $$~~' | $(SORT) > Makefile.dep rubidium@5475: rubidium@5475: $(Q)rm -f Makefile.dep.tmp Makefile.dep.tmp.bak rubidium@5475: rubidium@5475: endif rubidium@5475: glx@5650: # Avoid problems with deps if a .h/.hpp file is deleted without the deps rubidium@5475: # being updated. Now the Makefile continues, the deps are recreated rubidium@5475: # and all will be fine. glx@5650: %.h %.hpp: rubidium@5475: @true rubidium@5475: rubidium@5475: rubidium@5475: # Compile all the files according to the targets rubidium@5475: rubidium@5475: $(OBJS_C): %.o: $(SRC_DIR)/%.c $(DEP_MASK) $(FILE_DEP) rubidium@5475: $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.c=%.c)' rubidium@5475: $(Q)$(CC_HOST) $(CC_CFLAGS) $(CFLAGS) -c -o $@ $< rubidium@5475: rubidium@5475: $(OBJS_CPP): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP) rubidium@5475: $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' truelight@6523: ifeq ($(GCC295), 1) truelight@6523: $(Q)$(CXX_HOST) -E $(CFLAGS) $< | $(GCC295_FIX) | $(GCC295_FIX_2) | $(CXX_HOST) $(CFLAGS) -c -o $@ -x c++ - truelight@6523: else rubidium@5475: $(Q)$(CXX_HOST) $(CFLAGS) -c -o $@ $< truelight@6523: endif rubidium@5475: bjarni@5941: $(OBJS_MM): %.o: $(SRC_DIR)/%.mm $(DEP_MASK) $(FILE_DEP) bjarni@5941: $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.mm=%.mm)' bjarni@5941: $(Q)$(CC_HOST) $(CFLAGS) -c -o $@ $< rubidium@5475: rubidium@5475: $(OBJS_RC): %.o: $(SRC_DIR)/%.rc $(FILE_DEP) rubidium@5475: $(E) '$(STAGE) Compiling resource $(<:$(SRC_DIR)/%.rc=%.rc)' rubidium@5475: $(Q)$(WINDRES) -o $@ -I $(MEDIA_DIR) $< rubidium@5475: rubidium@5610: $(BIN_DIR)/$(TTD): $(TTD) rubidium@5610: $(Q)cp $< $@ rubidium@5610: rubidium@7564: $(TTD): $(OBJS) $(CONFIG_CACHE_LINKER) rubidium@5475: $(E) '$(STAGE) Linking $@' truelight@5979: ifeq ($(OS), PSP) truelight@6084: # Because of a bug in the PSP GCC tools, linking via CXX results truelight@6084: # in total chaos and more problems then you can handle. So we need truelight@6084: # CC to link OpenTTD for PSP rubidium@7564: $(Q)$(CC_HOST) $(LDFLAGS) $(OBJS) $(LIBS) -o $@ truelight@5979: else rubidium@7564: $(Q)$(CXX_HOST) $(LDFLAGS) $(OBJS) $(LIBS) -o $@ truelight@5979: endif rubidium@5475: ifdef STRIP rubidium@5475: $(Q)$(STRIP) $@ rubidium@10385: ifeq ($(OS), DOS) rubidium@10385: $(E) '$(STAGE) Adding CWSDPMI stub to $@' rubidium@10385: $(Q)$(ROOT_DIR)/os/dos/make_dos_binary_selfcontained.sh $(SRC_OBJS_DIR)/$@ rubidium@10385: endif rubidium@5475: endif rubidium@5475: rubidium@5475: # The targets to compile the endian-code rubidium@5475: rubidium@5475: endian_target.h: $(ENDIAN_CHECK) $(CONFIG_CACHE_ENDIAN) rubidium@5475: $(E) '$(STAGE) Testing endianness for target' rubidium@5475: $(Q)./$(ENDIAN_CHECK) $(ENDIAN_FORCE) > $@ rubidium@5475: rubidium@5587: $(ENDIAN_CHECK): $(SRC_DIR)/endian_check.cpp rubidium@5475: $(E) '$(STAGE) Compiling and Linking $@' rubidium@5587: $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $< -o $@ rubidium@5475: rubidium@5475: # Revision files rubidium@5475: rubidium@7564: $(SRC_DIR)/rev.cpp: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/rev.cpp.in smatz@10239: $(Q)cat $(SRC_DIR)/rev.cpp.in | sed "s~@@REVISION@@~$(REV_NR)~g;s~@@VERSION@@~$(REV)~g;s~@@MODIFIED@@~$(MODIFIED)~g;s~@@DATE@@~`date +%d.%m.%y`~g" > $(SRC_DIR)/rev.cpp rubidium@5475: rubidium@7564: $(SRC_DIR)/ottdres.rc: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/ottdres.rc.in smatz@10239: $(Q)cat $(SRC_DIR)/ottdres.rc.in | sed "s~@@REVISION@@~$(REV_NR)~g;s~@@VERSION@@~$(REV)~g;s~@@DATE@@~`date +%d.%m.%y`~g" > $(SRC_DIR)/ottdres.rc rubidium@5475: rubidium@5475: FORCE: rubidium@5475: rubidium@5475: depend: $(DEPS) rubidium@5475: rubidium@5475: clean: rubidium@5475: $(E) '$(STAGE) Cleaning up object files' rubidium@7564: $(Q)rm -f $(DEPS) $(OBJS) $(TTD) $(TTD:%=$(BIN_DIR)/%) $(CONFIG_CACHE_COMPILER) $(CONFIG_CACHE_LINKER) $(CONFIG_CACHE_ENDIAN) $(CONFIG_CACHE_SOURCE) $(ENDIAN_TARGETS) rubidium@5475: rubidium@5475: mrproper: clean rubidium@7564: $(Q)rm -f $(SRC_DIR)/rev.cpp $(SRC_DIR)/ottdres.rc rubidium@5475: rubidium@5475: %.o: bjarni@5970: @echo '$(STAGE) No such source-file: $(@:%.o=%).[c|cpp|mm|rc]' rubidium@5475: rubidium@5475: .PHONY: all mrproper depend clean FORCE