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