Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3584 | sourcerer | 1 | # |
2 | # Makefile for NetSurf |
||
3 | # |
||
4 | # Copyright 2007 Daniel Silverstone |
||
5 | # Copyright 2008 Rob Kendrick |
||
6 | # |
||
7 | # Trivially, invoke as: |
||
8 | # make |
||
9 | # to build native, or: |
||
10 | # make TARGET=riscos |
||
11 | # to cross-build for RO. |
||
12 | # |
||
13 | # Look at Makefile.config for configuration options. |
||
14 | # |
||
15 | # Tested on unix platforms (building for GTK and cross-compiling for RO) and |
||
16 | # on RO (building for RO). |
||
17 | # |
||
18 | # To clean, invoke as above, with the 'clean' target |
||
19 | # |
||
20 | # To build developer Doxygen generated documentation, invoke as above, |
||
21 | # with the 'docs' target: |
||
22 | # make docs |
||
23 | # |
||
24 | |||
25 | all: all-program |
||
26 | |||
27 | # Determine host type |
||
28 | # NOTE: HOST determination on RISC OS could fail because of missing bug fixes |
||
29 | # in UnixLib which only got addressed in UnixLib 5 / GCCSDK 4. |
||
30 | # When you don't have 'uname' available, you will see: |
||
31 | # File 'uname' not found |
||
32 | # When you do and using a 'uname' compiled with a buggy UnixLib, you |
||
33 | # will see the following printed on screen: |
||
34 | # RISC OS |
||
35 | # In both cases HOST make variable is empty and we recover from that by |
||
36 | # assuming we're building on RISC OS. |
||
37 | # In case you don't see anything printed (including the warning), you |
||
38 | # have an up-to-date RISC OS build system. ;-) |
||
39 | HOST := $(shell uname -s) |
||
40 | |||
41 | # Sanitise host |
||
42 | # TODO: Ideally, we want the equivalent of s/[^A-Za-z0-9]/_/g here |
||
43 | HOST := $(subst .,_,$(subst -,_,$(subst /,_,$(HOST)))) |
||
44 | |||
45 | ifeq ($(HOST),) |
||
46 | HOST := riscos |
||
47 | $(warning Build platform determination failed but that's a known problem for RISC OS so we're assuming a native RISC OS build.) |
||
48 | else |
||
49 | ifeq ($(HOST),RISC OS) |
||
50 | # Fixup uname -s returning "RISC OS" |
||
51 | HOST := riscos |
||
52 | endif |
||
53 | endif |
||
54 | |||
55 | ifeq ($(HOST),riscos) |
||
56 | # Build happening on RO platform, default target is RO backend |
||
57 | ifeq ($(TARGET),) |
||
58 | TARGET := riscos |
||
59 | endif |
||
60 | else |
||
61 | ifeq ($(HOST),BeOS) |
||
62 | HOST := beos |
||
63 | endif |
||
64 | ifeq ($(HOST),Haiku) |
||
65 | # Haiku implements the BeOS API |
||
66 | HOST := beos |
||
67 | endif |
||
68 | ifeq ($(HOST),beos) |
||
69 | # Build happening on BeOS platform, default target is BeOS backend |
||
70 | ifeq ($(TARGET),) |
||
71 | TARGET := beos |
||
72 | endif |
||
73 | else |
||
74 | ifeq ($(HOST),AmigaOS) |
||
75 | HOST := amiga |
||
76 | ifeq ($(TARGET),) |
||
77 | TARGET := amiga |
||
78 | endif |
||
79 | else |
||
80 | ifeq ($(HOST),Darwin) |
||
81 | HOST := macosx |
||
82 | ifeq ($(TARGET),) |
||
83 | TARGET := cocoa |
||
84 | endif |
||
85 | endif |
||
86 | ifeq ($(HOST),FreeMiNT) |
||
87 | HOST := mint |
||
88 | endif |
||
89 | ifeq ($(HOST),mint) |
||
90 | ifeq ($(TARGET),) |
||
91 | TARGET := atari |
||
92 | endif |
||
93 | endif |
||
94 | ifeq ($(findstring MINGW,$(HOST)),MINGW) |
||
95 | # MSYS' uname reports the likes of "MINGW32_NT-6.0" |
||
96 | HOST := windows |
||
97 | endif |
||
98 | ifeq ($(HOST),windows) |
||
99 | ifeq ($(TARGET),) |
||
100 | TARGET := windows |
||
101 | endif |
||
102 | endif |
||
103 | |||
104 | # Default target is GTK backend |
||
105 | ifeq ($(TARGET),) |
||
106 | TARGET := gtk |
||
107 | endif |
||
108 | endif |
||
109 | endif |
||
110 | endif |
||
111 | SUBTARGET = |
||
112 | RESOURCES = |
||
113 | |||
114 | ifneq ($(TARGET),riscos) |
||
115 | ifneq ($(TARGET),gtk) |
||
116 | ifneq ($(TARGET),beos) |
||
117 | ifneq ($(findstring amiga,$(TARGET)),amiga) |
||
118 | ifneq ($(TARGET),framebuffer) |
||
119 | ifneq ($(TARGET),windows) |
||
120 | ifneq ($(TARGET),atari) |
||
121 | ifneq ($(TARGET),cocoa) |
||
122 | ifneq ($(TARGET),monkey) |
||
123 | $(error Unknown TARGET "$(TARGET)", should either be "riscos", "gtk", "beos", "amiga", "framebuffer", "windows", "atari" or "cocoa" or "monkey") |
||
124 | endif |
||
125 | endif |
||
126 | endif |
||
127 | endif |
||
128 | endif |
||
129 | endif |
||
130 | endif |
||
131 | endif |
||
132 | endif |
||
133 | |||
134 | Q=@ |
||
135 | VQ=@ |
||
136 | PERL=perl |
||
137 | MKDIR=mkdir |
||
138 | TOUCH=touch |
||
139 | STRIP=strip |
||
140 | |||
141 | # Override this only if the host compiler is called something different |
||
142 | HOST_CC := gcc |
||
143 | |||
144 | ifeq ($(TARGET),riscos) |
||
145 | ifeq ($(HOST),riscos) |
||
146 | # Build for RO on RO |
||
147 | GCCSDK_INSTALL_ENV := |
||
148 | CCRES := ccres |
||
149 | TPLEXT := |
||
150 | MAKERUN := makerun |
||
151 | SQUEEZE := squeeze |
||
152 | RUNEXT := |
||
153 | CC := gcc |
||
154 | CXX := g++ |
||
155 | EXEEXT := |
||
156 | PKG_CONFIG := |
||
157 | else |
||
158 | # Cross-build for RO (either using GCCSDK 3.4.6 - AOF, |
||
159 | # either using GCCSDK 4 - ELF) |
||
160 | ifeq ($(origin GCCSDK_INSTALL_ENV),undefined) |
||
161 | ifneq ($(realpath /opt/netsurf/arm-unknown-riscos/env),) |
||
162 | GCCSDK_INSTALL_ENV := /opt/netsurf/arm-unknown-riscos/env |
||
163 | else |
||
164 | GCCSDK_INSTALL_ENV := /home/riscos/env |
||
165 | endif |
||
166 | endif |
||
167 | |||
168 | ifeq ($(origin GCCSDK_INSTALL_CROSSBIN),undefined) |
||
169 | ifneq ($(realpath /opt/netsurf/arm-unknown-riscos/cross/bin),) |
||
170 | GCCSDK_INSTALL_CROSSBIN := /opt/netsurf/arm-unknown-riscos/cross/bin |
||
171 | else |
||
172 | GCCSDK_INSTALL_CROSSBIN := /home/riscos/cross/bin |
||
173 | endif |
||
174 | endif |
||
175 | |||
176 | CCRES := $(GCCSDK_INSTALL_CROSSBIN)/ccres |
||
177 | TPLEXT := ,fec |
||
178 | MAKERUN := $(GCCSDK_INSTALL_CROSSBIN)/makerun |
||
179 | SQUEEZE := $(GCCSDK_INSTALL_CROSSBIN)/squeeze |
||
180 | RUNEXT := ,feb |
||
181 | CC := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*gcc) |
||
182 | ifneq (,$(findstring arm-unknown-riscos-gcc,$(CC))) |
||
183 | SUBTARGET := -elf |
||
184 | EXEEXT := ,e1f |
||
185 | ELF2AIF := $(GCCSDK_INSTALL_CROSSBIN)/elf2aif |
||
186 | else |
||
187 | SUBTARGET := -aof |
||
188 | EXEEXT := ,ff8 |
||
189 | endif |
||
190 | CXX := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*g++) |
||
191 | PKG_CONFIG := $(GCCSDK_INSTALL_ENV)/ro-pkg-config |
||
192 | endif |
||
193 | else |
||
194 | ifeq ($(TARGET),beos) |
||
195 | # Building for BeOS/Haiku |
||
196 | #ifeq ($(HOST),beos) |
||
197 | # Build for BeOS on BeOS |
||
198 | GCCSDK_INSTALL_ENV := /boot/develop |
||
199 | CC := gcc |
||
200 | CXX := g++ |
||
201 | EXEEXT := |
||
202 | PKG_CONFIG := |
||
203 | #endif |
||
204 | else |
||
205 | ifeq ($(TARGET),windows) |
||
206 | ifneq ($(HOST),windows) |
||
207 | # Set Mingw defaults |
||
208 | GCCSDK_INSTALL_ENV ?= /opt/netsurf/i686-w64-mingw32/env |
||
209 | GCCSDK_INSTALL_CROSSBIN ?= /opt/netsurf/i686-w64-mingw32/cross/bin |
||
210 | |||
211 | CC := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*gcc) |
||
212 | WINDRES := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*windres) |
||
213 | |||
214 | PKG_CONFIG := PKG_CONFIG_LIBDIR="$(GCCSDK_INSTALL_ENV)/lib/pkgconfig" pkg-config |
||
215 | else |
||
216 | # Building on Windows |
||
217 | CC := gcc |
||
218 | PKG_CONFIG := |
||
219 | endif |
||
220 | else |
||
221 | ifeq ($(findstring amiga,$(TARGET)),amiga) |
||
222 | ifeq ($(findstring amiga,$(HOST)),amiga) |
||
223 | PKG_CONFIG := pkg-config |
||
224 | else |
||
225 | ifeq ($(TARGET),amigaos3) |
||
226 | GCCSDK_INSTALL_ENV ?= /opt/netsurf/m68k-unknown-amigaos/env |
||
227 | GCCSDK_INSTALL_CROSSBIN ?= /opt/netsurf/m68k-unknown-amigaos/cross/bin |
||
228 | |||
229 | SUBTARGET = os3 |
||
230 | else |
||
231 | GCCSDK_INSTALL_ENV ?= /opt/netsurf/ppc-amigaos/env |
||
232 | GCCSDK_INSTALL_CROSSBIN ?= /opt/netsurf/ppc-amigaos/cross/bin |
||
233 | endif |
||
234 | |||
235 | override TARGET := amiga |
||
236 | |||
237 | CC := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*gcc) |
||
238 | |||
239 | PKG_CONFIG := PKG_CONFIG_LIBDIR="$(GCCSDK_INSTALL_ENV)/lib/pkgconfig" pkg-config |
||
240 | endif |
||
241 | else |
||
242 | ifeq ($(TARGET),cocoa) |
||
243 | PKG_CONFIG := PKG_CONFIG_PATH="$(PKG_CONFIG_PATH):/usr/local/lib/pkgconfig" pkg-config |
||
244 | else |
||
245 | ifeq ($(TARGET),atari) |
||
246 | ifeq ($(HOST),atari) |
||
247 | PKG_CONFIG := pkg-config |
||
248 | else |
||
249 | ifeq ($(HOST),mint) |
||
250 | PKG_CONFIG := pkg-config |
||
251 | else |
||
252 | GCCSDK_INSTALL_ENV ?= /opt/netsurf/m68k-atari-mint/env |
||
253 | GCCSDK_INSTALL_CROSSBIN ?= /opt/netsurf/m68k-atari-mint/cross/bin |
||
254 | |||
255 | CC := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*gcc) |
||
256 | |||
257 | PKG_CONFIG := PKG_CONFIG_LIBDIR="$(GCCSDK_INSTALL_ENV)/lib/pkgconfig" pkg-config |
||
258 | endif |
||
259 | endif |
||
260 | else |
||
261 | ifeq ($(TARGET),monkey) |
||
262 | ifeq ($(origin GCCSDK_INSTALL_ENV),undefined) |
||
263 | PKG_CONFIG := pkg-config |
||
264 | else |
||
265 | PKG_CONFIG := PKG_CONFIG_LIBDIR="$(GCCSDK_INSTALL_ENV)/lib/pkgconfig" pkg-config |
||
266 | endif |
||
267 | |||
268 | ifneq ($(origin GCCSDK_INSTALL_CROSSBIN),undefined) |
||
269 | CC := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*gcc) |
||
270 | CXX := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*g++) |
||
271 | endif |
||
272 | else |
||
273 | # All other targets (GTK, Framebuffer) |
||
274 | PKG_CONFIG := pkg-config |
||
275 | endif |
||
276 | endif |
||
277 | endif |
||
278 | endif |
||
279 | endif |
||
280 | endif |
||
281 | endif |
||
282 | |||
283 | # compiler versioning to adjust warning flags |
||
284 | CC_VERSION := $(shell $(CC) -dumpversion) |
||
285 | CC_MAJOR := $(word 1,$(subst ., ,$(CC_VERSION))) |
||
286 | CC_MINOR := $(word 2,$(subst ., ,$(CC_VERSION))) |
||
287 | define cc_ver_ge |
||
288 | $(shell expr $(CC_MAJOR) \>= $(1) \& $(CC_MINOR) \>= $(2)) |
||
289 | endef |
||
290 | |||
291 | # CCACHE |
||
292 | ifeq ($(origin CCACHE),undefined) |
||
293 | CCACHE=$(word 1,$(shell ccache -V 2>/dev/null)) |
||
294 | endif |
||
295 | CC := $(CCACHE) $(CC) |
||
296 | |||
297 | # Target paths |
||
298 | OBJROOT = build-$(HOST)-$(TARGET)$(SUBTARGET) |
||
299 | DEPROOT := $(OBJROOT)/deps |
||
300 | TOOLROOT := $(OBJROOT)/tools |
||
301 | |||
302 | |||
303 | # 1: Feature name (ie, NETSURF_USE_BMP -> BMP) |
||
304 | # 2: Parameters to add to CFLAGS |
||
305 | # 3: Parameters to add to LDFLAGS |
||
306 | # 4: Human-readable name for the feature |
||
307 | define feature_enabled |
||
308 | ifeq ($$(NETSURF_USE_$(1)),YES) |
||
309 | CFLAGS += $(2) |
||
310 | LDFLAGS += $(3) |
||
311 | ifneq ($(MAKECMDGOALS),clean) |
||
312 | $$(info M.CONFIG: $(4) enabled (NETSURF_USE_$(1) := YES)) |
||
313 | endif |
||
314 | else ifeq ($$(NETSURF_USE_$(1)),NO) |
||
315 | ifneq ($(MAKECMDGOALS),clean) |
||
316 | $$(info M.CONFIG: $(4) disabled (NETSURF_USE_$(1) := NO)) |
||
317 | endif |
||
318 | else |
||
319 | $$(info M.CONFIG: $(4) error (NETSURF_USE_$(1) := $$(NETSURF_USE_$(1)))) |
||
320 | $$(error NETSURF_USE_$(1) must be YES or NO) |
||
321 | endif |
||
322 | endef |
||
323 | |||
324 | # Extend flags with appropriate values from pkg-config for enabled features |
||
325 | # |
||
326 | # 1: pkg-config required modules for feature |
||
327 | # 2: Human-readable name for the feature |
||
328 | define pkg_config_find_and_add |
||
329 | ifeq ($$(PKG_CONFIG),) |
||
330 | $$(error pkg-config is required to auto-detect feature availability) |
||
331 | endif |
||
332 | |||
333 | PKG_CONFIG_$(1)_EXISTS := $$(shell $$(PKG_CONFIG) --exists $(1) && echo yes) |
||
334 | |||
335 | ifeq ($$(PKG_CONFIG_$(1)_EXISTS),yes) |
||
336 | CFLAGS += $$(shell $$(PKG_CONFIG) --cflags $(1)) |
||
337 | LDFLAGS += $$(shell $$(PKG_CONFIG) --libs $(1)) |
||
338 | ifneq ($(MAKECMDGOALS),clean) |
||
339 | $$(info PKG.CNFG: $(2) ($(1)) enabled) |
||
340 | endif |
||
341 | else |
||
342 | ifneq ($(MAKECMDGOALS),clean) |
||
343 | $$(info PKG.CNFG: $(2) ($(1)) failed) |
||
344 | $$(error Unable to find library for: $(2) ($(1))) |
||
345 | endif |
||
346 | endif |
||
347 | endef |
||
348 | |||
349 | # Extend flags with appropriate values from pkg-config for enabled features |
||
350 | # |
||
351 | # 1: Feature name (ie, NETSURF_USE_RSVG -> RSVG) |
||
352 | # 2: pkg-config required modules for feature |
||
353 | # 3: Human-readable name for the feature |
||
354 | define pkg_config_find_and_add_enabled |
||
355 | ifeq ($$(PKG_CONFIG),) |
||
356 | $$(error pkg-config is required to auto-detect feature availability) |
||
357 | endif |
||
358 | |||
359 | NETSURF_FEATURE_$(1)_AVAILABLE := $$(shell $$(PKG_CONFIG) --exists $(2) && echo yes) |
||
360 | |||
361 | ifeq ($$(NETSURF_USE_$(1)),YES) |
||
362 | ifeq ($$(NETSURF_FEATURE_$(1)_AVAILABLE),yes) |
||
363 | CFLAGS += $$(shell $$(PKG_CONFIG) --cflags $(2)) $$(NETSURF_FEATURE_$(1)_CFLAGS) |
||
364 | LDFLAGS += $$(shell $$(PKG_CONFIG) --libs $(2)) $$(NETSURF_FEATURE_$(1)_LDFLAGS) |
||
365 | ifneq ($(MAKECMDGOALS),clean) |
||
366 | $$(info M.CONFIG: $(3) ($(2)) enabled (NETSURF_USE_$(1) := YES)) |
||
367 | endif |
||
368 | else |
||
369 | ifneq ($(MAKECMDGOALS),clean) |
||
370 | $$(info M.CONFIG: $(3) ($(2)) failed (NETSURF_USE_$(1) := YES)) |
||
371 | $$(error Unable to find library for: $(3) ($(2))) |
||
372 | endif |
||
373 | endif |
||
374 | else ifeq ($$(NETSURF_USE_$(1)),AUTO) |
||
375 | ifeq ($$(NETSURF_FEATURE_$(1)_AVAILABLE),yes) |
||
376 | CFLAGS += $$(shell $$(PKG_CONFIG) --cflags $(2)) $$(NETSURF_FEATURE_$(1)_CFLAGS) |
||
377 | LDFLAGS += $$(shell $$(PKG_CONFIG) --libs $(2)) $$(NETSURF_FEATURE_$(1)_LDFLAGS) |
||
378 | ifneq ($(MAKECMDGOALS),clean) |
||
379 | $$(info M.CONFIG: $(3) ($(2)) auto-enabled (NETSURF_USE_$(1) := AUTO)) |
||
380 | NETSURF_USE_$(1) := YES |
||
381 | endif |
||
382 | else |
||
383 | ifneq ($(MAKECMDGOALS),clean) |
||
384 | $$(info M.CONFIG: $(3) ($(2)) auto-disabled (NETSURF_USE_$(1) := AUTO)) |
||
385 | NETSURF_USE_$(1) := NO |
||
386 | endif |
||
387 | endif |
||
388 | else ifeq ($$(NETSURF_USE_$(1)),NO) |
||
389 | ifneq ($(MAKECMDGOALS),clean) |
||
390 | $$(info M.CONFIG: $(3) ($(2)) disabled (NETSURF_USE_$(1) := NO)) |
||
391 | endif |
||
392 | else |
||
393 | ifneq ($(MAKECMDGOALS),clean) |
||
394 | $$(info M.CONFIG: $(3) ($(2)) error (NETSURF_USE_$(1) := $$(NETSURF_USE_$(1)))) |
||
395 | $$(error NETSURF_USE_$(1) must be YES, NO, or AUTO) |
||
396 | endif |
||
397 | endif |
||
398 | endef |
||
399 | |||
400 | # ---------------------------------------------------------------------------- |
||
401 | # General flag setup |
||
402 | # ---------------------------------------------------------------------------- |
||
403 | |||
404 | # Set up the WARNFLAGS here so that they can be overridden in the Makefile.config |
||
405 | WARNFLAGS = -W -Wall -Wundef -Wpointer-arith \ |
||
406 | -Wcast-align -Wwrite-strings -Wstrict-prototypes \ |
||
407 | -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls \ |
||
408 | -Wnested-externs -Wuninitialized |
||
409 | ifneq ($(CC_MAJOR),2) |
||
410 | WARNFLAGS += -Wno-unused-parameter |
||
411 | endif |
||
412 | # deal with lots of unwanted warnings from javascript |
||
413 | ifeq ($(call cc_ver_ge,4,6),1) |
||
414 | WARNFLAGS += -Wno-unused-but-set-variable |
||
415 | endif |
||
416 | |||
417 | # Pull in the configuration |
||
418 | include Makefile.defaults |
||
419 | |||
420 | $(eval $(call feature_enabled,JPEG,-DWITH_JPEG,-ljpeg,JPEG (libjpeg))) |
||
421 | $(eval $(call feature_enabled,MNG,-DWITH_MNG,-lmng,JNG/MNG/PNG (libmng))) |
||
422 | |||
423 | $(eval $(call feature_enabled,HARU_PDF,-DWITH_PDF_EXPORT,-lhpdf -lpng,PDF export (haru))) |
||
424 | $(eval $(call feature_enabled,LIBICONV_PLUG,-DLIBICONV_PLUG,,glibc internal iconv)) |
||
425 | |||
426 | # common libraries without pkg-config support |
||
427 | LDFLAGS += -lz |
||
428 | |||
429 | # add top level and build directory to include search path |
||
430 | CFLAGS += -I. -I$(OBJROOT) |
||
431 | |||
432 | # export the user agent format |
||
433 | CFLAGS += -DNETSURF_UA_FORMAT_STRING=\"$(NETSURF_UA_FORMAT_STRING)\" |
||
434 | |||
435 | # set the default homepage to use |
||
436 | CFLAGS += -DNETSURF_HOMEPAGE=\"$(NETSURF_HOMEPAGE)\" |
||
437 | |||
438 | # ---------------------------------------------------------------------------- |
||
439 | # General make rules |
||
440 | # ---------------------------------------------------------------------------- |
||
441 | |||
442 | $(OBJROOT)/created: |
||
443 | $(VQ)echo " MKDIR: $(OBJROOT)" |
||
444 | $(Q)$(MKDIR) $(OBJROOT) |
||
445 | $(Q)$(TOUCH) $(OBJROOT)/created |
||
446 | |||
447 | $(DEPROOT)/created: $(OBJROOT)/created |
||
448 | $(VQ)echo " MKDIR: $(DEPROOT)" |
||
449 | $(Q)$(MKDIR) $(DEPROOT) |
||
450 | $(Q)$(TOUCH) $(DEPROOT)/created |
||
451 | |||
452 | $(TOOLROOT)/created: $(OBJROOT)/created |
||
453 | $(VQ)echo " MKDIR: $(TOOLROOT)" |
||
454 | $(Q)$(MKDIR) $(TOOLROOT) |
||
455 | $(Q)$(TOUCH) $(TOOLROOT)/created |
||
456 | |||
457 | CLEANS := clean-target clean-testament |
||
458 | |||
459 | POSTEXES := |
||
460 | |||
461 | # ---------------------------------------------------------------------------- |
||
462 | # Target specific setup |
||
463 | # ---------------------------------------------------------------------------- |
||
464 | |||
465 | include $(TARGET)/Makefile.target |
||
466 | |||
467 | # ---------------------------------------------------------------------------- |
||
468 | # General source file setup |
||
469 | # ---------------------------------------------------------------------------- |
||
470 | |||
471 | include Makefile.sources |
||
472 | |||
473 | # ---------------------------------------------------------------------------- |
||
474 | # Source file setup |
||
475 | # ---------------------------------------------------------------------------- |
||
476 | |||
477 | # Force exapnsion of source file list |
||
478 | SOURCES := $(SOURCES) |
||
479 | |||
480 | ifeq ($(SOURCES),) |
||
481 | $(error Unable to build NetSurf, could not determine set of sources to build) |
||
482 | endif |
||
483 | |||
484 | OBJECTS := $(sort $(addprefix $(OBJROOT)/,$(subst /,_,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.m,%.o,$(patsubst %.s,%.o,$(SOURCES)))))))) |
||
485 | |||
486 | $(EXETARGET): $(OBJECTS) $(RESOURCES) |
||
487 | $(VQ)echo " LINK: $(EXETARGET)" |
||
488 | ifneq ($(TARGET)$(SUBTARGET),riscos-elf) |
||
489 | $(Q)$(CC) -o $(EXETARGET) $(OBJECTS) $(LDFLAGS) |
||
490 | else |
||
491 | $(Q)$(CXX) -o $(EXETARGET:,ff8=,e1f) $(OBJECTS) $(LDFLAGS) |
||
492 | $(Q)$(ELF2AIF) $(EXETARGET:,ff8=,e1f) $(EXETARGET) |
||
493 | $(Q)$(RM) $(EXETARGET:,ff8=,e1f) |
||
494 | endif |
||
495 | ifeq ($(TARGET),windows) |
||
496 | $(Q)$(TOUCH) windows/res/preferences |
||
497 | endif |
||
498 | ifeq ($(TARGET),gtk) |
||
499 | $(Q)$(TOUCH) gtk/res/toolbarIndices |
||
500 | endif |
||
501 | ifeq ($(NETSURF_STRIP_BINARY),YES) |
||
502 | $(VQ)echo " STRIP: $(EXETARGET)" |
||
503 | $(Q)$(STRIP) $(EXETARGET) |
||
504 | endif |
||
505 | ifeq ($(TARGET),beos) |
||
506 | $(VQ)echo " XRES: $(EXETARGET)" |
||
507 | $(Q)$(BEOS_XRES) -o $(EXETARGET) $(RSRC_BEOS) |
||
508 | $(VQ)echo " SETVER: $(EXETARGET)" |
||
509 | $(Q)$(BEOS_SETVER) $(EXETARGET) \ |
||
510 | -app $(VERSION_MAJ) $(VERSION_MIN) 0 d 0 \ |
||
511 | -short "NetSurf $(VERSION_FULL)" \ |
||
512 | -long "NetSurf $(VERSION_FULL) © 2003 - 2012 The NetSurf Developers" |
||
513 | $(VQ)echo " MIMESET: $(EXETARGET)" |
||
514 | $(Q)$(BEOS_MIMESET) $(EXETARGET) |
||
515 | endif |
||
516 | |||
517 | ifeq ($(TARGET),beos) |
||
518 | $(RDEF_IMP_BEOS): $(RDEP_BEOS) |
||
519 | $(VQ)echo " GEN: $@" |
||
520 | $(Q)n=5000; for f in $^; do echo "resource($$n,\"$${f#beos/res/}\") #'data' import \"$${f#beos/}\";"; n=$$(($$n+1)); done > $@ |
||
521 | |||
522 | $(RSRC_BEOS): $(RDEF_BEOS) $(RDEF_IMP_BEOS) |
||
523 | $(VQ)echo " RC: $<" |
||
524 | $(Q)$(BEOS_RC) -I beos -o $@ $^ |
||
525 | endif |
||
526 | |||
527 | ifeq ($(TARGET),riscos) |
||
528 | # Native RO build is different as 1) it can't do piping and 2) ccres on |
||
529 | # RO does not understand Unix filespec |
||
530 | ifeq ($(HOST),riscos) |
||
531 | define compile_template |
||
532 | !NetSurf/Resources/$(1)/Templates$$(TPLEXT): $(2) |
||
533 | $$(VQ)echo "TEMPLATE: $(2)" |
||
534 | $$(Q)$$(CC) -x c -E -P $$(CFLAGS) -o processed_template $(2) |
||
535 | $$(Q)$$(CCRES) processed_template $$(subst /,.,$$@) |
||
536 | $$(Q)$(RM) processed_template |
||
537 | CLEAN_TEMPLATES += !NetSurf/Resources/$(1)/Templates$$(TPLEXT) |
||
538 | |||
539 | endef |
||
540 | else |
||
541 | define compile_template |
||
542 | !NetSurf/Resources/$(1)/Templates$$(TPLEXT): $(2) |
||
543 | $$(VQ)echo "TEMPLATE: $(2)" |
||
544 | $$(Q)mkdir -p !NetSurf/Resources/$(1) |
||
545 | $$(Q)$$(CC) -x c -E -P $$(CFLAGS) $(2) | $$(CCRES) - $$@ |
||
546 | CLEAN_TEMPLATES += !NetSurf/Resources/$(1)/Templates$$(TPLEXT) |
||
547 | |||
548 | endef |
||
549 | endif |
||
550 | |||
551 | clean-templates: |
||
552 | $(VQ)echo " CLEAN: $(CLEAN_TEMPLATES)" |
||
553 | $(Q)$(RM) $(CLEAN_TEMPLATES) |
||
554 | CLEANS += clean-templates |
||
555 | |||
556 | $(eval $(foreach TPL,$(TPL_RISCOS), \ |
||
557 | $(call compile_template,$(notdir $(TPL)),$(TPL)))) |
||
558 | endif |
||
559 | |||
560 | clean-target: |
||
561 | $(VQ)echo " CLEAN: $(EXETARGET)" |
||
562 | $(Q)$(RM) $(EXETARGET) |
||
563 | |||
564 | clean-testament: |
||
565 | $(VQ)echo " CLEAN: utils/testament.h" |
||
566 | $(Q)$(RM) utils/testament.h |
||
567 | |||
568 | clean-builddir: |
||
569 | $(VQ)echo " CLEAN: $(OBJROOT)" |
||
570 | $(Q)$(RM) -r $(OBJROOT) |
||
571 | CLEANS += clean-builddir |
||
572 | |||
573 | all-program: $(EXETARGET) post-exe |
||
574 | |||
575 | .PHONY: testament |
||
576 | testament utils/testament.h: |
||
577 | $(Q)if test -d .svn; then \ |
||
578 | $(PERL) utils/svn-testament.pl $(CURDIR) utils/testament.h; \ |
||
579 | else \ |
||
580 | $(PERL) utils/git-testament.pl $(CURDIR) utils/testament.h; \ |
||
581 | fi |
||
582 | |||
583 | post-exe: $(POSTEXES) |
||
584 | |||
585 | .SUFFIXES: |
||
586 | |||
587 | DEPFILES := |
||
588 | # Now some macros which build the make system |
||
589 | |||
590 | # 1 = Source file |
||
591 | # 2 = dep filename, no prefix |
||
592 | # 3 = obj filename, no prefix |
||
593 | define dependency_generate_c |
||
594 | DEPFILES += $(2) |
||
595 | $$(DEPROOT)/$(2): $$(DEPROOT)/created $(1) Makefile.config |
||
596 | |||
597 | endef |
||
598 | |||
599 | # 1 = Source file |
||
600 | # 2 = dep filename, no prefix |
||
601 | # 3 = obj filename, no prefix |
||
602 | define dependency_generate_s |
||
603 | DEPFILES += $(2) |
||
604 | $$(DEPROOT)/$(2): $$(DEPROOT)/created $(1) |
||
605 | |||
606 | endef |
||
607 | |||
608 | # 1 = Source file |
||
609 | # 2 = obj filename, no prefix |
||
610 | # 3 = dep filename, no prefix |
||
611 | ifeq ($(CC_MAJOR),2) |
||
612 | # simpler deps tracking for gcc2... |
||
613 | define compile_target_c |
||
614 | $$(DEPROOT)/$(3) $$(OBJROOT)/$(2): $$(OBJROOT)/created |
||
615 | $$(VQ)echo " DEP: $(1)" |
||
616 | $$(Q)$$(RM) $$(DEPROOT)/$(3) |
||
617 | $$(Q)$$(CC) $$(CFLAGS) -MM \ |
||
618 | $(1) | sed 's,^.*:,$$(DEPROOT)/$(3) $$(OBJROOT)/$(2):,' \ |
||
619 | > $$(DEPROOT)/$(3) |
||
620 | $$(VQ)echo " COMPILE: $(1)" |
||
621 | $$(Q)$$(RM) $$(OBJROOT)/$(2) |
||
622 | $$(Q)$$(CC) $$(CFLAGS) -o $$(OBJROOT)/$(2) -c $(1) |
||
623 | |||
624 | endef |
||
625 | else |
||
626 | define compile_target_c |
||
627 | $$(DEPROOT)/$(3) $$(OBJROOT)/$(2): $$(OBJROOT)/created |
||
628 | $$(VQ)echo " COMPILE: $(1)" |
||
629 | $$(Q)$$(RM) $$(DEPROOT)/$(3) |
||
630 | $$(Q)$$(RM) $$(OBJROOT)/$(2) |
||
631 | $$(Q)$$(CC) $$(CFLAGS) -MMD -MT '$$(DEPROOT)/$(3) $$(OBJROOT)/$(2)' \ |
||
632 | -MF $$(DEPROOT)/$(3) -o $$(OBJROOT)/$(2) -c $(1) |
||
633 | |||
634 | endef |
||
635 | endif |
||
636 | |||
637 | define compile_target_cpp |
||
638 | $$(DEPROOT)/$(3) $$(OBJROOT)/$(2): $$(OBJROOT)/created |
||
639 | $$(VQ)echo " DEP: $(1)" |
||
640 | $$(Q)$$(RM) $$(DEPROOT)/$(3) |
||
641 | $$(Q)$$(CC) $$(CFLAGS) -MM \ |
||
642 | $(1) | sed 's,^.*:,$$(DEPROOT)/$(3) $$(OBJROOT)/$(2):,' \ |
||
643 | > $$(DEPROOT)/$(3) |
||
644 | $$(VQ)echo " COMPILE: $(1)" |
||
645 | $$(Q)$$(RM) $$(OBJROOT)/$(2) |
||
646 | $$(Q)$$(CXX) $$(CFLAGS) -o $$(OBJROOT)/$(2) -c $(1) |
||
647 | |||
648 | endef |
||
649 | |||
650 | # 1 = Source file |
||
651 | # 2 = obj filename, no prefix |
||
652 | # 3 = dep filename, no prefix |
||
653 | define compile_target_s |
||
654 | $$(DEPROOT)/$(3) $$(OBJROOT)/$(2): $$(OBJROOT)/created |
||
655 | $$(VQ)echo "ASSEMBLE: $(1)" |
||
656 | $$(Q)$$(RM) $$(DEPROOT)/$(3) |
||
657 | $$(Q)$$(RM) $$(OBJROOT)/$(2) |
||
658 | $$(Q)$$(CC) $$(ASFLAGS) -MMD -MT '$$(DEPROOT)/$(3) $$(OBJROOT)/$(2)' \ |
||
659 | -MF $$(DEPROOT)/$(3) -o $$(OBJROOT)/$(2) -c $(1) |
||
660 | |||
661 | endef |
||
662 | |||
663 | # Rules to construct dep lines for each object... |
||
664 | $(eval $(foreach SOURCE,$(filter %.c,$(SOURCES)), \ |
||
665 | $(call dependency_generate_c,$(SOURCE),$(subst /,_,$(SOURCE:.c=.d)),$(subst /,_,$(SOURCE:.c=.o))))) |
||
666 | |||
667 | $(eval $(foreach SOURCE,$(filter %.cpp,$(SOURCES)), \ |
||
668 | $(call dependency_generate_c,$(SOURCE),$(subst /,_,$(SOURCE:.cpp=.d)),$(subst /,_,$(SOURCE:.cpp=.o))))) |
||
669 | |||
670 | $(eval $(foreach SOURCE,$(filter %.m,$(SOURCES)), \ |
||
671 | $(call dependency_generate_c,$(SOURCE),$(subst /,_,$(SOURCE:.m=.d)),$(subst /,_,$(SOURCE:.m=.o))))) |
||
672 | |||
673 | # Cannot currently generate dep files for S files because they're objasm |
||
674 | # when we move to gas format, we will be able to. |
||
675 | |||
676 | #$(eval $(foreach SOURCE,$(filter %.s,$(SOURCES)), \ |
||
677 | # $(call dependency_generate_s,$(SOURCE),$(subst /,_,$(SOURCE:.s=.d)),$(subst /,_,$(SOURCE:.s=.o))))) |
||
678 | |||
679 | ifneq ($(MAKECMDGOALS),clean) |
||
680 | -include $(sort $(addprefix $(DEPROOT)/,$(DEPFILES))) |
||
681 | -include $(D_JSAPI_BINDING) |
||
682 | endif |
||
683 | |||
684 | # And rules to build the objects themselves... |
||
685 | |||
686 | $(eval $(foreach SOURCE,$(filter %.c,$(SOURCES)), \ |
||
687 | $(call compile_target_c,$(SOURCE),$(subst /,_,$(SOURCE:.c=.o)),$(subst /,_,$(SOURCE:.c=.d))))) |
||
688 | |||
689 | $(eval $(foreach SOURCE,$(filter %.cpp,$(SOURCES)), \ |
||
690 | $(call compile_target_cpp,$(SOURCE),$(subst /,_,$(SOURCE:.cpp=.o)),$(subst /,_,$(SOURCE:.cpp=.d))))) |
||
691 | |||
692 | $(eval $(foreach SOURCE,$(filter %.m,$(SOURCES)), \ |
||
693 | $(call compile_target_c,$(SOURCE),$(subst /,_,$(SOURCE:.m=.o)),$(subst /,_,$(SOURCE:.m=.d))))) |
||
694 | |||
695 | $(eval $(foreach SOURCE,$(filter %.s,$(SOURCES)), \ |
||
696 | $(call compile_target_s,$(SOURCE),$(subst /,_,$(SOURCE:.s=.o)),$(subst /,_,$(SOURCE:.s=.d))))) |
||
697 | |||
698 | .PHONY: all clean docs install package-$(TARGET) package install-$(TARGET) |
||
699 | |||
700 | clean: $(CLEANS) |
||
701 | |||
702 | # Target builds a distribution package |
||
703 | package: all-program package-$(TARGET) |
||
704 | |||
705 | FAT_LANGUAGES=de en fr it nl |
||
706 | # 1 = front end name (gtk, ro, ami, etc) |
||
707 | # 2 = Destination directory (where resources being installed, creates en/Messages etc) |
||
708 | # 3 = suffix after language name |
||
709 | define split_install_messages |
||
710 | $(foreach LANG, $(FAT_LANGUAGES), @echo MSGSPLIT: $(1)/$(LANG) to $(2) |
||
711 | $(Q)mkdir -p $(2)/$(LANG)$(3) |
||
712 | $(Q)$(PERL) utils/split-messages.pl $(LANG) $(1) < resources/FatMessages | gzip -9n > $(2)$(3)/$(LANG)/Messages |
||
713 | ) |
||
714 | endef |
||
715 | |||
716 | # Target installs executable on the host system |
||
717 | install: all-program install-$(TARGET) |
||
718 | |||
719 | docs: |
||
720 | doxygen Docs/Doxyfile>" |