xref: /netbsd-src/share/mk/bsd.prog.mk (revision 0dd5877adce57db949b16ae963e5a6831cccdfb6)
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
8realinstall:	proginstall scriptsinstall
9clean:		cleanprog
10
11##### Default values
12CPPFLAGS+=	${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include}
13CXXFLAGS+=	${DESTDIR:D-nostdinc++ ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include/g++}
14CFLAGS+=	${COPTS}
15
16# ELF platforms depend on crtbegin.o and crtend.o
17.if ${OBJECT_FMT} == "ELF"
18.ifndef LIBCRTBEGIN
19LIBCRTBEGIN=	${DESTDIR}/usr/lib/crtbegin.o
20.MADE: ${LIBCRTBEGIN}
21.endif
22.ifndef LIBCRTEND
23LIBCRTEND=	${DESTDIR}/usr/lib/crtend.o
24.MADE: ${LIBCRTEND}
25.endif
26_SHLINKER=	${SHLINKDIR}/ld.elf_so
27.else
28LIBCRTBEGIN?=
29LIBCRTEND?=
30_SHLINKER=	${SHLINKDIR}/ld.so
31.endif
32
33.ifndef LIBCRT0
34LIBCRT0=	${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}
51LIB${_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)
60CLEANFILES+=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)
80PROG=	${PROG_CXX}
81.endif
82
83.if defined(PROG)
84.if defined(PROG_CXX)
85SRCS?=		${PROG}.cc
86.else
87SRCS?=		${PROG}.c
88.endif
89
90DPSRCS+=	${SRCS:M*.[ly]:C/\..$/.c/}
91CLEANFILES+=	${DPSRCS} ${YHEADER:D${SRCS:M*.y:.y=.h}}
92
93.if !empty(SRCS:N*.h:N*.sh:N*.fth)
94OBJS+=		${SRCS:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
95LOBJS+=		${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)
136MAN=	${PROG}.1
137.endif	# !defined(MAN)
138.endif	# defined(PROG)
139
140realall: ${PROG} ${SCRIPTS}
141
142cleanprog: cleanobjs cleanextra
143	rm -f a.out [Ee]rrs mklog core *.core ${PROG}
144
145cleanobjs:
146.if defined(OBJS) && !empty(OBJS)
147	rm -f ${OBJS} ${LOBJS}
148.endif
149
150cleanextra:
151.if defined(CLEANFILES) && !empty(CLEANFILES)
152	rm -f ${CLEANFILES}
153.endif
154
155.if defined(SRCS) && !target(afterdepend)
156afterdepend: .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)
164PROGNAME?=${PROG}
165
166proginstall:: ${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)
187proginstall::
188.endif
189
190.if defined(SCRIPTS) && !target(scriptsinstall)
191SCRIPTSDIR?=${BINDIR}
192SCRIPTSOWN?=${BINOWN}
193SCRIPTSGRP?=${BINGRP}
194SCRIPTSMODE?=${BINMODE}
195
196scriptsinstall:: ${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)
222scriptsinstall::
223.endif
224
225lint: ${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