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