1# $Id: prog.mk,v 1.45 2024/12/12 19:56:36 sjg Exp $ 2 3# should be set properly in sys.mk 4_this ?= ${.PARSEFILE:S,bsd.,,} 5 6.if !target(__${_this}__) 7__${_this}__: .NOTMAIN 8 9.include <init.mk> 10 11# FreeBSD at least expects MAN8 etc. 12.if defined(MAN) && !empty(MAN) 13_sect:=${MAN:E} 14MAN${_sect}=${MAN} 15.endif 16 17.SUFFIXES: .out .o .c ${CXX_SUFFIXES} .y .l ${CCM_SUFFIXES} ${PCM} 18 19CFLAGS+= ${COPTS} 20 21.if ${TARGET_OSNAME} == "NetBSD" 22.if ${MACHINE_ARCH} == "sparc64" 23CFLAGS+= -mcmodel=medlow 24.endif 25 26# ELF platforms depend on crtbegin.o and crtend.o 27.if ${OBJECT_FMT} == "ELF" 28.ifndef LIBCRTBEGIN 29LIBCRTBEGIN= ${DESTDIR}/usr/lib/crtbegin.o 30.MADE: ${LIBCRTBEGIN} 31.endif 32.ifndef LIBCRTEND 33LIBCRTEND= ${DESTDIR}/usr/lib/crtend.o 34.MADE: ${LIBCRTEND} 35.endif 36_SHLINKER= ${SHLINKDIR}/ld.elf_so 37.else 38LIBCRTBEGIN?= 39LIBCRTEND?= 40_SHLINKER= ${SHLINKDIR}/ld.so 41.endif 42 43.ifndef LIBCRT0 44LIBCRT0= ${DESTDIR}/usr/lib/crt0.o 45.MADE: ${LIBCRT0} 46.endif 47.endif # NetBSD 48 49# here is where you can define what LIB* are 50.-include <libnames.mk> 51.if ${MK_DPADD_MK} == "yes" 52# lots of cool magic, but might not suit everyone. 53.include <dpadd.mk> 54.endif 55 56.if ${MK_GPROF} == "yes" 57CFLAGS+= ${CC_PG} ${PROFFLAGS} 58LDADD+= ${CC_PG} 59.if ${MK_DPADD_MK} == "no" 60LDADD_LIBC_P?= -lc_p 61LDADD_LAST+= ${LDADD_LIBC_P} 62.endif 63.endif 64 65.if defined(SHAREDSTRINGS) 66CLEANFILES+=strings 67.c.o: 68 @${COMPILE.c:N-c} -E ${.IMPSRC} | xstr -c - 69 @${COMPILE.c} x.c -o ${.TARGET} 70 @rm -f x.c 71 72# precompiled C++ Modules 73${CCM_SUFFIXES:%=%${PCM}}: 74 @${COMIPILE.cc:N-c} -E ${.IMPSRC} | xstr -c - 75 @mv -f x.c x.cc 76 @${COMPILE.pcm} x.cc -o ${.TARGET} 77 @rm -f x.cc 78 79${CXX_SUFFIXES:N.c*m:%=%.o}: 80 @${COMIPILE.cc:N-c} -E ${.IMPSRC} | xstr -c - 81 @mv -f x.c x.cc 82 @${COMPILE.cc} x.cc -o ${.TARGET} 83 @rm -f x.cc 84.endif 85 86.if defined(PROG_CXX) 87PROG= ${PROG_CXX} 88_SUPCXX?= -lstdc++ -lm 89.endif 90 91.if defined(PROG) 92BINDIR ?= ${prefix}/bin 93 94.if empty(SRCS) 95# init.mk handling of QUALIFIED_VAR_LIST means 96# SRCS will be defined - even if empty. 97SRCS = ${PROG}.c 98.endif 99 100SRCS ?= ${PROG}.c 101 102.for s in ${SRCS:${OBJS_SRCS_PRE_FILTER:ts:}:M*/*} 103${.o .po .lo:L:@o@${s:${OBJS_SRCS_FILTER:ts:}}$o@}: $s 104.endfor 105 106OBJS_SRCS = ${SRCS:${OBJS_SRCS_FILTER:ts:}} 107.if !empty(OBJS_SRCS) 108OBJS+= ${OBJS_SRCS:S/$/.o/g} 109LOBJS+= ${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln} 110.endif 111 112.if defined(OBJS) && !empty(OBJS) 113.NOPATH: ${OBJS} ${PROG} ${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}} 114 115# this is known to work for NetBSD 1.6 and FreeBSD 4.2 116.if ${TARGET_OSNAME:NFreeBSD:NNetBSD} == "" 117_PROGLDOPTS= 118.if ${SHLINKDIR} != "/usr/libexec" # XXX: change or remove if ld.so moves 119_PROGLDOPTS+= -Wl,-dynamic-linker=${_SHLINKER} 120.endif 121.if defined(LIBDIR) && ${SHLIBDIR} != ${LIBDIR} 122_PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBDIR}:${DESTDIR}/usr/lib \ 123 -L${DESTDIR}${SHLIBDIR} 124.endif 125_PROGLDOPTS+= -Wl,-rpath,${SHLIBDIR}:/usr/lib 126.endif # NetBSD 127 128.if ${MK_PROG_LDORDER_MK} != "no" 129${PROG}: ldorder 130 131.include <ldorder.mk> 132.endif 133# avoid -dL errors 134LDADD_LDORDER ?= 135LDSTATIC ?= 136 137.if defined(DESTDIR) && exists(${LIBCRT0}) && ${LIBCRT0} != "/dev/null" 138 139${PROG}: ${LIBCRT0} ${OBJS} ${LIBC} ${DPADD} 140 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} -nostdlib ${_PROGLDOPTS} -L${DESTDIR}/usr/lib ${LIBCRT0} ${LIBCRTBEGIN} ${OBJS} ${LDADD_LDORDER} ${LDADD} -L${DESTDIR}/usr/lib ${_SUPCXX} -lgcc -lc -lgcc ${LIBCRTEND} 141 142.else 143 144${PROG}: ${LIBCRT0} ${OBJS} ${LIBC} ${DPADD} 145 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} ${OBJS} ${LDADD_LDORDER} ${LDADD} 146 147.endif # defined(DESTDIR) 148.endif # defined(OBJS) && !empty(OBJS) 149 150.if !defined(MAN) 151MAN= ${PROG}.1 152.endif # !defined(MAN) 153.endif # defined(PROG) 154 155.if !defined(_SKIP_BUILD) 156realbuild: ${PROG} 157.endif 158 159all: _SUBDIRUSE 160 161.if !target(clean) 162cleanprog: 163 rm -f a.out [Ee]rrs mklog core *.core \ 164 ${PROG} ${OBJS} ${LOBJS} ${CLEANFILES} 165 166clean: _SUBDIRUSE cleanprog 167cleandir: _SUBDIRUSE cleanprog 168.else 169cleandir: _SUBDIRUSE clean 170.endif 171 172.if defined(SRCS) && (!defined(MKDEP) || ${MKDEP} != autodep) 173afterdepend: .depend 174 @(TMP=/tmp/_depend$$$$; \ 175 sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.ln:/' \ 176 < .depend > $$TMP; \ 177 mv $$TMP .depend) 178.endif 179 180.if !target(install) 181.if !target(beforeinstall) 182beforeinstall: 183.endif 184.if !target(afterinstall) 185afterinstall: 186.endif 187 188.if !empty(BINOWN) 189PROG_INSTALL_OWN ?= -o ${BINOWN} -g ${BINGRP} 190.endif 191 192.if !target(realinstall) 193realinstall: proginstall 194.endif 195.if !target(proginstall) 196proginstall: 197.if defined(PROG) 198 [ -d ${DESTDIR}${BINDIR} ] || \ 199 ${INSTALL} -d ${PROG_INSTALL_OWN} -m 775 ${DESTDIR}${BINDIR} 200 ${INSTALL} ${COPY} ${STRIP_FLAG} ${PROG_INSTALL_OWN} -m ${BINMODE} \ 201 ${PROG} ${DESTDIR}${BINDIR}/${PROG_NAME} 202.endif 203.if defined(HIDEGAME) 204 (cd ${DESTDIR}/usr/games; rm -f ${PROG}; ln -s dm ${PROG}) 205.endif 206.endif 207 208.include <links.mk> 209 210install: maninstall install_links _SUBDIRUSE 211 212install_links: 213.if !empty(SYMLINKS) 214 @set ${SYMLINKS}; ${_SYMLINKS_SCRIPT} 215.endif 216.if !empty(LINKS) 217 @set ${LINKS}; ${_LINKS_SCRIPT} 218.endif 219 220maninstall: afterinstall 221afterinstall: realinstall 222install_links: realinstall 223proginstall: beforeinstall 224realinstall: beforeinstall 225.endif 226 227.if !target(lint) 228lint: ${LOBJS} 229.if defined(LOBJS) && !empty(LOBJS) 230 @${LINT} ${LINTFLAGS} ${LDFLAGS:M-L*} ${LOBJS} ${LDADD} 231.endif 232.endif 233 234.NOPATH: ${PROG} 235.if defined(OBJS) && !empty(OBJS) 236.NOPATH: ${OBJS} 237.endif 238 239.if defined(FILES) || defined(FILESGROUPS) 240.include <files.mk> 241.endif 242 243.if ${MK_MAN} != "no" 244.include <man.mk> 245.endif 246 247.if ${MK_NLS} != "no" 248.include <nls.mk> 249.endif 250 251.include <obj.mk> 252.include <dep.mk> 253.include <subdir.mk> 254 255.if !empty(PROG) && ${MK_STAGING_PROG} == "yes" 256STAGE_BINDIR ?= ${STAGE_OBJTOP}${BINDIR} 257STAGE_DIR.prog ?= ${STAGE_BINDIR} 258.if ${PROG_NAME:U${PROG}} != ${PROG} 259STAGE_AS_SETS += prog 260STAGE_AS_${PROG} = ${PROG_NAME} 261stage_as.prog: ${PROG} 262.else 263STAGE_SETS += prog 264stage_files.prog: ${PROG} 265.endif 266.endif 267 268.include <final.mk> 269 270.endif 271