# Makefile fragment for C and C++ applications INCLUDED_CAPP = YES # # This makefile provides the following phony targets: # # all install debug # # # 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) # INSTAPP (opt) (the application target directory - otherwise ${INSTDIR}/!${COMPONENT}) # INSTDIR (opt) (the target directory - otherwise ${INSTALLDIR}/${TARGET}) # DIRS (opt) (stamp object for directory creation - otherwise _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}) # 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) # 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) # 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) # SOURCES_TO_LINK (opt) (files which need be linked to by the link farm, in addition to contents of c and h directories) # # # 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) # # # 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 # # TARGET ?= ${COMPONENT} DBG_TARGET ?= ${TARGET}-D INSTDIR ?= ${INSTALLDIR}/${TARGET} INSTAPP ?= ${INSTDIR}/!${COMPONENT} DIRS ?= _dirs OBJS ?= ${TARGET} APP_OBJS ?= ${OBJS} DBG_OBJS ?= ${OBJS} APP_LIBS ?= ${LIBS} DBG_LIBS ?= ${LIBS} DBG_LIBS += ${DEBUGLIBS} ifeq (C++,${LINK_TYPE}) APP_LIBS += ${C++LIB} DBG_LIBS += ${C++LIB} endif APP_LIBS += ${CLIB} DBG_LIBS += ${CLIB} APP_OBJS_ = $(addsuffix .o,${APP_OBJS}) DBG_OBJS_ = $(addsuffix .od,${DBG_OBJS}) SOURCES_TO_SYMLINK += $(wildcard c/*) $(wildcard c++/*) $(wildcard h/*) $(wildcard s/*) VersionNum VersionASM ifneq (objs,$(notdir ${CURDIR})) # Makefile invoked from same directory # Create link farm, then execute the makefile from within it ifeq (clean,${MAKECMDGOALS}) # With a double-colon rule which can have additional actions assigned from the # master makefile, we'd normally need the master makefile to include the # ${CURDIR} check to ensure that it's performed on the same invocation as us. # However, there's no real benefit to performing clean from within the objs # directory, and it adds an ordering problem between the different double-colon # rules (the one that deletes the objs directory has to be last otherwise the # cwd is invalid for the others) so to simplify things, we only ever do cleans # from the same directory as the Makefile. clean:: @echo Cleaning... @rm -rf objs @echo ${COMPONENT}: cleaned else all install debug links: ${SYMLINK_DEPEND} $(foreach linksource,${SOURCES_TO_SYMLINK}, \ $(shell \ linkdest=`echo ${linksource} | sed -e 's,\([^/]*\)/\([^/]*\)$$,\2.\1,' -e 's,^,objs/,'`; \ linkdestdir=`echo $$linkdest | sed -e 's,/[^/]*$$,,'`; \ linkbackpath=`echo $$linkdestdir | sed -e 's,[^/]*,..,g'`; \ [ -d ${linksource} ] || [ -L $$linkdest ] || mkdir -p $$linkdestdir; \ [ -d ${linksource} ] || [ -L $$linkdest ] || ln -s $$linkbackpath/${linksource} $$linkdest; \ ) \ ) @[ -L objs/Resources ] || ln -s ../Resources objs/Resources @mkdir -p objs ifneq (links,${MAKECMDGOALS}) @${MAKE} -C objs -f ../$(firstword ${MAKEFILE_LIST}) ${MAKECMDGOALS} endif endif else # Makefile invoked from objs subdirectory ifeq ("${INCLUDED_STDTOOLS}","") ifeq ("${INCLUDED_HOSTTOOLS}","") include StdTools endif endif ifeq ("${INCLUDED_APPLIBS}","") include AppLibs endif ifeq ("${INCLUDED_APPSTDRULE}","") include AppStdRule endif ifeq ("${INCLUDED_DBGRULES}","") include DbgRules endif all: ${TARGET}${SUFFIX_ABSOLUTE} @${ECHO} ${COMPONENT}: application built ${DIRS}:: ${TOUCH} $@ install: install_${INSTTYPE} install_: install_tool INSTAPP_DEPENDS += $(addsuffix ${SUFFIX_ABSOLUTE},$(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})) TMP=`mktemp`; ${INSERTVERSION} ${INSTAPP}/Messages > $$TMP; mv $$TMP ${INSTAPP}/Messages endif ifneq (,$(filter Desc,${INSTAPP_VERSION})) TMP=`mktemp`; ${INSERTVERSION} descmode=1 ${INSTAPP}/Desc ${INSTAPP}/Desc > $$TMP; mv $$TMP ${INSTAPP}/Desc endif ifneq (,$(filter !Run,${INSTAPP_VERSION})) TMP=`mktemp`; ${INSERTVERSION} obeymode=1 ${INSTAPP}/!Run${SUFFIX_OBEY} > $$TMP; mv $$TMP ${INSTAPP}/!Run${SUFFIX_OBEY} endif @${ECHO} ${COMPONENT}: application installation complete install_debug_app${CUSTOMINSTALLDBGAPP}: ${DBG_TARGET}${SUFFIX_DEBIMAGE} ${CP} ${DBG_TARGET}${SUFFIX_DEBIMAGE} ${INSTAPP}/${TARGET}${SUFFIX_DEBIMAGE} ${CPFLAGS} @${ECHO} ${COMPONENT}: ${TARGET} replaced with ${DBG_TARGET} install_tool${CUSTOMINSTALLTOOL}: ${TARGET}${SUFFIX_ABSOLUTE} ${MKDIR} ${INSTDIR} ${CP} ${TARGET}${SUFFIX_ABSOLUTE} ${INSTDIR}/${TARGET}${SUFFIX_ABSOLUTE} ${CPFLAGS} @${ECHO} ${COMPONENT}: tool installation complete debug: ${DBG_TARGET}${SUFFIX_DEBIMAGE} @${ECHO} ${COMPONENT}: debug application built ${TARGET}${SUFFIX_ABSOLUTE}${CUSTOMLINK}: ${DIRS} ${APP_OBJS_} ${APP_LIBS} ${LD} ${LDFLAGS} -o $@ ${APP_OBJS_} ${APP_LIBS} ${STRIP} $@ ${SQZ} ${SQZFLAGS} $@ ${DBG_TARGET}${SUFFIX_DEBIMAGE}${CUSTOMLINK}: ${DIRS} ${DBG_OBJS_} ${DBG_LIBS} ${LD} ${LDFLAGS} ${LDDFLAGS} -o $@ ${DBG_OBJS_} ${DBG_LIBS} include $(wildcard *.d) include $(wildcard *.dd) endif # EOF