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