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