Subversion Repositories Kolibri OS

Rev

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