1# from: @(#)bsd.prog.mk 5.26 (Berkeley) 6/25/91 2 3.include <bsd.init.mk> 4.include <bsd.compiler.mk> 5.include <bsd.linker.mk> 6 7.SUFFIXES: .out .o .bc .c .cc .cpp .cxx .C .m .y .l .ll .ln .s .S .asm 8 9# XXX The use of COPTS in modern makefiles is discouraged. 10.if defined(COPTS) 11.warning ${.CURDIR}: COPTS should be CFLAGS. 12CFLAGS+=${COPTS} 13.endif 14 15.if ${MK_ASSERT_DEBUG} == "no" 16CFLAGS+= -DNDEBUG 17# XXX: shouldn't we ensure that !asserts marks potentially unused variables as 18# __unused instead of disabling -Werror globally? 19MK_WERROR= no 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 ${LINKER_TYPE} != "mac" 44.if ${MK_RELRO} == "no" 45LDFLAGS+= -Wl,-znorelro 46.else 47LDFLAGS+= -Wl,-zrelro 48.endif 49.endif 50.if ${MK_PIE} != "no" 51# Static PIE is not yet supported/tested. 52.if !defined(NO_SHARED) || ${NO_SHARED:tl} == "no" 53CFLAGS+= -fPIE 54CXXFLAGS+= -fPIE 55LDFLAGS+= -pie 56.endif 57.endif 58.if ${MK_RETPOLINE} != "no" 59.if ${COMPILER_FEATURES:Mretpoline} && ${LINKER_FEATURES:Mretpoline} 60CFLAGS+= -mretpoline 61CXXFLAGS+= -mretpoline 62# retpolineplt is broken with static linking (PR 233336) 63.if !defined(NO_SHARED) || ${NO_SHARED:tl} == "no" 64LDFLAGS+= -Wl,-zretpolineplt 65.endif 66.else 67.warning Retpoline requested but not supported by compiler or linker 68.endif 69.endif 70# LLD sensibly defaults to -znoexecstack, so do the same for BFD 71LDFLAGS.bfd+= -Wl,-znoexecstack 72.if ${MK_BRANCH_PROTECTION} != "no" 73CFLAGS+= -mbranch-protection=standard 74.if ${LINKER_FEATURES:Mbti-report} && defined(BTI_REPORT_ERROR) 75LDFLAGS+= -Wl,-zbti-report=error 76.endif 77.endif 78 79# Initialize stack variables on function entry 80.if ${OPT_INIT_ALL} != "none" 81.if ${COMPILER_FEATURES:Minit-all} 82CFLAGS+= -ftrivial-auto-var-init=${OPT_INIT_ALL} 83CXXFLAGS+= -ftrivial-auto-var-init=${OPT_INIT_ALL} 84.if ${OPT_INIT_ALL} == "zero" && ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} < 160000 85CFLAGS+= -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang 86CXXFLAGS+= -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang 87.endif 88.else 89.warning INIT_ALL (${OPT_INIT_ALL}) requested but not supported by compiler 90.endif 91.endif 92 93# Zero used registers on return (mitigate some ROP) 94.if ${MK_ZEROREGS} != "no" 95.if ${COMPILER_FEATURES:Mzeroregs} 96ZEROREG_TYPE?= used 97CFLAGS+= -fzero-call-used-regs=${ZEROREG_TYPE} 98CXXFLAGS+= -fzero-call-used-regs=${ZEROREG_TYPE} 99.endif 100.endif 101 102# bsd.sanitizer.mk is not installed, so don't require it (e.g. for ports). 103.sinclude "bsd.sanitizer.mk" 104 105.if ${MACHINE_CPUARCH} == "riscv" && ${LINKER_FEATURES:Mriscv-relaxations} == "" 106CFLAGS += -mno-relax 107.endif 108 109.if defined(CRUNCH_CFLAGS) 110CFLAGS+=${CRUNCH_CFLAGS} 111.else 112.if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \ 113 empty(DEBUG_FLAGS:M-gdwarf-*) 114.if !${COMPILER_FEATURES:Mcompressed-debug} 115CFLAGS+= ${DEBUG_FILES_CFLAGS:N-gz*} 116.else 117CFLAGS+= ${DEBUG_FILES_CFLAGS} 118.endif 119CTFFLAGS+= -g 120.endif 121.endif 122 123.if !defined(DEBUG_FLAGS) 124STRIP?= -s 125.endif 126 127.if defined(NO_ROOT) 128.if !defined(TAGS) || ! ${TAGS:Mpackage=*} 129TAGS+= package=${PACKAGE:Uutilities} 130.endif 131TAG_ARGS= -T ${TAGS:[*]:S/ /,/g} 132.endif 133 134.if defined(NO_SHARED) && ${NO_SHARED:tl} != "no" 135LDFLAGS+= -static 136.endif 137 138.if ${MK_DEBUG_FILES} != "no" 139PROG_FULL=${PROG}.full 140# Use ${DEBUGDIR} for base system debug files, else .debug subdirectory 141.if defined(BINDIR) && (\ 142 ${BINDIR} == "/bin" ||\ 143 ${BINDIR:C%/libexec(/.*)?%/libexec%} == "/libexec" ||\ 144 ${BINDIR} == "/sbin" ||\ 145 ${BINDIR:C%/usr/(bin|bsdinstall|libexec|lpr|sendmail|sm.bin|sbin|tests)(/.*)?%/usr/bin%} == "/usr/bin" ||\ 146 ${BINDIR} == "/usr/lib" \ 147 ) 148DEBUGFILEDIR= ${DEBUGDIR}${BINDIR} 149.else 150DEBUGFILEDIR?= ${BINDIR}/.debug 151.endif 152.if !exists(${DESTDIR}${DEBUGFILEDIR}) 153DEBUGMKDIR= 154.endif 155.else 156PROG_FULL= ${PROG} 157.endif 158 159.if defined(PROG) 160PROGNAME?= ${PROG} 161 162.if defined(SRCS) 163 164OBJS+= ${SRCS:N*.h:${OBJS_SRCS_FILTER:ts:}:S/$/.o/g} 165 166# LLVM bitcode / textual IR representations of the program 167BCOBJS+=${SRCS:N*.[hsS]:N*.asm:${OBJS_SRCS_FILTER:ts:}:S/$/.bco/g} 168LLOBJS+=${SRCS:N*.[hsS]:N*.asm:${OBJS_SRCS_FILTER:ts:}:S/$/.llo/g} 169 170.if target(beforelinking) 171beforelinking: ${OBJS} 172${PROG_FULL}: beforelinking 173.endif 174${PROG_FULL}: ${OBJS} 175.if defined(PROG_CXX) 176 ${CXX:N${CCACHE_BIN}} ${CXXFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} \ 177 ${OBJS} ${LDADD} 178.else 179 ${CC:N${CCACHE_BIN}} ${CFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} ${OBJS} \ 180 ${LDADD} 181.endif 182.if ${MK_CTF} != "no" 183 ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS} 184.endif 185 186.else # !defined(SRCS) 187 188.if !target(${PROG}) 189.if defined(PROG_CXX) 190SRCS= ${PROG}.cc 191.else 192SRCS= ${PROG}.c 193.endif 194 195# Always make an intermediate object file because: 196# - it saves time rebuilding when only the library has changed 197# - the name of the object gets put into the executable symbol table instead of 198# the name of a variable temporary object. 199# - it's useful to keep objects around for crunching. 200OBJS+= ${PROG}.o 201BCOBJS+= ${PROG}.bc 202LLOBJS+= ${PROG}.ll 203CLEANFILES+= ${PROG}.o ${PROG}.bc ${PROG}.ll 204 205.if target(beforelinking) 206beforelinking: ${OBJS} 207${PROG_FULL}: beforelinking 208.endif 209${PROG_FULL}: ${OBJS} 210.if defined(PROG_CXX) 211 ${CXX:N${CCACHE_BIN}} ${CXXFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} \ 212 ${OBJS} ${LDADD} 213.else 214 ${CC:N${CCACHE_BIN}} ${CFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} ${OBJS} \ 215 ${LDADD} 216.endif 217.if ${MK_CTF} != "no" 218 ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS} 219.endif 220.endif # !target(${PROG}) 221 222.endif # !defined(SRCS) 223 224.if ${MK_DEBUG_FILES} != "no" 225${PROG}: ${PROG_FULL} ${PROGNAME}.debug 226 ${OBJCOPY} --strip-debug --add-gnu-debuglink=${PROGNAME}.debug \ 227 ${PROG_FULL} ${.TARGET} 228 229${PROGNAME}.debug: ${PROG_FULL} 230 ${OBJCOPY} --only-keep-debug ${PROG_FULL} ${.TARGET} 231.endif 232 233.if defined(LLVM_LINK) 234${PROG_FULL}.bc: ${BCOBJS} 235 ${LLVM_LINK} -o ${.TARGET} ${BCOBJS} 236 237${PROG_FULL}.ll: ${LLOBJS} 238 ${LLVM_LINK} -S -o ${.TARGET} ${LLOBJS} 239 240CLEANFILES+= ${PROG_FULL}.bc ${PROG_FULL}.ll 241.endif # defined(LLVM_LINK) 242 243.if ${MK_MAN} != "no" && !defined(MAN) && \ 244 !defined(MAN1) && !defined(MAN2) && !defined(MAN3) && \ 245 !defined(MAN4) && !defined(MAN5) && !defined(MAN6) && \ 246 !defined(MAN7) && !defined(MAN8) && !defined(MAN9) 247MAN= ${PROG}.1 248MAN1= ${MAN} 249.endif 250.endif # defined(PROG) 251 252.if defined(_SKIP_BUILD) 253all: 254.else 255.if target(afterbuild) 256.ORDER: ${PROG} afterbuild 257all: ${PROG} ${SCRIPTS} afterbuild 258.else 259all: ${PROG} ${SCRIPTS} 260.endif 261.if ${MK_MAN} != "no" 262all: all-man 263.endif 264.endif 265 266.if defined(PROG) 267CLEANFILES+= ${PROG} ${PROG}.bc ${PROG}.ll 268.if ${MK_DEBUG_FILES} != "no" 269CLEANFILES+= ${PROG_FULL} ${PROGNAME}.debug 270.endif 271.endif 272 273.if defined(OBJS) 274CLEANFILES+= ${OBJS} ${BCOBJS} ${LLOBJS} 275.endif 276 277.include <bsd.libnames.mk> 278 279.if defined(PROG) 280.if !defined(NO_EXTRADEPEND) 281_EXTRADEPEND: 282.if defined(LDFLAGS) && !empty(LDFLAGS:M-nostdlib) 283.if defined(DPADD) && !empty(DPADD) 284 echo ${PROG_FULL}: ${DPADD} >> ${DEPENDFILE} 285.endif 286.else 287 echo ${PROG_FULL}: ${LIBC} ${DPADD} >> ${DEPENDFILE} 288.if defined(PROG_CXX) 289 echo ${PROG_FULL}: ${LIBCPLUSPLUS} >> ${DEPENDFILE} 290.endif 291.endif 292.endif # !defined(NO_EXTRADEPEND) 293.endif 294 295.if !target(install) 296 297.if defined(PRECIOUSPROG) 298.if !defined(NO_FSCHG) 299INSTALLFLAGS+= -fschg 300.endif 301INSTALLFLAGS+= -S 302.endif 303 304_INSTALLFLAGS:= ${INSTALLFLAGS} 305.for ie in ${INSTALLFLAGS_EDIT} 306_INSTALLFLAGS:= ${_INSTALLFLAGS${ie}} 307.endfor 308 309.if !target(realinstall) && !defined(INTERNALPROG) 310realinstall: _proginstall 311.ORDER: beforeinstall _proginstall 312_proginstall: 313.if defined(PROG) 314 ${INSTALL} ${TAG_ARGS} ${STRIP} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ 315 ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${BINDIR}/${PROGNAME} 316.if ${MK_DEBUG_FILES} != "no" 317.if defined(DEBUGMKDIR) 318 ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dbg} -d ${DESTDIR}${DEBUGFILEDIR}/ 319.endif 320 ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dbg} -o ${BINOWN} -g ${BINGRP} -m ${DEBUGMODE} \ 321 ${PROGNAME}.debug ${DESTDIR}${DEBUGFILEDIR}/${PROGNAME}.debug 322.endif 323.endif 324.endif # !target(realinstall) 325 326.if defined(SCRIPTS) && !empty(SCRIPTS) 327realinstall: _scriptsinstall 328.ORDER: beforeinstall _scriptsinstall 329 330SCRIPTSDIR?= ${BINDIR} 331SCRIPTSOWN?= ${BINOWN} 332SCRIPTSGRP?= ${BINGRP} 333SCRIPTSMODE?= ${BINMODE} 334 335STAGE_AS_SETS+= scripts 336stage_as.scripts: ${SCRIPTS} 337FLAGS.stage_as.scripts= -m ${SCRIPTSMODE} 338STAGE_FILES_DIR.scripts= ${STAGE_OBJTOP} 339.for script in ${SCRIPTS} 340.if defined(SCRIPTSNAME) 341SCRIPTSNAME_${script:T}?= ${SCRIPTSNAME} 342.else 343SCRIPTSNAME_${script:T}?= ${script:T:R} 344.endif 345SCRIPTSDIR_${script:T}?= ${SCRIPTSDIR} 346SCRIPTSOWN_${script:T}?= ${SCRIPTSOWN} 347SCRIPTSGRP_${script:T}?= ${SCRIPTSGRP} 348SCRIPTSMODE_${script:T}?= ${SCRIPTSMODE} 349STAGE_AS_${script:T}= ${SCRIPTSDIR_${script:T}}/${SCRIPTSNAME_${script:T}} 350_scriptsinstall: _SCRIPTSINS_${script:T} 351_SCRIPTSINS_${script:T}: ${script} 352 ${INSTALL} ${TAG_ARGS} -o ${SCRIPTSOWN_${.ALLSRC:T}} \ 353 -g ${SCRIPTSGRP_${.ALLSRC:T}} -m ${SCRIPTSMODE_${.ALLSRC:T}} \ 354 ${.ALLSRC} \ 355 ${DESTDIR}${SCRIPTSDIR_${.ALLSRC:T}}/${SCRIPTSNAME_${.ALLSRC:T}} 356.endfor 357.endif 358 359NLSNAME?= ${PROG} 360.include <bsd.nls.mk> 361 362.include <bsd.confs.mk> 363.include <bsd.files.mk> 364.include <bsd.incs.mk> 365 366LINKOWN?= ${BINOWN} 367LINKGRP?= ${BINGRP} 368LINKMODE?= ${BINMODE} 369.include <bsd.links.mk> 370 371.if ${MK_MAN} != "no" 372realinstall: maninstall 373.ORDER: beforeinstall maninstall 374.endif 375 376.endif # !target(install) 377 378.if ${MK_MAN} != "no" 379.include <bsd.man.mk> 380.endif 381 382.if defined(HAS_TESTS) 383MAKE+= MK_MAKE_CHECK_USE_SANDBOX=yes 384SUBDIR_TARGETS+= check 385TESTS_LD_LIBRARY_PATH+= ${.OBJDIR} 386TESTS_PATH+= ${.OBJDIR} 387.endif 388 389.if defined(PROG) 390OBJS_DEPEND_GUESS+= ${SRCS:M*.h} 391.endif 392 393.include <bsd.dep.mk> 394.include <bsd.clang-analyze.mk> 395.include <bsd.obj.mk> 396.include <bsd.sys.mk> 397