bsd.prog.mk revision 1.187 1 # $NetBSD: bsd.prog.mk,v 1.187 2003/09/14 22:36:55 lukem Exp $
2 # @(#)bsd.prog.mk 8.2 (Berkeley) 4/2/94
3
4 .ifndef HOSTPROG
5
6 .include <bsd.init.mk>
7 .include <bsd.shlib.mk>
8 .include <bsd.gcc.mk>
9
10 .if defined(PROG_CXX)
11 PROG= ${PROG_CXX}
12 .endif
13
14 ##### Basic targets
15 .PHONY: cleanextra cleanobjs cleanprog proginstall scriptsinstall
16 realinstall: proginstall scriptsinstall
17 clean: cleanprog
18
19 ##### PROG specific flags.
20 COPTS+= ${COPTS.${PROG}}
21 CPPFLAGS+= ${CPPFLAGS.${PROG}}
22 CXXFLAGS+= ${CXXFLAGS.${PROG}}
23 LDADD+= ${LDADD.${PROG}}
24 LDFLAGS+= ${LDFLAGS.${PROG}}
25 LDSTATIC+= ${LDSTATIC.${PROG}}
26
27 ##### Default values
28 CPPFLAGS+= ${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include}
29 CXXFLAGS+= ${DESTDIR:D-nostdinc++ ${CPPFLAG_ISYSTEMXX} ${DESTDIR}/usr/include/g++}
30 CFLAGS+= ${COPTS}
31 .if ${MACHINE_ARCH} == "sparc64"
32 CFLAGS+= -mcmodel=medlow
33 .endif
34
35 # ELF platforms depend on crti.o, crtbegin.o, crtend.o, and crtn.o
36 .if ${OBJECT_FMT} == "ELF"
37 .ifndef LIBCRTBEGIN
38 LIBCRTBEGIN= ${DESTDIR}/usr/lib/crti.o ${_GCC_CRTBEGIN}
39 .MADE: ${LIBCRTBEGIN}
40 .endif
41 .ifndef LIBCRTEND
42 LIBCRTEND= ${_GCC_CRTEND} ${DESTDIR}/usr/lib/crtn.o
43 .MADE: ${LIBCRTEND}
44 .endif
45 _SHLINKER= ${SHLINKDIR}/ld.elf_so
46 .else
47 LIBCRTBEGIN?=
48 LIBCRTEND?=
49 _SHLINKER= ${SHLINKDIR}/ld.so
50 .endif
51
52 .ifndef LIBCRT0
53 LIBCRT0= ${DESTDIR}/usr/lib/crt0.o
54 .MADE: ${LIBCRT0}
55 .endif
56
57 ##### Installed system library definitions
58 # E.g. LIBC?=${DESTDIR}/usr/lib/libc.a
59 # etc..
60 #
61 __bsd_prog_mk_system_libs?= \
62 BZ2 C C_PIC CDK COM_ERR COMPAT CRYPT CRYPTO CRYPTO_IDEA CRYPTO_MDC2 \
63 CRYPTO_RC5 \
64 CURSES DBM DES EDIT EVENT FORM GCC GNUMALLOC GSSAPI HDB INTL IPSEC \
65 KADM KADM5CLNT KADM5SRV KAFS KDB KRB KRB5 KSTREAM KVM L M MENU \
66 OBJC OSSAUDIO PCAP PCI PMC POSIX PTHREAD PTHREAD_DBG RESOLV RMT \
67 ROKEN RPCSVC RT SKEY SS SSL SL TERMCAP USBHID UTIL WRAP Y Z
68
69 .for _n in ${__bsd_prog_mk_system_libs}
70 .ifndef LIB${_n}
71 LIB${_n}= ${DESTDIR}/usr/lib/lib${_n:tl}.a
72 # Note: ${DESTDIR} will be expanded in the following rule
73 .MADE: ${LIB${_n}}
74 .endif
75 .endfor
76 .undef __bsd_prog_mk_system_libs
77
78 ##### Installed X11R6 library definitions
79 # E.g. LIBX11?=${DESTDIR}/usr/X11R6/lib/libX11.a
80 # etc..
81 #
82 __bsd_prog_mk_x11r6_libs?= \
83 dps expat fntstubs fontcache fontconfig fontenc freetype FS \
84 GL GLU ICE lbxutil SM X11 Xau Xaw Xdmcp Xext Xfont Xft \
85 Xi Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt \
86 XTrap Xtst Xv Xxf86dga Xxf86misc Xxf86vm
87
88 .for _n in ${__bsd_prog_mk_x11r6_libs}
89 .ifndef LIB${_n:tu}
90 LIB${_n:tu}= ${DESTDIR}/usr/X11R6/lib/lib${_n}.a
91 # Note: ${DESTDIR} will be expanded in the following rule
92 .MADE: ${LIB${_n:tu}}
93 .endif
94 .endfor
95 .undef __bsd_prog_mk_x11r6_libs
96
97 ##### Build and install rules
98 .if defined(SHAREDSTRINGS)
99 CLEANFILES+=strings
100 .c.o:
101 ${CC} -E ${CFLAGS} ${.IMPSRC} | xstr -c -
102 @${CC} ${CFLAGS} -c x.c -o ${.TARGET}
103 @rm -f x.c
104
105 .cc.o .cpp.o .cxx.o .C.o:
106 ${CXX} -E ${CXXFLAGS} ${.IMPSRC} | xstr -c -
107 @mv -f x.c x.cc
108 @${CXX} ${CXXFLAGS} -c x.cc -o ${.TARGET}
109 @rm -f x.cc
110 .endif
111
112 .if defined(PROG)
113 .if defined(PROG_CXX)
114 SRCS?= ${PROG}.cc
115 .else
116 SRCS?= ${PROG}.c
117 .endif
118
119 DPSRCS+= ${SRCS:M*.l:.l=.c} ${SRCS:M*.y:.y=.c}
120 DPSRCS+= ${YHEADER:D${SRCS:M*.y:.y=.h}}
121 CLEANFILES+= ${SRCS:M*.l:.l=.c} ${SRCS:M*.y:.y=.c}
122 CLEANFILES+= ${YHEADER:D${SRCS:M*.y:.y=.h}}
123
124 .if !empty(SRCS:N*.h:N*.sh:N*.fth)
125 OBJS+= ${SRCS:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
126 LOBJS+= ${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln}
127 .endif
128
129 .if defined(OBJS) && !empty(OBJS)
130 .NOPATH: ${OBJS} ${PROG} ${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}}
131
132 _PROGLDOPTS=
133 .if ${SHLINKDIR} != "/usr/libexec" # XXX: change or remove if ld.so moves
134 .if ${OBJECT_FMT} == "ELF"
135 _PROGLDOPTS+= -Wl,-dynamic-linker=${_SHLINKER}
136 .endif
137 .if ${OBJECT_FMT} == "a.out"
138 LIBCRT0= ${DESTDIR}/lib/crt0.o
139 .endif
140 .endif
141 .if ${SHLIBDIR} != "/usr/lib"
142 _PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBDIR}:${DESTDIR}/usr/lib \
143 -R${SHLIBDIR} \
144 -L${DESTDIR}${SHLIBDIR}
145 .elif ${SHLIBINSTALLDIR} != "/usr/lib"
146 _PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR}:${DESTDIR}/usr/lib \
147 -L${DESTDIR}${SHLIBINSTALLDIR}
148 .endif
149
150 .if defined(PROG_CXX)
151 _CCLINK= ${CXX}
152 .if ${USE_LIBSTDCXX} == "no"
153 _SUPCXX= -lsupc++ -lm
154 .else
155 _SUPCXX= -lstdc++ -lm
156 .endif
157 .else
158 _CCLINK= ${CC}
159 .endif
160
161 .gdbinit:
162 rm -f .gdbinit
163 .if defined(DESTDIR) && !empty(DESTDIR)
164 echo "set solib-absolute-prefix ${DESTDIR}" > .gdbinit
165 .else
166 touch .gdbinit
167 .endif
168 .for __gdbinit in ${GDBINIT}
169 echo "source ${__gdbinit}" >> .gdbinit
170 .endfor
171
172 ${OBJS} ${LOBJS}: ${DPSRCS}
173
174 ${PROG}: .gdbinit ${LIBCRT0} ${OBJS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD}
175 .if !commands(${PROG})
176 .if defined(DESTDIR)
177 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} -nostdlib ${_PROGLDOPTS} ${LIBCRT0} ${LIBCRTBEGIN} ${OBJS} ${LDADD} -L${_GCC_LIBGCCDIR} -L${DESTDIR}/usr/lib ${_SUPCXX} -lgcc -lc -lgcc ${LIBCRTEND}
178 .else
179 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} ${OBJS} ${LDADD}
180 .endif # defined(DESTDIR)
181 .endif # !commands(${PROG})
182
183 ${PROG}.ro: ${OBJS} ${DPADD}
184 ${LD} -r -dc -o ${.TARGET} ${OBJS}
185
186 .endif # defined(OBJS) && !empty(OBJS)
187
188 .if !defined(MAN)
189 MAN= ${PROG}.1
190 .endif # !defined(MAN)
191 .endif # defined(PROG)
192
193 realall: ${PROG} ${SCRIPTS}
194
195 cleanprog: cleanobjs cleanextra
196 rm -f a.out [Ee]rrs mklog core *.core .gdbinit ${PROG}
197
198 cleanobjs:
199 .if defined(OBJS) && !empty(OBJS)
200 rm -f ${OBJS} ${LOBJS}
201 .endif
202
203 cleanextra:
204 .if defined(CLEANFILES) && !empty(CLEANFILES)
205 rm -f ${CLEANFILES}
206 .endif
207
208 .if defined(SRCS) && !target(afterdepend)
209 afterdepend: .depend
210 @(TMP=/tmp/_depend$$$$; trap 'rm -f $$TMP ; exit 1' 1 2 3 13 15; \
211 sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.ln:/' \
212 < .depend > $$TMP; \
213 mv $$TMP .depend)
214 .endif
215
216 .if defined(PROG) && !target(proginstall)
217 PROGNAME?=${PROG}
218
219 proginstall:: ${DESTDIR}${BINDIR}/${PROGNAME}
220 .PRECIOUS: ${DESTDIR}${BINDIR}/${PROGNAME}
221
222 __proginstall: .USE
223 ${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
224 ${STRIPFLAG} ${SYSPKGTAG} ${.ALLSRC} ${.TARGET}
225
226 .if ${MKUPDATE} == "no"
227 ${DESTDIR}${BINDIR}/${PROGNAME}! ${PROG} __proginstall
228 .if !defined(BUILD) && !make(all) && !make(${PROG})
229 ${DESTDIR}${BINDIR}/${PROGNAME}! .MADE
230 .endif
231 .else
232 ${DESTDIR}${BINDIR}/${PROGNAME}: ${PROG} __proginstall
233 .if !defined(BUILD) && !make(all) && !make(${PROG})
234 ${DESTDIR}${BINDIR}/${PROGNAME}: .MADE
235 .endif
236 .endif
237 .endif
238
239 .if !target(proginstall)
240 proginstall::
241 .endif
242
243 .if defined(SCRIPTS) && !target(scriptsinstall)
244 SCRIPTSDIR?=${BINDIR}
245 SCRIPTSOWN?=${BINOWN}
246 SCRIPTSGRP?=${BINGRP}
247 SCRIPTSMODE?=${BINMODE}
248
249 scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
250 .PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
251
252 __scriptinstall: .USE
253 ${INSTALL_FILE} \
254 -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
255 -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
256 -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
257 ${SYSPKGTAG} ${.ALLSRC} ${.TARGET}
258
259 .for S in ${SCRIPTS:O:u}
260 .if ${MKUPDATE} == "no"
261 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
262 .if !defined(BUILD) && !make(all) && !make(${S})
263 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
264 .endif
265 .else
266 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
267 .if !defined(BUILD) && !make(all) && !make(${S})
268 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
269 .endif
270 .endif
271 .endfor
272 .endif
273
274 .if !target(scriptsinstall)
275 scriptsinstall::
276 .endif
277
278 lint: ${LOBJS}
279 .if defined(LOBJS) && !empty(LOBJS)
280 ${LINT} ${LINTFLAGS} ${LDFLAGS:M-L*} ${LOBJS} ${LDADD}
281 .endif
282
283 ##### Pull in related .mk logic
284 .include <bsd.man.mk>
285 .include <bsd.nls.mk>
286 .include <bsd.files.mk>
287 .include <bsd.inc.mk>
288 .include <bsd.links.mk>
289 .include <bsd.sys.mk>
290 .include <bsd.dep.mk>
291
292 ${TARGETS}: # ensure existence
293
294 .endif # HOSTPROG
295