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