bsd.prog.mk revision 1.197 1 # $NetBSD: bsd.prog.mk,v 1.197 2004/01/29 01:48:45 lukem Exp $
2 # @(#)bsd.prog.mk 8.2 (Berkeley) 4/2/94
3
4 .ifndef HOSTPROG
5
6 .include <bsd.init.mk>
7 .include <bsd.shlib.mk>
8 .include <bsd.gcc.mk>
9
10 .if defined(PROG_CXX)
11 PROG= ${PROG_CXX}
12 .endif
13
14 ##### Basic targets
15 realinstall: proginstall scriptsinstall
16 clean: cleanprog
17
18 ##### PROG specific flags.
19 COPTS+= ${COPTS.${PROG}}
20 CPPFLAGS+= ${CPPFLAGS.${PROG}}
21 CXXFLAGS+= ${CXXFLAGS.${PROG}}
22 LDADD+= ${LDADD.${PROG}}
23 LDFLAGS+= ${LDFLAGS.${PROG}}
24 LDSTATIC+= ${LDSTATIC.${PROG}}
25
26 ##### Default values
27 CPPFLAGS+= ${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include}
28 CXXFLAGS+= ${DESTDIR:D-nostdinc++ ${CPPFLAG_ISYSTEMXX} ${DESTDIR}/usr/include/g++}
29 CFLAGS+= ${COPTS}
30 MKDEP_SUFFIXES?= .o .ln
31
32 # ELF platforms depend on crti.o, crtbegin.o, crtend.o, and crtn.o
33 .if ${OBJECT_FMT} == "ELF"
34 .ifndef LIBCRTBEGIN
35 LIBCRTBEGIN= ${DESTDIR}/usr/lib/crti.o ${_GCC_CRTBEGIN}
36 .MADE: ${LIBCRTBEGIN}
37 .endif
38 .ifndef LIBCRTEND
39 LIBCRTEND= ${_GCC_CRTEND} ${DESTDIR}/usr/lib/crtn.o
40 .MADE: ${LIBCRTEND}
41 .endif
42 _SHLINKER= ${SHLINKDIR}/ld.elf_so
43 .else
44 LIBCRTBEGIN?=
45 LIBCRTEND?=
46 _SHLINKER= ${SHLINKDIR}/ld.so
47 .endif
48
49 .ifndef LIBCRT0
50 LIBCRT0= ${DESTDIR}/usr/lib/crt0.o
51 .MADE: ${LIBCRT0}
52 .endif
53
54 ##### Installed system library definitions
55 # E.g. LIBC?=${DESTDIR}/usr/lib/libc.a
56 # etc..
57 #
58 __bsd_prog_mk_system_libs?= \
59 BZ2 C C_PIC CDK COM_ERR COMPAT CRYPT CRYPTO CRYPTO_IDEA CRYPTO_MDC2 \
60 CRYPTO_RC5 \
61 CURSES DBM DES EDIT EVENT FORM GCC GNUMALLOC GSSAPI HDB INTL IPSEC \
62 KADM KADM5CLNT KADM5SRV KAFS KDB KRB KRB5 KSTREAM KVM L M MENU \
63 OBJC OSSAUDIO PCAP PCI PMC POSIX PTHREAD PTHREAD_DBG RESOLV RMT \
64 ROKEN RPCSVC RT SKEY SL SS SSL TERMCAP USBHID UTIL WRAP Y Z
65
66 .for _n in ${__bsd_prog_mk_system_libs}
67 .ifndef LIB${_n}
68 LIB${_n}= ${DESTDIR}/usr/lib/lib${_n:tl}.a
69 # Note: ${DESTDIR} will be expanded in the following rule
70 .MADE: ${LIB${_n}}
71 .endif
72 .endfor
73 .undef __bsd_prog_mk_system_libs
74
75 .ifndef LIBSTDCXX
76 LIBSTDCXX= ${DESTDIR}/usr/lib/libstdc++.a
77 .MADE: ${LIBSTDCXX}
78 .endif
79
80 ##### Installed X11R6 library definitions
81 # E.g. LIBX11?=${DESTDIR}/usr/X11R6/lib/libX11.a
82 # etc..
83 #
84 __bsd_prog_mk_x11r6_libs?= \
85 dps expat fntstubs fontcache fontconfig fontenc freetype FS \
86 GL GLU ICE lbxutil SM X11 Xau Xaw Xdmcp Xext Xfont Xft \
87 Xi Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt \
88 XTrap Xtst Xv Xxf86dga Xxf86misc Xxf86vm
89
90 .for _n in ${__bsd_prog_mk_x11r6_libs}
91 .ifndef LIB${_n:tu}
92 LIB${_n:tu}= ${DESTDIR}/usr/X11R6/lib/lib${_n}.a
93 # Note: ${DESTDIR} will be expanded in the following rule
94 .MADE: ${LIB${_n:tu}}
95 .endif
96 .endfor
97 .undef __bsd_prog_mk_x11r6_libs
98
99 ##### Build and install rules
100 .if defined(SHAREDSTRINGS)
101 CLEANFILES+=strings
102 .c.o:
103 ${CC} -E ${CFLAGS} ${.IMPSRC} | xstr -c -
104 @${CC} ${CFLAGS} -c x.c -o ${.TARGET}
105 @rm -f x.c
106
107 .cc.o .cpp.o .cxx.o .C.o:
108 ${CXX} -E ${CXXFLAGS} ${.IMPSRC} | xstr -c -
109 @mv -f x.c x.cc
110 @${CXX} ${CXXFLAGS} -c x.cc -o ${.TARGET}
111 @rm -f x.cc
112 .endif
113
114 .if defined(PROG)
115 .if defined(PROG_CXX)
116 SRCS?= ${PROG}.cc
117 .else
118 SRCS?= ${PROG}.c
119 .endif
120
121 DPSRCS+= ${SRCS:M*.l:.l=.c} ${SRCS:M*.y:.y=.c}
122 DPSRCS+= ${YHEADER:D${SRCS:M*.y:.y=.h}}
123 CLEANFILES+= ${SRCS:M*.l:.l=.c} ${SRCS:M*.y:.y=.c}
124 CLEANFILES+= ${YHEADER:D${SRCS:M*.y:.y=.h}}
125
126 .if !empty(SRCS:N*.h:N*.sh:N*.fth)
127 OBJS+= ${SRCS:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
128 LOBJS+= ${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln}
129 .endif
130
131 .if defined(OBJS) && !empty(OBJS)
132 .NOPATH: ${OBJS} ${PROG} ${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}}
133
134 _PROGLDOPTS=
135 .if ${SHLINKDIR} != "/usr/libexec" # XXX: change or remove if ld.so moves
136 .if ${OBJECT_FMT} == "ELF"
137 _PROGLDOPTS+= -Wl,-dynamic-linker=${_SHLINKER}
138 .endif
139 .endif
140 .if ${SHLIBDIR} != "/usr/lib"
141 _PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBDIR}:${DESTDIR}/usr/lib \
142 -R${SHLIBDIR} \
143 -L${DESTDIR}${SHLIBDIR}
144 .elif ${SHLIBINSTALLDIR} != "/usr/lib"
145 _PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR}:${DESTDIR}/usr/lib \
146 -L${DESTDIR}${SHLIBINSTALLDIR}
147 .endif
148
149 .if defined(PROG_CXX)
150 _CCLINK= ${CXX}
151 .if ${USE_LIBSTDCXX} == "no"
152 _SUPCXX= -lsupc++ -lm
153 .else
154 _SUPCXX= -lstdc++ -lm
155 .endif
156 .else
157 _CCLINK= ${CC}
158 .endif
159
160 .gdbinit:
161 rm -f .gdbinit
162 .if defined(DESTDIR) && !empty(DESTDIR)
163 echo "set solib-absolute-prefix ${DESTDIR}" > .gdbinit
164 .else
165 touch .gdbinit
166 .endif
167 .for __gdbinit in ${GDBINIT}
168 echo "source ${__gdbinit}" >> .gdbinit
169 .endfor
170
171 ${OBJS} ${LOBJS}: ${DPSRCS}
172
173 ${PROG}: .gdbinit ${LIBCRT0} ${OBJS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD}
174 .if !commands(${PROG})
175 ${_MKTARGET_LINK}
176 .if defined(DESTDIR)
177 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} -nostdlib ${_PROGLDOPTS} ${LIBCRT0} ${LIBCRTBEGIN} ${OBJS} ${LDADD} -L${_GCC_LIBGCCDIR} -L${DESTDIR}/usr/lib ${_SUPCXX} -lgcc -lc -lgcc ${LIBCRTEND}
178 .else
179 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} ${OBJS} ${LDADD}
180 .endif # defined(DESTDIR)
181 .endif # !commands(${PROG})
182
183 ${PROG}.ro: ${OBJS} ${DPADD}
184 ${LD} -r -dc -o ${.TARGET} ${OBJS}
185
186 .endif # defined(OBJS) && !empty(OBJS)
187
188 .if !defined(MAN)
189 MAN= ${PROG}.1
190 .endif # !defined(MAN)
191 .endif # defined(PROG)
192
193 realall: ${PROG} ${SCRIPTS}
194
195 cleanprog: .PHONY cleanobjs cleanextra
196 rm -f a.out [Ee]rrs mklog core *.core .gdbinit ${PROG}
197
198 cleanobjs: .PHONY
199 .if defined(OBJS) && !empty(OBJS)
200 rm -f ${OBJS} ${LOBJS}
201 .endif
202
203 cleanextra: .PHONY
204 .if defined(CLEANFILES) && !empty(CLEANFILES)
205 rm -f ${CLEANFILES}
206 .endif
207
208 .if defined(PROG) && !target(proginstall)
209 PROGNAME?=${PROG}
210
211 proginstall:: ${DESTDIR}${BINDIR}/${PROGNAME}
212 .PRECIOUS: ${DESTDIR}${BINDIR}/${PROGNAME}
213
214 __proginstall: .USE
215 ${_MKTARGET_INSTALL}
216 ${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
217 ${STRIPFLAG} ${SYSPKGTAG} ${.ALLSRC} ${.TARGET}
218
219 .if ${MKUPDATE} == "no"
220 ${DESTDIR}${BINDIR}/${PROGNAME}! ${PROG} __proginstall
221 .if !defined(BUILD) && !make(all) && !make(${PROG})
222 ${DESTDIR}${BINDIR}/${PROGNAME}! .MADE
223 .endif
224 .else
225 ${DESTDIR}${BINDIR}/${PROGNAME}: ${PROG} __proginstall
226 .if !defined(BUILD) && !make(all) && !make(${PROG})
227 ${DESTDIR}${BINDIR}/${PROGNAME}: .MADE
228 .endif
229 .endif
230 .endif
231
232 .if !target(proginstall)
233 proginstall::
234 .endif
235 .PHONY: proginstall
236
237 .if defined(SCRIPTS) && !target(scriptsinstall)
238 SCRIPTSDIR?=${BINDIR}
239 SCRIPTSOWN?=${BINOWN}
240 SCRIPTSGRP?=${BINGRP}
241 SCRIPTSMODE?=${BINMODE}
242
243 scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
244 .PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
245
246 __scriptinstall: .USE
247 ${_MKTARGET_INSTALL}
248 ${INSTALL_FILE} \
249 -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
250 -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
251 -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
252 ${SYSPKGTAG} ${.ALLSRC} ${.TARGET}
253
254 .for S in ${SCRIPTS:O:u}
255 .if ${MKUPDATE} == "no"
256 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
257 .if !defined(BUILD) && !make(all) && !make(${S})
258 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
259 .endif
260 .else
261 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
262 .if !defined(BUILD) && !make(all) && !make(${S})
263 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
264 .endif
265 .endif
266 .endfor
267 .endif
268
269 .if !target(scriptsinstall)
270 scriptsinstall::
271 .endif
272 .PHONY: scriptsinstall
273
274 lint: ${LOBJS}
275 .if defined(LOBJS) && !empty(LOBJS)
276 ${LINT} ${LINTFLAGS} ${LDFLAGS:C/-L[ ]*/-L/Wg:M-L*} ${LOBJS} ${LDADD}
277 .endif
278
279 ##### Pull in related .mk logic
280 .include <bsd.man.mk>
281 .include <bsd.nls.mk>
282 .include <bsd.files.mk>
283 .include <bsd.inc.mk>
284 .include <bsd.links.mk>
285 .include <bsd.sys.mk>
286 .include <bsd.dep.mk>
287
288 ${TARGETS}: # ensure existence
289
290 .endif # HOSTPROG
291