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
178
# Makefile fragment for C and C++ libraries for applications and modules
#
# This makefile provides the following phony targets:
#
# all_libs export_hdrs export_libs
#
#
# This fragment uses the following macros set by the master makefile.
#
#
# COMPONENT (the name of the component)
# TARGET (opt) (the leafname of the primary target - otherwise ${COMPONENT})
# LIBRARY (opt) (the leafname of the application library - otherwise ${TARGET})
# LIBRARYZM (opt) (the leafname of the module library - otherwise ${LIBRARY}zm)
# LIBRARYD (opt) (the leafname of the debug app library - otherwise ${LIBRARY}d)
# LIBRARYDZM (opt) (the leafname of the debug module library - otherwise ${LIBRARY}dzm)
# LIBRARIES (opt) (libraries to build/export - otherwise ${LIBRARY} and ${LIBRARYZM})
# LIBEXT (opt) (subdir or filename extension for library files - otherwise a)
# EXPDIR (opt) (the target directory - otherwise ${LIBDIR}/${TARGET})
# DIRS (opt) (stamp object for directory creation - otherwise _dirs)
# HDRS (opt) (header files to export, no h. prefix - otherwise ${TARGET})
# ASMHDRS (opt) (assembly header files to export, no Hdr. prefix - otherwise none)
# OBJS (object files, no o. or oz. prefixes)
# DBG_OBJS (opt) (debug build object files, no o. or oz. prefixes - otherwise ${OBJS})
# APP_OBJS (opt) (object files for application version - otherwise derived from ${OBJS})
# APP_DBG_OBJS (opt) (object files for debug app version - otherwise derived from ${DBG_OBJS})
# MOD_OBJS (opt) (object files for module version - otherwise derived from ${OBJS})
# MOD_DBG_OBJS (opt) (object files for debug module version - otherwise derived from ${DBG_OBJS})
# CLEAN_DEPEND (opt) (phony target for additional clean actions)
# CUSTOMLIB (opt) (set to "custom" to override the application library rule)
# CUSTOMLIBZM (opt) (set to "custom" to override the module library rule)
# CUSTOMLIBD (opt) (set to "custom" to override the debug application library rule)
# CUSTOMLIBDZM (opt) (set to "custom" to override the debug module library rule)
# 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 from the build system:
#
#
# PHASE (export phase discriminator)
#
#
# It relies on the following generic tool macros from the StdTools makefile
#
#
# CP + CPFLAGS (copy, cp etc.)
# WIPE + WFLAGS (recursive delete)
# RM (non-recursive delete)
# AS + ASFLAGS (assembler)
# MKDIR (cdir/mkdir -p)
# ECHO
# AR + ARFLAGS (libfile/ar)
# TOUCH (create/touch)
# NOP
#
#
# It relies on the following from the StdRules makefile
#
#
# .c.o .c.oz .c++.o .cpp.o .c++.oz .c++.oz .s.o .s.oz
#
#
# It relies on the following from the DbgRules makefile
#
#
# CDFLAGS C++DFLAGS ASDFLAGS
# .c.od .c.odz .c++.od .cpp.od .c++.odz .cpp.odz .s.od .s.odz
#
#
LIBDIR = ${BUILDDIR}/Export/${APCS}/Lib
TARGET ?= ${COMPONENT}
LIBRARY ?= ${TARGET}
LIBRARYZM ?= ${LIBRARY}zm
LIBRARYD ?= ${LIBRARY}d
LIBRARYDZM ?= ${LIBRARY}dzm
LIBRARIES ?= ${LIBRARYZM} ${LIBRARY}
LIBEXT ?= a
EXPDIR ?= ${LIBDIR}/${TARGET}
DIRS ?= _dirs
HDRS ?= ${TARGET}
ASMHDRS ?=
DBG_OBJS ?= ${OBJS}
APP_OBJS ?= $(addsuffix .o,${OBJS})
APP_DBG_OBJS ?= $(addsuffix .od,${DBG_OBJS})
MOD_OBJS ?= $(addsuffix .oz,${OBJS})
MOD_DBG_OBJS ?= $(addsuffix .odz,${DBG_OBJS})
EXPORTING_HDRS = $(addsuffix .exphdr,${HDRS})
EXPORTING_ASMHDRS = $(addsuffix .expasm,${ASMHDRS})
EXPORTING_LIBS = $(addsuffix .explib,${LIBRARIES})
TARGET_LIBS = $(addsuffix .${LIBEXT},${LIBRARIES})
SOURCES_TO_SYMLINK += $(wildcard c/*) $(wildcard h/*) $(wildcard s/*)
ifneq (objs,$(notdir ${CURDIR}))
# Makefile invoked from same directory
# Create link farm, then execute the makefile from within it
all_libs export_hdrs export_libs clean links: ${SYMLINK_DEPEND}
ifneq (clean,${MAKECMDGOALS})
$(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} $$linkdestdir; \
[ -d ${linksource} ] || [ -L $$linkdest ] || ln -s $$linkbackpath/${linksource} $$linkdest; \
) \
)
endif
@[ -d objs ] || ${MKDIR} objs
ifneq (links,${MAKECMDGOALS})
@${MAKE} -C objs -f ../$(firstword ${MAKEFILE_LIST}) ${MAKECMDGOALS}
endif
else
# Makefile invoked from objs subdirectory
all_libs: ${TARGET_LIBS}
@${ECHO} ${COMPONENT}: library built
${DIRS}:
${TOUCH} $@
clean :: ${CLEAN_DEPEND}
@${ECHO} Cleaning...
@cd .. && ${WIPE} objs ${WFLAGS}
@${ECHO} ${COMPONENT}: cleaned
export: export_${PHASE}
${NOP}
export_: export_libs export_hdrs
${NOP}
create_exp_hdr_dirs:
${MKDIR} ${EXPDIR}
create_exp_lib_dir:
${MKDIR} ${EXPDIR}
.SUFFIXES: .exphdr .expasm .explib .h .Hdr .${LIBEXT}
.h.exphdr:; ${CP} $< ${EXPDIR}/$< ${CPFLAGS}
.Hdr.expasm:; ${CP} $< ${EXPDIR}/$< ${CPFLAGS}
.${LIBEXT}.explib:; ${CP} $< ${EXPDIR}/$< ${CPFLAGS}
export_hdrs: create_exp_hdr_dirs ${DIRS} ${EXPORTING_ASMHDRS} ${EXPORTING_HDRS}
[ ! -f ../VersionNum ] || ${CP} ../VersionNum ${EXPDIR}/LibVersion ${CPFLAGS}
@${ECHO} ${COMPONENT}: header export complete
export_libs: create_exp_lib_dir ${DIRS} ${EXPORTING_LIBS} ${TARGET_LIBS}
[ ! -f ../VersionNum ] || ${CP} ../VersionNum ${EXPDIR}/LibVersion ${CPFLAGS}
@${ECHO} ${COMPONENT}: library export complete
${LIBRARY}${CUSTOMLIB}.${LIBEXT}: ${DIRS} ${APP_OBJS}
${AR} ${ARFLAGS} ${LIBRARY}.${LIBEXT} ${APP_OBJS}
${LIBRARYZM}${CUSTOMLIBZM}.${LIBEXT}: ${DIRS} ${MOD_OBJS}
${AR} ${ARFLAGS} ${LIBRARYZM}.${LIBEXT} ${MOD_OBJS}
${LIBRARYD}${CUSTOMLIBD}.${LIBEXT}: ${DIRS} ${APP_DBG_OBJS}
${AR} ${ARFLAGS} ${LIBRARYD}.${LIBEXT} ${APP_DBG_OBJS}
${LIBRARYDZM}${CUSTOMLIBDZM}.${LIBEXT}: ${DIRS} ${MOD_DBG_OBJS}
${AR} ${ARFLAGS} ${LIBRARYDZM}.${LIBEXT} ${MOD_DBG_OBJS}
include $(wildcard *.d)
include $(wildcard *.dz)
include $(wildcard *.dd)
include $(wildcard *.ddz)
endif
# EOF