1 # $Id: prog.mk,v 1.32 2017/05/06 17:30:09 sjg Exp $
3 .if !target(__${.PARSEFILE}__)
8 # FreeBSD at least expects MAN8 etc.
9 .if defined(MAN) && !empty(MAN)
14 .SUFFIXES: .out .o .c .cc .C .y .l .s .8 .7 .6 .5 .4 .3 .2 .1 .0
18 .if ${TARGET_OSNAME} == "NetBSD"
19 .if ${MACHINE_ARCH} == "sparc64"
20 CFLAGS+= -mcmodel=medlow
23 # ELF platforms depend on crtbegin.o and crtend.o
24 .if ${OBJECT_FMT} == "ELF"
26 LIBCRTBEGIN= ${DESTDIR}/usr/lib/crtbegin.o
30 LIBCRTEND= ${DESTDIR}/usr/lib/crtend.o
33 _SHLINKER= ${SHLINKDIR}/ld.elf_so
37 _SHLINKER= ${SHLINKDIR}/ld.so
41 LIBCRT0= ${DESTDIR}/usr/lib/crt0.o
46 # here is where you can define what LIB* are
47 .-include <libnames.mk>
48 .if ${MK_DPADD_MK} == "yes"
49 # lots of cool magic, but might not suit everyone.
53 .if ${MK_GPROF} == "yes"
54 CFLAGS+= ${CC_PG} ${PROFFLAGS}
56 .if ${MK_DPADD_MK} == "no"
58 LDADD_LAST+= ${LDADD_LIBC_P}
62 .if defined(SHAREDSTRINGS)
65 ${CC} -E ${CFLAGS} ${.IMPSRC} | xstr -c -
66 @${CC} ${CFLAGS} -c x.c -o ${.TARGET}
69 ${CXX_SUFFIXES:%=%.o}:
70 ${CXX} -E ${CXXFLAGS} ${.IMPSRC} | xstr -c -
72 @${CXX} ${CXXFLAGS} -c x.cc -o ${.TARGET}
78 BINDIR ?= ${prefix}/bin
81 .for s in ${SRCS:N*.h:N*.sh:M*/*}
82 ${.o .po .lo:L:@o@${s:T:R}$o@}: $s
84 .if !empty(SRCS:N*.h:N*.sh)
85 OBJS+= ${SRCS:T:N*.h:N*.sh:R:S/$/.o/g}
86 LOBJS+= ${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln}
89 .if defined(OBJS) && !empty(OBJS)
90 .NOPATH: ${OBJS} ${PROG} ${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}}
92 # this is known to work for NetBSD 1.6 and FreeBSD 4.2
93 .if ${TARGET_OSNAME} == "NetBSD" || ${TARGET_OSNAME} == "FreeBSD"
95 .if ${SHLINKDIR} != "/usr/libexec" # XXX: change or remove if ld.so moves
96 _PROGLDOPTS+= -Wl,-dynamic-linker=${_SHLINKER}
98 .if defined(LIBDIR) && ${SHLIBDIR} != ${LIBDIR}
99 _PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBDIR}:${DESTDIR}/usr/lib \
100 -L${DESTDIR}${SHLIBDIR}
102 _PROGLDOPTS+= -Wl,-rpath,${SHLIBDIR}:/usr/lib
104 .if defined(PROG_CXX)
106 _SUPCXX= -lstdc++ -lm
112 .if defined(DESTDIR) && exists(${LIBCRT0}) && ${LIBCRT0} != "/dev/null"
114 ${PROG}: ${LIBCRT0} ${OBJS} ${LIBC} ${DPADD}
115 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} -nostdlib ${_PROGLDOPTS} -L${DESTDIR}/usr/lib ${LIBCRT0} ${LIBCRTBEGIN} ${OBJS} ${LDADD} -L${DESTDIR}/usr/lib ${_SUPCXX} -lgcc -lc -lgcc ${LIBCRTEND}
119 ${PROG}: ${LIBCRT0} ${OBJS} ${LIBC} ${DPADD}
120 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} ${OBJS} ${LDADD}
122 .endif # defined(DESTDIR)
123 .endif # defined(OBJS) && !empty(OBJS)
127 .endif # !defined(MAN)
128 .endif # defined(PROG)
130 .if !defined(_SKIP_BUILD)
138 rm -f a.out [Ee]rrs mklog core *.core \
139 ${PROG} ${OBJS} ${LOBJS} ${CLEANFILES}
141 clean: _SUBDIRUSE cleanprog
142 cleandir: _SUBDIRUSE cleanprog
144 cleandir: _SUBDIRUSE clean
147 .if defined(SRCS) && (!defined(MKDEP) || ${MKDEP} != autodep)
149 @(TMP=/tmp/_depend$$$$; \
150 sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.ln:/' \
156 .if !target(beforeinstall)
159 .if !target(afterinstall)
164 PROG_INSTALL_OWN ?= -o ${BINOWN} -g ${BINGRP}
167 .if !target(realinstall)
168 realinstall: proginstall
170 .if !target(proginstall)
173 [ -d ${DESTDIR}${BINDIR} ] || \
174 ${INSTALL} -d ${PROG_INSTALL_OWN} -m 775 ${DESTDIR}${BINDIR}
175 ${INSTALL} ${COPY} ${STRIP_FLAG} ${PROG_INSTALL_OWN} -m ${BINMODE} \
176 ${PROG} ${DESTDIR}${BINDIR}/${PROG_NAME}
178 .if defined(HIDEGAME)
179 (cd ${DESTDIR}/usr/games; rm -f ${PROG}; ln -s dm ${PROG})
185 install: maninstall install_links _SUBDIRUSE
189 @set ${SYMLINKS}; ${_SYMLINKS_SCRIPT}
192 @set ${LINKS}; ${_LINKS_SCRIPT}
195 maninstall: afterinstall
196 afterinstall: realinstall
197 install_links: realinstall
198 proginstall: beforeinstall
199 realinstall: beforeinstall
204 .if defined(LOBJS) && !empty(LOBJS)
205 @${LINT} ${LINTFLAGS} ${LDFLAGS:M-L*} ${LOBJS} ${LDADD}
210 .if defined(OBJS) && !empty(OBJS)
214 .if defined(FILES) || defined(FILESGROUPS)
218 .if ${MK_MAN} != "no"
222 .if ${MK_NLS} != "no"
230 .if !empty(PROG) && ${MK_STAGING_PROG} == "yes"
231 STAGE_BINDIR ?= ${STAGE_OBJTOP}${BINDIR}
232 STAGE_DIR.prog ?= ${STAGE_BINDIR}
233 .if ${PROG_NAME:U${PROG}} != ${PROG}
234 STAGE_AS_SETS += prog
235 STAGE_AS_${PROG} = ${PROG_NAME}
236 stage_as.prog: ${PROG}
239 stage_files.prog: ${PROG}