BasicApp 7.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
# Makefile fragment for Basic applications

INCLUDED_BASICAPP = YES

#
# This makefile provides the following phony targets:
#
#    all  install  resources  rom  install_rom
#
#
# 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})
# ROM_MODULE          (opt) (module filename - otherwise ${COMPONENT})
# 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)
# SRCS                (opt) (source files to be concatenated, no .bas suffixes - otherwise ${TARGET})
# 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 ROM - use InstRes specification rules. Where these conflict with the files in INSTAPP_FILES, prefer a subdirectory named 'ROM')
# RES_DEPENDS         (opt) (list of dependencies to be satisfied before doing resources export - ${TARGET} assumed if in RES_FILES)
# RESAPP_FILES        (opt) (list of files to be installed in ${RESFSAPPDIR} when building a ROM - use InstRes specification rules. Where these conflict with the files in INSTAPP_FILES, prefer a subdirectory named 'ROM')
# 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)
# CUSTOMROM           (opt) (set to "custom" to override the rom rules)
# SOURCES_TO_SYMLINK  (opt) (files which need be linked to by the link farm, in addition to contents of bas directory)
#
#

TARGET       ?= ${COMPONENT}
ROM_MODULE   ?= ${COMPONENT}${SUFFIX_MODULE}
INSTDIR      ?= ${INSTALLDIR}/${TARGET}
INSTAPP      ?= ${INSTDIR}/!${COMPONENT}
RESFSDIR     ?= ${RESDIR}/${COMPONENT}
RESFSAPPDIR  ?= Apps.!${COMPONENT}
MERGEDRDIR   ?= _ResData_
RES_AREA     ?= Resources
DIRS         ?= _dirs
SRCS         ?= ${TARGET}

SRCS_         = $(addsuffix .bas,${SRCS})

SOURCES_TO_SYMLINK += $(wildcard bas/*) VersionNum

ifeq ("${INCLUDED_STDTOOLS}","")
include StdTools
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 resources rom install_rom 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

all: ${TARGET}${SUFFIX_BASIC}
	@${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_BASIC},$(filter ${TARGET},${INSTAPP_FILES}))
RES_DEPENDS     += $(addsuffix ${SUFFIX_BASIC},$(filter ${TARGET},${RES_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_tool${CUSTOMINSTALLTOOL}: ${TARGET}${SUFFIX_BASIC}
	${MKDIR} ${INSTDIR}
	${CP} ${TARGET}${SUFFIX_BASIC} ${INSTDIR}/${TARGET}${SUFFIX_BASIC} ${CPFLAGS}
	@${ECHO} ${COMPONENT}: tool installation complete

resources: ${RES_DEPENDS}
	${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_MODULE}
	@${ECHO} ${COMPONENT}: rom module built

install_rom${CUSTOMROM}: ${ROM_MODULE}
	${CP} ${ROM_MODULE} ${INSTDIR}/${COMPONENT}${SUFFIX_MODULE} ${CPFLAGS}
	@${ECHO} ${COMPONENT}: rom module installed

${TARGET}${SUFFIX_BASIC}: ${DIRS} ${SRCS_}
ifneq (${TARGET},${SRCS})
	${FAPPEND} ${TARGET}.bas ${SRCS_}
endif
	${BASCRUNCH} -1 ${TARGET}.bas ${TARGET}.crunched
	${SQUISH} ${SQUISHFLAGS} -from ${TARGET}.crunched -to $@
	@${ECHO} ${TARGET}${SUFFIX_BASIC}: ${SRCS_} > ${TARGET}.d

${ROM_MODULE}:
	${MKDIR} ${MERGEDRDIR}
	${INSTRES} -I Resources.${LOCALE}.ROM,Resources.UK.ROM,Resources.ROM,Resources.${LOCALE},Resources.UK,Resources ${MERGEDRDIR} ${RESAPP_FILES}
	${INSTVIARG} ${MERGEDRDIR} ${RESFSAPPDIR} _ModGen_
	${MODGEN} -date "$$(awk '/Module_Date / { $$1=""; $$2=""; gsub(/"/, ""); print }' VersionNum)" $@ !${COMPONENT} !${COMPONENT} $$(sed -n -e 's/^.*(\(.*\)).*$$/\1/;1p' VersionNum) -via _ModGen_

include $(wildcard *.d)

endif

export${CUSTOMEXP}: export_${PHASE}
	@${NOP}

export_ export_hdrs export_libs:
	@${NOP}

# EOF