diff --git a/share/mk/bsd.confs.mk b/share/mk/bsd.confs.mk index ea702cece28d..77b573c7e42c 100644 --- a/share/mk/bsd.confs.mk +++ b/share/mk/bsd.confs.mk @@ -1,145 +1,145 @@ .if !target(____) . error bsd.conf.mk cannot be included directly. .endif .if !target(____) . if target(____) . error bsd.dirs.mk must be included after bsd.confs.mk. . endif ____: .NOTMAIN CONFGROUPS?= CONFS . if !target(buildconfig) . for group in ${CONFGROUPS} buildconfig: ${${group}} . endfor . endif . if !defined(_SKIP_BUILD) all: buildconfig . endif . for group in ${CONFGROUPS} . if defined(${group}) && !empty(${group}) . if !target(afterinstallconfig) afterinstallconfig: . endif . if !target(beforeinstallconfig) beforeinstallconfig: . endif installconfig: beforeinstallconfig realinstallconfig afterinstallconfig .ORDER: beforeinstallconfig realinstallconfig afterinstallconfig ${group}OWN?= ${SHAREOWN} ${group}GRP?= ${SHAREGRP} ${group}MODE?= ${CONFMODE} ${group}DIR?= ${CONFDIR} STAGE_SETS+= ${group:C,[/*],_,g} . if defined(NO_ROOT) . if !defined(${group}TAGS) || ! ${${group}TAGS:Mpackage=*} . if defined(${group}PACKAGE) ${group}TAGS+= package=${${group}PACKAGE:Uutilities} . else ${group}TAGS+= package=${PACKAGE:Uutilities} . endif . endif ${group}TAGS+= config -${group}TAG_ARGS= -T ${${group}TAGS:[*]:S/ /,/g} +${group}TAG_ARGS= -T ${${group}TAGS:ts,:[*]} . endif . if ${${group}DIR:S/^\///} == ${${group}DIR} # ${group}DIR specifies a variable that specifies a path DIRS+= ${${group}DIR} _${group}DIR= ${${group}DIR} . else # ${group}DIR specifies a path DIRS+= ${group}DIR _${group}DIR= ${group}DIR . endif STAGE_DIR.${group:C,[/*],_,g}= ${STAGE_OBJTOP}${${_${group}DIR}} . for cnf in ${${group}} ${group}OWN_${cnf}?= ${${group}OWN} ${group}GRP_${cnf}?= ${${group}GRP} ${group}MODE_${cnf}?= ${${group}MODE} ${group}DIR_${cnf}?= ${${group}DIR} . if defined(${group}NAME) ${group}NAME_${cnf}?= ${${group}NAME} . else ${group}NAME_${cnf}?= ${cnf:T} . endif # Determine the directory for the current file. Default to the parent group # DIR, then check to see how to pass that variable on below. ${group}DIR_${cnf}?= ${${group}DIR} . if ${${group}DIR_${cnf}:S/^\///} == ${${group}DIR_${cnf}} # DIR specifies a variable that specifies a path _${group}DIR_${cnf}= ${${group}DIR_${cnf}} . else # DIR directly specifies a path _${group}DIR_${cnf}= ${group}DIR_${cnf} . endif ${group}PREFIX_${cnf}= ${DESTDIR}${${_${group}DIR_${cnf}}} # Append DIR to DIRS if not already in place -- DIRS is already filtered, so # this is primarily to ease inspection. . for d in ${DIRS} _DIRS+= ${${d}} . endfor . if ${DIRS:M${_${group}DIR_${cnf}}} == "" . if ${_DIRS:M${${_${group}DIR_${cnf}}}} == "" DIRS+= ${_${group}DIR_${cnf}} . else _${group}DIR_${cnf}= ${group}DIR . endif . endif . if defined(${group}NAME) ${group}NAME_${cnf}?= ${${group}NAME} . else ${group}NAME_${cnf}?= ${cnf:T} . endif # defined(${group}NAME) # Work around a bug with install(1) -C and /dev/null . if ${cnf} == "/dev/null" INSTALL_COPY= . else INSTALL_COPY= -C . endif STAGE_AS_SETS+= ${cnf:T} STAGE_AS_${cnf:T}= ${${group}NAME_${cnf:T}} # XXX {group}OWN,GRP,MODE STAGE_DIR.${cnf:T}= ${STAGE_OBJTOP}${${_${group}DIR_${cnf}}} stage_as.${cnf:T}: ${cnf} realinstallconfig: installdirs-${_${group}DIR_${cnf}} _${group}INS_${cnf:T} _${group}INS_${cnf:T}: ${cnf} ${INSTALL} ${${group}TAG_ARGS} ${INSTALL_COPY} -o ${${group}OWN_${cnf}} \ -g ${${group}GRP_${cnf}} -m ${${group}MODE_${cnf}} \ ${.ALLSRC} ${${group}PREFIX_${cnf}}/${${group}NAME_${cnf}} . endfor # for cnf in ${${group}} . endif # defined(${group}) && !empty(${group}) . endfor .if ${MK_STAGING} != "no" . if !empty(STAGE_SETS) buildconfig: stage_files stage_files: . if !empty(STAGE_AS_SETS) buildconfig: stage_as stage_as: . endif . endif .endif .endif # !target(____) diff --git a/share/mk/bsd.dirs.mk b/share/mk/bsd.dirs.mk index 317ff61cd604..1f81bda80eab 100644 --- a/share/mk/bsd.dirs.mk +++ b/share/mk/bsd.dirs.mk @@ -1,54 +1,54 @@ # # Directory permissions management. .if !target(____) ____: .NOTMAIN # List of directory variable names to install. Each variable name's value # must be a full path. If non-default permissions are desired, _MODE, # _OWN, and _GRP may be specified. DIRS?= . for dir in ${DIRS:O:u} . if defined(${dir}) && !empty(${dir}) # Set default permissions for a directory ${dir}_MODE?= 0755 ${dir}_OWN?= root ${dir}_GRP?= wheel . if defined(${dir}_FLAGS) && !empty(${dir}_FLAGS) ${dir}_FLAG= -f ${${dir}_FLAGS} . endif . if defined(NO_ROOT) . if !defined(${dir}TAGS) || ! ${${dir}TAGS:Mpackage=*} ${dir}TAGS+= package=${${dir}PACKAGE:Uutilities} . endif -${dir}TAG_ARGS= -T ${${dir}TAGS:[*]:S/ /,/g} +${dir}TAG_ARGS= -T ${${dir}TAGS:ts,:[*]} . endif installdirs: installdirs-${dir} # Coalesce duplicate destdirs . if !defined(_uniquedirs_${${dir}}) _uniquedirs_${${dir}}= ${dir} _alldirs_${dir}= ${dir} installdirs-${dir}: .PHONY @${ECHO} installing DIRS ${_alldirs_${dir}} ${INSTALL} ${${dir}TAG_ARGS} -d -m ${${dir}_MODE} -o ${${dir}_OWN} \ -g ${${dir}_GRP} ${${dir}_FLAG} ${DESTDIR}${${dir}} . else _uniquedir:= ${_uniquedirs_${${dir}}} _alldirs_${_uniquedir}+=${dir} # Connect to the single target installdirs-${dir}: installdirs-${_uniquedir} # Validate that duplicate dirs have the same metadata. . for v in TAG_ARGS _MODE _OWN _GRP _FLAG . if ${${dir}${v}:Uunset} != ${${_uniquedir}${v}:Uunset} . warning ${RELDIR}: ${dir}${v} (${${dir}${v}:U}) does not match ${_uniquedir}${v} (${${_uniquedir}${v}:U}) but both install to ${${dir}} . endif . endfor . endif # !defined(_uniquedirs_${${dir}}) . endif # defined(${dir}) && !empty(${dir}) . endfor realinstall: installdirs .endif diff --git a/share/mk/bsd.doc.mk b/share/mk/bsd.doc.mk index ea8c68e87d50..675639db7611 100644 --- a/share/mk/bsd.doc.mk +++ b/share/mk/bsd.doc.mk @@ -1,199 +1,199 @@ # The include file handles installing BSD troff documents. # # # +++ variables +++ # # DCOMPRESS_CMD Program to compress troff documents. Output is to stdout. # [${COMPRESS_CMD}] # # DESTDIR Change the tree where the documents get installed. [not set] # # DOC Document name. [paper] # # EXTRA Extra files (not SRCS) that make up the document. [not set] # # LPR Printer command. [lpr] # # MACROS Macro packages used to build the document. [not set] # # WITHOUT_DOCCOMPRESS If you do not want formatted troff documents to be # compressed when they are installed. [not set] # # PRINTERDEVICE Indicates which output formats will be generated # (ascii, ps, html). [ascii] # # SRCDIR Directory where source files live. [${.CURDIR}] # # SRCS List of source files. [not set] # # TRFLAGS Additional flags to groff(1). [not set] # # USE_EQN If set, preprocess with eqn(1). [not set] # # USE_PIC If set, preprocess with pic(1). [not set] # # USE_REFER If set, preprocess with refer(1). [not set] # # USE_SOELIM If set, preprocess with soelim(1). [not set] # # USE_TBL If set, preprocess with tbl(1). [not set] # # VOLUME Volume the document belongs to. [not set] .include PRINTERDEVICE?= ascii BIB?= bib GREMLIN?= grn GRIND?= vgrind -f INDXBIB?= indxbib PIC?= pic REFER?= refer .for _dev in ${PRINTERDEVICE:Mascii} ROFF.ascii?= groff -Tascii -P-c ${TRFLAGS} -mtty-char ${MACROS} ${PAGES:C/^/-o/1} .endfor .for _dev in ${PRINTERDEVICE:Nascii} ROFF.${_dev}?= groff -T${_dev} ${TRFLAGS} ${MACROS} ${PAGES:C/^/-o/1} .endfor SOELIM?= soelim TBL?= tbl DOC?= paper LPR?= lpr .if defined(USE_EQN) TRFLAGS+= -e .endif .if defined(USE_PIC) TRFLAGS+= -p .endif .if defined(USE_REFER) TRFLAGS+= -R .endif .if defined(USE_SOELIM) TRFLAGS+= -I${.CURDIR} .endif .if defined(USE_TBL) TRFLAGS+= -t .endif .if defined(NO_ROOT) .if !defined(TAGS) || ! ${TAGS:Mpackage=*} TAGS+= package=${PACKAGE:Uutilities} .endif -TAG_ARGS= -T ${TAGS:[*]:S/ /,/g} +TAG_ARGS= -T ${TAGS:ts,:[*]} .endif DCOMPRESS_EXT?= ${COMPRESS_EXT} DCOMPRESS_CMD?= ${COMPRESS_CMD} .for _dev in ${PRINTERDEVICE:Mhtml} DFILE.html= ${DOC}.html .endfor .for _dev in ${PRINTERDEVICE:Nhtml} .if ${MK_DOCCOMPRESS} == "no" DFILE.${_dev}= ${DOC}.${_dev} .else DFILE.${_dev}= ${DOC}.${_dev}${DCOMPRESS_EXT} .endif .endfor UNROFF?= unroff HTML_SPLIT?= yes UNROFFFLAGS?= -fhtml .if ${HTML_SPLIT} == "yes" UNROFFFLAGS+= split=1 .endif # Compatibility mode flag for groff. Use this when formatting documents with # Berkeley me macros (orig_me(7)). COMPAT?= -C .PATH: ${.CURDIR} ${SRCDIR} .if !defined(_SKIP_BUILD) .for _dev in ${PRINTERDEVICE} all: ${DFILE.${_dev}} .endfor .endif .if !target(print) .for _dev in ${PRINTERDEVICE} print: ${DFILE.${_dev}} .endfor print: .for _dev in ${PRINTERDEVICE} .if ${MK_DOCCOMPRESS} == "no" ${LPR} ${DFILE.${_dev}} .else ${DCOMPRESS_CMD} -d ${DFILE.${_dev}} | ${LPR} .endif .endfor .endif .for _dev in ${PRINTERDEVICE:Nascii:Nps:Nhtml} CLEANFILES+= ${DOC}.${_dev} ${DOC}.${_dev}${DCOMPRESS_EXT} .endfor CLEANFILES+= ${DOC}.ascii ${DOC}.ascii${DCOMPRESS_EXT} \ ${DOC}.ps ${DOC}.ps${DCOMPRESS_EXT} \ ${DOC}.html ${DOC}-*.html realinstall: .if ${PRINTERDEVICE:Mhtml} cd ${SRCDIR}; \ ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},docs} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ ${DOC}*.html ${DESTDIR}${BINDIR}/${VOLUME}/ .endif .for _dev in ${PRINTERDEVICE:Nhtml} ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},docs} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ ${DFILE.${_dev}} ${DESTDIR}${BINDIR}/${VOLUME}/ .endfor spell: ${SRCS} (cd ${.CURDIR}; spell ${SRCS} ) | sort | \ comm -23 - ${.CURDIR}/spell.ok > ${DOC}.spell BINDIR?= /usr/share/doc BINMODE= 444 SRCDIR?= ${.CURDIR} .if defined(EXTRA) && !empty(EXTRA) _stamp.extra: ${EXTRA} touch ${.TARGET} .endif CLEANFILES+= _stamp.extra .for _dev in ${PRINTERDEVICE:Nhtml} .if !target(${DFILE.${_dev}}) .if target(_stamp.extra) ${DFILE.${_dev}}: _stamp.extra .endif ${DFILE.${_dev}}: ${SRCS} .if ${MK_DOCCOMPRESS} == "no" ${ROFF.${_dev}} ${.ALLSRC:N_stamp.extra} > ${.TARGET} .else ${ROFF.${_dev}} ${.ALLSRC:N_stamp.extra} | ${DCOMPRESS_CMD} > ${.TARGET} .endif .endif .endfor .for _dev in ${PRINTERDEVICE:Mhtml} .if !target(${DFILE.html}) .if target(_stamp.extra) ${DFILE.html}: _stamp.extra .endif ${DFILE.html}: ${SRCS} .if defined(MACROS) && !empty(MACROS) cd ${SRCDIR}; ${UNROFF} ${MACROS} ${UNROFFFLAGS} \ document=${DOC} ${SRCS} .else # unroff(1) requires a macro package as an argument cd ${SRCDIR}; ${UNROFF} -ms ${UNROFFFLAGS} \ document=${DOC} ${SRCS} .endif .endif .endfor DISTRIBUTION?= doc .include diff --git a/share/mk/bsd.incs.mk b/share/mk/bsd.incs.mk index df4cf4641141..848ee0aa2ea9 100644 --- a/share/mk/bsd.incs.mk +++ b/share/mk/bsd.incs.mk @@ -1,113 +1,113 @@ .if !target(____) .error bsd.incs.mk cannot be included directly. .endif .if ${MK_INCLUDES} != "no" INCSGROUPS?= INCS .if !target(buildincludes) .for group in ${INCSGROUPS} buildincludes: ${${group}} .endfor .endif .if !defined(_SKIP_BUILD) all: buildincludes .endif .if !target(installincludes) .for group in ${INCSGROUPS} .if defined(${group}) && !empty(${group}) ${group}OWN?= ${BINOWN} ${group}GRP?= ${BINGRP} ${group}MODE?= ${NOBINMODE} ${group}DIR?= ${INCLUDEDIR}${PRIVATELIB:D/private/${LIB}} STAGE_SETS+= ${group:C,[/*],_,g} STAGE_DIR.${group:C,[/*],_,g}= ${STAGE_OBJTOP}${${group}DIR} STAGE_SYMLINKS_DIR.${group:C,[/*],_,g}= ${STAGE_OBJTOP} .if defined(NO_ROOT) .if !defined(${group}TAGS) || ! ${${group}TAGS:Mpackage=*} .if defined(${group}PACKAGE) ${group}TAGS+= package=${${group}PACKAGE:Uutilities},dev .else ${group}TAGS+= package=${PACKAGE:Uutilities},dev .endif .endif -${group}TAG_ARGS= -T ${${group}TAGS:[*]:S/ /,/g} +${group}TAG_ARGS= -T ${${group}TAGS:ts,:[*]} .endif _${group}INCS= .for header in ${${group}} .if defined(${group}OWN_${header:T}) || defined(${group}GRP_${header:T}) || \ defined(${group}MODE_${header:T}) || defined(${group}DIR_${header:T}) || \ defined(${group}NAME_${header:T}) || defined(${group}NAME) ${group}OWN_${header:T}?= ${${group}OWN} ${group}GRP_${header:T}?= ${${group}GRP} ${group}MODE_${header:T}?= ${${group}MODE} ${group}DIR_${header:T}?= ${${group}DIR} .if defined(${group}NAME) ${group}NAME_${header:T}?= ${${group}NAME} .else ${group}NAME_${header:T}?= ${header:T} .endif STAGE_AS_SETS+= ${header:T} STAGE_AS_${header:T}= ${${group}NAME_${header:T}} # XXX {group}OWN,GRP,MODE STAGE_DIR.${header:T}= ${STAGE_OBJTOP}${${group}DIR_${header:T}} stage_as.${header:T}: ${header} stage_includes: stage_as.${header:T} installincludes: _${group}INS_${header:T} _${group}INS_${header:T}: ${header} ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dev} -C -o ${${group}OWN_${.ALLSRC:T}} \ -g ${${group}GRP_${.ALLSRC:T}} -m ${${group}MODE_${.ALLSRC:T}} \ ${.ALLSRC} \ ${DESTDIR}${${group}DIR_${.ALLSRC:T}}/${${group}NAME_${.ALLSRC:T}} .else _${group}INCS+= ${header} .endif .endfor # header in ${${group}} .if !empty(_${group}INCS) stage_files.${group}: ${_${group}INCS} stage_includes: stage_files.${group} installincludes: _${group}INS _${group}INS: ${_${group}INCS} .if defined(${group}NAME) ${INSTALL} ${${group}TAG_ARGS} -C -o ${${group}OWN} -g ${${group}GRP} -m ${${group}MODE} \ ${.ALLSRC} ${DESTDIR}${${group}DIR}/${${group}NAME} .else ${INSTALL} ${${group}TAG_ARGS} -C -o ${${group}OWN} -g ${${group}GRP} -m ${${group}MODE} \ ${.ALLSRC} ${DESTDIR}${${group}DIR}/ .endif .endif # !empty(_${group}INCS) .endif # defined(${group}) && !empty(${group}) .endfor # group in ${INCSGROUPS} .if defined(INCSLINKS) && !empty(INCSLINKS) installincludes: .for s t in ${INCSLINKS} ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ${s} ${DESTDIR}${t} .endfor .endif .endif # !target(installincludes) realinstall: installincludes .ORDER: beforeinstall installincludes .if ${MK_STAGING} != "no" && !defined(_SKIP_BUILD) .if !defined(NO_STAGE_INCLUDES) STAGE_TARGETS+= stage_includes .if !empty(INCSLINKS) STAGE_TARGETS+= stage_symlinks STAGE_SYMLINKS.INCS= ${INCSLINKS} .endif .endif .endif .endif # ${MK_INCLUDES} != "no" diff --git a/share/mk/bsd.lib.mk b/share/mk/bsd.lib.mk index 01dd979af155..3013f32c2b36 100644 --- a/share/mk/bsd.lib.mk +++ b/share/mk/bsd.lib.mk @@ -1,507 +1,507 @@ .include .include .include .include ____: .NOTMAIN .if defined(LIB_CXX) || defined(SHLIB_CXX) _LD= ${CXX} .else _LD= ${CC} .endif .if defined(LIB_CXX) LIB= ${LIB_CXX} .endif .if defined(SHLIB_CXX) SHLIB= ${SHLIB_CXX} .endif LIB_PRIVATE= ${PRIVATELIB:Dprivate} # Set up the variables controlling shared libraries. After this section, # SHLIB_NAME will be defined only if we are to create a shared library. # SHLIB_LINK will be defined only if we are to create a link to it. # INSTALL_PIC_ARCHIVE will be defined only if we are to create a PIC archive. # BUILD_NOSSP_PIC_ARCHIVE will be defined only if we are to create a PIC archive. .if defined(NO_PIC) .undef SHLIB_NAME .undef INSTALL_PIC_ARCHIVE .undef BUILD_NOSSP_PIC_ARCHIVE .else .if !defined(SHLIB) && defined(LIB) SHLIB= ${LIB} .endif .if !defined(SHLIB_NAME) && defined(SHLIB) && defined(SHLIB_MAJOR) SHLIB_NAME= lib${LIB_PRIVATE}${SHLIB}.so.${SHLIB_MAJOR} .endif .if defined(SHLIB_NAME) && !empty(SHLIB_NAME:M*.so.*) SHLIB_LINK?= ${SHLIB_NAME:R} .endif SONAME?= ${SHLIB_NAME} .endif .if defined(CRUNCH_CFLAGS) CFLAGS+= ${CRUNCH_CFLAGS} .endif .if ${MK_ASSERT_DEBUG} == "no" CFLAGS+= -DNDEBUG # XXX: shouldn't we ensure that !asserts marks potentially unused variables as # __unused instead of disabling -Werror globally? MK_WERROR= no .endif .if defined(DEBUG_FLAGS) CFLAGS+= ${DEBUG_FLAGS} .if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != "" CTFFLAGS+= -g .endif .else STRIP?= -s .endif .for _libcompat in ${_ALL_libcompats} .if ${SHLIBDIR:M*/lib${_libcompat}} || ${SHLIBDIR:M*/lib${_libcompat}/*} TAGS+= lib${_libcompat} .endif .endfor .if defined(NO_ROOT) .if !defined(TAGS) || ! ${TAGS:Mpackage=*} TAGS+= package=${PACKAGE:Uutilities} .endif -TAG_ARGS= -T ${TAGS:[*]:S/ /,/g} +TAG_ARGS= -T ${TAGS:ts,:[*]} .endif # ELF hardening knobs .if ${MK_BIND_NOW} != "no" LDFLAGS+= -Wl,-znow .endif .if ${LINKER_TYPE} != "mac" .if ${MK_RELRO} == "no" LDFLAGS+= -Wl,-znorelro .else LDFLAGS+= -Wl,-zrelro .endif .endif .if ${MK_RETPOLINE} != "no" .if ${COMPILER_FEATURES:Mretpoline} && ${LINKER_FEATURES:Mretpoline} CFLAGS+= -mretpoline CXXFLAGS+= -mretpoline LDFLAGS+= -Wl,-zretpolineplt .else .warning Retpoline requested but not supported by compiler or linker .endif .endif # LLD sensibly defaults to -znoexecstack, so do the same for BFD LDFLAGS.bfd+= -Wl,-znoexecstack .if ${MK_BRANCH_PROTECTION} != "no" CFLAGS+= -mbranch-protection=standard .if ${LINKER_FEATURES:Mbti-report} && defined(BTI_REPORT_ERROR) LDFLAGS+= -Wl,-zbti-report=error .endif .endif # Initialize stack variables on function entry .if ${OPT_INIT_ALL} != "none" .if ${COMPILER_FEATURES:Minit-all} CFLAGS+= -ftrivial-auto-var-init=${OPT_INIT_ALL} CXXFLAGS+= -ftrivial-auto-var-init=${OPT_INIT_ALL} .if ${OPT_INIT_ALL} == "zero" && ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} < 160000 CFLAGS+= -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang CXXFLAGS+= -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang .endif .else .warning INIT_ALL (${OPT_INIT_ALL}) requested but not supported by compiler .endif .endif # Zero used registers on return (mitigate some ROP) .if ${MK_ZEROREGS} != "no" .if ${COMPILER_FEATURES:Mzeroregs} ZEROREG_TYPE?= used CFLAGS+= -fzero-call-used-regs=${ZEROREG_TYPE} CXXFLAGS+= -fzero-call-used-regs=${ZEROREG_TYPE} .endif .endif # bsd.sanitizer.mk is not installed, so don't require it (e.g. for ports). .sinclude "bsd.sanitizer.mk" .if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \ empty(DEBUG_FLAGS:M-gdwarf*) .if !${COMPILER_FEATURES:Mcompressed-debug} CFLAGS+= ${DEBUG_FILES_CFLAGS:N-gz*} CXXFLAGS+= ${DEBUG_FILES_CFLAGS:N-gz*} .else CFLAGS+= ${DEBUG_FILES_CFLAGS} CXXFLAGS+= ${DEBUG_FILES_CFLAGS} .endif CTFFLAGS+= -g .endif .if ${MACHINE_CPUARCH} == "riscv" && ${LINKER_FEATURES:Mriscv-relaxations} == "" CFLAGS += -mno-relax .endif .include .include _LIBDIR:=${LIBDIR} _SHLIBDIR:=${SHLIBDIR} .if defined(SHLIB_NAME) .if ${MK_DEBUG_FILES} != "no" SHLIB_NAME_FULL=${SHLIB_NAME}.full # Use ${DEBUGDIR} for base system debug files, else .debug subdirectory .if ${_SHLIBDIR} == "/boot" ||\ ${SHLIBDIR:C%/lib(/.*)?$%/lib%} == "/lib" ||\ ${SHLIBDIR:C%/usr/lib(32|exec)?(/.*)?%/usr/lib%} == "/usr/lib" ||\ ${SHLIBDIR:C%/usr/tests(/.*)?%/usr/tests%} == "/usr/tests" DEBUGFILEDIR=${DEBUGDIR}${_SHLIBDIR} .else DEBUGFILEDIR=${_SHLIBDIR}/.debug .endif .if !exists(${DESTDIR}${DEBUGFILEDIR}) DEBUGMKDIR= .endif .else SHLIB_NAME_FULL=${SHLIB_NAME} .endif .endif .include # Allow libraries to specify their own version map or have it # automatically generated (see bsd.symver.mk above). .if !empty(VERSION_MAP) ${SHLIB_NAME_FULL}: ${VERSION_MAP} LDFLAGS+= -Wl,--version-script=${VERSION_MAP} # Ideally we'd always enable --no-undefined-version (default for lld >= 16), # but we have several symbols in our version maps that may or may not exist, # depending on compile-time defines and that needs to be handled first. .if ${MK_UNDEFINED_VERSION} == "no" LDFLAGS+= -Wl,--no-undefined-version .else LDFLAGS+= -Wl,--undefined-version .endif .endif .if defined(LIB) && !empty(LIB) || defined(SHLIB_NAME) OBJS+= ${SRCS:N*.h:${OBJS_SRCS_FILTER:ts:}:S/$/.o/} BCOBJS+= ${SRCS:N*.[hsS]:N*.asm:${OBJS_SRCS_FILTER:ts:}:S/$/.bco/g} LLOBJS+= ${SRCS:N*.[hsS]:N*.asm:${OBJS_SRCS_FILTER:ts:}:S/$/.llo/g} CLEANFILES+= ${OBJS} ${BCOBJS} ${LLOBJS} ${STATICOBJS} .endif .if defined(LIB) && !empty(LIB) .if defined(STATIC_LDSCRIPT) _STATICLIB_SUFFIX= _real .endif _LIBS= lib${LIB_PRIVATE}${LIB}${_STATICLIB_SUFFIX}.a lib${LIB_PRIVATE}${LIB}${_STATICLIB_SUFFIX}.a: ${OBJS} ${STATICOBJS} @${ECHO} Building static ${LIB} library @rm -f ${.TARGET} ${AR} ${ARFLAGS} ${.TARGET} ${OBJS} ${STATICOBJS} ${ARADD} .endif .if !defined(INTERNALLIB) .if defined(LLVM_LINK) lib${LIB_PRIVATE}${LIB}.bc: ${BCOBJS} ${LLVM_LINK} -o ${.TARGET} ${BCOBJS} lib${LIB_PRIVATE}${LIB}.ll: ${LLOBJS} ${LLVM_LINK} -S -o ${.TARGET} ${LLOBJS} CLEANFILES+= lib${LIB_PRIVATE}${LIB}.bc lib${LIB_PRIVATE}${LIB}.ll .endif .if defined(SHLIB_NAME) || \ defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) SOBJS+= ${OBJS:.o=.pico} DEPENDOBJS+= ${SOBJS} CLEANFILES+= ${SOBJS} .endif .if defined(SHLIB_NAME) _LIBS+= ${SHLIB_NAME} SOLINKOPTS+= -shared -Wl,-x .if defined(LD_FATAL_WARNINGS) && ${LD_FATAL_WARNINGS} == "no" SOLINKOPTS+= -Wl,--no-fatal-warnings .else SOLINKOPTS+= -Wl,--fatal-warnings .endif SOLINKOPTS+= -Wl,--warn-shared-textrel .if target(beforelinking) beforelinking: ${SOBJS} ${SHLIB_NAME_FULL}: beforelinking .endif .if defined(SHLIB_LINK) .if defined(SHLIB_LDSCRIPT) && !empty(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT}) ${SHLIB_LINK:R}.ld: ${.CURDIR}/${SHLIB_LDSCRIPT} sed -e 's,@@SHLIB@@,${_SHLIBDIR}/${SHLIB_NAME},g' \ -e 's,@@LIBDIR@@,${_LIBDIR},g' \ ${.ALLSRC} > ${.TARGET} ${SHLIB_NAME_FULL}: ${SHLIB_LINK:R}.ld CLEANFILES+= ${SHLIB_LINK:R}.ld .endif CLEANFILES+= ${SHLIB_LINK} .endif ${SHLIB_NAME_FULL}: ${SOBJS} @${ECHO} Building shared library ${SHLIB_NAME} @rm -f ${SHLIB_NAME} ${SHLIB_LINK} .if defined(SHLIB_LINK) && !commands(${SHLIB_LINK:R}.ld) && ${MK_DEBUG_FILES} == "no" # Note: This uses ln instead of ${INSTALL_LIBSYMLINK} since we are in OBJDIR @${LN:Uln} -fs ${SHLIB_NAME} ${SHLIB_LINK} .endif ${_LD:N${CCACHE_BIN}} ${LDFLAGS} ${SSP_CFLAGS} ${SOLINKOPTS} \ -o ${.TARGET} -Wl,-soname,${SONAME} ${SOBJS} ${LDADD} .if ${MK_CTF} != "no" ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${SOBJS} .endif .if ${MK_DEBUG_FILES} != "no" CLEANFILES+= ${SHLIB_NAME_FULL} ${SHLIB_NAME}.debug ${SHLIB_NAME}: ${SHLIB_NAME_FULL} ${SHLIB_NAME}.debug ${OBJCOPY} --strip-debug --add-gnu-debuglink=${SHLIB_NAME}.debug \ ${SHLIB_NAME_FULL} ${.TARGET} .if defined(SHLIB_LINK) && !commands(${SHLIB_LINK:R}.ld) # Note: This uses ln instead of ${INSTALL_LIBSYMLINK} since we are in OBJDIR @${LN:Uln} -fs ${SHLIB_NAME} ${SHLIB_LINK} .endif ${SHLIB_NAME}.debug: ${SHLIB_NAME_FULL} ${OBJCOPY} --only-keep-debug ${SHLIB_NAME_FULL} ${.TARGET} .endif .endif #defined(SHLIB_NAME) .if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) _LIBS+= lib${LIB_PRIVATE}${LIB}_pic.a lib${LIB_PRIVATE}${LIB}_pic.a: ${SOBJS} @${ECHO} Building special pic ${LIB} library @rm -f ${.TARGET} ${AR} ${ARFLAGS} ${.TARGET} ${SOBJS} ${ARADD} .endif .if defined(BUILD_NOSSP_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) NOSSPSOBJS+= ${OBJS:.o=.nossppico} DEPENDOBJS+= ${NOSSPSOBJS} CLEANFILES+= ${NOSSPSOBJS} _LIBS+= lib${LIB_PRIVATE}${LIB}_nossp_pic.a lib${LIB_PRIVATE}${LIB}_nossp_pic.a: ${NOSSPSOBJS} @${ECHO} Building special nossp pic ${LIB} library @rm -f ${.TARGET} ${AR} ${ARFLAGS} ${.TARGET} ${NOSSPSOBJS} ${ARADD} .endif .endif # !defined(INTERNALLIB) .if defined(INTERNALLIB) && ${MK_PIE} != "no" && defined(LIB) && !empty(LIB) PIEOBJS+= ${OBJS:.o=.pieo} DEPENDOBJS+= ${PIEOBJS} CLEANFILES+= ${PIEOBJS} _LIBS+= lib${LIB_PRIVATE}${LIB}_pie.a lib${LIB_PRIVATE}${LIB}_pie.a: ${PIEOBJS} @${ECHO} Building pie ${LIB} library @rm -f ${.TARGET} ${AR} ${ARFLAGS} ${.TARGET} ${PIEOBJS} ${ARADD} .endif .if defined(_SKIP_BUILD) all: .else .if defined(_LIBS) && !empty(_LIBS) all: ${_LIBS} .endif .if ${MK_MAN} != "no" && !defined(LIBRARIES_ONLY) all: all-man .endif .endif CLEANFILES+= ${_LIBS} _EXTRADEPEND: .if !defined(NO_EXTRADEPEND) && defined(SHLIB_NAME) .if defined(DPADD) && !empty(DPADD) echo ${SHLIB_NAME_FULL}: ${DPADD} >> ${DEPENDFILE} .endif .endif .if !target(install) INSTALLFLAGS+= -C .if defined(PRECIOUSLIB) .if !defined(NO_FSCHG) SHLINSTALLFLAGS+= -fschg .endif .endif # Install libraries with -S to avoid risk of modifying in-use libraries when # installing to a running system. It is safe to avoid this for NO_ROOT builds # that are only creating an image. # # XXX: Since Makefile.inc1 ends up building lib/libc both as part of # _startup_libs and as part of _generic_libs it ends up getting installed a # second time during the parallel build, and although the .WAIT in lib/Makefile # stops that mattering for lib, other directories like secure/lib are built in # parallel at the top level and are unaffected by that, so can sometimes race # with the libc.so.7 reinstall and see a missing or corrupt file. Ideally the # build system would be fixed to not build/install libc to WORLDTMP the second # time round, but for now using -S ensures the install is atomic and thus we # never see a broken intermediate state, so use it even for NO_ROOT builds. .if !defined(NO_SAFE_LIBINSTALL) #&& !defined(NO_ROOT) SHLINSTALLFLAGS+= -S SHLINSTALLSYMLINKFLAGS+= -S .endif _INSTALLFLAGS:= ${INSTALLFLAGS} .for ie in ${INSTALLFLAGS_EDIT} _INSTALLFLAGS:= ${_INSTALLFLAGS${ie}} .endfor _SHLINSTALLFLAGS:= ${SHLINSTALLFLAGS} _SHLINSTALLSYMLINKFLAGS:= ${SHLINSTALLSYMLINKFLAGS} .for ie in ${INSTALLFLAGS_EDIT} _SHLINSTALLFLAGS:= ${_SHLINSTALLFLAGS${ie}} .endfor .if defined(PCFILES) .for pcfile in ${PCFILES} installpcfiles: installpcfiles-${pcfile} installpcfiles-${pcfile}: ${pcfile} ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dev} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ ${_INSTALLFLAGS} \ ${.ALLSRC} ${DESTDIR}${LIBDATADIR}/pkgconfig/ .endfor .endif installpcfiles: .PHONY .if !defined(INTERNALLIB) realinstall: _libinstall installpcfiles .ORDER: beforeinstall _libinstall _libinstall: .if defined(LIB) && !empty(LIB) && ${MK_INSTALLLIB} != "no" ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dev} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ ${_INSTALLFLAGS} lib${LIB_PRIVATE}${LIB}${_STATICLIB_SUFFIX}.a ${DESTDIR}${_LIBDIR}/ .endif .if defined(SHLIB_NAME) ${INSTALL} ${TAG_ARGS} ${STRIP} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \ ${SHLIB_NAME} ${DESTDIR}${_SHLIBDIR}/ .if ${MK_DEBUG_FILES} != "no" .if defined(DEBUGMKDIR) ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dbg} -d ${DESTDIR}${DEBUGFILEDIR}/ .endif ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dbg} -o ${LIBOWN} -g ${LIBGRP} -m ${DEBUGMODE} \ ${_INSTALLFLAGS} \ ${SHLIB_NAME}.debug ${DESTDIR}${DEBUGFILEDIR}/ .endif .if defined(SHLIB_LINK) .if commands(${SHLIB_LINK:R}.ld) ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dev} -S -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ ${_INSTALLFLAGS} ${SHLIB_LINK:R}.ld \ ${DESTDIR}${_LIBDIR}/${SHLIB_LINK} .for _SHLIB_LINK_LINK in ${SHLIB_LDSCRIPT_LINKS} ${INSTALL_LIBSYMLINK} ${_SHLINSTALLSYMLINKFLAGS} ${TAG_ARGS} ${SHLIB_LINK} \ ${DESTDIR}${_LIBDIR}/${_SHLIB_LINK_LINK} .endfor .else .if ${_SHLIBDIR} == ${_LIBDIR} .if ${SHLIB_LINK:Mlib*} ${INSTALL_RSYMLINK} ${_SHLINSTALLSYMLINKFLAGS} ${TAG_ARGS:D${TAG_ARGS},dev} \ ${SHLIB_NAME} ${DESTDIR}${_LIBDIR}/${SHLIB_LINK} .else ${INSTALL_RSYMLINK} ${_SHLINSTALLSYMLINKFLAGS} ${TAG_ARGS} ${DESTDIR}${_SHLIBDIR}/${SHLIB_NAME} \ ${DESTDIR}${_LIBDIR}/${SHLIB_LINK} .endif .else .if ${SHLIB_LINK:Mlib*} ${INSTALL_RSYMLINK} ${_SHLINSTALLSYMLINKFLAGS} ${TAG_ARGS:D${TAG_ARGS},dev} \ ${DESTDIR}${_SHLIBDIR}/${SHLIB_NAME} ${DESTDIR}${_LIBDIR}/${SHLIB_LINK} .else ${INSTALL_RSYMLINK} ${_SHLINSTALLSYMLINKFLAGS} ${TAG_ARGS} \ ${DESTDIR}${_SHLIBDIR}/${SHLIB_NAME} ${DESTDIR}${_LIBDIR}/${SHLIB_LINK} .endif .if exists(${DESTDIR}${_LIBDIR}/${SHLIB_NAME}) -chflags noschg ${DESTDIR}${_LIBDIR}/${SHLIB_NAME} rm -f ${DESTDIR}${_LIBDIR}/${SHLIB_NAME} .endif .endif # _SHLIBDIR == _LIBDIR .endif # SHLIB_LDSCRIPT .endif # SHLIB_LINK .endif # SHIB_NAME .if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dev} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${_LIBDIR}/ .endif .endif # !defined(INTERNALLIB) .if !defined(LIBRARIES_ONLY) .include .include .include #No need to install header for INTERNALLIB .if !defined(INTERNALLIB) .include .endif .endif LINKOWN?= ${LIBOWN} LINKGRP?= ${LIBGRP} LINKMODE?= ${LIBMODE} SYMLINKOWN?= ${LIBOWN} SYMLINKGRP?= ${LIBGRP} LINKTAGS= dev .include .if ${MK_MAN} != "no" && !defined(LIBRARIES_ONLY) realinstall: maninstall .ORDER: beforeinstall maninstall .endif .endif .if ${MK_MAN} != "no" && !defined(LIBRARIES_ONLY) .include .endif .if defined(LIB) && !empty(LIB) OBJS_DEPEND_GUESS+= ${SRCS:M*.h} .endif .if defined(SHLIB_NAME) || \ defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) .for _S in ${SRCS:N*.[hly]} OBJS_DEPEND_GUESS.${_S:${OBJS_SRCS_FILTER:ts:}}.pico+= ${_S} .endfor .endif .if defined(BUILD_NOSSP_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) .for _S in ${SRCS:N*.[hly]} OBJS_DEPEND_GUESS.${_S:${OBJS_SRCS_FILTER:ts:}}.nossppico+= ${_S} .endfor .endif .if defined(HAS_TESTS) MAKE+= MK_MAKE_CHECK_USE_SANDBOX=yes SUBDIR_TARGETS+= check TESTS_LD_LIBRARY_PATH+= ${.OBJDIR} .endif .include .include .include .include diff --git a/share/mk/bsd.links.mk b/share/mk/bsd.links.mk index 437ffd0d3b34..509520a24a3a 100644 --- a/share/mk/bsd.links.mk +++ b/share/mk/bsd.links.mk @@ -1,35 +1,35 @@ .if !target(____) .error bsd.links.mk cannot be included directly. .endif .if defined(NO_ROOT) .if !defined(TAGS) || ! ${TAGS:Mpackage=*} TAGS+= package=${PACKAGE} .endif -TAG_ARGS= -T ${TAGS:[*]:S/ /,/g} +TAG_ARGS= -T ${TAGS:ts,:[*]} .endif afterinstall: _installlinks .ORDER: realinstall _installlinks _installlinks: .for s t in ${LINKS} # On MacOS, assume case folding FS, and don't install links from foo.x to FOO.x. .if ${.MAKE.OS} != "Darwin" || ${s:tu} != ${t:tu} .if defined(LINKTAGS) ${INSTALL_LINK} ${TAG_ARGS:D${TAG_ARGS},${LINKTAGS}} ${DESTDIR}${s} ${DESTDIR}${t} .else ${INSTALL_LINK} ${TAG_ARGS} ${DESTDIR}${s} ${DESTDIR}${t} .endif .endif .endfor .for s t in ${SYMLINKS} # On MacOS, assume case folding FS, and don't install links from foo.x to FOO.x. .if ${.MAKE.OS} != "Darwin" || ${s:tu} != ${t:tu} .if defined(LINKTAGS) ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},${LINKTAGS}} ${s} ${DESTDIR}${t} .else ${INSTALL_SYMLINK} ${TAG_ARGS} ${s} ${DESTDIR}${t} .endif .endif .endfor diff --git a/share/mk/bsd.man.mk b/share/mk/bsd.man.mk index 3444e9612a20..b21522796845 100644 --- a/share/mk/bsd.man.mk +++ b/share/mk/bsd.man.mk @@ -1,304 +1,304 @@ # # The include file handles installing manual pages and # their links. # # # +++ variables +++ # # DESTDIR Change the tree where the man pages gets installed. [not set] # # MANDIR Base path for manual installation. [${SHAREDIR}/man/man] # # MANOWN Manual owner. [${SHAREOWN}] # # MANGRP Manual group. [${SHAREGRP}] # # MANMODE Manual mode. [${NOBINMODE}] # # MANSUBDIR Subdirectory under the manual page section, i.e. "/i386" # or "/tahoe" for machine specific manual pages. # # MAN The manual pages to be installed. For sections see # variable ${SECTIONS} # # MCOMPRESS_CMD Program to compress man pages. Output is to # stdout. [${COMPRESS_CMD}] # # MLINKS List of manual page links (using a suffix). The # linked-to file must come first, the linked file # second, and there may be multiple pairs. The files # are hard-linked. # # NO_MLINKS If you do not want install manual page links. [not set] # # MANFILTER command to pipe the raw man page through before compressing # or installing. Can be used to do sed substitution. # # MANBUILDCAT create preformatted manual pages in addition to normal # pages. [not set] # # MANDOC_CMD command and flags to create preformatted pages # # MANGROUPS A list of groups, each of which should be a variable containing # a list of manual pages in that group. By default one group is # defined called "MAN". # # For each group, group-specific options may be set: # OWN, GRP, MODE and PACKAGE. # # +++ targets +++ # # maninstall: # Install the manual pages and their links. # .if !target(____) .error bsd.man.mk cannot be included directly. .endif MANGROUPS?= MAN # Backwards compatibility. MINSTALL?= ${MANINSTALL} CATDIR= ${MANDIR:H:S/$/\/cat/} CATEXT= .cat MANDOC_CMD?= mandoc -Tascii MCOMPRESS_CMD?= ${COMPRESS_CMD} MCOMPRESS_EXT?= ${COMPRESS_EXT} SECTIONS= 1 2 3 4 5 6 7 8 9 .SUFFIXES: ${SECTIONS:S/^/./g} # Backwards compatibility. .if !defined(MAN) .for __sect in ${SECTIONS} MANGROUPS+= MAN${__sect} .endfor .endif # Following the conventions of MANGROUPS, manpage links should be defined # as ${group}LINKS, which means the default groups' links would be called # MANLINKS. However it's actually called MLINKS, so for compatibility, # use ${MLINKS} as the default group's links if it's set. .if defined(MLINKS) MANLINKS= ${MLINKS} .endif maninstall: realmaninstall manlinksinstall .PHONY # Make sure all manpages are installed before we try to link any. .ORDER: realmaninstall manlinksinstall realmaninstall: .PHONY manlinksinstall: .PHONY all-man: .for __group in ${MANGROUPS} realmaninstall: realmaninstall-${__group} manlinksinstall: manlinksinstall-${__group} ${__group}OWN?= ${MANOWN} ${__group}GRP?= ${MANGRP} ${__group}MODE?= ${MANMODE} # Tag processing is only done for NO_ROOT installs. .if defined(NO_ROOT) .if !defined(${__group}TAGS) || ! ${${__group}TAGS:Mpackage=*} .if ${MK_MANSPLITPKG} == "no" ${__group}TAGS+= package=${${__group}PACKAGE:U${PACKAGE:Uutilities}} .else ${__group}TAGS+= package=${${__group}PACKAGE:U${PACKAGE:Uutilities}}-man .endif .endif -${__group}TAG_ARGS= -T ${${__group}TAGS:[*]:S/ /,/g} +${__group}TAG_ARGS= -T ${${__group}TAGS:ts,:[*]} .endif # defined(NO_ROOT) ${__group}INSTALL?= ${INSTALL} ${${__group}TAG_ARGS} \ -o ${${__group}OWN} -g ${${__group}GRP} -m ${${__group}MODE} .if ${MK_MANCOMPRESS} == "no" # Make special arrangements to filter to a temporary file at build time # for MK_MANCOMPRESS == no. .if defined(MANFILTER) FILTEXTENSION= .filt .else FILTEXTENSION= .endif ZEXT= .if defined(MANFILTER) .if defined(${__group}) && !empty(${__group}) CLEANFILES+= ${${__group}:T:S/$/${FILTEXTENSION}/g} CLEANFILES+= ${${__group}:T:S/$/${CATEXT}${FILTEXTENSION}/g} .for __page in ${${__group}} # Escape colons in target names to support manual pages whose # filenames contain colons. .for __target in ${__page:T:S/:/\:/g:S/$/${FILTEXTENSION}/g} all-man: ${__target} ${__target}: ${__page} ${MANFILTER} < ${.ALLSRC} > ${.TARGET} .endfor .if defined(MANBUILDCAT) && !empty(MANBUILDCAT) .for __target in ${__page:T:S/:/\:/g:S/$/${CATEXT}${FILTEXTENSION}/g} all-man: ${__target} ${__target}: ${__page} ${MANFILTER} < ${.ALLSRC} | ${MANDOC_CMD} > ${.TARGET} .endfor .endif .endfor .endif # !empty(${__group}) .else # !defined(MANFILTER) .if defined(${__group}) && !empty(${__group}) CLEANFILES+= ${${__group}:T:S/$/${CATEXT}/g} .if defined(MANBUILDCAT) && !empty(MANBUILDCAT) .for __page in ${${__group}} .for __target in ${__page:T:S/:/\:/g:S/$/${CATEXT}/g} all-man: ${__target} ${__target}: ${__page} ${MANDOC_CMD} ${.ALLSRC} > ${.TARGET} .endfor .endfor .else all-man: ${${__group}} .endif .endif .endif # defined(MANFILTER) .else # ${MK_MANCOMPRESS} == "yes" ZEXT= ${MCOMPRESS_EXT} .if defined(${__group}) && !empty(${__group}) CLEANFILES+= ${${__group}:T:S/$/${MCOMPRESS_EXT}/g} CLEANFILES+= ${${__group}:T:S/$/${CATEXT}${MCOMPRESS_EXT}/g} .for __page in ${${__group}} .for __target in ${__page:T:S/:/\:/g:S/$/${MCOMPRESS_EXT}/} all-man: ${__target} ${__target}: ${__page} .if defined(MANFILTER) ${MANFILTER} < ${.ALLSRC} | ${MCOMPRESS_CMD} > ${.TARGET} .else ${MCOMPRESS_CMD} ${.ALLSRC} > ${.TARGET} .endif .endfor .if defined(MANBUILDCAT) && !empty(MANBUILDCAT) .for __target in ${__page:T:S/:/\:/g:S/$/${CATEXT}${MCOMPRESS_EXT}/} all-man: ${__target} ${__target}: ${__page} .if defined(MANFILTER) ${MANFILTER} < ${.ALLSRC} | ${MANDOC_CMD} | ${MCOMPRESS_CMD} > ${.TARGET} .else ${MANDOC_CMD} ${.ALLSRC} | ${MCOMPRESS_CMD} > ${.TARGET} .endif .endfor .endif .endfor .endif .endif # ${MK_MANCOMPRESS} == "no" _MANLINKS= .if !defined(NO_MLINKS) && defined(${__group}LINKS) && !empty(${__group}LINKS) .for _oname _osect _dname _dsect in ${${__group}LINKS:C/\.([^.]*)$/.\1 \1/} _MANLINKS+= ${MANDIR}${_osect}${MANSUBDIR}/${_oname} \ ${MANDIR}${_dsect}${MANSUBDIR}/${_dname} .if defined(MANBUILDCAT) && !empty(MANBUILDCAT) _MANLINKS+= ${CATDIR}${_osect}${MANSUBDIR}/${_oname} \ ${CATDIR}${_dsect}${MANSUBDIR}/${_dname} .endif .endfor .endif .if defined(${__group}) && !empty(${__group}) .if ${MK_STAGING_MAN} == "yes" STAGE_TARGETS+= stage_files.${__group} _mansets.${__group}:= ${${__group}:E:O:u:M*[1-9]:@s@man$s@} STAGE_SETS+= ${_mansets.${__group}} .for _page in ${${__group}} stage_files.${__group}.man${_page:T:E}: ${_page} .if target(${_page}${MCOMPRESS_EXT}) stage_files.${__group}.man${_page:T:E}: ${_page}${MCOMPRESS_EXT} .endif STAGE_DIR.${__group}.man${_page:T:E}?= ${STAGE_OBJTOP}${MANDIR}${_page:T:E}${MANSUBDIR} .endfor .if !defined(NO_MLINKS) && !empty(${__group}LINKS) STAGE_SETS+= mlinks.${__group} STAGE_TARGETS+= stage_links.${__group} STAGE_LINKS.mlinks.${__group}:= ${${__group}LINKS:M*.[1-9]:@f@${f:S,^,${MANDIR}${f:E}${MANSUBDIR}/,}@} stage_links.mlinks.${__group}: ${_mansets.${__group}:@s@stage_files.${__group}.$s@} .endif .endif .endif realmaninstall-${__group}: .if defined(${__group}) && !empty(${__group}) realmaninstall-${__group}: ${${__group}} .if ${MK_MANCOMPRESS} == "no" .if defined(MANFILTER) .for __page in ${${__group}} ${${__group}INSTALL} ${__page:T:S/$/${FILTEXTENSION}/g} \ ${DESTDIR}${MANDIR}${__page:E}${MANSUBDIR}/${__page} .if defined(MANBUILDCAT) && !empty(MANBUILDCAT) ${${__group}INSTALL} ${__page:T:S/$/${CATEXT}${FILTEXTENSION}/g} \ ${DESTDIR}${CATDIR}${__page:E}${MANSUBDIR}/${__page} .endif .endfor .else # !defined(MANFILTER) @set ${.ALLSRC:C/\.([^.]*)$/.\1 \1/}; \ while : ; do \ case $$# in \ 0) break;; \ 1) echo "warn: missing extension: $$1"; break;; \ esac; \ page=$$1; shift; sect=$$1; shift; \ d=${DESTDIR}${MANDIR}$${sect}${MANSUBDIR}; \ ${ECHO} ${${__group}INSTALL} $${page} $${d}; \ ${${__group}INSTALL} $${page} $${d}; \ done .if defined(MANBUILDCAT) && !empty(MANBUILDCAT) .for __page in ${${__group}} ${${__group}INSTALL} ${__page:T:S/$/${CATEXT}/} \ ${DESTDIR}${CATDIR}${__page:E}${MANSUBDIR}/${__page:T} .endfor .endif .endif # defined(MANFILTER) .else # ${MK_MANCOMPRESS} == "yes" .for __page in ${${__group}} ${${__group}INSTALL} ${__page:T:S/$/${MCOMPRESS_EXT}/g} \ ${DESTDIR}${MANDIR}${__page:E}${MANSUBDIR}/ .if defined(MANBUILDCAT) && !empty(MANBUILDCAT) ${${__group}INSTALL} ${__page:T:S/$/${CATEXT}${MCOMPRESS_EXT}/g} \ ${DESTDIR}${CATDIR}${__page:E}${MANSUBDIR}/${__page:T:S/$/${MCOMPRESS_EXT}/} .endif .endfor .endif # ${MK_MANCOMPRESS} == "no" .endif manlinksinstall-${__group}: .for l t in ${_MANLINKS} # On MacOS, assume case folding FS, and don't install links from foo.x to FOO.x. .if ${.MAKE.OS} != "Darwin" || ${l:tu} != ${t:tu} ${INSTALL_MANLINK} ${${__group}TAG_ARGS} ${DESTDIR}${l}${ZEXT} ${DESTDIR}${t}${ZEXT} .endif .endfor manlint: .if defined(${__group}) && !empty(${__group}) .for __page in ${${__group}} manlint: ${__page}lint ${__page}lint: ${__page} .if defined(MANFILTER) ${MANFILTER} < ${.ALLSRC} | ${MANDOC_CMD} -Tlint .else ${MANDOC_CMD} -Tlint ${.ALLSRC} .endif .endfor .endif .endfor # __group in ${MANGROUPS} diff --git a/share/mk/bsd.prog.mk b/share/mk/bsd.prog.mk index f44556ef9b75..9350d4786cec 100644 --- a/share/mk/bsd.prog.mk +++ b/share/mk/bsd.prog.mk @@ -1,397 +1,397 @@ # from: @(#)bsd.prog.mk 5.26 (Berkeley) 6/25/91 .include .include .include .include # XXX The use of COPTS in modern makefiles is discouraged. .if defined(COPTS) .warning ${.CURDIR}: COPTS should be CFLAGS. CFLAGS+=${COPTS} .endif .if ${MK_ASSERT_DEBUG} == "no" CFLAGS+= -DNDEBUG # XXX: shouldn't we ensure that !asserts marks potentially unused variables as # __unused instead of disabling -Werror globally? MK_WERROR= no .endif .if defined(DEBUG_FLAGS) CFLAGS+=${DEBUG_FLAGS} CXXFLAGS+=${DEBUG_FLAGS} .if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != "" CTFFLAGS+= -g .endif .endif .if defined(PROG_CXX) PROG= ${PROG_CXX} .endif .if !empty(LDFLAGS:M-Wl,*--oformat,*) || !empty(LDFLAGS:M-static) MK_DEBUG_FILES= no .endif # ELF hardening knobs .if ${MK_BIND_NOW} != "no" LDFLAGS+= -Wl,-znow .endif .if ${LINKER_TYPE} != "mac" .if ${MK_RELRO} == "no" LDFLAGS+= -Wl,-znorelro .else LDFLAGS+= -Wl,-zrelro .endif .endif # Static PIE is not yet supported/tested. .if ${MK_PIE} != "no" && (!defined(NO_SHARED) || ${NO_SHARED:tl} == "no") CFLAGS+= -fPIE CXXFLAGS+= -fPIE LDFLAGS+= -pie OBJ_EXT=pieo .else OBJ_EXT=o .endif .if ${MK_RETPOLINE} != "no" .if ${COMPILER_FEATURES:Mretpoline} && ${LINKER_FEATURES:Mretpoline} CFLAGS+= -mretpoline CXXFLAGS+= -mretpoline # retpolineplt is broken with static linking (PR 233336) .if !defined(NO_SHARED) || ${NO_SHARED:tl} == "no" LDFLAGS+= -Wl,-zretpolineplt .endif .else .warning Retpoline requested but not supported by compiler or linker .endif .endif # LLD sensibly defaults to -znoexecstack, so do the same for BFD LDFLAGS.bfd+= -Wl,-znoexecstack .if ${MK_BRANCH_PROTECTION} != "no" CFLAGS+= -mbranch-protection=standard .if ${LINKER_FEATURES:Mbti-report} && defined(BTI_REPORT_ERROR) LDFLAGS+= -Wl,-zbti-report=error .endif .endif # Initialize stack variables on function entry .if ${OPT_INIT_ALL} != "none" .if ${COMPILER_FEATURES:Minit-all} CFLAGS+= -ftrivial-auto-var-init=${OPT_INIT_ALL} CXXFLAGS+= -ftrivial-auto-var-init=${OPT_INIT_ALL} .if ${OPT_INIT_ALL} == "zero" && ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} < 160000 CFLAGS+= -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang CXXFLAGS+= -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang .endif .else .warning INIT_ALL (${OPT_INIT_ALL}) requested but not supported by compiler .endif .endif # Zero used registers on return (mitigate some ROP) .if ${MK_ZEROREGS} != "no" .if ${COMPILER_FEATURES:Mzeroregs} ZEROREG_TYPE?= used CFLAGS+= -fzero-call-used-regs=${ZEROREG_TYPE} CXXFLAGS+= -fzero-call-used-regs=${ZEROREG_TYPE} .endif .endif # bsd.sanitizer.mk is not installed, so don't require it (e.g. for ports). .sinclude "bsd.sanitizer.mk" .if ${MACHINE_CPUARCH} == "riscv" && ${LINKER_FEATURES:Mriscv-relaxations} == "" CFLAGS += -mno-relax .endif .if defined(CRUNCH_CFLAGS) CFLAGS+=${CRUNCH_CFLAGS} .else .if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \ empty(DEBUG_FLAGS:M-gdwarf-*) .if !${COMPILER_FEATURES:Mcompressed-debug} CFLAGS+= ${DEBUG_FILES_CFLAGS:N-gz*} .else CFLAGS+= ${DEBUG_FILES_CFLAGS} .endif CTFFLAGS+= -g .endif .endif .if !defined(DEBUG_FLAGS) STRIP?= -s .endif .if defined(NO_ROOT) .if !defined(TAGS) || ! ${TAGS:Mpackage=*} TAGS+= package=${PACKAGE:Uutilities} .endif -TAG_ARGS= -T ${TAGS:[*]:S/ /,/g} +TAG_ARGS= -T ${TAGS:ts,:[*]} .endif .if defined(NO_SHARED) && ${NO_SHARED:tl} != "no" LDFLAGS+= -static .endif .if ${MK_DEBUG_FILES} != "no" PROG_FULL=${PROG}.full # Use ${DEBUGDIR} for base system debug files, else .debug subdirectory .if defined(BINDIR) && (\ ${BINDIR} == "/bin" ||\ ${BINDIR:C%/libexec(/.*)?%/libexec%} == "/libexec" ||\ ${BINDIR} == "/sbin" ||\ ${BINDIR:C%/usr/(bin|bsdinstall|libexec|lpr|sendmail|sm.bin|sbin|tests)(/.*)?%/usr/bin%} == "/usr/bin" ||\ ${BINDIR} == "/usr/lib" \ ) DEBUGFILEDIR= ${DEBUGDIR}${BINDIR} .else DEBUGFILEDIR?= ${BINDIR}/.debug .endif .if !exists(${DESTDIR}${DEBUGFILEDIR}) DEBUGMKDIR= .endif .else PROG_FULL= ${PROG} .endif .if defined(PROG) PROGNAME?= ${PROG} .if defined(SRCS) OBJS+= ${SRCS:N*.h:${OBJS_SRCS_FILTER:ts:}:S/$/.${OBJ_EXT}/g} # LLVM bitcode / textual IR representations of the program BCOBJS+=${SRCS:N*.[hsS]:N*.asm:${OBJS_SRCS_FILTER:ts:}:S/$/.bco/g} LLOBJS+=${SRCS:N*.[hsS]:N*.asm:${OBJS_SRCS_FILTER:ts:}:S/$/.llo/g} .if target(beforelinking) beforelinking: ${OBJS} ${PROG_FULL}: beforelinking .endif ${PROG_FULL}: ${OBJS} .if defined(PROG_CXX) ${CXX:N${CCACHE_BIN}} ${CXXFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} \ ${OBJS} ${LDADD} .else ${CC:N${CCACHE_BIN}} ${CFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} ${OBJS} \ ${LDADD} .endif .if ${MK_CTF} != "no" ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS} .endif .else # !defined(SRCS) .if !target(${PROG}) .if defined(PROG_CXX) SRCS= ${PROG}.cc .else SRCS= ${PROG}.c .endif # Always make an intermediate object file because: # - it saves time rebuilding when only the library has changed # - the name of the object gets put into the executable symbol table instead of # the name of a variable temporary object. # - it's useful to keep objects around for crunching. OBJS+= ${PROG}.${OBJ_EXT} BCOBJS+= ${PROG}.bc LLOBJS+= ${PROG}.ll CLEANFILES+= ${PROG}.${OBJ_EXT} ${PROG}.bc ${PROG}.ll .if target(beforelinking) beforelinking: ${OBJS} ${PROG_FULL}: beforelinking .endif ${PROG_FULL}: ${OBJS} .if defined(PROG_CXX) ${CXX:N${CCACHE_BIN}} ${CXXFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} \ ${OBJS} ${LDADD} .else ${CC:N${CCACHE_BIN}} ${CFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} ${OBJS} \ ${LDADD} .endif .if ${MK_CTF} != "no" ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS} .endif .endif # !target(${PROG}) .endif # !defined(SRCS) .if ${MK_DEBUG_FILES} != "no" ${PROG}: ${PROG_FULL} ${PROGNAME}.debug ${OBJCOPY} --strip-debug --add-gnu-debuglink=${PROGNAME}.debug \ ${PROG_FULL} ${.TARGET} ${PROGNAME}.debug: ${PROG_FULL} ${OBJCOPY} --only-keep-debug ${PROG_FULL} ${.TARGET} .endif .if defined(LLVM_LINK) ${PROG_FULL}.bc: ${BCOBJS} ${LLVM_LINK} -o ${.TARGET} ${BCOBJS} ${PROG_FULL}.ll: ${LLOBJS} ${LLVM_LINK} -S -o ${.TARGET} ${LLOBJS} CLEANFILES+= ${PROG_FULL}.bc ${PROG_FULL}.ll .endif # defined(LLVM_LINK) .if ${MK_MAN} != "no" && !defined(MAN) && \ !defined(MAN1) && !defined(MAN2) && !defined(MAN3) && \ !defined(MAN4) && !defined(MAN5) && !defined(MAN6) && \ !defined(MAN7) && !defined(MAN8) && !defined(MAN9) MAN= ${PROG}.1 MAN1= ${MAN} .endif .endif # defined(PROG) .if defined(_SKIP_BUILD) all: .else .if target(afterbuild) .ORDER: ${PROG} afterbuild all: ${PROG} ${SCRIPTS} afterbuild .else all: ${PROG} ${SCRIPTS} .endif .if ${MK_MAN} != "no" all: all-man .endif .endif .if defined(PROG) CLEANFILES+= ${PROG} ${PROG}.bc ${PROG}.ll .if ${MK_DEBUG_FILES} != "no" CLEANFILES+= ${PROG_FULL} ${PROGNAME}.debug .endif .endif .if defined(OBJS) CLEANFILES+= ${OBJS} ${BCOBJS} ${LLOBJS} .endif .include .if defined(PROG) .if !defined(NO_EXTRADEPEND) _EXTRADEPEND: .if defined(LDFLAGS) && !empty(LDFLAGS:M-nostdlib) .if defined(DPADD) && !empty(DPADD) echo ${PROG_FULL}: ${DPADD} >> ${DEPENDFILE} .endif .else echo ${PROG_FULL}: ${LIBC} ${DPADD} >> ${DEPENDFILE} .if defined(PROG_CXX) echo ${PROG_FULL}: ${LIBCPLUSPLUS} >> ${DEPENDFILE} .endif .endif .endif # !defined(NO_EXTRADEPEND) .endif .if !target(install) .if defined(PRECIOUSPROG) .if !defined(NO_FSCHG) INSTALLFLAGS+= -fschg .endif INSTALLFLAGS+= -S .endif _INSTALLFLAGS:= ${INSTALLFLAGS} .for ie in ${INSTALLFLAGS_EDIT} _INSTALLFLAGS:= ${_INSTALLFLAGS${ie}} .endfor .if !target(realinstall) && !defined(INTERNALPROG) realinstall: _proginstall .ORDER: beforeinstall _proginstall _proginstall: .if defined(PROG) ${INSTALL} ${TAG_ARGS} ${STRIP} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${BINDIR}/${PROGNAME} .if ${MK_DEBUG_FILES} != "no" .if defined(DEBUGMKDIR) ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dbg} -d ${DESTDIR}${DEBUGFILEDIR}/ .endif ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dbg} -o ${BINOWN} -g ${BINGRP} -m ${DEBUGMODE} \ ${PROGNAME}.debug ${DESTDIR}${DEBUGFILEDIR}/${PROGNAME}.debug .endif .endif .endif # !target(realinstall) .if defined(SCRIPTS) && !empty(SCRIPTS) realinstall: _scriptsinstall .ORDER: beforeinstall _scriptsinstall SCRIPTSDIR?= ${BINDIR} SCRIPTSOWN?= ${BINOWN} SCRIPTSGRP?= ${BINGRP} SCRIPTSMODE?= ${BINMODE} STAGE_AS_SETS+= scripts stage_as.scripts: ${SCRIPTS} FLAGS.stage_as.scripts= -m ${SCRIPTSMODE} STAGE_FILES_DIR.scripts= ${STAGE_OBJTOP} .for script in ${SCRIPTS} .if defined(SCRIPTSNAME) SCRIPTSNAME_${script:T}?= ${SCRIPTSNAME} .else SCRIPTSNAME_${script:T}?= ${script:T:R} .endif SCRIPTSDIR_${script:T}?= ${SCRIPTSDIR} SCRIPTSOWN_${script:T}?= ${SCRIPTSOWN} SCRIPTSGRP_${script:T}?= ${SCRIPTSGRP} SCRIPTSMODE_${script:T}?= ${SCRIPTSMODE} STAGE_AS_${script:T}= ${SCRIPTSDIR_${script:T}}/${SCRIPTSNAME_${script:T}} _scriptsinstall: _SCRIPTSINS_${script:T} _SCRIPTSINS_${script:T}: ${script} ${INSTALL} ${TAG_ARGS} -o ${SCRIPTSOWN_${.ALLSRC:T}} \ -g ${SCRIPTSGRP_${.ALLSRC:T}} -m ${SCRIPTSMODE_${.ALLSRC:T}} \ ${.ALLSRC} \ ${DESTDIR}${SCRIPTSDIR_${.ALLSRC:T}}/${SCRIPTSNAME_${.ALLSRC:T}} .endfor .endif NLSNAME?= ${PROG} .include .include .include .include LINKOWN?= ${BINOWN} LINKGRP?= ${BINGRP} LINKMODE?= ${BINMODE} .include .if ${MK_MAN} != "no" realinstall: maninstall .ORDER: beforeinstall maninstall .endif .endif # !target(install) .if ${MK_MAN} != "no" .include .endif .if defined(HAS_TESTS) MAKE+= MK_MAKE_CHECK_USE_SANDBOX=yes SUBDIR_TARGETS+= check TESTS_LD_LIBRARY_PATH+= ${.OBJDIR} TESTS_PATH+= ${.OBJDIR} .endif .if defined(PROG) OBJS_DEPEND_GUESS+= ${SRCS:M*.h} .endif .include .include .include .include