bsd.prog.mk revision 256281
1139738Simp#	from: @(#)bsd.prog.mk	5.26 (Berkeley) 6/25/91
2135699Smarcel# $FreeBSD: stable/10/share/mk/bsd.prog.mk 255431 2013-09-09 21:18:16Z des $
3110211Smarcel
4110211Smarcel.include <bsd.init.mk>
5110211Smarcel
6110211Smarcel.SUFFIXES: .out .o .c .cc .cpp .cxx .C .m .y .l .ln .s .S .asm
7110211Smarcel
8110211Smarcel# XXX The use of COPTS in modern makefiles is discouraged.
9110211Smarcel.if defined(COPTS)
10110211SmarcelCFLAGS+=${COPTS}
11110211Smarcel.endif
12110211Smarcel
13110211Smarcel.if ${MK_ASSERT_DEBUG} == "no"
14110211SmarcelCFLAGS+= -DNDEBUG
15110211SmarcelNO_WERROR=
16110211Smarcel.endif
17110211Smarcel
18110211Smarcel.if defined(DEBUG_FLAGS)
19110211SmarcelCFLAGS+=${DEBUG_FLAGS}
20110211SmarcelCXXFLAGS+=${DEBUG_FLAGS}
21110211Smarcel
22110211Smarcel.if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != ""
23110211SmarcelCTFFLAGS+= -g
24110211Smarcel.endif
25110211Smarcel.endif
26110211Smarcel
27119880Sobrien.if defined(PROG_CXX)
28119880SobrienPROG=	${PROG_CXX}
29119880Sobrien.endif
30110211Smarcel
31135699Smarcel.if defined(PROG) && target(${PROG})
32164010SmarcelMK_DEBUG_FILES=	no
33110211Smarcel.elif !empty(LDFLAGS:M-Wl,*--oformat,*) || !empty(LDFLAGS:M-static)
34110211SmarcelMK_DEBUG_FILES=	no
35110211Smarcel.endif
36110211Smarcel
37110211Smarcel.if defined(CRUNCH_CFLAGS)
38110211SmarcelCFLAGS+=${CRUNCH_CFLAGS}
39135699Smarcel.else
40135699Smarcel.if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \
41135699Smarcel    empty(DEBUG_FLAGS:M-gdwarf-*)
42110211SmarcelCFLAGS+= -g
43110211SmarcelCTFFLAGS+= -g
44135699Smarcel.endif
45135699Smarcel.endif
46135699Smarcel
47135699Smarcel.if !defined(DEBUG_FLAGS)
48110211SmarcelSTRIP?=	-s
49135699Smarcel.endif
50135699Smarcel
51135699Smarcel.if defined(NO_SHARED) && (${NO_SHARED} != "no" && ${NO_SHARED} != "NO")
52110211SmarcelLDFLAGS+= -static
53135699Smarcel.endif
54135699Smarcel
55135699Smarcel.if defined(USEPRIVATELIB)
56135699SmarcelLDFLAGS+= -L${_SHLIBDIRPREFIX}${LIBPRIVATEDIR} -rpath ${LIBPRIVATEDIR}
57135699Smarcel.endif
58110211Smarcel
59135699Smarcel.if ${MK_DEBUG_FILES} != "no"
60135699SmarcelPROG_FULL=${PROG}.full
61110211Smarcel# Use ${DEBUGDIR} for base system debug files, else .debug subdirectory
62135699Smarcel.if defined(BINDIR) && (\
63110211Smarcel    ${BINDIR} == "/bin" ||\
64135699Smarcel    ${BINDIR} == "/libexec" ||\
65135699Smarcel    ${BINDIR} == "/sbin" ||\
66110211Smarcel    ${BINDIR:C%/usr/(bin|bsdinstall|games|libexec|lpr|sendmail|sm.bin|sbin)(/.*)?%/usr/bin%} == "/usr/bin"\
67110211Smarcel     )
68110211SmarcelDEBUGFILEDIR=	${DEBUGDIR}${BINDIR}
69110211Smarcel.else
70110211SmarcelDEBUGFILEDIR?=	${BINDIR}/.debug
71110211SmarcelDEBUGMKDIR=
72110211Smarcel.endif
73110211Smarcel.else
74110211SmarcelPROG_FULL=	${PROG}
75110211Smarcel.endif
76110211Smarcel
77110211Smarcel.if defined(PROG)
78110211SmarcelPROGNAME?=	${PROG}
79110211Smarcel
80110211Smarcel.if defined(SRCS)
81110211Smarcel
82110211SmarcelOBJS+=  ${SRCS:N*.h:R:S/$/.o/g}
83110211Smarcel
84110211Smarcel.if target(beforelinking)
85110211Smarcelbeforelinking: ${OBJS}
86110211Smarcel${PROG_FULL}: beforelinking
87110211Smarcel.endif
88110211Smarcel${PROG_FULL}: ${OBJS}
89110211Smarcel.if defined(PROG_CXX)
90135699Smarcel	${CXX} ${CXXFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
91110211Smarcel.else
92135699Smarcel	${CC} ${CFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
93135699Smarcel.endif
94135699Smarcel.if ${MK_CTF} != "no"
95135699Smarcel	${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS}
96110211Smarcel.endif
97110211Smarcel
98110211Smarcel.else	# !defined(SRCS)
99135699Smarcel
100110211Smarcel.if !target(${PROG})
101110211Smarcel.if defined(PROG_CXX)
102110211SmarcelSRCS=	${PROG}.cc
103110211Smarcel.else
104110211SmarcelSRCS=	${PROG}.c
105110211Smarcel.endif
106110211Smarcel
107135699Smarcel# Always make an intermediate object file because:
108110211Smarcel# - it saves time rebuilding when only the library has changed
109110211Smarcel# - the name of the object gets put into the executable symbol table instead of
110110211Smarcel#   the name of a variable temporary object.
111135699Smarcel# - it's useful to keep objects around for crunching.
112135699SmarcelOBJS+=	${PROG}.o
113110211Smarcel
114110211Smarcel.if target(beforelinking)
115135699Smarcelbeforelinking: ${OBJS}
116110211Smarcel${PROG_FULL}: beforelinking
117110211Smarcel.endif
118110211Smarcel${PROG_FULL}: ${OBJS}
119135699Smarcel.if defined(PROG_CXX)
120110211Smarcel	${CXX} ${CXXFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
121110211Smarcel.else
122135699Smarcel	${CC} ${CFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
123135699Smarcel.endif
124110211Smarcel.if ${MK_CTF} != "no"
125135699Smarcel	${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS}
126110211Smarcel.endif
127135699Smarcel.endif # !target(${PROG})
128135699Smarcel
129135699Smarcel.endif # !defined(SRCS)
130135699Smarcel
131135699Smarcel.if ${MK_DEBUG_FILES} != "no"
132135699Smarcel${PROG}: ${PROG_FULL} ${PROGNAME}.debug
133135699Smarcel	${OBJCOPY} --strip-debug --add-gnu-debuglink=${PROGNAME}.debug \
134135699Smarcel	    ${PROG_FULL} ${.TARGET}
135135699Smarcel
136135699Smarcel${PROGNAME}.debug: ${PROG_FULL}
137135699Smarcel	${OBJCOPY} --only-keep-debug ${PROG_FULL} ${.TARGET}
138135699Smarcel.endif
139110211Smarcel
140110211Smarcel.if	${MK_MAN} != "no" && !defined(MAN) && \
141135699Smarcel	!defined(MAN1) && !defined(MAN2) && !defined(MAN3) && \
142135699Smarcel	!defined(MAN4) && !defined(MAN5) && !defined(MAN6) && \
143110211Smarcel	!defined(MAN7) && !defined(MAN8) && !defined(MAN9)
144135699SmarcelMAN=	${PROG}.1
145110211SmarcelMAN1=	${MAN}
146110211Smarcel.endif
147135699Smarcel.endif # defined(PROG)
148135699Smarcel
149110211Smarcelall: objwarn ${PROG} ${SCRIPTS}
150110211Smarcel.if ${MK_MAN} != "no"
151110211Smarcelall: _manpages
152110211Smarcel.endif
153135699Smarcel
154135699Smarcel.if defined(PROG)
155110211SmarcelCLEANFILES+= ${PROG}
156110211Smarcel.if ${MK_DEBUG_FILES} != "no"
157110211SmarcelCLEANFILES+=	${PROG_FULL} ${PROGNAME}.debug
158110211Smarcel.endif
159110211Smarcel.endif
160135699Smarcel
161110211Smarcel.if defined(OBJS)
162135699SmarcelCLEANFILES+= ${OBJS}
163110211Smarcel.endif
164110211Smarcel
165110211Smarcel.include <bsd.libnames.mk>
166110211Smarcel
167110211Smarcel.if defined(PROG)
168110211Smarcel_EXTRADEPEND:
169135699Smarcel.if defined(LDFLAGS) && !empty(LDFLAGS:M-nostdlib)
170135699Smarcel.if defined(DPADD) && !empty(DPADD)
171135699Smarcel	echo ${PROG}: ${DPADD} >> ${DEPENDFILE}
172110211Smarcel.endif
173135699Smarcel.else
174110211Smarcel	echo ${PROG}: ${LIBC} ${DPADD} >> ${DEPENDFILE}
175135699Smarcel.if defined(PROG_CXX)
176135699Smarcel.if ${MK_CLANG_IS_CC} != "no" && empty(CXXFLAGS:M-stdlib=libstdc++)
177135699Smarcel	echo ${PROG}: ${LIBCPLUSPLUS} >> ${DEPENDFILE}
178135699Smarcel.else
179110211Smarcel	echo ${PROG}: ${LIBSTDCPLUSPLUS} >> ${DEPENDFILE}
180110211Smarcel.endif
181135699Smarcel.endif
182135699Smarcel.endif
183110211Smarcel.endif
184110211Smarcel
185110211Smarcel.if !target(install)
186110211Smarcel
187135699Smarcel.if defined(PRECIOUSPROG)
188135699Smarcel.if !defined(NO_FSCHG)
189135699SmarcelINSTALLFLAGS+= -fschg
190110211Smarcel.endif
191110211SmarcelINSTALLFLAGS+= -S
192110211Smarcel.endif
193110211Smarcel
194135699Smarcel_INSTALLFLAGS:=	${INSTALLFLAGS}
195135699Smarcel.for ie in ${INSTALLFLAGS_EDIT}
196110211Smarcel_INSTALLFLAGS:=	${_INSTALLFLAGS${ie}}
197110211Smarcel.endfor
198110211Smarcel
199110211Smarcel.if !target(realinstall) && !defined(INTERNALPROG)
200135699Smarcelrealinstall: _proginstall
201135699Smarcel.ORDER: beforeinstall _proginstall
202135699Smarcel_proginstall:
203110211Smarcel.if defined(PROG)
204110211Smarcel	${INSTALL} ${STRIP} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
205110211Smarcel	    ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${BINDIR}/${PROGNAME}
206110211Smarcel.if ${MK_DEBUG_FILES} != "no"
207135699Smarcel.if defined(DEBUGMKDIR)
208135699Smarcel	${INSTALL} -T debug -d ${DESTDIR}${DEBUGFILEDIR}
209110211Smarcel.endif
210135699Smarcel	${INSTALL} -T debug -o ${BINOWN} -g ${BINGRP} -m ${DEBUGMODE} \
211110211Smarcel	    ${PROGNAME}.debug ${DESTDIR}${DEBUGFILEDIR}/${PROGNAME}.debug
212110211Smarcel.endif
213135699Smarcel.endif
214110211Smarcel.endif	# !target(realinstall)
215110211Smarcel
216135699Smarcel.if defined(SCRIPTS) && !empty(SCRIPTS)
217135699Smarcelrealinstall: _scriptsinstall
218135699Smarcel.ORDER: beforeinstall _scriptsinstall
219110211Smarcel
220110211SmarcelSCRIPTSDIR?=	${BINDIR}
221110211SmarcelSCRIPTSOWN?=	${BINOWN}
222110211SmarcelSCRIPTSGRP?=	${BINGRP}
223164010SmarcelSCRIPTSMODE?=	${BINMODE}
224164010Smarcel
225110211Smarcel.for script in ${SCRIPTS}
226220283Smarcel.if defined(SCRIPTSNAME)
227110211SmarcelSCRIPTSNAME_${script:T}?=	${SCRIPTSNAME}
228110211Smarcel.else
229220283SmarcelSCRIPTSNAME_${script:T}?=	${script:T:R}
230220283Smarcel.endif
231135699SmarcelSCRIPTSDIR_${script:T}?=	${SCRIPTSDIR}
232110211SmarcelSCRIPTSOWN_${script:T}?=	${SCRIPTSOWN}
233110211SmarcelSCRIPTSGRP_${script:T}?=	${SCRIPTSGRP}
234220283SmarcelSCRIPTSMODE_${script:T}?=	${SCRIPTSMODE}
235220283Smarcel_scriptsinstall: _SCRIPTSINS_${script:T}
236220283Smarcel_SCRIPTSINS_${script:T}: ${script}
237220283Smarcel	${INSTALL} -o ${SCRIPTSOWN_${.ALLSRC:T}} \
238220283Smarcel	    -g ${SCRIPTSGRP_${.ALLSRC:T}} -m ${SCRIPTSMODE_${.ALLSRC:T}} \
239110211Smarcel	    ${.ALLSRC} \
240220283Smarcel	    ${DESTDIR}${SCRIPTSDIR_${.ALLSRC:T}}/${SCRIPTSNAME_${.ALLSRC:T}}
241220283Smarcel.endfor
242220283Smarcel.endif
243220283Smarcel
244220283SmarcelNLSNAME?=	${PROG}
245110211Smarcel.include <bsd.nls.mk>
246220283Smarcel
247220283Smarcel.include <bsd.files.mk>
248220283Smarcel.include <bsd.incs.mk>
249220283Smarcel.include <bsd.links.mk>
250220283Smarcel
251110211Smarcel.if ${MK_MAN} != "no"
252220283Smarcelrealinstall: _maninstall
253220283Smarcel.ORDER: beforeinstall _maninstall
254220283Smarcel.endif
255220283Smarcel
256220283Smarcel.endif
257110211Smarcel
258110211Smarcel.if !target(lint)
259110211Smarcellint: ${SRCS:M*.c}
260.if defined(PROG)
261	${LINT} ${LINTFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC}
262.endif
263.endif
264
265.if ${MK_MAN} != "no"
266.include <bsd.man.mk>
267.endif
268
269.include <bsd.dep.mk>
270
271.if defined(PROG) && !exists(${.OBJDIR}/${DEPENDFILE})
272${OBJS}: ${SRCS:M*.h}
273.endif
274
275.include <bsd.obj.mk>
276
277.include <bsd.sys.mk>
278
279.if defined(PORTNAME)
280.include <bsd.pkg.mk>
281.endif
282