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