Subversion Repositories Kolibri OS

Rev

Rev 3584 | Blame | Last modification | View Log | RSS feed

  1. #
  2. # Makefile for NetSurf
  3. #
  4. # Copyright 2007 Daniel Silverstone <dsilvers@netsurf-browser.org>
  5. # Copyright 2008 Rob Kendrick <rjek@netsurf-browser.org>
  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 := <NSLibs$$Dir>
  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
  721.