# Makefile fragment for C and C++ applications INCLUDED_CAPP = YES # # 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}.aof) # LNK_TARGET (opt) (fixed-position module-wrapped leafname - otherwise ${TARGET}.linked) # INSTAPP (opt) (the application target directory - otherwise ${INSTDIR}/!${COMPONENT}) # INSTDIR (opt) (the target directory - otherwise ${INSTALLDIR}/${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, using RISC OS style directory separators - otherwise Apps.!${COMPONENT}) # 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}) # 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 $LIBDIR/RISC_OSLib/modulewrap.s) # 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) # SOURCES_TO_SYMLINK (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 ROM_TARGET ?= ${TARGET} LNK_TARGET ?= ${TARGET} INSTDIR ?= ${INSTALLDIR}/${TARGET} INSTAPP ?= ${INSTDIR}/!${COMPONENT} RESFSDIR ?= ${RESDIR}/${COMPONENT} RESFSAPPDIR ?= Apps.!${COMPONENT} MERGEDRDIR ?= _ResData_ RES_AREA ?= Resources RES_OBJ ?= resources DIRS ?= _dirs OBJS ?= ${TARGET} APP_OBJS ?= ${OBJS} DBG_OBJS ?= ${OBJS} ROM_OBJS ?= ${OBJS} modulewrap ${RES_OBJ} APP_LIBS ?= ${LIBS} DBG_LIBS ?= ${LIBS} DBG_LIBS += ${DEBUGLIBS} 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 += ${CLIB} WRAPPER ?= ${LIBDIR}/RISC_OSLib/modulewrap.s APP_OBJS_ = $(addsuffix .o,${APP_OBJS}) DBG_OBJS_ = $(addsuffix .od,${DBG_OBJS}) ROM_OBJS_ = $(addsuffix .oz,${ROM_OBJS}) SOURCES_TO_SYMLINK += $(wildcard c/*) $(wildcard c++/*) $(wildcard h/*) $(wildcard s/*) VersionNum VersionASM ifeq ("${INCLUDED_STDTOOLS}","") ifeq ("${INCLUDED_HOSTTOOLS}","") include StdTools endif endif 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 resources rom rom_link 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 ($(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}${SUFFIX_ABSOLUTE} @${ECHO} ${COMPONENT}: application built # GNU make seems to treat any double-colon rule with no dependencies as # always out-of-date, therefore always rebuilds it and anything which in turn # depends on the target of the double-colon rule. So use a single-colon rule # instead. If any cross builds need to create extra directories on a # per-component basis, we'll cross that bridge when we get to it. ${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 resources: ${MKDIR} ${RESFSDIR} 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_ for path in ${LOCALE}/ROM UK/ROM ROM ${LOCALE} UK ""; do if [ -f Resources/$$path/Messages ]; then touch -r Resources/$$path/Messages ${RESFSDIR}/Messages; break; fi; done endif @${ECHO} ${COMPONENT}: resources copied to Messages module rom${CUSTOMROM}: ${ROM_TARGET}.aof @${ECHO} ${COMPONENT}: rom module built rom_link${CUSTOMROM}: ${LNK_TARGET}.linked ${CP} ${LNK_TARGET}.linked ${LINKDIR}/${COMPONENT} ${CPFLAGS} ${CP} ${LNK_TARGET}_sym.linked ${LINKDIR}/${COMPONENT}_sym ${CPFLAGS} @${ECHO} ${COMPONENT}: rom_link complete ${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} ${ROM_TARGET}.aof: ${ROM_OBJS_} ${ROM_LIBS_} ${DIRS} ${ROM_DEPEND} ${LD} -o $@ -aof ${ROM_OBJS_} ${ROM_LIBS_} ${LNK_TARGET}.linked: ${ROM_TARGET}.aof ${ROM_SYMS} ${FORCEROMLINK} ${LD} ${LDFLAGS} ${LDLINKFLAGS} -o $@ -rmf -base ${ADDRESS} ${ROM_TARGET}.aof ${ROM_SYMS} -symbols ${LNK_TARGET}_sym.linked modulewrap.oz: ${WRAPPER} AppName.s ${AS} ${ASFLAGS} ${WRAPPER} $@ ${RES_OBJ}.oz: ${MKDIR} ${MERGEDRDIR} ${INSTRES} -I Resources.${LOCALE}.ROM,Resources.UK.ROM,Resources.ROM,Resources.${LOCALE},Resources.UK,Resources ${MERGEDRDIR} ${RESAPP_FILES} ${INSTVIARG} ${MERGEDRDIR} ${RESFSAPPDIR} _ResGen_ ${RESGEN} ${RES_AREA} $@ -via _ResGen_ include $(wildcard *.d) include $(wildcard *.dd) endif export${CUSTOMEXP}: export_${PHASE} @${NOP} export_ export_hdrs export_libs: @${NOP} # EOF