Add: INR currency (#8136)
[openttd-github.git] / Makefile.src.in
blob6b0fb940204ff4093f9e1047eb52fd35278e6059
1 # This file is part of OpenTTD.
2 # 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.
3 # 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.
4 # 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/>.
6 CC_HOST        = !!CC_HOST!!
7 CXX_HOST       = !!CXX_HOST!!
8 CC_BUILD       = !!CC_BUILD!!
9 CXX_BUILD      = !!CXX_BUILD!!
10 WINDRES        = !!WINDRES!!
11 STRIP          = !!STRIP!!
12 CFLAGS         = !!CFLAGS!!
13 CFLAGS_BUILD   = !!CFLAGS_BUILD!!
14 CXXFLAGS       = !!CXXFLAGS!!
15 CXXFLAGS_BUILD = !!CXXFLAGS_BUILD!!
16 LIBS           = !!LIBS!!
17 LDFLAGS        = !!LDFLAGS!!
18 LDFLAGS_BUILD  = !!LDFLAGS_BUILD!!
19 ROOT_DIR       = !!ROOT_DIR!!
20 BIN_DIR        = !!BIN_DIR!!
21 LANG_DIR       = !!LANG_DIR!!
22 SRC_OBJS_DIR   = !!SRC_OBJS_DIR!!
23 LANG_OBJS_DIR  = !!LANG_OBJS_DIR!!
24 SETTING_OBJS_DIR= !!SETTING_OBJS_DIR!!
25 SRC_DIR        = !!SRC_DIR!!
26 SCRIPT_SRC_DIR = !!SCRIPT_SRC_DIR!!
27 MEDIA_DIR      = !!MEDIA_DIR!!
28 TTD            = !!TTD!!
29 STRGEN         = !!STRGEN!!
30 DEPEND         = !!DEPEND!!
31 OS             = !!OS!!
32 STAGE          = !!STAGE!!
33 MAKEDEPEND     = !!MAKEDEPEND!!
34 CFLAGS_MAKEDEP = !!CFLAGS_MAKEDEP!!
35 SORT           = !!SORT!!
36 AWK            = !!AWK!!
37 CONFIG_CACHE_COMPILER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_COMPILER!!
38 CONFIG_CACHE_LINKER   = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_LINKER!!
39 CONFIG_CACHE_SOURCE   = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_SOURCE!!
40 CONFIG_CACHE_VERSION  = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_VERSION!!
42 OBJS_C   := !!OBJS_C!!
43 OBJS_CPP := !!OBJS_CPP!!
44 OBJS_MM  := !!OBJS_MM!!
45 OBJS_RC  := !!OBJS_RC!!
46 OBJS     := $(OBJS_C) $(OBJS_CPP) $(OBJS_MM) $(OBJS_RC)
47 SRCS     := !!SRCS!!
49 # All C-files depend on those 3 files
50 FILE_DEP := $(CONFIG_CACHE_COMPILER)
51 # Create all dirs and subdirs
52 RES      := $(shell mkdir -p $(BIN_DIR) $(sort $(dir $(OBJS))))
54 CFLAGS += -I $(SRC_OBJS_DIR) -I $(LANG_OBJS_DIR) -I $(SETTING_OBJS_DIR)
55 CFLAGS_MAKEDEP += -I $(SRC_OBJS_DIR) -I $(LANG_OBJS_DIR) -I $(SETTING_OBJS_DIR)
56 ifdef SCRIPT_SRC_DIR
57         CFLAGS_MAKEDEP += -I $(SCRIPT_SRC_DIR)
58 endif
60 # Check if we want to show what we are doing
61 ifdef VERBOSE
62         Q =
63         E = @true
64 else
65         Q = @
66         E = @echo
67 endif
69 # Our default target
70 all: $(BIN_DIR)/$(TTD)
72 # This are 2 rules that are pointing back to STRGEN stuff.
73 #  There is not really a need to have them here, but in case
74 #  some weirdo wants to run 'make' in the 'src' dir and expects
75 #  the languages to be recompiled, this catches that case and
76 #  takes care of it nicely.
77 $(LANG_OBJS_DIR)/$(STRGEN):
78         $(MAKE) -C $(LANG_OBJS_DIR) $(STRGEN)
80 $(LANG_OBJS_DIR)/table/strings.h: $(LANG_DIR)/english.txt $(LANG_OBJS_DIR)/$(STRGEN)
81         $(MAKE) -C $(LANG_OBJS_DIR) table/strings.h
83 # Always run version detection, so we always have an accurate modified
84 # flag
85 VERSIONS := $(shell AWK="$(AWK)" "$(ROOT_DIR)/findversion.sh")
86 MODIFIED := $(shell echo "$(VERSIONS)" | cut -f 3 -d'   ')
88 # Use autodetected revisions
89 VERSION  := $(shell echo "$(VERSIONS)" | cut -f 1 -d'   ')
90 ISODATE  := $(shell echo "$(VERSIONS)" | cut -f 2 -d'   ')
91 GITHASH  := $(shell echo "$(VERSIONS)" | cut -f 4 -d'   ')
92 ISTAG    := $(shell echo "$(VERSIONS)" | cut -f 5 -d'   ')
93 ISSTABLETAG := $(shell echo "$(VERSIONS)" | cut -f 6 -d'        ')
94 YEAR     := $(shell echo "$(VERSIONS)" | cut -f 7 -d'   ')
96 # Make sure we have something in VERSION and ISODATE
97 ifeq ($(VERSION),)
98 VERSION := norev000
99 endif
100 ifeq ($(ISODATE),)
101 ISODATE := 00000000
102 endif
104 # This helps to recompile if flags change
105 RES := $(shell if [ "`cat $(CONFIG_CACHE_COMPILER) 2>/dev/null`" != "$(CFLAGS) $(CXXFLAGS)" ]; then echo "$(CFLAGS) $(CXXFLAGS)" > $(CONFIG_CACHE_COMPILER); fi )
106 RES := $(shell if [ "`cat $(CONFIG_CACHE_LINKER) 2>/dev/null`" != "$(LDFLAGS) $(LIBS)" ]; then echo "$(LDFLAGS) $(LIBS)" > $(CONFIG_CACHE_LINKER); fi )
108 # If there is a change in the source-file-list, make sure we recheck the deps
109 RES := $(shell if [ "`cat $(CONFIG_CACHE_SOURCE) 2>/dev/null`" != "$(SRCS)" ]; then echo "$(SRCS)" > $(CONFIG_CACHE_SOURCE); fi )
110 # If there is a change in the revision, make sure we recompile rev.cpp
111 RES := $(shell if [ "`cat $(CONFIG_CACHE_VERSION) 2>/dev/null`" != "$(VERSION) $(MODIFIED)" ]; then echo "$(VERSION) $(MODIFIED)" > $(CONFIG_CACHE_VERSION); fi )
113 ifndef MAKEDEPEND
114 # The slow, but always correct, dep-check
115 DEP_MASK := %.d
116 DEPS     := $(OBJS:%.o=%.d)
118 # Only include the deps if we are compiling everything
119 ifeq ($(filter %.o clean mrproper, $(MAKECMDGOALS)),)
120 -include $(DEPS)
121 else
122 # In case we want to compile a single target, include the .d file for it
123 ifneq ($(filter %.o, $(MAKECMDGOALS)),)
124 SINGLE_DEP := $(filter %.o, $(MAKECMDGOALS))
125 -include $(SINGLE_DEP:%.o=%.d)
126 endif
127 endif
129 # Find the deps via GCC. Rarely wrong, but a bit slow
131 $(OBJS_C:%.o=%.d): %.d: $(SRC_DIR)/%.c $(FILE_DEP)
132         $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.c=%.c)'
133         $(Q)$(CC_HOST) $(CFLAGS) -MM $< | sed 's@^$(@F:%.d=%.o):@$@ $(@:%.d=%.o):@' > $@
135 $(OBJS_CPP:%.o=%.d): %.d: $(SRC_DIR)/%.cpp $(FILE_DEP)
136         $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.cpp=%.cpp)'
137         $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -MM $< | sed 's@^$(@F:%.d=%.o):@$@ $(@:%.d=%.o):@' > $@
139 $(OBJS_MM:%.o=%.d): %.d: $(SRC_DIR)/%.mm $(FILE_DEP)
140         $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.mm=%.mm)'
141         $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -MM $< | sed 's@^$(@F:%.d=%.o):@$@ $(@:%.d=%.o):@' > $@
143 $(OBJS_RC:%.o=%.d): %.d: $(SRC_DIR)/%.rc $(FILE_DEP)
144         $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.rc=%.rc)'
145         $(Q)touch $@
147 else
148 # The much faster, but can be wrong, dep-check
149 DEP_MASK :=
150 DEPS     := Makefile.dep
152 # Only include the deps if we are not cleaning
153 ifeq ($(filter depend clean mrproper, $(MAKECMDGOALS)),)
154 -include Makefile.dep
155 endif
157 ifeq ("$(SRC_OBJS_DIR)/$(DEPEND)","$(MAKEDEPEND)")
158 DEP := $(MAKEDEPEND)
159 $(SRC_OBJS_DIR)/$(DEPEND): $(SRC_DIR)/depend/depend.cpp
160         $(E) '$(STAGE) Compiling and linking $(DEPEND)'
161         $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) -o $@ $<
162 endif
164 # Macro for invoking a command on groups of 100 words at a time
165 # (analogous to xargs(1)).  The macro invokes itself recursively
166 # until the list of words is depleted.
168 # Usage: $(call xargs,COMMAND,LIST)
170 # COMMAND should be a shell command to which the words will be
171 # appended as arguments in groups of 100.
172 define xargs
173 $(1) $(wordlist 1,100,$(2))
174 $(if $(word 101,$(2)),$(call xargs,$(1),$(wordlist 101,$(words $(2)),$(2))))
175 endef
177 # Make sure that only 'make depend' ALWAYS triggers a recheck
178 ifeq ($(filter depend, $(MAKECMDGOALS)),)
179 Makefile.dep: $(FILE_DEP) $(SRCS:%=$(SRC_DIR)/%) $(CONFIG_CACHE_SOURCE) $(DEP)
180 else
181 Makefile.dep: $(FILE_DEP) $(SRCS:%=$(SRC_DIR)/%) $(DEP) FORCE
182 endif
183         $(E) '$(STAGE) DEP CHECK (all files)'
184         $(Q)rm -f Makefile.dep.tmp
185         $(Q)touch Makefile.dep.tmp
187 # Calculate the deps via makedepend
188         $(call xargs,$(Q)$(MAKEDEPEND) -f$(SRC_OBJS_DIR)/Makefile.dep.tmp -o.o -Y -v -a -- $(CFLAGS_MAKEDEP) -- 2>/dev/null,$(SRCS:%=$(SRC_DIR)/%))
190 # Remove all comments and includes that don't start with $(SRC_DIR)
191 # Remove $(SRC_DIR) from object-file-name
192         @$(AWK) '                           \
193         /^# DO NOT/ { print $$0 ; next}     \
194         /^#/ {next}                         \
195         /: / {                               \
196                 left = NF - 1;                    \
197                 for (n = 2; n <= NF; n++) {       \
198                         if (match($$n, "^$(ROOT_DIR)") == 0) { \
199                                 $$n = "";                     \
200                                 left--;                       \
201                         }                               \
202                 }                                 \
203                 gsub("$(SRC_DIR)/", "", $$1);     \
204                 if (left > 0) {                   \
205                         print $$0;                      \
206                         $$1 = "Makefile.dep:";          \
207                         print $$0;                      \
208                 }                                 \
209                 next                              \
210         }                                   \
211         {                                   \
212                 print $$0                         \
213         }                                   \
214         ' < Makefile.dep.tmp | sed 's@  *@ @g;s@ $$@@' | LC_ALL=C $(SORT) > Makefile.dep
216         $(Q)rm -f Makefile.dep.tmp Makefile.dep.tmp.bak
218 endif
220 # Avoid problems with deps if a .h/.hpp/.hpp.sq file is deleted without the deps
221 #  being updated. Now the Makefile continues, the deps are recreated
222 #  and all will be fine.
223 %.h %.hpp %.hpp.sq:
224         @true
227 # Compile all the files according to the targets
229 $(OBJS_C): %.o: $(SRC_DIR)/%.c $(DEP_MASK) $(FILE_DEP)
230         $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.c=%.c)'
231         $(Q)$(CC_HOST) $(CFLAGS) -c -o $@ $<
233 $(filter-out %sse2.o, $(filter-out %ssse3.o, $(filter-out %sse4.o, $(OBJS_CPP)))): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP)
234         $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
235         $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -o $@ $<
237 $(filter %sse2.o, $(OBJS_CPP)): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP)
238         $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
239         $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -msse2 -o $@ $<
241 $(filter %ssse3.o, $(OBJS_CPP)): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP)
242         $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
243         $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -mssse3 -o $@ $<
245 $(filter %sse4.o, $(OBJS_CPP)): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP)
246         $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
247         $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -msse4.1 -o $@ $<
249 $(OBJS_MM): %.o: $(SRC_DIR)/%.mm $(DEP_MASK) $(FILE_DEP)
250         $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.mm=%.mm)'
251         $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -o $@ $<
253 $(OBJS_RC): %.o: $(SRC_DIR)/%.rc $(FILE_DEP)
254         $(E) '$(STAGE) Compiling resource $(<:$(SRC_DIR)/%.rc=%.rc)'
255         $(Q)$(WINDRES) -o $@ $<
257 $(BIN_DIR)/$(TTD): $(TTD)
258         $(Q)cp $(TTD) $(BIN_DIR)/$(TTD)
259 ifeq ($(OS), UNIX)
260         $(Q)cp $(MEDIA_DIR)/openttd.32.bmp $(BIN_DIR)/baseset/
261 endif
262 ifeq ($(OS), OSX)
263         $(Q)cp $(ROOT_DIR)/os/macosx/splash.png $(BIN_DIR)/baseset/
264 endif
266 $(TTD): $(OBJS) $(CONFIG_CACHE_LINKER)
267         $(E) '$(STAGE) Linking $@'
268         $(Q)+$(CXX_HOST) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
269 ifdef STRIP
270         $(Q)$(STRIP) $@
271 endif
273 # Revision files
275 $(SRC_DIR)/rev.cpp: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/rev.cpp.in
276         $(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;s@!!YEAR!!@$(YEAR)@g" > $(SRC_DIR)/rev.cpp
278 $(SRC_DIR)/os/windows/ottdres.rc: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/os/windows/ottdres.rc.in
279         $(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;s@!!YEAR!!@$(YEAR)@g" > $(SRC_DIR)/os/windows/ottdres.rc
281 FORCE:
283 depend: $(DEPS)
285 clean:
286         $(E) '$(STAGE) Cleaning up object files'
287         $(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)
289 mrproper: clean
290         $(Q)rm -f $(SRC_DIR)/rev.cpp $(SRC_DIR)/os/windows/ottdres.rc
292 %.o:
293         @echo '$(STAGE) No such source-file: $(@:%.o=%).[c|cpp|mm|rc]'
295 .PHONY: all mrproper depend clean FORCE