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