# Copyright 2008 Castle Technology Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Makefile fragment for C and C++ applications

INCLUDED_CAPP = YES

#
# $Id$
#
# This makefile provides the following phony targets:
#
#    all  install  debug  resources  rom  rom_link
#
#
# This fragment uses the following macros set by the master makefile.
#
#
# COMPONENT                 (the name of the component)
# TARGET              (opt) (the leafname of the application - otherwise ${COMPONENT})
# DBG_TARGET          (opt) (debug application leafname - otherwise ${TARGET}-D)
# ROM_TARGET          (opt) (partially linked module-wrapped leafname - otherwise ${TARGET} in aof)
# LNK_TARGET          (opt) (fixed-position module-wrapped leafname - otherwise ${TARGET} in linked)
# INSTAPP             (opt) (the application target directory - otherwise ${INSTDIR}.!${COMPONENT})
# INSTDIR             (opt) (the target directory - otherwise <Install$Dir>.${TARGET})
# RESFSDIR            (opt) (actual directory to export non-application-dir resources to - otherwise ${RESDIR}.${COMPONENT})
# RESFSAPPDIR         (opt) (where to register application-dir resources to within ResourceFS - otherwise Apps.!${COMPONENT})
# DIRS                (opt) (stamp object for directory creation - otherwise o._dirs)
# OBJS                (opt) (object files, no o. prefixes - otherwise ${TARGET})
# APP_OBJS            (opt) (release build object files, no prefixes - otherwise ${OBJS})
# DBG_OBJS            (opt) (debug build object files, no prefixes - otherwise ${OBJS})
# ROM_OBJS            (opt) (ROM module-wrap build objects - otherwise ${OBJS} plus modulewrap and ${RES_OBJ})
# LIBS                (opt) (extra libraries; ${CLIB} is always used)
# APP_LIBS            (opt) (extra release libraries - otherwise ${LIBS}; ${CLIB} is always used)
# DBG_LIBS            (opt) (extra debug libraries - otherwise ${LIBS}; ${CLIB} and ${DEBUGLIBS} always used)
# ROM_LIBS            (opt) (libraries to link for ROM module-wrap targets - otherwise ${LIBS}; ${ROMSTUBS} or ${ROMCSTUBS} is always used, depending on whether ${LIBS} contains ${RLIB} or not)
# WRAPPER             (opt) (module-wrap source file to use - defaults to RISCOSLib:s.modulewrap)
# ROM_DEPEND          (opt) (any extra dependency to assert on ROM_TARGET)
# LINK_TYPE           (opt) (variant of linking command, eg C++ - defaults to C)
# INSTTYPE            (opt) (use "tool" or "app" to install executable vs application - defaults to "tool")
# INSTAPP_FILES       (opt) (list of files to be installed in application directory - use InstRes specification rules)
# INSTAPP_DEPENDS     (opt) (list of dependencies to be satisfied before doing application install - ${TARGET} assumed if in INSTAPP_FILES)
# INSTAPP_VERSION     (opt) (list of Messages/!Run/Desc files to insert app version from VersionNum - include in INSTAPP_FILES as well)
# RES_FILES           (opt) (list of files to be installed in ${RESFSDIR} when building a module-wrap ROM - use InstRes specification rules. Where these conflict with the files in INSTAPP_FILES, prefer a subdirectory named 'ROM')
# RESAPP_FILES        (opt) (list of files to be installed in ${RESFSAPPDIR} when building a module-wrap ROM - use InstRes specification rules. Where these conflict with the files in INSTAPP_FILES, prefer a subdirectory named 'ROM')
# CUSTOMLINK          (opt) (set to "custom" to override the link rule)
# CUSTOMINSTALLAPP    (opt) (set to "custom" to override the install rule for resource files)
# CUSTOMINSTALLTOOL   (opt) (set to "custom" to override the install rule for target binary)
# CUSTOMINSTALLDBGAPP (opt) (set to "custom" to override the install rule for debug resources)
# CUSTOMROM           (opt) (set to "custom" to override the rom module-wrap rules)
#
#
# It relies on the following generic tool macros from the StdTools makefile
#
#
#C + CFLAGS       (C compiler; CDFLAGS also used in debug builds; -g implicit)
# CP + CPFLAGS     (copy, cp etc.)
# WIPE + WFLAGS    (recursive delete)
# RM               (non-recursive delete)
# AS + ASFLAGS     (assembler)
# LD + LDFLAGS     (linker; LDDFLAGS also used in debug builds; -d implicit)
# SQZ + SQZFLAGS   (binary compressor)
# MKDIR            (cdir/mkdir -p)
# ECHO
# TOUCH            (create/touch)
# INSERTVERSION    (awk script to substitute from VersionNum)
# CHMOD            (file permission manipulation)
#
#
# It relies on the following from the StdRules makefile
#
#
# .c.o  .c++.o  .cpp.o  .s.o
#
#
# It relies on the following from the DbgRules makefile
#
#
# CDFLAGS  C++DFLAGS  ASDFLAGS  LDDFLAGS
# .c.od  .c++.od  .cpp.od  .s.od
#
#

INSTALLDIR    = <Install$Dir>

TARGET       ?= ${COMPONENT}
DBG_TARGET   ?= ${TARGET}-D
ROM_TARGET   ?= ${TARGET}
LNK_TARGET   ?= ${TARGET}
INSTDIR      ?= ${INSTALLDIR}.${TARGET}
INSTAPP      ?= ${INSTDIR}.!${COMPONENT}
RESFSDIR     ?= ${RESDIR}.${COMPONENT}
RESFSAPPDIR  ?= Apps.!${COMPONENT}
MERGEDRDIR   ?= oz._ResData_
RES_AREA     ?= Resources
RES_OBJ      ?= resources
DIRS         ?= o._dirs
OBJS         ?= ${TARGET}
APP_OBJS     ?= ${OBJS}
DBG_OBJS     ?= ${OBJS}
ROM_OBJS     ?= ${OBJS} modulewrap ${RES_OBJ}
APP_LIBS     ?= ${LIBS}
DBG_LIBS     ?= ${LIBS}
ROM_LIBS     ?= ${LIBS}
ifeq (C++,${LINK_TYPE})
APP_LIBS     += ${C++LIB}
DBG_LIBS     += ${C++LIB}
ROM_LIBS     += ${C++LIB}
endif
APP_LIBS     += ${CLIB}
DBG_LIBS     += ${DEBUGLIBS} ${CLIB}
WRAPPER      ?= RISC_OSLib:s.modulewrap

APP_OBJS_     = $(addprefix o.,${APP_OBJS})
DBG_OBJS_     = $(addprefix od.,${DBG_OBJS})
ROM_OBJS_     = $(addprefix oz.,${ROM_OBJS})

ifeq ("${INCLUDED_STDTOOLS}","")
ifeq ("${INCLUDED_HOSTTOOLS}","")
include StdTools
endif
endif

ifeq ($(filter rom%,${MAKECMDGOALS}),)
ifeq ("${INCLUDED_APPLIBS}","")
include AppLibs
endif
else
ifeq ("${INCLUDED_MODULELIBS}","")
include ModuleLibs
endif
endif

ifeq ("${INCLUDED_APPSTDRULE}","")
include AppStdRule
endif
ifeq ("${INCLUDED_DBGRULES}","")
include DbgRules
endif

ifeq ($(filter ${RLIB},${ROM_LIBS}),)
ROM_LIBS_     = ${ROM_LIBS} ${ROMCSTUBS}
ROM_SYMS      = ${C_ABSSYM}
else
ROM_LIBS_     = $(filter-out ${RLIB},${ROM_LIBS}) ${ROMSTUBS}
ROM_SYMS      = ${ABSSYM}
endif

all: ${TARGET}
        @${ECHO} ${COMPONENT}: application built

${DIRS} ::
        ${MKDIR} o
        ${MKDIR} od
        ${MKDIR} oz
        ${MKDIR} aof
        ${MKDIR} linked
        ${TOUCH} $@

clean ::
        @IfThere o  Then ${ECHO} ${WIPE} o ${WFLAGS}
        @IfThere o  Then ${WIPE} o ${WFLAGS}
        @IfThere od Then ${ECHO} ${WIPE} od ${WFLAGS}
        @IfThere od Then ${WIPE} od ${WFLAGS}
        @IfThere oz Then ${ECHO} ${WIPE} oz ${WFLAGS}
        @IfThere oz Then ${WIPE} oz ${WFLAGS}
        @IfThere aof Then ${ECHO} ${WIPE} aof ${WFLAGS}
        @IfThere aof Then ${WIPE} aof ${WFLAGS}
        @IfThere linked Then ${ECHO} ${WIPE} linked ${WFLAGS}
        @IfThere linked Then ${WIPE} linked ${WFLAGS}
        ${RM} ${TARGET}
        ${RM} ${DBG_TARGET}
        @${ECHO} ${COMPONENT}: cleaned

install: install_${INSTTYPE}

install_: install_tool
        @${NOP}

INSTAPP_DEPENDS += $(filter ${TARGET},${INSTAPP_FILES})

install_app${CUSTOMINSTALLAPP}: ${INSTAPP_DEPENDS}
        ${MKDIR} ${INSTAPP}
        ${INSTRES} -I Resources.${USERIF}.${LOCALE},Resources.${USERIF}.UK,Resources.${LOCALE},Resources.UK,Resources ${INSTAPP} ${INSTAPP_FILES}
ifneq (,$(filter Messages,${INSTAPP_VERSION}))
        ${CHMOD} +w ${INSTAPP}.Messages
        ${INSERTVERSION} LocalRes:Messages > ${INSTAPP}.Messages
endif
ifneq (,$(filter Desc,${INSTAPP_VERSION}))
        ${CHMOD} +w ${INSTAPP}.Desc
        ${INSERTVERSION} descmode=1 LocalRes:Desc > ${INSTAPP}.Desc
endif
ifneq (,$(filter !Run,${INSTAPP_VERSION}))
        ${CHMOD} +w ${INSTAPP}.!Run
        ${INSERTVERSION} obeymode=1 LocalRes:!Run > ${INSTAPP}.!Run
        ${SETTYPE} ${INSTAPP}.!Run Obey
endif
        @${ECHO} ${COMPONENT}: application installation complete

install_debug_app${CUSTOMINSTALLDBGAPP}: ${DBG_TARGET} install_app
        ${CP} ${DBG_TARGET} ${INSTAPP}.${TARGET} ${CPFLAGS}
        @${ECHO} ${COMPONENT}: ${TARGET} replaced with ${DBG_TARGET}

install_tool${CUSTOMINSTALLTOOL}: ${TARGET}
        ${MKDIR} ${INSTDIR}
        ${CP} ${TARGET} ${INSTDIR}.${TARGET} ${CPFLAGS}
        @${ECHO} ${COMPONENT}: tool installation complete

debug: ${DBG_TARGET}
        @${ECHO} ${COMPONENT}: debug application built

resources:
        ${MKDIR} ${RESFSDIR}
        ${TOKENCHECK} LocalRes:Messages
        ${CP} LocalRes:Messages ${RESFSDIR}.Messages ${CPFLAGS}
ifneq (${RES_FILES},)
        ${INSTRES} -I Resources.${LOCALE}.ROM,Resources.UK.ROM,Resources.ROM,Resources.${LOCALE},Resources.UK,Resources ${RESFSDIR} ${RES_FILES}
endif
ifneq (,$(filter Messages,${INSTAPP_VERSION}))
        ${INSERTVERSION} ${RESFSDIR}.Messages > ${RESFSDIR}._Awk_
        ${CP} ${RESFSDIR}._Awk_ ${RESFSDIR}.Messages ${CPFLAGS}
        ${RM} ${RESFSDIR}._Awk_
        ${TOUCH} -r LocalRes:Messages ${RESFSDIR}.Messages
endif
        @${ECHO} ${COMPONENT}: resources copied to Messages module

rom${CUSTOMROM}: aof.${ROM_TARGET}
        @${ECHO} ${COMPONENT}: rom module built

rom_link${CUSTOMROM}: linked.${LNK_TARGET}
        ${CP} linked.${LNK_TARGET} ${LINKDIR}.${COMPONENT} ${CPFLAGS}
        ${CP} linked.${LNK_TARGET}_sym ${LINKDIR}.${COMPONENT}_sym ${CPFLAGS}
        @${ECHO} ${COMPONENT}: rom_link complete

${TARGET}${CUSTOMLINK}: ${APP_OBJS_} ${APP_LIBS} ${DIRS}
        ${LD} ${LDFLAGS} -o ${TARGET} ${APP_OBJS_} ${APP_LIBS}
        ${SQZ} ${SQZFLAGS} $@

${DBG_TARGET}${CUSTOMLINK}: ${DBG_OBJS_} ${DBG_LIBS} ${DIRS}
        ${LD} ${LDFLAGS} ${LDDFLAGS} -o ${DBG_TARGET} ${DBG_OBJS_} ${DBG_LIBS}

aof.${ROM_TARGET}: ${ROM_OBJS_} ${ROM_LIBS_} ${DIRS} ${ROM_DEPEND}
        ${LD} -o $@ -aof ${ROM_OBJS_} ${ROM_LIBS_}

linked.${LNK_TARGET}: aof.${ROM_TARGET} ${ROM_SYMS} ${FORCEROMLINK}
        ${LD} ${LDFLAGS} ${LDLINKFLAGS} -o $@ -rmf -base ${ADDRESS} aof.${ROM_TARGET} ${ROM_SYMS} -Symbols linked.${LNK_TARGET}_sym

oz.modulewrap: s.modulewrap s.AppName
        ${AS} ${ASFLAGS} s.modulewrap $@

s.modulewrap: ${WRAPPER}
        ${CP} ${WRAPPER} $@ ${CPFLAGS}

oz.${RES_OBJ}:
        ${MKDIR} ${MERGEDRDIR}
        ${INSTRES} -I Resources.${LOCALE}.ROM,Resources.UK.ROM,Resources.ROM,Resources.${LOCALE},Resources.UK,Resources ${MERGEDRDIR} ${RESAPP_FILES}
        ${INSTVIARG} ${MERGEDRDIR} ${RESFSAPPDIR} oz._ResGen_
        ${RESGEN} ${RES_AREA} $@ -via oz._ResGen_

# EOF
