bsd.prog.mk revision 1.153 1 # $NetBSD: bsd.prog.mk,v 1.153 2002/02/07 07:43:24 pk 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 .if !defined(UPDATE)
169 .PHONY: ${DESTDIR}${BINDIR}/${PROGNAME}
170 .endif
171
172 __proginstall: .USE
173 ${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
174 ${STRIPFLAG} ${.ALLSRC} ${.TARGET}
175
176 .if !defined(BUILD) && !make(all) && !make(${PROG})
177 ${DESTDIR}${BINDIR}/${PROGNAME}: .MADE
178 .endif
179 ${DESTDIR}${BINDIR}/${PROGNAME}: ${PROG} __proginstall
180 .endif
181
182 .if !target(proginstall)
183 proginstall::
184 .endif
185
186 .if defined(SCRIPTS) && !target(scriptsinstall)
187 SCRIPTSDIR?=${BINDIR}
188 SCRIPTSOWN?=${BINOWN}
189 SCRIPTSGRP?=${BINGRP}
190 SCRIPTSMODE?=${BINMODE}
191
192 scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
193 .PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
194 .if !defined(UPDATE)
195 .PHONY: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
196 .endif
197
198 __scriptinstall: .USE
199 ${INSTALL_FILE} \
200 -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
201 -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
202 -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
203 ${.ALLSRC} ${.TARGET}
204
205 .for S in ${SCRIPTS:O:u}
206 .if !defined(BUILD) && !make(all) && !make(${S})
207 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
208 .endif
209 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
210 .endfor
211 .endif
212
213 .if !target(scriptsinstall)
214 scriptsinstall::
215 .endif
216
217 lint: ${LOBJS}
218 .if defined(LOBJS) && !empty(LOBJS)
219 ${LINT} ${LINTFLAGS} ${LDFLAGS:M-L*} ${LOBJS} ${LDADD}
220 .endif
221
222 ##### Pull in related .mk logic
223 .include <bsd.man.mk>
224 .include <bsd.nls.mk>
225 .include <bsd.files.mk>
226 .include <bsd.inc.mk>
227 .include <bsd.links.mk>
228 .include <bsd.dep.mk>
229 .include <bsd.sys.mk>
230
231 ${TARGETS}: # ensure existence
232