bsd.prog.mk revision 255431
1153816Sdougb#	from: @(#)bsd.prog.mk	5.26 (Berkeley) 6/25/91
2153816Sdougb# $FreeBSD: head/share/mk/bsd.prog.mk 255431 2013-09-09 21:18:16Z des $
3153816Sdougb
4153816Sdougb.include <bsd.init.mk>
5153816Sdougb
6153816Sdougb.SUFFIXES: .out .o .c .cc .cpp .cxx .C .m .y .l .ln .s .S .asm
7153816Sdougb
8153816Sdougb# XXX The use of COPTS in modern makefiles is discouraged.
9153816Sdougb.if defined(COPTS)
10153816SdougbCFLAGS+=${COPTS}
11153816Sdougb.endif
12153816Sdougb
13153816Sdougb.if ${MK_ASSERT_DEBUG} == "no"
14153816SdougbCFLAGS+= -DNDEBUG
15153816SdougbNO_WERROR=
16153816Sdougb.endif
17153816Sdougb
18153816Sdougb.if defined(DEBUG_FLAGS)
19153816SdougbCFLAGS+=${DEBUG_FLAGS}
20153816SdougbCXXFLAGS+=${DEBUG_FLAGS}
21153816Sdougb
22153816Sdougb.if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != ""
23153816SdougbCTFFLAGS+= -g
24153816Sdougb.endif
25153816Sdougb.endif
26153816Sdougb
27153816Sdougb.if defined(PROG_CXX)
28153816SdougbPROG=	${PROG_CXX}
29153816Sdougb.endif
30153816Sdougb
31153816Sdougb.if defined(PROG) && target(${PROG})
32153816SdougbMK_DEBUG_FILES=	no
33153816Sdougb.elif !empty(LDFLAGS:M-Wl,*--oformat,*) || !empty(LDFLAGS:M-static)
34153816SdougbMK_DEBUG_FILES=	no
35153816Sdougb.endif
36153816Sdougb
37153816Sdougb.if defined(CRUNCH_CFLAGS)
38153816SdougbCFLAGS+=${CRUNCH_CFLAGS}
39153816Sdougb.else
40153816Sdougb.if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \
41153816Sdougb    empty(DEBUG_FLAGS:M-gdwarf-*)
42153816SdougbCFLAGS+= -g
43153816SdougbCTFFLAGS+= -g
44153816Sdougb.endif
45153816Sdougb.endif
46153816Sdougb
47153816Sdougb.if !defined(DEBUG_FLAGS)
48153816SdougbSTRIP?=	-s
49153816Sdougb.endif
50153816Sdougb
51153816Sdougb.if defined(NO_SHARED) && (${NO_SHARED} != "no" && ${NO_SHARED} != "NO")
52153816SdougbLDFLAGS+= -static
53153816Sdougb.endif
54153816Sdougb
55153816Sdougb.if defined(USEPRIVATELIB)
56153816SdougbLDFLAGS+= -L${_SHLIBDIRPREFIX}${LIBPRIVATEDIR} -rpath ${LIBPRIVATEDIR}
57153816Sdougb.endif
58153816Sdougb
59153816Sdougb.if ${MK_DEBUG_FILES} != "no"
60153816SdougbPROG_FULL=${PROG}.full
61153816Sdougb# Use ${DEBUGDIR} for base system debug files, else .debug subdirectory
62153816Sdougb.if defined(BINDIR) && (\
63153816Sdougb    ${BINDIR} == "/bin" ||\
64153816Sdougb    ${BINDIR} == "/libexec" ||\
65153816Sdougb    ${BINDIR} == "/sbin" ||\
66153816Sdougb    ${BINDIR:C%/usr/(bin|bsdinstall|games|libexec|lpr|sendmail|sm.bin|sbin)(/.*)?%/usr/bin%} == "/usr/bin"\
67153816Sdougb     )
68153816SdougbDEBUGFILEDIR=	${DEBUGDIR}${BINDIR}
69153816Sdougb.else
70153816SdougbDEBUGFILEDIR?=	${BINDIR}/.debug
71153816SdougbDEBUGMKDIR=
72153816Sdougb.endif
73153816Sdougb.else
74153816SdougbPROG_FULL=	${PROG}
75153816Sdougb.endif
76153816Sdougb
77153816Sdougb.if defined(PROG)
78153816SdougbPROGNAME?=	${PROG}
79153816Sdougb
80153816Sdougb.if defined(SRCS)
81135446Strhodes
82153816SdougbOBJS+=  ${SRCS:N*.h:R:S/$/.o/g}
83135446Strhodes
84153816Sdougb.if target(beforelinking)
85153816Sdougbbeforelinking: ${OBJS}
86135446Strhodes${PROG_FULL}: beforelinking
87153816Sdougb.endif
88153816Sdougb${PROG_FULL}: ${OBJS}
89153816Sdougb.if defined(PROG_CXX)
90153816Sdougb	${CXX} ${CXXFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
91135446Strhodes.else
92153816Sdougb	${CC} ${CFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
93153816Sdougb.endif
94153816Sdougb.if ${MK_CTF} != "no"
95153816Sdougb	${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS}
96153816Sdougb.endif
97153816Sdougb
98135446Strhodes.else	# !defined(SRCS)
99135446Strhodes
100153816Sdougb.if !target(${PROG})
101153816Sdougb.if defined(PROG_CXX)
102153816SdougbSRCS=	${PROG}.cc
103153816Sdougb.else
104153816SdougbSRCS=	${PROG}.c
105153816Sdougb.endif
106135446Strhodes
107135446Strhodes# Always make an intermediate object file because:
108135446Strhodes# - it saves time rebuilding when only the library has changed
109153816Sdougb# - the name of the object gets put into the executable symbol table instead of
110153816Sdougb#   the name of a variable temporary object.
111153816Sdougb# - it's useful to keep objects around for crunching.
112153816SdougbOBJS+=	${PROG}.o
113153816Sdougb
114135446Strhodes.if target(beforelinking)
115153816Sdougbbeforelinking: ${OBJS}
116135446Strhodes${PROG_FULL}: beforelinking
117153816Sdougb.endif
118135446Strhodes${PROG_FULL}: ${OBJS}
119153816Sdougb.if defined(PROG_CXX)
120153816Sdougb	${CXX} ${CXXFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
121135446Strhodes.else
122135446Strhodes	${CC} ${CFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
123135446Strhodes.endif
124135446Strhodes.if ${MK_CTF} != "no"
125153816Sdougb	${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS}
126153816Sdougb.endif
127135446Strhodes.endif # !target(${PROG})
128153816Sdougb
129153816Sdougb.endif # !defined(SRCS)
130153816Sdougb
131153816Sdougb.if ${MK_DEBUG_FILES} != "no"
132135446Strhodes${PROG}: ${PROG_FULL} ${PROGNAME}.debug
133135446Strhodes	${OBJCOPY} --strip-debug --add-gnu-debuglink=${PROGNAME}.debug \
134135446Strhodes	    ${PROG_FULL} ${.TARGET}
135153816Sdougb
136153816Sdougb${PROGNAME}.debug: ${PROG_FULL}
137135446Strhodes	${OBJCOPY} --only-keep-debug ${PROG_FULL} ${.TARGET}
138135446Strhodes.endif
139153816Sdougb
140153816Sdougb.if	${MK_MAN} != "no" && !defined(MAN) && \
141135446Strhodes	!defined(MAN1) && !defined(MAN2) && !defined(MAN3) && \
142153816Sdougb	!defined(MAN4) && !defined(MAN5) && !defined(MAN6) && \
143153816Sdougb	!defined(MAN7) && !defined(MAN8) && !defined(MAN9)
144153816SdougbMAN=	${PROG}.1
145153816SdougbMAN1=	${MAN}
146153816Sdougb.endif
147153816Sdougb.endif # defined(PROG)
148153816Sdougb
149153816Sdougball: objwarn ${PROG} ${SCRIPTS}
150135446Strhodes.if ${MK_MAN} != "no"
151135446Strhodesall: _manpages
152153816Sdougb.endif
153153816Sdougb
154135446Strhodes.if defined(PROG)
155135446StrhodesCLEANFILES+= ${PROG}
156135446Strhodes.if ${MK_DEBUG_FILES} != "no"
157135446StrhodesCLEANFILES+=	${PROG_FULL} ${PROGNAME}.debug
158135446Strhodes.endif
159135446Strhodes.endif
160153816Sdougb
161153816Sdougb.if defined(OBJS)
162153816SdougbCLEANFILES+= ${OBJS}
163153816Sdougb.endif
164135446Strhodes
165135446Strhodes.include <bsd.libnames.mk>
166153816Sdougb
167153816Sdougb.if defined(PROG)
168153816Sdougb_EXTRADEPEND:
169153816Sdougb.if defined(LDFLAGS) && !empty(LDFLAGS:M-nostdlib)
170153816Sdougb.if defined(DPADD) && !empty(DPADD)
171153816Sdougb	echo ${PROG}: ${DPADD} >> ${DEPENDFILE}
172153816Sdougb.endif
173153816Sdougb.else
174153816Sdougb	echo ${PROG}: ${LIBC} ${DPADD} >> ${DEPENDFILE}
175153816Sdougb.if defined(PROG_CXX)
176153816Sdougb.if ${MK_CLANG_IS_CC} != "no" && empty(CXXFLAGS:M-stdlib=libstdc++)
177135446Strhodes	echo ${PROG}: ${LIBCPLUSPLUS} >> ${DEPENDFILE}
178135446Strhodes.else
179135446Strhodes	echo ${PROG}: ${LIBSTDCPLUSPLUS} >> ${DEPENDFILE}
180135446Strhodes.endif
181153816Sdougb.endif
182153816Sdougb.endif
183135446Strhodes.endif
184135446Strhodes
185135446Strhodes.if !target(install)
186153816Sdougb
187153816Sdougb.if defined(PRECIOUSPROG)
188153816Sdougb.if !defined(NO_FSCHG)
189153816SdougbINSTALLFLAGS+= -fschg
190135446Strhodes.endif
191135446StrhodesINSTALLFLAGS+= -S
192153816Sdougb.endif
193153816Sdougb
194135446Strhodes_INSTALLFLAGS:=	${INSTALLFLAGS}
195135446Strhodes.for ie in ${INSTALLFLAGS_EDIT}
196135446Strhodes_INSTALLFLAGS:=	${_INSTALLFLAGS${ie}}
197153816Sdougb.endfor
198153816Sdougb
199135446Strhodes.if !target(realinstall) && !defined(INTERNALPROG)
200135446Strhodesrealinstall: _proginstall
201153816Sdougb.ORDER: beforeinstall _proginstall
202153816Sdougb_proginstall:
203153816Sdougb.if defined(PROG)
204153816Sdougb	${INSTALL} ${STRIP} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
205135446Strhodes	    ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${BINDIR}/${PROGNAME}
206153816Sdougb.if ${MK_DEBUG_FILES} != "no"
207153816Sdougb.if defined(DEBUGMKDIR)
208153816Sdougb	${INSTALL} -T debug -d ${DESTDIR}${DEBUGFILEDIR}
209135446Strhodes.endif
210135446Strhodes	${INSTALL} -T debug -o ${BINOWN} -g ${BINGRP} -m ${DEBUGMODE} \
211153816Sdougb	    ${PROGNAME}.debug ${DESTDIR}${DEBUGFILEDIR}/${PROGNAME}.debug
212153816Sdougb.endif
213153816Sdougb.endif
214135446Strhodes.endif	# !target(realinstall)
215153816Sdougb
216153816Sdougb.if defined(SCRIPTS) && !empty(SCRIPTS)
217153816Sdougbrealinstall: _scriptsinstall
218135446Strhodes.ORDER: beforeinstall _scriptsinstall
219135446Strhodes
220135446StrhodesSCRIPTSDIR?=	${BINDIR}
221135446StrhodesSCRIPTSOWN?=	${BINOWN}
222135446StrhodesSCRIPTSGRP?=	${BINGRP}
223153816SdougbSCRIPTSMODE?=	${BINMODE}
224153816Sdougb
225153816Sdougb.for script in ${SCRIPTS}
226153816Sdougb.if defined(SCRIPTSNAME)
227135446StrhodesSCRIPTSNAME_${script:T}?=	${SCRIPTSNAME}
228135446Strhodes.else
229135446StrhodesSCRIPTSNAME_${script:T}?=	${script:T:R}
230153816Sdougb.endif
231153816SdougbSCRIPTSDIR_${script:T}?=	${SCRIPTSDIR}
232135446StrhodesSCRIPTSOWN_${script:T}?=	${SCRIPTSOWN}
233153816SdougbSCRIPTSGRP_${script:T}?=	${SCRIPTSGRP}
234153816SdougbSCRIPTSMODE_${script:T}?=	${SCRIPTSMODE}
235153816Sdougb_scriptsinstall: _SCRIPTSINS_${script:T}
236135446Strhodes_SCRIPTSINS_${script:T}: ${script}
237153816Sdougb	${INSTALL} -o ${SCRIPTSOWN_${.ALLSRC:T}} \
238153816Sdougb	    -g ${SCRIPTSGRP_${.ALLSRC:T}} -m ${SCRIPTSMODE_${.ALLSRC:T}} \
239153816Sdougb	    ${.ALLSRC} \
240153816Sdougb	    ${DESTDIR}${SCRIPTSDIR_${.ALLSRC:T}}/${SCRIPTSNAME_${.ALLSRC:T}}
241153816Sdougb.endfor
242153816Sdougb.endif
243153816Sdougb
244153816SdougbNLSNAME?=	${PROG}
245153816Sdougb.include <bsd.nls.mk>
246153816Sdougb
247153816Sdougb.include <bsd.files.mk>
248153816Sdougb.include <bsd.incs.mk>
249153816Sdougb.include <bsd.links.mk>
250153816Sdougb
251153816Sdougb.if ${MK_MAN} != "no"
252153816Sdougbrealinstall: _maninstall
253153816Sdougb.ORDER: beforeinstall _maninstall
254153816Sdougb.endif
255153816Sdougb
256135446Strhodes.endif
257153816Sdougb
258153816Sdougb.if !target(lint)
259153816Sdougblint: ${SRCS:M*.c}
260153816Sdougb.if defined(PROG)
261135446Strhodes	${LINT} ${LINTFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC}
262135446Strhodes.endif
263153816Sdougb.endif
264135446Strhodes
265135446Strhodes.if ${MK_MAN} != "no"
266135446Strhodes.include <bsd.man.mk>
267135446Strhodes.endif
268135446Strhodes
269135446Strhodes.include <bsd.dep.mk>
270153816Sdougb
271135446Strhodes.if defined(PROG) && !exists(${.OBJDIR}/${DEPENDFILE})
272135446Strhodes${OBJS}: ${SRCS:M*.h}
273135446Strhodes.endif
274135446Strhodes
275135446Strhodes.include <bsd.obj.mk>
276135446Strhodes
277135446Strhodes.include <bsd.sys.mk>
278135446Strhodes
279135446Strhodes.if defined(PORTNAME)
280135446Strhodes.include <bsd.pkg.mk>
281135446Strhodes.endif
282135446Strhodes