CModule 13.1 KB
Newer Older
1
# Makefile fragment for C and C++ modules
Ben Avison's avatar
Ben Avison committed
2 3 4

INCLUDED_CMODULE = YES

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
#
# $Id$
#
# This makefile provides the following phony targets:
#
#    all 
#    export  export-hdrs  export-libs
#    resources  resources_common  resources-None
#    rom  rom_link
#    standalone  install
#    debug  gpa_debug
#    prepro
#    clean
#
# It is intended that this be used instead of the ROMCModule and RAMCModule
# makefiles, but they remain for the time being for compatibility reasons.
#
#
# This fragment uses the following macros set by the master makefile.
#
#
# COMPONENT          (the name of the component)
# TARGET       (opt) (the leafname of the module - otherwise ${COMPONENT})
# ROM_TARGET   (opt) (partially linked module leafname - otherwise ${TARGET} in aof)
# LNK_TARGET   (opt) (fixed-position module leafname - otherwise ${TARGET} in linked)
# SA_TARGET    (opt) (standalone module leafname - otherwise ${TARGET} in rm)
# DBG_TARGET   (opt) (debug module leafname - otherwise ${TARGET}D in rm)
# AIF_TARGET   (opt) (GPA-intermediate leafname - otherwise ${TARGET} in aif)
# GPA_TARGET   (opt) (GPA debug leafname - otherwise ${TARGET} in gpa)
# INSTDIR      (opt) (the target directory - otherwise <Install$Dir>)
# C_EXP_HDR    (opt) (C header target directory - otherwise <cexport$dir>.Interface.h)
# EXP_HDR      (opt) (assembly header target directory - otherwise <export$dir>
# DIRS         (opt) (stamp object for directory creation - otherwise o._dirs)
# HDRS         (opt) (C header files to export, no h. prefix - otherwise ${TARGET})
# ASMHDRS      (opt) (assembly header files to export, no Hdr. prefix - otherwise none)
# ASMCHDRS     (opt) (C-from-assembly auto-generated header files to export, no Hdr. prefix - otherwise none)
# MERGEDMDIR   (opt) (directory for generating exported message file - otherwise o._Messages_)
# MERGEDMSGS   (opt) (leafname of generated messages file - otherwise ${MERGEDMDIR}.${TARGET})
# RES_AREA     (opt) (area name to use for embedded messages in standalone build - otherwise Resources)
# RES_OBJ      (opt) (object file for embedded messages in standalone build, no o.prefix - otherwise ${TARGET}Msgs)
# RES_PATH     (opt) (path in ResourceFS to messages file - otherise Resources.${TARGET}.Messages)
# CMHGFILE     (opt) (name of CMHG source file, no cmhg. prefix - otherwise ${TARGET}Hdr)
# CMHGAUTOHDR  (opt) (header file, if any, from HDRS or ASMCHDRS, to which to append the SWI defines from CMHG)
# CMHGFILE_SWIPREFIX (opt) (name of SWI prefix used in CMHG file - otherwise ${TARGET})
# OBJS         (opt) (object files, no o. prefixes - otherwise ${TARGET} ${CMHGFILE})
# ROM_OBJS     (opt) (ROM build objects - otherwise ${OBJS})
# SA_OBJS      (opt) (standalone build objects - otherwise ${OBJS})
# DBG_OBJS     (opt) (debug build object files, no prefixes - otherwise ${OBJS})
# LIBS         (opt) (extra libraries; CLib is always used)
# ROM_LIBS     (opt) (libraries to link for ROM targets - otherwise ${LIBS})
# SA_LIBS      (opt) (libraries to link for standalone targets - otherwise ${LIBS})
# DBG_LIBS     (opt) (extra debug libraries in addition to SA_LIBS and DEBUGLIBS)
# ROM_DEPEND   (opt) (any extra dependency to assert on ROM_TARGET)
# SA_DEPEND    (opt) (any extra dependency to assert on SA_TARGET and DBG_TARGET)
# CUSTOMEXP    (opt) (set to "custom" to override the export rules)
# CUSTOMRES    (opt) (set to "custom" to override the resources rules)
# CUSTOMROM    (opt) (set to "custom" to override the rom rules)
# CUSTOMSA     (opt) (set to "custom" to override the standalone rules)
# CUSTOMDBG    (opt) (set to "custom" to override the debug rules)
# CUSTOMGPA    (opt) (set to "custom" to override the GPA rules)
65 66 67 68 69
# RAMCDEFINES  (opt) (additions to CDEFINES for RAM builds - requires ModStdRule to be included later)
# ROMCDEFINES  (opt) (additions to CDEFINES for ROM builds - requires ModStdRule to be included later)
# RAMASMDEFINES (opt) (additions to ASMDEFINES for RAM builds - requires ModStdRule to be included later)
# ROMASMDEFINES (opt) (additions to ASMDEFINES for ROM builds - requires ModStdRule to be included later)
# CMHGDEPENDS  (opt) (source files which need to include the .h file autogenerated from the CMHG file)
70 71 72 73 74 75 76
#
#
# It relies on the following from the build system:
#
#
# PHASE            (export phase discriminator)
# CMDHELP          (whether star command help/syntax strings are included)
77
# RESDIR           (installation directory for resources - cf. RESFSDIR)
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
# FORCEROMLINK     (set to force a relink of the ROM target, used in BBE)
# LINKDIR          (installation directory for LNK_TARGET)
# ADDRESS          (base address for LNK_TARGET)
#
#
# 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)
# LDRAMFLAGS       (more linker flags)
# LDROMFLAGS       (more linker flags)
# LDLINKFLAGS      (flags for the rom_link phase)
# MODSQZ + MODSQZFLAGS (module binary compressor)
# CHMOD
# MKDIR            (cdir/mkdir -p)
# ECHO
# TOUCH            (create/touch)
# TOKENCHECK
# RESGEN
# TOGPA
#
#
# It relies on the following from the StdRules makefile
#
#
# .c.o  .c++.o  .cpp.o  .s.o
#
#
# It relies on the following from the ModStdRule makefile
#
#
# .cmhg.h  .cmhg.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>
EXPDIR        = <export$dir>
CEXPDIR       = <cexport$dir>

TARGET       ?= ${COMPONENT}
ROM_TARGET   ?= ${TARGET}
LNK_TARGET   ?= ${TARGET}
SA_TARGET    ?= ${TARGET}
DBG_TARGET   ?= ${TARGET}D
AIF_TARGET   ?= ${TARGET}
GPA_TARGET   ?= ${TARGET}
INSTDIR      ?= ${INSTALLDIR}
C_EXP_HDR    ?= ${CEXPDIR}.Interface.h
EXP_HDR      ?= ${EXPDIR}
DIRS         ?= o._dirs
HDRS         ?= ${TARGET}
ASMHDRS      ?= 
ASMCHDRS     ?= 
MERGEDMDIR   ?= o._Messages_
MERGEDMSGS   ?= ${MERGEDMDIR}.${TARGET}
RES_AREA     ?= Resources
RES_OBJ      ?= ${TARGET}Msgs
RES_PATH     ?= Resources.${TARGET}.Messages
148
RESFSDIR     ?= ${RESDIR}.${TARGET}
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
CMHGFILE     ?= ${TARGET}Hdr
CMHGFILE_SWIPREFIX ?= ${TARGET}
OBJS         ?= ${TARGET}
ROM_OBJS     ?= ${OBJS}
SA_OBJS      ?= ${OBJS}
DBG_OBJS     ?= ${OBJS}
ROM_OBJS     += ${CMHGFILE}
SA_OBJS      += ${CMHGFILE} ${RES_OBJ}
DBG_OBJS     += ${CMHGFILE} ${RES_OBJ}
ROM_LIBS     ?= ${LIBS}
SA_LIBS      ?= ${LIBS}
DBG_LIBS     += ${DEBUGLIBS}

OBJS_         = $(addprefix o.,${OBJS})
ROM_OBJS_     = $(addprefix o.,${ROM_OBJS})
SA_OBJS_      = $(addprefix o.,${SA_OBJS})
DBG_OBJS_     = $(addprefix od.,${DBG_OBJS})
PP_OBJS_      = $(addprefix i.,$(filter-out ${CMHGFILE} ${RES_OBJ},${DBG_OBJS}))
EXPORTING_HDRS     = $(addprefix exphdr.,${HDRS})
EXPORTING_ASMHDRS  = $(addprefix expasm.,${ASMHDRS})
EXPORTING_ASMCHDRS = $(addprefix expasmc.,${ASMCHDRS})

171 172 173 174 175 176 177 178
ifeq ($(filter rom%,${MAKECMDGOALS}),)
CDEFINES     += ${RAMCDEFINES}
ASMDEFINES   += ${RAMASMDEFINES}
else
CDEFINES     += ${ROMCDEFINES}
ASMDEFINES   += ${ROMASMDEFINES}
endif

Ben Avison's avatar
Ben Avison committed
179 180 181 182 183 184 185
ifeq ("${INCLUDED_STDTOOLS}","")
include StdTools
endif
ifeq ("${INCLUDED_MODULELIBS}","")
include ModuleLibs
endif

186 187
CFLAGS       := -zM -zps1 ${CFLAGS}

Ben Avison's avatar
Ben Avison committed
188 189 190 191 192 193
ifeq ("${INCLUDED_MODSTDRULE}","")
include ModStdRule
endif
ifeq ("${INCLUDED_DBGRULES}","")
include DbgRules
endif
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243

# General rules

all: aof.${ROM_TARGET} rm.${SA_TARGET} rm.${DBG_TARGET}
        @${ECHO} ${COMPONENT}: all built

${DIRS} ::
        ${MKDIR} aif
        ${MKDIR} aof
        ${MKDIR} i
        ${MKDIR} linked
        ${MKDIR} gpa
        ${MKDIR} o
        ${MKDIR} od
        ${MKDIR} rm
        ${TOUCH} $@

clean ::
        @IfThere aif    Then ${ECHO} ${WIPE} aif ${WFLAGS}
        @IfThere aif    Then ${WIPE} aif ${WFLAGS}
        @IfThere aof    Then ${ECHO} ${WIPE} aof ${WFLAGS}
        @IfThere aof    Then ${WIPE} aof ${WFLAGS}
        @IfThere i      Then ${ECHO} ${WIPE} i ${WFLAGS}
        @IfThere i      Then ${WIPE} i ${WFLAGS}
        @IfThere linked Then ${ECHO} ${WIPE} linked ${WFLAGS}
        @IfThere linked Then ${WIPE} linked ${WFLAGS}
        @IfThere gpa    Then ${ECHO} ${WIPE} gpa ${WFLAGS}
        @IfThere gpa    Then ${WIPE} gpa ${WFLAGS}
        @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 rm     Then ${ECHO} ${WIPE} rm ${WFLAGS}
        @IfThere rm     Then ${WIPE} rm ${WFLAGS}
        @IfThere h.${CMHGFILE} Then ${RM} h.${CMHGFILE}
        @${ECHO} ${COMPONENT}: cleaned


# Export rules

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

export_: export_libs export_hdrs
        @${NOP}

create_exp_hdr_dirs:
        ${MKDIR} ${C_EXP_HDR}
        ${MKDIR} ${EXP_HDR}

244
ifneq (${CMHGFILE},)
245 246
o._h_${CMHGAUTOHDR}: h.${CMHGFILE} ${DIRS}
        Do ${AWK} -- "/.ifndef ${CMHGFILE_SWIPREFIX}/,/endif/" h.${CMHGFILE} > o._h_${CMHGAUTOHDR}
247
endif
248 249 250 251 252 253 254 255 256 257 258 259

ifneq ($(findstring ${CMHGAUTOHDR},${HDRS}),)
exphdr.${CMHGAUTOHDR}: h.${CMHGAUTOHDR} o._h_${CMHGAUTOHDR}
        FAppend ${C_EXP_HDR}.${CMHGAUTOHDR} h.${CMHGAUTOHDR} o._h_${CMHGAUTOHDR}
endif

ifneq ($(findstring ${CMHGAUTOHDR},${ASMCHDRS}),)
expasmc.${CMHGAUTOHDR}: hdr.${CMHGAUTOHDR} o._h_${CMHGAUTOHDR}
        ${HDR2H} hdr.${CMHGAUTOHDR} ${C_EXP_HDR}.${CMHGAUTOHDR}
        FAppend ${C_EXP_HDR}.${CMHGAUTOHDR} ${C_EXP_HDR}.${CMHGAUTOHDR} o._h_${CMHGAUTOHDR}
endif

260 261 262 263 264
ifneq (${CMHGDEPENDS},)
CMHGDEPENDS_ = $(addprefix o.,${CMHGDEPENDS}) $(addprefix od.,${CMHGDEPENDS}) $(addprefix i.,${CMHGDEPENDS})
${CMHGDEPENDS_}: h.${CMHGFILE}
endif

265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
.SUFFIXES: .exphdr .expasm .expasmc .h .hdr
.h.exphdr:;    @${ECHO} ${CP} $< ${C_EXP_HDR}.$(subst h.,,$<) ${CPFLAGS} ; ${CP} $< ${C_EXP_HDR}.$(subst h.,,$<) ${CPFLAGS} 
.hdr.expasm:;  @${ECHO} ${CP} $< ${EXP_HDR}.$(subst hdr.,,$<) ${CPFLAGS} ; ${CP} $< ${EXP_HDR}.$(subst hdr.,,$<) ${CPFLAGS} 
.hdr.expasmc:; @${ECHO} ${HDR2H} $< ${C_EXP_HDR}.$(subst hdr.,,$<)       ; ${HDR2H} $< ${C_EXP_HDR}.$(subst hdr.,,$<)

export_hdrs${CUSTOMEXP}: ${EXPORTING_ASMCHDRS} ${EXPORTING_ASMHDRS} ${EXPORTING_HDRS} ${DIRS} create_exp_hdr_dirs
        @${ECHO} ${COMPONENT}: header export complete

export_libs${CUSTOMEXP}:
        @${ECHO} ${COMPONENT}: no exported libraries


# Resources rules

resources${CUSTOMRES}: resources-${CMDHELP}
        @${ECHO} ${COMPONENT}: resources copied to Messages module

resources_common:
        ${MKDIR} ${RESFSDIR}
        ${TOKENCHECK} LocalRes:Messages
        ${CP} LocalRes:Messages ${RESFSDIR}.Messages ${CPFLAGS}

resources-None: resources_common
        ${CP} LocalRes:Messages ${RESFSDIR}.Messages ${CPFLAGS}

resources-: resources_common
        IfThere LocalRes:CmdHelp Then ${TOKENCHECK} LocalRes:CmdHelp
        IfThere LocalRes:CmdHelp Then FAppend ${RESFSDIR}.Messages LocalRes:Messages LocalRes:CmdHelp

${MERGEDMSGS}: LocalRes:Messages
        ${MKDIR} ${MERGEDMDIR}
        ${TOKENCHECK} LocalRes:Messages
        IfThere LocalRes:CmdHelp Then ${TOKENCHECK} LocalRes:CmdHelp
        IfThere LocalRes:CmdHelp Then FAppend $@ LocalRes:Messages LocalRes:CmdHelp Else ${CP} LocalRes:Messages $@ ${CPFLAGS}

ifneq (${RES_OBJ},)
o.${RES_OBJ}: ${MERGEDMSGS} ${DIRS}
	${RESGEN} ${RES_AREA} $@ ${MERGEDMSGS} ${RES_PATH}

od.${RES_OBJ}: o.${RES_OBJ} ${DIRS}
        ${CP} o.${RES_OBJ} od.${RES_OBJ} ${CPFLAGS}
endif


# ROM rules

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

rom_link${CUSTOMROM}: aof.${ROM_TARGET} ${ABSSYM} ${FORCEROMLINK}
        ${LD} ${LDFLAGS} ${LDLINKFLAGS} -o linked.${LNK_TARGET} -rmf -base ${ADDRESS} aof.${ROM_TARGET} ${ABSSYM}
        ${CP} linked.${LNK_TARGET} ${LINKDIR}.${TARGET} ${CPFLAGS}
        @${ECHO} ${COMPONENT}: rom_link complete

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

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


# Standalone rules

install${CUSTOMSA}: rm.${SA_TARGET}
        ${MKDIR} ${INSTDIR}
        ${CP} rm.${SA_TARGET} ${INSTDIR}.${TARGET} ${CPFLAGS}
        @${ECHO} ${COMPONENT}: ram module installed

standalone${CUSTOMSA}: rm.${SA_TARGET}
        @${ECHO} ${COMPONENT}: ram module built

debug${CUSTOMDBG}: rm.${DBG_TARGET}
        @${ECHO} ${COMPONENT}: debug module built

gpa_debug${CUSTOMGPA}: gpa.${GPA_TARGET}
        @${ECHO} ${COMPONENT}: GPA debug built

prepro: ${PP_OBJS_} ${DIRS}
        @${ECHO} ${COMPONENT}: sources preprocessed

rm.${SA_TARGET}: ${SA_OBJS_} ${SA_LIBS} ${CLIB} ${DIRS} ${SA_DEPEND}
        ${LD} ${LDFLAGS} ${LDRAMFLAGS} -o $@ -rmf ${SA_OBJS_} ${SA_LIBS} ${CLIB}
        ${MODSQZ} ${MODSQZFLAGS} $@
        ${CHMOD} -R a+rx rm

rm.${DBG_TARGET}: ${DBG_OBJS_} ${DBG_LIBS} ${SA_LIBS} ${CLIB} ${DIRS} ${SA_DEPEND}
        ${LD} ${LDFLAGS} ${LDRAMFLAGS} -o $@ -rmf ${DBG_OBJS_} ${DBG_LIBS} ${SA_LIBS} ${CLIB}
        ${CHMOD} -R a+rx rm

gpa.${GPA_TARGET}: aif.${AIF_TARGET}
        ${TOGPA} -s aif.${AIF_TARGET} $@

aif.${AIF_TARGET}: rm.${DBG_TARGET}
        ${LD} -aif -bin -d -o aif.${AIF_TARGET} ${DBG_OBJS_} ${DBG_LIBS} ${SA_LIBS} ${CLIB}

# EOF