bsd.prog.mk revision 255431
1193326Sed#	from: @(#)bsd.prog.mk	5.26 (Berkeley) 6/25/91
2193326Sed# $FreeBSD: head/share/mk/bsd.prog.mk 255431 2013-09-09 21:18:16Z des $
3193326Sed
4193326Sed.include <bsd.init.mk>
5193326Sed
6193326Sed.SUFFIXES: .out .o .c .cc .cpp .cxx .C .m .y .l .ln .s .S .asm
7193326Sed
8193326Sed# XXX The use of COPTS in modern makefiles is discouraged.
9193326Sed.if defined(COPTS)
10193326SedCFLAGS+=${COPTS}
11193326Sed.endif
12193326Sed
13193326Sed.if ${MK_ASSERT_DEBUG} == "no"
14193326SedCFLAGS+= -DNDEBUG
15193326SedNO_WERROR=
16193326Sed.endif
17193326Sed
18193326Sed.if defined(DEBUG_FLAGS)
19193326SedCFLAGS+=${DEBUG_FLAGS}
20193326SedCXXFLAGS+=${DEBUG_FLAGS}
21193326Sed
22193326Sed.if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != ""
23193326SedCTFFLAGS+= -g
24193326Sed.endif
25193326Sed.endif
26193326Sed
27193326Sed.if defined(PROG_CXX)
28198092SrdivackyPROG=	${PROG_CXX}
29198092Srdivacky.endif
30193326Sed
31193326Sed.if defined(PROG) && target(${PROG})
32193326SedMK_DEBUG_FILES=	no
33193326Sed.elif !empty(LDFLAGS:M-Wl,*--oformat,*) || !empty(LDFLAGS:M-static)
34193326SedMK_DEBUG_FILES=	no
35193326Sed.endif
36193326Sed
37193326Sed.if defined(CRUNCH_CFLAGS)
38193326SedCFLAGS+=${CRUNCH_CFLAGS}
39193326Sed.else
40193326Sed.if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \
41193326Sed    empty(DEBUG_FLAGS:M-gdwarf-*)
42193326SedCFLAGS+= -g
43193326SedCTFFLAGS+= -g
44193326Sed.endif
45193326Sed.endif
46198398Srdivacky
47198092Srdivacky.if !defined(DEBUG_FLAGS)
48198092SrdivackySTRIP?=	-s
49195341Sed.endif
50193326Sed
51193326Sed.if defined(NO_SHARED) && (${NO_SHARED} != "no" && ${NO_SHARED} != "NO")
52193326SedLDFLAGS+= -static
53193326Sed.endif
54193326Sed
55193326Sed.if defined(USEPRIVATELIB)
56193326SedLDFLAGS+= -L${_SHLIBDIRPREFIX}${LIBPRIVATEDIR} -rpath ${LIBPRIVATEDIR}
57193326Sed.endif
58193326Sed
59193326Sed.if ${MK_DEBUG_FILES} != "no"
60193326SedPROG_FULL=${PROG}.full
61193326Sed# Use ${DEBUGDIR} for base system debug files, else .debug subdirectory
62193326Sed.if defined(BINDIR) && (\
63193326Sed    ${BINDIR} == "/bin" ||\
64193326Sed    ${BINDIR} == "/libexec" ||\
65193326Sed    ${BINDIR} == "/sbin" ||\
66193326Sed    ${BINDIR:C%/usr/(bin|bsdinstall|games|libexec|lpr|sendmail|sm.bin|sbin)(/.*)?%/usr/bin%} == "/usr/bin"\
67193326Sed     )
68193326SedDEBUGFILEDIR=	${DEBUGDIR}${BINDIR}
69193326Sed.else
70193326SedDEBUGFILEDIR?=	${BINDIR}/.debug
71193326SedDEBUGMKDIR=
72193326Sed.endif
73193326Sed.else
74193326SedPROG_FULL=	${PROG}
75193326Sed.endif
76193326Sed
77198398Srdivacky.if defined(PROG)
78198398SrdivackyPROGNAME?=	${PROG}
79198398Srdivacky
80198398Srdivacky.if defined(SRCS)
81198398Srdivacky
82198398SrdivackyOBJS+=  ${SRCS:N*.h:R:S/$/.o/g}
83198398Srdivacky
84198398Srdivacky.if target(beforelinking)
85198398Srdivackybeforelinking: ${OBJS}
86198398Srdivacky${PROG_FULL}: beforelinking
87198398Srdivacky.endif
88198398Srdivacky${PROG_FULL}: ${OBJS}
89198398Srdivacky.if defined(PROG_CXX)
90198398Srdivacky	${CXX} ${CXXFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
91198398Srdivacky.else
92198398Srdivacky	${CC} ${CFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
93198398Srdivacky.endif
94198398Srdivacky.if ${MK_CTF} != "no"
95198398Srdivacky	${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS}
96198398Srdivacky.endif
97198398Srdivacky
98198398Srdivacky.else	# !defined(SRCS)
99198398Srdivacky
100198398Srdivacky.if !target(${PROG})
101198398Srdivacky.if defined(PROG_CXX)
102198398SrdivackySRCS=	${PROG}.cc
103198398Srdivacky.else
104198398SrdivackySRCS=	${PROG}.c
105198398Srdivacky.endif
106198398Srdivacky
107198398Srdivacky# Always make an intermediate object file because:
108198398Srdivacky# - it saves time rebuilding when only the library has changed
109198398Srdivacky# - the name of the object gets put into the executable symbol table instead of
110198398Srdivacky#   the name of a variable temporary object.
111198398Srdivacky# - it's useful to keep objects around for crunching.
112198398SrdivackyOBJS+=	${PROG}.o
113198398Srdivacky
114198398Srdivacky.if target(beforelinking)
115198398Srdivackybeforelinking: ${OBJS}
116198398Srdivacky${PROG_FULL}: beforelinking
117198398Srdivacky.endif
118198398Srdivacky${PROG_FULL}: ${OBJS}
119198398Srdivacky.if defined(PROG_CXX)
120198398Srdivacky	${CXX} ${CXXFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
121198398Srdivacky.else
122198398Srdivacky	${CC} ${CFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
123198398Srdivacky.endif
124198398Srdivacky.if ${MK_CTF} != "no"
125198398Srdivacky	${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS}
126198398Srdivacky.endif
127198398Srdivacky.endif # !target(${PROG})
128193326Sed
129193326Sed.endif # !defined(SRCS)
130193326Sed
131193326Sed.if ${MK_DEBUG_FILES} != "no"
132193326Sed${PROG}: ${PROG_FULL} ${PROGNAME}.debug
133193326Sed	${OBJCOPY} --strip-debug --add-gnu-debuglink=${PROGNAME}.debug \
134193326Sed	    ${PROG_FULL} ${.TARGET}
135193326Sed
136193326Sed${PROGNAME}.debug: ${PROG_FULL}
137193326Sed	${OBJCOPY} --only-keep-debug ${PROG_FULL} ${.TARGET}
138193326Sed.endif
139193326Sed
140193326Sed.if	${MK_MAN} != "no" && !defined(MAN) && \
141193326Sed	!defined(MAN1) && !defined(MAN2) && !defined(MAN3) && \
142198092Srdivacky	!defined(MAN4) && !defined(MAN5) && !defined(MAN6) && \
143193326Sed	!defined(MAN7) && !defined(MAN8) && !defined(MAN9)
144193326SedMAN=	${PROG}.1
145193326SedMAN1=	${MAN}
146198092Srdivacky.endif
147193326Sed.endif # defined(PROG)
148193326Sed
149193326Sedall: objwarn ${PROG} ${SCRIPTS}
150198092Srdivacky.if ${MK_MAN} != "no"
151193326Sedall: _manpages
152198092Srdivacky.endif
153193326Sed
154193326Sed.if defined(PROG)
155193326SedCLEANFILES+= ${PROG}
156193326Sed.if ${MK_DEBUG_FILES} != "no"
157193326SedCLEANFILES+=	${PROG_FULL} ${PROGNAME}.debug
158193326Sed.endif
159193326Sed.endif
160193326Sed
161193326Sed.if defined(OBJS)
162193326SedCLEANFILES+= ${OBJS}
163193326Sed.endif
164193326Sed
165193326Sed.include <bsd.libnames.mk>
166198092Srdivacky
167193326Sed.if defined(PROG)
168193326Sed_EXTRADEPEND:
169193326Sed.if defined(LDFLAGS) && !empty(LDFLAGS:M-nostdlib)
170198092Srdivacky.if defined(DPADD) && !empty(DPADD)
171193326Sed	echo ${PROG}: ${DPADD} >> ${DEPENDFILE}
172193326Sed.endif
173193326Sed.else
174193326Sed	echo ${PROG}: ${LIBC} ${DPADD} >> ${DEPENDFILE}
175193326Sed.if defined(PROG_CXX)
176193326Sed.if ${MK_CLANG_IS_CC} != "no" && empty(CXXFLAGS:M-stdlib=libstdc++)
177193326Sed	echo ${PROG}: ${LIBCPLUSPLUS} >> ${DEPENDFILE}
178193326Sed.else
179193326Sed	echo ${PROG}: ${LIBSTDCPLUSPLUS} >> ${DEPENDFILE}
180198092Srdivacky.endif
181193326Sed.endif
182193326Sed.endif
183193326Sed.endif
184193326Sed
185193326Sed.if !target(install)
186198092Srdivacky
187193326Sed.if defined(PRECIOUSPROG)
188198092Srdivacky.if !defined(NO_FSCHG)
189193326SedINSTALLFLAGS+= -fschg
190193326Sed.endif
191193326SedINSTALLFLAGS+= -S
192193326Sed.endif
193193326Sed
194193326Sed_INSTALLFLAGS:=	${INSTALLFLAGS}
195193326Sed.for ie in ${INSTALLFLAGS_EDIT}
196193326Sed_INSTALLFLAGS:=	${_INSTALLFLAGS${ie}}
197193326Sed.endfor
198193326Sed
199198092Srdivacky.if !target(realinstall) && !defined(INTERNALPROG)
200193326Sedrealinstall: _proginstall
201193326Sed.ORDER: beforeinstall _proginstall
202193326Sed_proginstall:
203193326Sed.if defined(PROG)
204198092Srdivacky	${INSTALL} ${STRIP} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
205193326Sed	    ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${BINDIR}/${PROGNAME}
206193326Sed.if ${MK_DEBUG_FILES} != "no"
207193326Sed.if defined(DEBUGMKDIR)
208198092Srdivacky	${INSTALL} -T debug -d ${DESTDIR}${DEBUGFILEDIR}
209193326Sed.endif
210193326Sed	${INSTALL} -T debug -o ${BINOWN} -g ${BINGRP} -m ${DEBUGMODE} \
211193326Sed	    ${PROGNAME}.debug ${DESTDIR}${DEBUGFILEDIR}/${PROGNAME}.debug
212193326Sed.endif
213193326Sed.endif
214193326Sed.endif	# !target(realinstall)
215193326Sed
216193326Sed.if defined(SCRIPTS) && !empty(SCRIPTS)
217193326Sedrealinstall: _scriptsinstall
218198092Srdivacky.ORDER: beforeinstall _scriptsinstall
219193326Sed
220193326SedSCRIPTSDIR?=	${BINDIR}
221193326SedSCRIPTSOWN?=	${BINOWN}
222193326SedSCRIPTSGRP?=	${BINGRP}
223193326SedSCRIPTSMODE?=	${BINMODE}
224193326Sed
225193326Sed.for script in ${SCRIPTS}
226193326Sed.if defined(SCRIPTSNAME)
227193326SedSCRIPTSNAME_${script:T}?=	${SCRIPTSNAME}
228193326Sed.else
229193326SedSCRIPTSNAME_${script:T}?=	${script:T:R}
230193326Sed.endif
231193326SedSCRIPTSDIR_${script:T}?=	${SCRIPTSDIR}
232193326SedSCRIPTSOWN_${script:T}?=	${SCRIPTSOWN}
233193326SedSCRIPTSGRP_${script:T}?=	${SCRIPTSGRP}
234193326SedSCRIPTSMODE_${script:T}?=	${SCRIPTSMODE}
235193326Sed_scriptsinstall: _SCRIPTSINS_${script:T}
236193326Sed_SCRIPTSINS_${script:T}: ${script}
237193326Sed	${INSTALL} -o ${SCRIPTSOWN_${.ALLSRC:T}} \
238193326Sed	    -g ${SCRIPTSGRP_${.ALLSRC:T}} -m ${SCRIPTSMODE_${.ALLSRC:T}} \
239193326Sed	    ${.ALLSRC} \
240193326Sed	    ${DESTDIR}${SCRIPTSDIR_${.ALLSRC:T}}/${SCRIPTSNAME_${.ALLSRC:T}}
241193326Sed.endfor
242193326Sed.endif
243198092Srdivacky
244198092SrdivackyNLSNAME?=	${PROG}
245198092Srdivacky.include <bsd.nls.mk>
246193326Sed
247193326Sed.include <bsd.files.mk>
248193326Sed.include <bsd.incs.mk>
249193326Sed.include <bsd.links.mk>
250193326Sed
251193326Sed.if ${MK_MAN} != "no"
252193326Sedrealinstall: _maninstall
253193326Sed.ORDER: beforeinstall _maninstall
254193326Sed.endif
255193326Sed
256193326Sed.endif
257193326Sed
258198092Srdivacky.if !target(lint)
259193326Sedlint: ${SRCS:M*.c}
260193326Sed.if defined(PROG)
261198092Srdivacky	${LINT} ${LINTFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC}
262193326Sed.endif
263193326Sed.endif
264193326Sed
265193326Sed.if ${MK_MAN} != "no"
266193326Sed.include <bsd.man.mk>
267193326Sed.endif
268193326Sed
269193326Sed.include <bsd.dep.mk>
270193326Sed
271193326Sed.if defined(PROG) && !exists(${.OBJDIR}/${DEPENDFILE})
272193326Sed${OBJS}: ${SRCS:M*.h}
273193326Sed.endif
274198092Srdivacky
275193326Sed.include <bsd.obj.mk>
276193326Sed
277193326Sed.include <bsd.sys.mk>
278193326Sed
279198092Srdivacky.if defined(PORTNAME)
280193326Sed.include <bsd.pkg.mk>
281198092Srdivacky.endif
282193326Sed