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