1# from: @(#)bsd.prog.mk 5.26 (Berkeley) 6/25/91 2# $FreeBSD$ 3 4.include <bsd.init.mk> 5.include <bsd.compiler.mk> 6 7.SUFFIXES: .out .o .c .cc .cpp .cxx .C .m .y .l .ln .s .S .asm 8 9# XXX The use of COPTS in modern makefiles is discouraged. 10.if defined(COPTS) 11CFLAGS+=${COPTS} 12.endif 13 14.if ${MK_ASSERT_DEBUG} == "no" 15CFLAGS+= -DNDEBUG 16NO_WERROR= 17.endif 18 19.if defined(DEBUG_FLAGS) 20CFLAGS+=${DEBUG_FLAGS} 21CXXFLAGS+=${DEBUG_FLAGS} 22 23.if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != "" 24CTFFLAGS+= -g 25.endif 26.endif 27 28.if defined(PROG_CXX) 29PROG= ${PROG_CXX} 30.endif 31 32.if !empty(LDFLAGS:M-Wl,*--oformat,*) || !empty(LDFLAGS:M-static) 33MK_DEBUG_FILES= no 34.endif 35 36.if defined(CRUNCH_CFLAGS) 37CFLAGS+=${CRUNCH_CFLAGS} 38.else 39.if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \ 40 empty(DEBUG_FLAGS:M-gdwarf-*) 41CFLAGS+= -g 42CTFFLAGS+= -g 43.endif 44.endif 45 46.if !defined(DEBUG_FLAGS) 47STRIP?= -s 48.endif 49 50.if defined(NO_ROOT) 51.if !defined(TAGS) || ! ${TAGS:Mpackage=*} 52TAGS+= package=${PACKAGE:Uruntime} 53.endif 54TAG_ARGS= -T ${TAGS:[*]:S/ /,/g} 55.endif 56 57.if defined(NO_SHARED) && (${NO_SHARED} != "no" && ${NO_SHARED} != "NO") 58LDFLAGS+= -static 59.endif 60 61.if ${MK_DEBUG_FILES} != "no" 62PROG_FULL=${PROG}.full 63# Use ${DEBUGDIR} for base system debug files, else .debug subdirectory 64.if defined(BINDIR) && (\ 65 ${BINDIR} == "/bin" ||\ 66 ${BINDIR:C%/libexec(/.*)?%/libexec%} == "/libexec" ||\ 67 ${BINDIR} == "/sbin" ||\ 68 ${BINDIR:C%/usr/(bin|bsdinstall|libexec|lpr|sendmail|sm.bin|sbin|tests)(/.*)?%/usr/bin%} == "/usr/bin"\ 69 ) 70DEBUGFILEDIR= ${DEBUGDIR}${BINDIR} 71.else 72DEBUGFILEDIR?= ${BINDIR}/.debug 73.endif 74.if !exists(${DESTDIR}${DEBUGFILEDIR}) 75DEBUGMKDIR= 76.endif 77.else 78PROG_FULL= ${PROG} 79.endif 80 81.if defined(PROG) 82PROGNAME?= ${PROG} 83 84.if defined(SRCS) 85 86OBJS+= ${SRCS:N*.h:R:S/$/.o/g} 87 88.if target(beforelinking) 89beforelinking: ${OBJS} 90${PROG_FULL}: beforelinking 91.endif 92${PROG_FULL}: ${OBJS} 93.if defined(PROG_CXX) 94 ${CXX:N${CCACHE_BIN}} ${CXXFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} \ 95 ${OBJS} ${LDADD} 96.else 97 ${CC:N${CCACHE_BIN}} ${CFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} ${OBJS} \ 98 ${LDADD} 99.endif 100.if ${MK_CTF} != "no" 101 ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS} 102.endif 103 104.else # !defined(SRCS) 105 106.if !target(${PROG}) 107.if defined(PROG_CXX) 108SRCS= ${PROG}.cc 109.else 110SRCS= ${PROG}.c 111.endif 112 113# Always make an intermediate object file because: 114# - it saves time rebuilding when only the library has changed 115# - the name of the object gets put into the executable symbol table instead of 116# the name of a variable temporary object. 117# - it's useful to keep objects around for crunching. 118OBJS+= ${PROG}.o 119 120.if target(beforelinking) 121beforelinking: ${OBJS} 122${PROG_FULL}: beforelinking 123.endif 124${PROG_FULL}: ${OBJS} 125.if defined(PROG_CXX) 126 ${CXX:N${CCACHE_BIN}} ${CXXFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} \ 127 ${OBJS} ${LDADD} 128.else 129 ${CC:N${CCACHE_BIN}} ${CFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} ${OBJS} \ 130 ${LDADD} 131.endif 132.if ${MK_CTF} != "no" 133 ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS} 134.endif 135.endif # !target(${PROG}) 136 137.endif # !defined(SRCS) 138 139.if ${MK_DEBUG_FILES} != "no" 140${PROG}: ${PROG_FULL} ${PROGNAME}.debug 141 ${OBJCOPY} --strip-debug --add-gnu-debuglink=${PROGNAME}.debug \ 142 ${PROG_FULL} ${.TARGET} 143 144${PROGNAME}.debug: ${PROG_FULL} 145 ${OBJCOPY} --only-keep-debug ${PROG_FULL} ${.TARGET} 146.endif 147 148.if ${MK_MAN} != "no" && !defined(MAN) && \ 149 !defined(MAN1) && !defined(MAN2) && !defined(MAN3) && \ 150 !defined(MAN4) && !defined(MAN5) && !defined(MAN6) && \ 151 !defined(MAN7) && !defined(MAN8) && !defined(MAN9) 152MAN= ${PROG}.1 153MAN1= ${MAN} 154.endif 155.endif # defined(PROG) 156 157.if defined(_SKIP_BUILD) 158all: 159.else 160all: ${PROG} ${SCRIPTS} 161.if ${MK_MAN} != "no" 162all: all-man 163.endif 164.endif 165 166.if defined(PROG) 167CLEANFILES+= ${PROG} 168.if ${MK_DEBUG_FILES} != "no" 169CLEANFILES+= ${PROG_FULL} ${PROGNAME}.debug 170.endif 171.endif 172 173.if defined(OBJS) 174CLEANFILES+= ${OBJS} 175.endif 176 177.include <bsd.libnames.mk> 178 179.if defined(PROG) 180_EXTRADEPEND: 181.if defined(LDFLAGS) && !empty(LDFLAGS:M-nostdlib) 182.if defined(DPADD) && !empty(DPADD) 183 echo ${PROG_FULL}: ${DPADD} >> ${DEPENDFILE} 184.endif 185.else 186 echo ${PROG_FULL}: ${LIBC} ${DPADD} >> ${DEPENDFILE} 187.if defined(PROG_CXX) 188.if ${COMPILER_TYPE} == "clang" && empty(CXXFLAGS:M-stdlib=libstdc++) 189 echo ${PROG_FULL}: ${LIBCPLUSPLUS} >> ${DEPENDFILE} 190.else 191 echo ${PROG_FULL}: ${LIBSTDCPLUSPLUS} >> ${DEPENDFILE} 192.endif 193.endif 194.endif 195.endif 196 197.if !target(install) 198 199.if defined(PRECIOUSPROG) 200.if !defined(NO_FSCHG) 201INSTALLFLAGS+= -fschg 202.endif 203INSTALLFLAGS+= -S 204.endif 205 206_INSTALLFLAGS:= ${INSTALLFLAGS} 207.for ie in ${INSTALLFLAGS_EDIT} 208_INSTALLFLAGS:= ${_INSTALLFLAGS${ie}} 209.endfor 210 211.if !target(realinstall) && !defined(INTERNALPROG) 212realinstall: _proginstall 213.ORDER: beforeinstall _proginstall 214_proginstall: 215.if defined(PROG) 216 ${INSTALL} ${TAG_ARGS} ${STRIP} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ 217 ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${BINDIR}/${PROGNAME} 218.if ${MK_DEBUG_FILES} != "no" 219.if defined(DEBUGMKDIR) 220 ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},debug} -d ${DESTDIR}${DEBUGFILEDIR}/ 221.endif 222 ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},debug} -o ${BINOWN} -g ${BINGRP} -m ${DEBUGMODE} \ 223 ${PROGNAME}.debug ${DESTDIR}${DEBUGFILEDIR}/${PROGNAME}.debug 224.endif 225.endif 226.endif # !target(realinstall) 227 228.if defined(SCRIPTS) && !empty(SCRIPTS) 229realinstall: _scriptsinstall 230.ORDER: beforeinstall _scriptsinstall 231 232SCRIPTSDIR?= ${BINDIR} 233SCRIPTSOWN?= ${BINOWN} 234SCRIPTSGRP?= ${BINGRP} 235SCRIPTSMODE?= ${BINMODE} 236 237STAGE_AS_SETS+= scripts 238stage_as.scripts: ${SCRIPTS} 239FLAGS.stage_as.scripts= -m ${SCRIPTSMODE} 240STAGE_FILES_DIR.scripts= ${STAGE_OBJTOP} 241.for script in ${SCRIPTS} 242.if defined(SCRIPTSNAME) 243SCRIPTSNAME_${script:T}?= ${SCRIPTSNAME} 244.else 245SCRIPTSNAME_${script:T}?= ${script:T:R} 246.endif 247SCRIPTSDIR_${script:T}?= ${SCRIPTSDIR} 248SCRIPTSOWN_${script:T}?= ${SCRIPTSOWN} 249SCRIPTSGRP_${script:T}?= ${SCRIPTSGRP} 250SCRIPTSMODE_${script:T}?= ${SCRIPTSMODE} 251STAGE_AS_${script:T}= ${SCRIPTSDIR_${script:T}}/${SCRIPTSNAME_${script:T}} 252_scriptsinstall: _SCRIPTSINS_${script:T} 253_SCRIPTSINS_${script:T}: ${script} 254 ${INSTALL} ${TAG_ARGS} -o ${SCRIPTSOWN_${.ALLSRC:T}} \ 255 -g ${SCRIPTSGRP_${.ALLSRC:T}} -m ${SCRIPTSMODE_${.ALLSRC:T}} \ 256 ${.ALLSRC} \ 257 ${DESTDIR}${SCRIPTSDIR_${.ALLSRC:T}}/${SCRIPTSNAME_${.ALLSRC:T}} 258.endfor 259.endif 260 261NLSNAME?= ${PROG} 262.include <bsd.nls.mk> 263 264.include <bsd.confs.mk> 265.include <bsd.files.mk> 266.include <bsd.incs.mk> 267.include <bsd.links.mk> 268 269.if ${MK_MAN} != "no" 270realinstall: maninstall 271.ORDER: beforeinstall maninstall 272.endif 273 274.endif # !target(install) 275 276.if !target(lint) 277lint: ${SRCS:M*.c} 278.if defined(PROG) 279 ${LINT} ${LINTFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC} 280.endif 281.endif 282 283.if ${MK_MAN} != "no" 284.include <bsd.man.mk> 285.endif 286 287.if defined(PROG) 288OBJS_DEPEND_GUESS+= ${SRCS:M*.h} 289.endif 290 291.include <bsd.dep.mk> 292 293.if defined(PROG) 294.if ${MK_FAST_DEPEND} == "no" && !exists(${.OBJDIR}/${DEPENDFILE}) 295${OBJS}: ${OBJS_DEPEND_GUESS} 296.endif 297.endif 298 299.include <bsd.clang-analyze.mk> 300.include <bsd.obj.mk> 301.include <bsd.sys.mk> 302