xref: /netbsd-src/share/mk/bsd.prog.mk (revision d20841bb642898112fe68f0ad3f7b26dddf56f07)
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)
11PROG=	${PROG_CXX}
12.endif
13
14##### Basic targets
15realinstall:	proginstall scriptsinstall
16clean:		cleanprog
17
18##### PROG specific flags.
19COPTS+=     ${COPTS.${PROG}}
20CPPFLAGS+=  ${CPPFLAGS.${PROG}}
21CXXFLAGS+=  ${CXXFLAGS.${PROG}}
22LDADD+=     ${LDADD.${PROG}}
23LDFLAGS+=   ${LDFLAGS.${PROG}}
24LDSTATIC+=  ${LDSTATIC.${PROG}}
25
26##### Default values
27CPPFLAGS+=	${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include}
28CXXFLAGS+=	${DESTDIR:D-nostdinc++ ${CPPFLAG_ISYSTEMXX} ${DESTDIR}/usr/include/g++}
29CFLAGS+=	${COPTS}
30MKDEP_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
35LIBCRTBEGIN=	${DESTDIR}/usr/lib/crti.o ${_GCC_CRTBEGIN}
36.MADE: ${LIBCRTBEGIN}
37.endif
38.ifndef LIBCRTEND
39LIBCRTEND=	${_GCC_CRTEND} ${DESTDIR}/usr/lib/crtn.o
40.MADE: ${LIBCRTEND}
41.endif
42_SHLINKER=	${SHLINKDIR}/ld.elf_so
43.else
44LIBCRTBEGIN?=
45LIBCRTEND?=
46_SHLINKER=	${SHLINKDIR}/ld.so
47.endif
48
49.ifndef LIBCRT0
50LIBCRT0=	${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}
68LIB${_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
76LIBSTDCXX=	${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}
92LIB${_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)
101CLEANFILES+=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)
116SRCS?=		${PROG}.cc
117.else
118SRCS?=		${PROG}.c
119.endif
120
121DPSRCS+=	${SRCS:M*.l:.l=.c} ${SRCS:M*.y:.y=.c}
122DPSRCS+=	${YHEADER:D${SRCS:M*.y:.y=.h}}
123CLEANFILES+=	${SRCS:M*.l:.l=.c} ${SRCS:M*.y:.y=.c}
124CLEANFILES+=	${YHEADER:D${SRCS:M*.y:.y=.h}}
125
126.if !empty(SRCS:N*.h:N*.sh:N*.fth)
127OBJS+=		${SRCS:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
128LOBJS+=		${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)
189MAN=	${PROG}.1
190.endif	# !defined(MAN)
191.endif	# defined(PROG)
192
193realall: ${PROG} ${SCRIPTS}
194
195cleanprog: .PHONY cleanobjs cleanextra
196	rm -f a.out [Ee]rrs mklog core *.core .gdbinit ${PROG}
197
198cleanobjs: .PHONY
199.if defined(OBJS) && !empty(OBJS)
200	rm -f ${OBJS} ${LOBJS}
201.endif
202
203cleanextra: .PHONY
204.if defined(CLEANFILES) && !empty(CLEANFILES)
205	rm -f ${CLEANFILES}
206.endif
207
208.if defined(PROG) && !target(proginstall)
209PROGNAME?=${PROG}
210
211proginstall:: ${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)
233proginstall::
234.endif
235.PHONY:		proginstall
236
237.if defined(SCRIPTS) && !target(scriptsinstall)
238SCRIPTSDIR?=${BINDIR}
239SCRIPTSOWN?=${BINOWN}
240SCRIPTSGRP?=${BINGRP}
241SCRIPTSMODE?=${BINMODE}
242
243scriptsinstall:: ${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)
270scriptsinstall::
271.endif
272.PHONY:		scriptsinstall
273
274lint: ${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