bsd.prog.mk revision 1.189 1 # $NetBSD: bsd.prog.mk,v 1.189 2003/09/29 01:06:37 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
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 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 DPSRCS+= ${SRCS:M*.l:.l=.c} ${SRCS:M*.y:.y=.c}
122 DPSRCS+= ${YHEADER:D${SRCS:M*.y:.y=.h}}
123 CLEANFILES+= ${SRCS:M*.l:.l=.c} ${SRCS:M*.y:.y=.c}
124 CLEANFILES+= ${YHEADER:D${SRCS:M*.y:.y=.h}}
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} ${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}}
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 .if ${OBJECT_FMT} == "a.out"
140 LIBCRT0= ${DESTDIR}/lib/crt0.o
141 .endif
142 .endif
143 .if ${SHLIBDIR} != "/usr/lib"
144 _PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBDIR}:${DESTDIR}/usr/lib \
145 -R${SHLIBDIR} \
146 -L${DESTDIR}${SHLIBDIR}
147 .elif ${SHLIBINSTALLDIR} != "/usr/lib"
148 _PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR}:${DESTDIR}/usr/lib \
149 -L${DESTDIR}${SHLIBINSTALLDIR}
150 .endif
151
152 .if defined(PROG_CXX)
153 _CCLINK= ${CXX}
154 .if ${USE_LIBSTDCXX} == "no"
155 _SUPCXX= -lsupc++ -lm
156 .else
157 _SUPCXX= -lstdc++ -lm
158 .endif
159 .else
160 _CCLINK= ${CC}
161 .endif
162
163 .gdbinit:
164 rm -f .gdbinit
165 .if defined(DESTDIR) && !empty(DESTDIR)
166 echo "set solib-absolute-prefix ${DESTDIR}" > .gdbinit
167 .else
168 touch .gdbinit
169 .endif
170 .for __gdbinit in ${GDBINIT}
171 echo "source ${__gdbinit}" >> .gdbinit
172 .endfor
173
174 ${OBJS} ${LOBJS}: ${DPSRCS}
175
176 ${PROG}: .gdbinit ${LIBCRT0} ${OBJS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD}
177 .if !commands(${PROG})
178 .if defined(DESTDIR)
179 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} -nostdlib ${_PROGLDOPTS} ${LIBCRT0} ${LIBCRTBEGIN} ${OBJS} ${LDADD} -L${_GCC_LIBGCCDIR} -L${DESTDIR}/usr/lib ${_SUPCXX} -lgcc -lc -lgcc ${LIBCRTEND}
180 .else
181 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} ${OBJS} ${LDADD}
182 .endif # defined(DESTDIR)
183 .endif # !commands(${PROG})
184
185 ${PROG}.ro: ${OBJS} ${DPADD}
186 ${LD} -r -dc -o ${.TARGET} ${OBJS}
187
188 .endif # defined(OBJS) && !empty(OBJS)
189
190 .if !defined(MAN)
191 MAN= ${PROG}.1
192 .endif # !defined(MAN)
193 .endif # defined(PROG)
194
195 realall: ${PROG} ${SCRIPTS}
196
197 cleanprog: cleanobjs cleanextra
198 rm -f a.out [Ee]rrs mklog core *.core .gdbinit ${PROG}
199
200 cleanobjs:
201 .if defined(OBJS) && !empty(OBJS)
202 rm -f ${OBJS} ${LOBJS}
203 .endif
204
205 cleanextra:
206 .if defined(CLEANFILES) && !empty(CLEANFILES)
207 rm -f ${CLEANFILES}
208 .endif
209
210 .if defined(SRCS) && !target(afterdepend)
211 afterdepend: .depend
212 @(TMP=/tmp/_depend$$$$; trap 'rm -f $$TMP ; exit 1' 1 2 3 13 15; \
213 sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.ln:/' \
214 < .depend > $$TMP; \
215 mv $$TMP .depend)
216 .endif
217
218 .if defined(PROG) && !target(proginstall)
219 PROGNAME?=${PROG}
220
221 proginstall:: ${DESTDIR}${BINDIR}/${PROGNAME}
222 .PRECIOUS: ${DESTDIR}${BINDIR}/${PROGNAME}
223
224 __proginstall: .USE
225 ${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
226 ${STRIPFLAG} ${SYSPKGTAG} ${.ALLSRC} ${.TARGET}
227
228 .if ${MKUPDATE} == "no"
229 ${DESTDIR}${BINDIR}/${PROGNAME}! ${PROG} __proginstall
230 .if !defined(BUILD) && !make(all) && !make(${PROG})
231 ${DESTDIR}${BINDIR}/${PROGNAME}! .MADE
232 .endif
233 .else
234 ${DESTDIR}${BINDIR}/${PROGNAME}: ${PROG} __proginstall
235 .if !defined(BUILD) && !make(all) && !make(${PROG})
236 ${DESTDIR}${BINDIR}/${PROGNAME}: .MADE
237 .endif
238 .endif
239 .endif
240
241 .if !target(proginstall)
242 proginstall::
243 .endif
244
245 .if defined(SCRIPTS) && !target(scriptsinstall)
246 SCRIPTSDIR?=${BINDIR}
247 SCRIPTSOWN?=${BINOWN}
248 SCRIPTSGRP?=${BINGRP}
249 SCRIPTSMODE?=${BINMODE}
250
251 scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
252 .PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
253
254 __scriptinstall: .USE
255 ${INSTALL_FILE} \
256 -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
257 -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
258 -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
259 ${SYSPKGTAG} ${.ALLSRC} ${.TARGET}
260
261 .for S in ${SCRIPTS:O:u}
262 .if ${MKUPDATE} == "no"
263 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
264 .if !defined(BUILD) && !make(all) && !make(${S})
265 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
266 .endif
267 .else
268 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
269 .if !defined(BUILD) && !make(all) && !make(${S})
270 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
271 .endif
272 .endif
273 .endfor
274 .endif
275
276 .if !target(scriptsinstall)
277 scriptsinstall::
278 .endif
279
280 lint: ${LOBJS}
281 .if defined(LOBJS) && !empty(LOBJS)
282 ${LINT} ${LINTFLAGS} ${LDFLAGS:M-L*} ${LOBJS} ${LDADD}
283 .endif
284
285 ##### Pull in related .mk logic
286 .include <bsd.man.mk>
287 .include <bsd.nls.mk>
288 .include <bsd.files.mk>
289 .include <bsd.inc.mk>
290 .include <bsd.links.mk>
291 .include <bsd.sys.mk>
292 .include <bsd.dep.mk>
293
294 ${TARGETS}: # ensure existence
295
296 .endif # HOSTPROG
297