bsd.prog.mk revision 1.155 1 # $NetBSD: bsd.prog.mk,v 1.155 2002/03/27 05:40:54 eeh 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 POSIX RESOLV RMT ROKEN RPCSVC SKEY SS SSL SL \
50 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 .if defined(DESTDIR)
122
123 ${PROG}: ${LIBCRT0} ${DPSRCS} ${OBJS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD}
124 .if !commands(${PROG})
125 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} -nostdlib ${_PROGLDOPTS} ${LIBCRT0} ${LIBCRTBEGIN} ${OBJS} ${LDADD} -L${DESTDIR}/usr/lib ${_SUPCXX} -lgcc -lc -lgcc ${LIBCRTEND}
126 .endif
127
128 .else
129
130 ${PROG}: ${LIBCRT0} ${DPSRCS} ${OBJS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD}
131 .if !commands(${PROG})
132 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} ${OBJS} ${LDADD}
133 .endif
134
135 .endif # defined(DESTDIR)
136 .endif # defined(OBJS) && !empty(OBJS)
137
138 .if !defined(MAN)
139 MAN= ${PROG}.1
140 .endif # !defined(MAN)
141 .endif # defined(PROG)
142
143 realall: ${PROG} ${SCRIPTS}
144
145 cleanprog: cleanobjs cleanextra
146 rm -f a.out [Ee]rrs mklog core *.core ${PROG}
147
148 cleanobjs:
149 .if defined(OBJS) && !empty(OBJS)
150 rm -f ${OBJS} ${LOBJS}
151 .endif
152
153 cleanextra:
154 .if defined(CLEANFILES) && !empty(CLEANFILES)
155 rm -f ${CLEANFILES}
156 .endif
157
158 .if defined(SRCS) && !target(afterdepend)
159 afterdepend: .depend
160 @(TMP=/tmp/_depend$$$$; \
161 sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.ln:/' \
162 < .depend > $$TMP; \
163 mv $$TMP .depend)
164 .endif
165
166 .if defined(PROG) && !target(proginstall)
167 PROGNAME?=${PROG}
168
169 proginstall:: ${DESTDIR}${BINDIR}/${PROGNAME}
170 .PRECIOUS: ${DESTDIR}${BINDIR}/${PROGNAME}
171
172 __proginstall: .USE
173 ${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
174 ${STRIPFLAG} ${.ALLSRC} ${.TARGET}
175
176 .if !defined(UPDATE)
177 ${DESTDIR}${BINDIR}/${PROGNAME}! ${PROG} __proginstall
178 .if !defined(BUILD) && !make(all) && !make(${PROG})
179 ${DESTDIR}${BINDIR}/${PROGNAME}! .MADE
180 .endif
181 .else
182 ${DESTDIR}${BINDIR}/${PROGNAME}: ${PROG} __proginstall
183 .if !defined(BUILD) && !make(all) && !make(${PROG})
184 ${DESTDIR}${BINDIR}/${PROGNAME}: .MADE
185 .endif
186 .endif
187 .endif
188
189 .if !target(proginstall)
190 proginstall::
191 .endif
192
193 .if defined(SCRIPTS) && !target(scriptsinstall)
194 SCRIPTSDIR?=${BINDIR}
195 SCRIPTSOWN?=${BINOWN}
196 SCRIPTSGRP?=${BINGRP}
197 SCRIPTSMODE?=${BINMODE}
198
199 scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
200 .PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
201
202 __scriptinstall: .USE
203 ${INSTALL_FILE} \
204 -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
205 -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
206 -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
207 ${.ALLSRC} ${.TARGET}
208
209 .for S in ${SCRIPTS:O:u}
210 .if !defined(UPDATE)
211 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
212 .if !defined(BUILD) && !make(all) && !make(${S})
213 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
214 .endif
215 .else
216 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
217 .if !defined(BUILD) && !make(all) && !make(${S})
218 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
219 .endif
220 .endif
221 .endfor
222 .endif
223
224 .if !target(scriptsinstall)
225 scriptsinstall::
226 .endif
227
228 lint: ${LOBJS}
229 .if defined(LOBJS) && !empty(LOBJS)
230 ${LINT} ${LINTFLAGS} ${LDFLAGS:M-L*} ${LOBJS} ${LDADD}
231 .endif
232
233 ##### Pull in related .mk logic
234 .include <bsd.man.mk>
235 .include <bsd.nls.mk>
236 .include <bsd.files.mk>
237 .include <bsd.inc.mk>
238 .include <bsd.links.mk>
239 .include <bsd.dep.mk>
240 .include <bsd.sys.mk>
241
242 ${TARGETS}: # ensure existence
243