Index: head/Mk/Scripts/check-desktop-entries.sh =================================================================== --- head/Mk/Scripts/check-desktop-entries.sh (revision 554138) +++ head/Mk/Scripts/check-desktop-entries.sh (revision 554139) @@ -1,111 +1,112 @@ #!/bin/sh # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org set -e +set pipefail . "${dp_SCRIPTSDIR}/functions.sh" validate_env dp_CURDIR dp_ECHO_CMD dp_ECHO_MSG dp_EXPR dp_GREP dp_PKGNAME \ dp_SED dp_TR dp_MAKE [ -n "${DEBUG_MK_SCRIPTS}" ] || [ -n "${DEBUG_MK_SCRIPTS_CHECK_DESKTOP_ENTRIES}" ] && set -x set -u # http://standards.freedesktop.org/menu-spec/menu-spec-latest.html DESKTOP_CATEGORIES_MAIN='AudioVideo Audio Video Development Education Game Graphics Network Office Science Settings System Utility' DESKTOP_CATEGORIES_ADDITIONAL='Building Debugger IDE GUIDesigner Profiling RevisionControl Translation Calendar ContactManagement Database Dictionary Chart Email Finance FlowChart PDA ProjectManagement Presentation Spreadsheet WordProcessor 2DGraphics VectorGraphics RasterGraphics 3DGraphics Scanning OCR Photography Publishing Viewer TextTools DesktopSettings HardwareSettings Printing PackageManager Dialup InstantMessaging Chat IRCClient Feed FileTransfer HamRadio News P2P RemoteAccess Telephony TelephonyTools VideoConference WebBrowser WebDevelopment Midi Mixer Sequencer Tuner TV AudioVideoEditing Player Recorder DiscBurning ActionGame AdventureGame ArcadeGame BoardGame BlocksGame CardGame KidsGame LogicGame RolePlaying Shooter Simulation SportsGame StrategyGame Art Construction Music Languages ArtificialIntelligence Astronomy Biology Chemistry ComputerScience DataVisualization Economy Electricity Geography Geology Geoscience History Humanities ImageProcessing Literature Maps Math NumericalAnalysis MedicalSoftware Physics Robotics Spirituality Sports ParallelComputing Amusement Archiving Compression Electronics Emulator Engineering FileTools FileManager TerminalEmulator Filesystem Monitor Security Accessibility Calculator Clock TextEditor Documentation Adult Core KDE GNOME MATE XFCE GTK Qt Motif Java ConsoleOnly' DESKTOP_CATEGORIES_RESERVED='Screensaver TrayIcon Applet Shell' VALID_DESKTOP_CATEGORIES="${dp_VALID_DESKTOP_CATEGORIES} ${DESKTOP_CATEGORIES_MAIN} ${DESKTOP_CATEGORIES_ADDITIONAL} ${DESKTOP_CATEGORIES_RESERVED}" if [ "$(${dp_EXPR} $# % 6)" -ne 0 ]; then ${dp_ECHO_MSG} "${dp_PKGNAME}: Makefile error: the DESKTOP_ENTRIES list must contain one or more groups of 6 elements" exit 1 fi num=0 while [ $# -ge 6 ]; do num=$(${dp_EXPR} ${num} + 1) entry="#${num}" Name="${1}" #Comment="${2}" # Not Used Icon="${3}" Exec="${4}" Categories="${5}" StartupNotify="${6}" shift 6 if [ -n "${Exec}" ]; then entry="${entry} (${Exec})" elif [ -n "${Name}" ]; then entry="${entry} (${Name})" fi if [ -z "${Name}" ]; then ${dp_ECHO_MSG} "${dp_PKGNAME}: Makefile error: in desktop entry ${entry}: field 1 (Name) is empty" exit 1 fi if ${dp_EXPR} '(' "${Icon}" : '.*\.xpm$' ')' '|' '(' "${Icon}" : '.*\.png$' ')' '|' '(' "${Icon}" : '.*\.svg$' ')' > /dev/null; then if ! echo "${Icon}" | ${dp_GREP} -qe '^/' ; then ${dp_ECHO_MSG} "${dp_PKGNAME}: Makefile warning: in desktop entry ${entry}: field 3 (Icon) should be either absolute path or icon name without extension if installed icons follow Icon Theme Specification" fi fi if [ -z "${Exec}" ]; then ${dp_ECHO_MSG} "${dp_PKGNAME}: Makefile error: in desktop entry ${entry}: field 4 (Exec) is empty" exit 1 fi if [ -n "${Categories}" ]; then for c in $(${dp_ECHO_CMD} "${Categories}" | ${dp_TR} ';' ' '); do if ! ${dp_ECHO_CMD} "${VALID_DESKTOP_CATEGORIES}" | ${dp_GREP} -wq "${c}"; then ${dp_ECHO_CMD} "${dp_PKGNAME}: Makefile warning: in desktop entry ${entry}: category ${c} is not a valid desktop category" fi done if ! ${dp_ECHO_CMD} "${Categories}" | ${dp_GREP} -Eq "$(${dp_ECHO_CMD} "${DESKTOP_CATEGORIES_MAIN}" | ${dp_SED} -E 's,[[:blank:]]+,\|,g')"; then ${dp_ECHO_CMD} "${dp_PKGNAME}: Makefile warning: in desktop entry ${entry}: field 5 (Categories) must contain at least one main desktop category (make -VDESKTOP_CATEGORIES_MAIN)" fi if ! ${dp_EXPR} "${Categories}" : '.*;$' > /dev/null; then ${dp_ECHO_MSG} "${dp_PKGNAME}: Makefile error: in desktop entry ${entry}: field 5 (Categories) does not end with a semicolon" exit 1 fi else if [ -z "$(cd "${dp_CURDIR}" && ${dp_MAKE} desktop-categories)" ]; then ${dp_ECHO_MSG} "${dp_PKGNAME}: Makefile error: in desktop entry ${entry}: field 5 (Categories) is empty and could not be deduced from the CATEGORIES variable" exit 1 fi fi if [ "${StartupNotify}" != "true" ] && [ "${StartupNotify}" != "false" ] && [ -n "${StartupNotify}" ]; then ${dp_ECHO_MSG} "${dp_PKGNAME}: Makefile error: in desktop entry ${entry}: field 6 (StartupNotify) is not \"true\", \"false\" or \"\"(empty)" exit 1 fi done Index: head/Mk/Scripts/check-stagedir.sh =================================================================== --- head/Mk/Scripts/check-stagedir.sh (revision 554138) +++ head/Mk/Scripts/check-stagedir.sh (revision 554139) @@ -1,288 +1,289 @@ #!/bin/sh # ports/Mk/Scripts/check-stagedir.sh - called from ports/Mk/bsd.stage.mk # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org # # This script serves 2 purposes: # 1. Generate a plist # 2. Test a plist for issues: # a. Files in STAGEDIR that are missing from plist # b. Files in plist missing from STAGEDIR # c. Files in plist which are owned by dependencies/MTREEs set -e +set pipefail . ${SCRIPTSDIR}/functions.sh # lists an mtree file's contents, prefixed to dir. listmtree() { # mtreefile prefix { echo '#mtree' sed 's/nochange$//;' $1 } | tar -tf- | sed "s,^,$2/,;s,^$2/\.$,$2,;s,^$,/," } ### PRODUCE MTREE FILE parse_mtree() { { listmtree /etc/mtree/BSD.root.dist "" listmtree /etc/mtree/BSD.usr.dist /usr listmtree /etc/mtree/BSD.var.dist /var # Use MTREE_FILE if specified and it doesn't already # match LOCALBASE if [ -n "${MTREE_FILE}" ]; then if [ "${PREFIX}" != "${LOCALBASE}" -o "${MTREE_FILE}" \ != "${PORTSDIR}/Templates/BSD.local.dist" ]; then listmtree "${MTREE_FILE}" "${PREFIX}" fi fi listmtree "${PORTSDIR}/Templates/BSD.local.dist" "${LOCALBASE}" unset MTREE_FILE # Add LOCALBASE a=${LOCALBASE} while :; do echo ${a} a=${a%/*} [ -z "${a}" ] && break done # Add in PREFIX if this port wants it if [ ${NO_PREFIX_RMDIR} -eq 0 ]; then a=${PREFIX} while :; do echo ${a} a=${a%/*} [ -z "${a}" ] && break done fi } >${WRKDIR}/.mtree } # Sort a directory list by the order of the dfs-sorted file (from find -d -s) sort_dfs() { while read -r dir; do grep "^[0-9]* ${dir}$" ${WRKDIR}/.staged-dirs-dfs-sorted done | sort -n | cut -d ' ' -f2- } # Prepare sed(1) regex for PLIST_SUB_SED/PORTEXAMPLES/OPTIONS/... setup_plist_seds() { ### HANDLE PORTDOCS/PORTEXAMPLES sed_portdocsexamples="/%%DOCSDIR%%/s!^!%%PORTDOCS%%!g; /%%EXAMPLESDIR%%/s!^!%%PORTEXAMPLES%%!g;" if [ ${makeplist} -eq 0 ]; then # echo "=====> Using OPTIONS: ${PORT_OPTIONS}" | /usr/bin/fmt -w 79 | \ # sed -e '2,$s/^/ /' # Handle magical PORT* features for option in DOCS EXAMPLES; do want_option=0 case " ${PORT_OPTIONS} " in *\ ${option}\ *) want_option=1 ;; esac [ ${want_option} -eq 0 ] && \ sed_portdocsexamples="${sed_portdocsexamples} /^%%PORT${option}%%/d;" done unset PORT_OPTIONS fi sed_plist_sub=$(mktemp -t sed_plist_sub) # We only exit 0 or exit 1 trap "rm -f ${sed_plist_sub}" EXIT 1 echo "${PLIST_SUB_SED}" | /bin/sh ${SCRIPTSDIR}/plist_sub_sed_sort.sh ${sed_plist_sub} unset PLIST_SUB_SED # Used for generate_plist sed_files_gen="${sed_portdocsexamples} /^share\/licenses/d; \ \#${LOCALBASE}/lib/debug#d;" sed_dirs_gen="s,^,@dir ,; \ ${sed_portdocsexamples} \ /^@dir share\/licenses/d; \ \#@dir ${LOCALBASE}/lib/debug#d;" # These prevent ignoring DOCS/EXAMPLES dirs with sed_portdocsexamples sed_files="/^share\/licenses/d; \ \#${LOCALBASE}/lib/debug#d;" sed_dirs="s,^,@dir ,; \ /^@dir share\/licenses/d; \ \#@dir ${LOCALBASE}/lib/debug#d;" } # Generate plist from staged files generate_plist() { : >${WRKDIR}/.staged-plist ### HANDLE FILES find ${STAGEDIR} -type f -o -type l | sort | \ sed -e "s,${STAGEDIR},," >${WRKDIR}/.staged-files comm -13 ${WRKDIR}/.plist-files ${WRKDIR}/.staged-files | \ sed -e "s!^${PREFIX}/!!g;" -f "${sed_plist_sub}" -e "${sed_files_gen}" \ >>${WRKDIR}/.staged-plist || : ### HANDLE DIRS cat ${WRKDIR}/.plist-dirs-unsorted ${WRKDIR}/.mtree \ | sort -u >${WRKDIR}/.traced-dirs find ${STAGEDIR} -type d | sed -e "s,^${STAGEDIR},,;/^$/d" | sort \ >${WRKDIR}/.staged-dirrms-sorted find -s -d ${STAGEDIR}${PREFIX} -type d -empty | sed -e "s,^${STAGEDIR},,;\,^${PREFIX}$,d;/^$/d" \ >${WRKDIR}/.staged-dirs-dfs find -s -d ${STAGEDIR} -type d ! -path "${STAGEDIR}${PREFIX}/*" | sed -e "s,^${STAGEDIR},,;\,^${PREFIX}$,d;/^$/d" \ >>${WRKDIR}/.staged-dirs-dfs sort ${WRKDIR}/.staged-dirs-dfs >${WRKDIR}/.staged-dirs-sorted awk '{print FNR, $0}' ${WRKDIR}/.staged-dirs-dfs \ >${WRKDIR}/.staged-dirs-dfs-sorted # Find all staged dirs and then sort them by depth-first (find -d -s) comm -13 ${WRKDIR}/.traced-dirs ${WRKDIR}/.staged-dirs-sorted \ | sort_dfs | sed -e "s!^${PREFIX}/!!g;" -f "${sed_plist_sub}" -e "${sed_dirs_gen}" \ >>${WRKDIR}/.staged-plist || : } # Check for files in STAGEDIR missing from plist check_orphans_from_plist() { local ret=0 echo "===> Checking for items in STAGEDIR missing from pkg-plist" # Handle whitelisting while read -r path; do case "${path}" in *.bak) ;; *.orig) ;; */.DS_Store) ;; */.cvsignore) ;; */.git/*|'@dir '*/.git) ;; */.gitattributes|*/.gitignore|*/.gitmodules) ;; */.svn/*|'@dir '*/.svn) ;; */.svnignore) ;; */CVS/*|'@dir '*/CVS) ;; */info/dir|info/dir|info/*/dir|share/info/*/dir) ;; share/fonts/*/fonts.dir) ;; share/fonts/*/fonts.scale) ;; share/applications/mimeinfo.cache) ;; share/mime/XMLnamespaces) ;; share/mime/aliases) ;; share/mime/generic-icons) ;; share/mime/globs) ;; share/mime/globs2) ;; share/mime/icons) ;; share/mime/magic) ;; share/mime/mime.cache) ;; share/mime/subclasses) ;; share/mime/treemagic) ;; share/mime/types) ;; share/mime/version) ;; '@dir etc/gconf/gconf.xml.defaults');; *) # An orphan was found, return non-zero status ret=1 echo "Error: Orphaned: ${path}" >&2 ;; esac done < ${WRKDIR}/.staged-plist return ${ret} } # Check for items in plist not in STAGEDIR (pkg lstat(2) errors) check_missing_plist_items() { local ret=0 echo "===> Checking for items in pkg-plist which are not in STAGEDIR" : >${WRKDIR}/.invalid-plist-missing comm -23 ${WRKDIR}/.plist-files-no-comments ${WRKDIR}/.staged-files | \ sed -e "s!^${PREFIX}/!!g;" -f "${sed_plist_sub}" -e "${sed_files}" \ >>${WRKDIR}/.invalid-plist-missing || : # Look for directories, then sort them by DFS. Must create the dirs # so find -ds can be used to sort them. rm -rf ${WRKDIR}/.missing-dirs > /dev/null 2>&1 || : mkdir ${WRKDIR}/.missing-dirs comm -23 ${WRKDIR}/.plist-dirs-sorted-no-comments \ ${WRKDIR}/.staged-dirrms-sorted > ${WRKDIR}/.missing-plist-dirs # Creates the dirs in WRKDIR/.missing-dirs and ensure spaces are # quoted. sed -e "s,^,${WRKDIR}/.missing-dirs," \ -e 's,^\(.*\)$,"\1",' \ ${WRKDIR}/.missing-plist-dirs | xargs mkdir -p find -d -s ${WRKDIR}/.missing-dirs | \ sed -e "s,^${WRKDIR}/.missing-dirs,," | \ while read -r dir; do \ grep -x "${dir}" ${WRKDIR}/.missing-plist-dirs || :; done | \ sed -e "s!^${PREFIX}/!!g;" -f "${sed_plist_sub}" -e "${sed_dirs}" \ >>${WRKDIR}/.invalid-plist-missing || : rm -rf ${WRKDIR}/.missing-dirs if [ -s "${WRKDIR}/.invalid-plist-missing" ]; then ret=1 while read -r line; do echo "Error: Missing: ${line}" >&2 done < ${WRKDIR}/.invalid-plist-missing fi return ${ret} } # obtain operating mode from command line ret=0 makeplist=0 case "$1" in checkplist) ;; makeplist) makeplist=1 ;; *) echo >&2 "Usage: $0 {checkplist|makeplist}" ; exit 1 ;; esac # validate environment validate_env STAGEDIR PREFIX LOCALBASE WRKDIR WRKSRC MTREE_FILE \ TMPPLIST PLIST_SUB_SED SCRIPTSDIR PORT_OPTIONS NO_PREFIX_RMDIR [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_CHECK_STAGEDIR}" ] && set -x set -u if [ $makeplist = 0 ] ; then echo "===> Parsing plist" parse_plist "${PREFIX}" 1 < ${TMPPLIST} \ 3>${WRKDIR}/.plist-dirs-unsorted \ >${WRKDIR}/.plist-files-unsorted unset TMPPLIST # Create the -no-comments files and trim out @comment from the plists. # This is used for various tests later. sed -e '/^@comment/d' ${WRKDIR}/.plist-dirs-unsorted \ >${WRKDIR}/.plist-dirs-unsorted-no-comments sed -i '' -e 's/^@comment //' ${WRKDIR}/.plist-dirs-unsorted sed -e '/^@comment/d' ${WRKDIR}/.plist-files-unsorted | sort \ >${WRKDIR}/.plist-files-no-comments sed -e 's/^@comment //' ${WRKDIR}/.plist-files-unsorted | sort \ >${WRKDIR}/.plist-files else # generate plist - pretend the plist had been empty : >${WRKDIR}/.plist-dirs-unsorted : >${WRKDIR}/.plist-files echo '/you/have/to/check/what/makeplist/gives/you' fi parse_mtree setup_plist_seds generate_plist # If just making plist, show results and exit successfully. if [ ${makeplist} -eq 1 ]; then cat ${WRKDIR}/.staged-plist exit 0 fi check_orphans_from_plist || ret=1 # Prepare plist-dirs for directory checks sort -u ${WRKDIR}/.plist-dirs-unsorted-no-comments \ >${WRKDIR}/.plist-dirs-sorted-no-comments check_missing_plist_items || ret=1 if [ ${ret} -ne 0 ]; then echo "===> Error: Plist issues found." >&2 if [ "${PREFIX}" != "${LOCALBASE}" ]; then echo "===> Warning: Test was done with PREFIX != LOCALBASE" echo "===> Warning: The port may not be properly installing into PREFIX" fi fi exit ${ret} Index: head/Mk/Scripts/check-vulnerable.sh =================================================================== --- head/Mk/Scripts/check-vulnerable.sh (revision 554138) +++ head/Mk/Scripts/check-vulnerable.sh (revision 554139) @@ -1,34 +1,35 @@ #!/bin/sh # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org set -e +set pipefail . "${dp_SCRIPTSDIR}/functions.sh" validate_env dp_ECHO_MSG dp_PKG_BIN dp_PORTNAME dp_PKGNAME [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_CHECK_VULNERABLE}" ] && set -x set -u # If the package is pkg, disable these checks, it fails while # upgrading when pkg is not there. # FIXME: check is this is still true if [ "${dp_PORTNAME}" = "pkg" ]; then exit 0 fi if [ ! -x "${dp_PKG_BIN}" ]; then exit 0 fi if ! vlist=$(${dp_PKG_BIN} audit "${dp_PKGNAME}"); then ${dp_ECHO_MSG} "===> ${dp_PKGNAME} has known vulnerabilities:" ${dp_ECHO_MSG} "$vlist" ${dp_ECHO_MSG} "=> Please update your ports tree and try again." ${dp_ECHO_MSG} "=> Note: Vulnerable ports are marked as such even if there is no update available." ${dp_ECHO_MSG} "=> If you wish to ignore this vulnerability rebuild with 'make DISABLE_VULNERABILITIES=yes'" exit 1 fi Index: head/Mk/Scripts/check_leftovers.sh =================================================================== --- head/Mk/Scripts/check_leftovers.sh (revision 554138) +++ head/Mk/Scripts/check_leftovers.sh (revision 554139) @@ -1,177 +1,179 @@ #! /bin/sh # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org # # This script is used by poudriere and tinderbox(soon) as the source-of-truth for # what should be considered a leftover and what is whitelisted. # # !!!! This script's input/output format must remain backwards-compatible. # !!!! If you want to change it, create a new script and have the calling # !!!! scripts use the new one if available. # # Usage: env PORTSDIR=... check_leftovers.sh category/port # stdin: # - missing-file # + new-file # M modified-file reason... # # stdout: # same -/+/M format, but with files substituted, without approved # whitelisted files, and hides any directories already in plist. # # The PLIST_SUB feature can be disabled by setting PLIST_SUB_SED= # in environment. +set pipefail + [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_CHECK_LEFTOVERS}" ] && set -x origin="$1" [ $# -eq 1 ] || { echo "Must supply ORIGIN as parameter" >&2; exit 1; } [ -n "${PORTSDIR}" ] || { echo "PORTSDIR must be set" >&2; exit 1; } # May be passed in from environment if using an overlay. : ${portdir:="${PORTSDIR}/${origin}"} # PREFIX/LOCALBASE may be set in env or want default from port. if [ -n "${PREFIX}" ]; then PORT_FLAGS="${PORT_FLAGS} PREFIX=${PREFIX}" else PREFIX=$(make -C ${portdir} -VPREFIX) fi if [ -n "${LOCALBASE}" ]; then PORT_FLAGS="${PORT_FLAGS} LOCALBASE=${LOCALBASE}" else LOCALBASE=$(make -C ${portdir} -VLOCALBASE) fi if [ -z "${CCACHE_DIR}" ]; then CCACHE_DIR=$(make -C ${portdir} -VCCACHE_DIR) fi if [ -z "${UID_FILES}" ]; then UID_FILES=$(make -C ${portdir} -VUID_FILES) fi homedirs=$(awk -F: -v users="$(make -C ${portdir} -V USERS|sed -e 's, ,|,g;/^$/d;s,^,^(,;s,$,)$,')" 'users && $1 ~ users {print $9}' ${UID_FILES}|sort -u|sed -e "s|/usr/local|${PREFIX}|"|tr "\n" " ") plistsub_sed=$(mktemp -t plistsub_sed) trap "rm -f ${plistsub_sed}" EXIT 1 make -C ${portdir} -VPLIST_SUB_SED | /bin/sh ${PORTSDIR}/Mk/Scripts/plist_sub_sed_sort.sh ${plistsub_sed} tmpplist=$(make -C ${portdir} -VTMPPLIST) while read -r modtype path extra; do # Ignore everything from these files/directories case "${path}" in ${CCACHE_DIR:-/nonexistent}/*|\ /compat/linux/proc/*|\ /dev/*|\ /etc/make.conf.bak|\ /proc/*|\ /tmp/*|\ /var/db/pkg/*|\ /var/db/ports/*|\ /var/log/*|\ /var/mail/*|\ /var/run/*|\ /var/tmp/*) continue ;; # fc-cache - skip for now /var/db/fontconfig/*) continue ;; esac ignore_path=0 sub_path=$(echo "$path" | sed -e "s|^${PREFIX}/||" -f "${plistsub_sed}") orig_sub_path="${sub_path}" # If this is a directory, use @dir in output is_dir=0 if [ -d "${path}" ]; then is_dir=1 sub_path="@dir ${sub_path}" fi # Handle PORTDOCS/PORTEXAMPLES/etc case "${orig_sub_path}" in %%DOCSDIR%%*) sub_path="%%PORTDOCS%%${sub_path}" ;; %%EXAMPLESDIR%%*) sub_path="%%PORTEXAMPLES%%${sub_path}" ;; esac case $modtype in +) if [ ${is_dir} -eq 1 ]; then # home directory of users created case " ${homedirs} " in *\ ${path}\ *) continue ;; *\ ${path}/*\ *) continue ;; esac # Don't show dirs already in plist (due to parents) grep -qE \ "^@(unexec rmdir \"?(%D/|${PREFIX})?${path#${PREFIX}/}[ \"]|dir(rm|rmtry)? ${path#${PREFIX}/}\$)" \ ${tmpplist} && continue fi # Check absolute paths case "${path}" in # Leave qmail's queue dir alone to not cause lost mail # during upgrades, just as /var/mail is left alone. /var/qmail/queue/*|/var/qmail/queue) continue ;; esac # Check relative/plist paths case "${sub_path}" in # gconftool-2 --makefile-uninstall-rule is unpredictable etc/gconf/gconf.xml.defaults/%gconf-tree*.xml) ;; *) echo "+ ${sub_path}" ;; esac ;; -) # Skip removal of PREFIX and PREFIX/info from # bsd.port.mk for now. # Skip if it is PREFIX and non-LOCALBASE. See misc/kdehier4 # or mail/qmail for examples [ "${path}" = "${PREFIX}" -a "${LOCALBASE}" != "${PREFIX}" ] && ignore_path=1 # The removal of info may be a bug; it's part of BSD.local.dist. # See ports/74691 [ "${sub_path}" = "info" -a "${LOCALBASE}" != "${PREFIX}" ] && ignore_path=1 [ $ignore_path -eq 0 ] && echo "- ${sub_path}" ;; M) # Check relative/plist paths case "${sub_path}" in # gconftool-2 --makefile-uninstall-rule is unpredictable etc/gconf/gconf.xml.defaults/%gconf-tree*.xml) ;; # This is a cache file for gio modules could be modified # for any gio modules lib/gio/modules/giomodule.cache) ;; # removal of info files leaves entry uneasy to cleanup # in info/dir info/dir) ;; */info/dir) ;; # The is pear database cache %%PEARDIR%%/.depdb|%%PEARDIR%%/.filemap) ;; #ls-R files from texmf are often regenerated */ls-R) ;; # Octave packages database, blank lines can be inserted # between pre-install and post-deinstall share/octave/octave_packages) ;; # xmlcatmgr is constantly updating catalog.ports ignore # modification to that file share/xml/catalog.ports) ;; # Ignore ghc's doc index share/doc/ghc-%%GHC_VERSION%%/*) ;; # Ignore ghc's package conf lib/ghc-%%GHC_VERSION%%/package.conf.d/*) ;; # Ignore common system config files /etc/group|\ /etc/make.conf|\ /etc/master.passwd|\ /etc/passwd|\ /etc/pwd.db|\ /etc/shells|\ /etc/spwd.db) ;; *) echo "M ${sub_path#@dir } ${extra}" ;; esac ;; esac done exit 0 Index: head/Mk/Scripts/checksum.sh =================================================================== --- head/Mk/Scripts/checksum.sh (revision 554138) +++ head/Mk/Scripts/checksum.sh (revision 554139) @@ -1,93 +1,94 @@ #!/bin/sh # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org set -e +set pipefail . "${dp_SCRIPTSDIR}/functions.sh" validate_env dp_CHECKSUM_ALGORITHMS dp_CURDIR dp_DISTDIR dp_DISTINFO_FILE \ dp_DIST_SUBDIR dp_ECHO_MSG dp_FETCH_REGET dp_MAKE dp_MAKEFLAGS \ dp_DISABLE_SIZE dp_NO_CHECKSUM [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_CHECKSUM}" ] && set -x set -u check_checksum_algorithms if [ -f "${dp_DISTINFO_FILE}" ]; then cd "${dp_DISTDIR}" OK= refetchlist= for file in "${@}"; do ignored="true" for alg in ${dp_CHECKSUM_ALGORITHMS}; do ignore="false" eval "alg_executable=\$dp_${alg}" if [ "$alg_executable" != "NO" ]; then MKSUM=$($alg_executable < "${file}") CKSUM=$(distinfo_data "${alg}" "${file}") else ignore="true" fi if [ $ignore = "false" -a -z "$CKSUM" ]; then ${dp_ECHO_MSG} "=> No $alg checksum recorded for $file." ignore="true" fi if [ $ignore != "false" ]; then continue fi match="false" for chksum in $CKSUM; do if [ "$chksum" = "$MKSUM" ]; then match="true" break fi done if [ $match = "true" ]; then ${dp_ECHO_MSG} "=> $alg Checksum OK for $file." ignored="false" else ${dp_ECHO_MSG} "=> $alg Checksum mismatch for $file." refetchlist="$refetchlist $file " OK="${OK:-retry}" [ "${OK}" = "retry" -a "${dp_FETCH_REGET}" -gt 0 ] && rm -f "${file}" ignored="false" fi done if [ $ignored = "true" ]; then ${dp_ECHO_MSG} "=> No suitable checksum found for $file." OK=false fi done if [ "${OK:=true}" = "retry" ] && [ "${dp_FETCH_REGET}" -gt 0 ]; then ${dp_ECHO_MSG} "===> Refetch for ${dp_FETCH_REGET} more times files: $refetchlist" if ${dp_MAKE} -C "${dp_CURDIR}" ${dp_MAKEFLAGS} FORCE_FETCH_LIST="$refetchlist" FETCH_REGET="$((dp_FETCH_REGET - 1))" fetch; then if ${dp_MAKE} -C "${dp_CURDIR}" ${dp_MAKEFLAGS} FETCH_REGET="$((dp_FETCH_REGET - 1))" checksum ; then OK="true" fi fi fi if [ "$OK" != "true" -a "${dp_FETCH_REGET}" -eq 0 ]; then ${dp_ECHO_MSG} "===> Giving up on fetching files: $refetchlist" ${dp_ECHO_MSG} "Make sure the Makefile and distinfo file (${dp_DISTINFO_FILE})" ${dp_ECHO_MSG} "are up to date. If you are absolutely sure you want to override this" ${dp_ECHO_MSG} "check, type \"make NO_CHECKSUM=yes [other args]\"." exit 1 fi if [ "$OK" != "true" ]; then exit 1 fi elif [ -n "${*}" ]; then ${dp_ECHO_MSG} "=> No checksum file (${dp_DISTINFO_FILE})." exit 1 fi Index: head/Mk/Scripts/create-manifest.sh =================================================================== --- head/Mk/Scripts/create-manifest.sh (revision 554138) +++ head/Mk/Scripts/create-manifest.sh (revision 554139) @@ -1,169 +1,170 @@ #!/bin/sh # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org set -e +set pipefail . "${dp_SCRIPTSDIR}/functions.sh" validate_env dp_ACTUAL_PACKAGE_DEPENDS dp_CATEGORIES dp_COMMENT \ dp_COMPLETE_OPTIONS_LIST dp_DEPRECATED dp_DESCR dp_EXPIRATION_DATE \ dp_GROUPS dp_LICENSE dp_LICENSE_COMB dp_MAINTAINER dp_METADIR \ dp_NO_ARCH dp_PKGBASE dp_PKGDEINSTALL dp_PKGINSTALL dp_PKGMESSAGES \ dp_PKGORIGIN dp_PKGPOSTDEINSTALL dp_PKGPOSTINSTALL dp_PKGPOSTUPGRADE \ dp_PKGPREDEINSTALL dp_PKGPREINSTALL dp_PKGPREUPGRADE dp_PKGUPGRADE \ dp_PKGVERSION dp_PKG_BIN dp_PKG_IGNORE_DEPENDS dp_PKG_NOTES \ dp_PORT_OPTIONS dp_PREFIX dp_USERS dp_WWW [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_CREATE_MANIFEST}" ] && set -x set -u listcontains() { local str lst elt str=$1 lst=$2 for elt in ${lst} ; do if [ ${elt} = ${str} ]; then return 0 fi done return 1 } mkdir -p ${dp_METADIR} # Save stdout and redirect it to the manifest file. exec 3>&1 >${dp_METADIR}/+MANIFEST # First, all the required bits cat <> ${output} [ -f "${input}.lua" ] && cp ${input}.lua ${dp_METADIR} done done done # *** STARTING NOW, STDOUT is +DISPLAY *** exec >${dp_METADIR}/+DISPLAY echo '[' for message in ${dp_PKGMESSAGES}; do if [ -f "${message}" ]; then #if if starts with [ then it is ucl and we do drop last and first line if head -1 "${message}" | grep -q '^\['; then sed '1d;$d' "${message}" else echo '{type: install, message=< NOTICE: The ${dp_PKGBASE} port currently does not have a maintainer. As a result, it is more likely to have unresolved issues, not be up-to-date, or even be removed in the future. To volunteer to maintain this port, please create an issue at: https://bugs.freebsd.org/bugzilla More information about port maintainership is available at: https://www.freebsd.org/doc/en/articles/contributing/ports-contributing.html#maintain-port EOD }, EOT fi if [ -n "${dp_DEPRECATED}" ]; then cat <<-EOT { message=< NOTICE: This port is deprecated; you may wish to reconsider installing it: ${dp_DEPRECATED}. EOT if [ -n "${dp_EXPIRATION_DATE}" ]; then cat <<-EOT It is scheduled to be removed on or after ${dp_EXPIRATION_DATE}. EOT fi printf 'EOD\n},\n' fi echo ']' Index: head/Mk/Scripts/depends-list.sh =================================================================== --- head/Mk/Scripts/depends-list.sh (revision 554138) +++ head/Mk/Scripts/depends-list.sh (revision 554139) @@ -1,141 +1,142 @@ #!/bin/sh # MAINTAINER: portmgr@FreeBSD.org # $FreeBSD$ set -e +set pipefail . ${dp_SCRIPTSDIR}/functions.sh flavors=0 recursive=0 missing=0 requires_wrkdir=0 while getopts "fmrw" FLAG; do case "${FLAG}" in f) flavors=1 ;; m) missing=1 recursive=1 ;; r) recursive=1 ;; w) # Only list dependencies that have a WRKDIR. Used for # 'make clean-depends'. # Without -r recurse when WRKDIR exists; with -r # always recurse. requires_wrkdir=1 ;; *) echo "Unknown flag" >&2 exit 1 ;; esac done shift $((OPTIND-1)) validate_env PORTSDIR dp_OVERLAYS dp_PKGNAME if [ ${recursive} -eq 1 -o ${requires_wrkdir} -eq 1 ]; then validate_env dp_MAKE # Cache command executions to avoid looking them up again in every # sub-make. MAKE="${dp_MAKE}" export_ports_env >/dev/null fi [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_DEPENDS_LIST}" ] && set -x set -u if [ ${missing} -eq 1 ]; then existing=$(${dp_PKG_INFO} -aoq|paste -d ' ' -s -) fi check_dep() { local _dep wrkdir show_dep for _dep ; do unset FLAVOR myifs=${IFS} IFS=: set -- ${_dep} IFS=${myifs} case "${2}" in /*) d=${2} ;; *) for overlay in ${dp_OVERLAYS} ${PORTSDIR}; do d=${overlay}/${2} f= case "${d}" in *@*/*) ;; # Ignore @ in the path which would not be a flavor *@*) f=${d##*@} d=${d%@*} ;; esac if [ -f ${d}/Makefile ]; then if [ -n $f ]; then export FLAVOR=$f fi break fi done esac if [ ${flavors} -eq 1 -a -n "${FLAVOR:-}" ]; then port_display="${d}@${FLAVOR}" else port_display="${d}" fi case " ${checked} " in *\ ${d}\ *) continue ;; # Already checked esac checked="${checked} ${d}" # Check if the dependency actually exists or skip otherwise. if [ ! -d "${d}" ]; then echo "${dp_PKGNAME}: \"${port_display}\" non-existent -- dependency list incomplete" >&2 continue fi # If only looking for missing, show if missing if [ ${missing} -eq 1 ]; then case " ${existing} " in *\ ${d#${PORTSDIR}/}\ *) continue ;; # We have it, nothing to see esac fi # Grab any needed vars from the port. if [ ${requires_wrkdir} -eq 1 ]; then # shellcheck disable=SC2046 # We want word splitting here. set -- $(${dp_MAKE} -C ${d} -VWRKDIR -V_UNIFIED_DEPENDS) wrkdir="$1" shift elif [ ${recursive} -eq 1 ]; then # shellcheck disable=SC2046 # We want word splitting here. set -- $(${dp_MAKE} -C ${d} -V_UNIFIED_DEPENDS) fi # If a WRKDIR is required to show the dependency, check for it. show_dep=1 if [ ${requires_wrkdir} -eq 1 ] && ! [ -d "${wrkdir}" ]; then show_dep=0 fi [ ${show_dep} -eq 1 ] && echo "${port_display}" if [ ${recursive} -eq 1 -o ${requires_wrkdir} -eq 1 -a ${show_dep} -eq 1 ]; then # shellcheck disable=SC2068 # Do not add quotes, we want to split the string here. check_dep $@ fi done } checked= # shellcheck disable=SC2068 # Do not add quotes, we want to split the string here. check_dep $@ Index: head/Mk/Scripts/desktop-categories.sh =================================================================== --- head/Mk/Scripts/desktop-categories.sh (revision 554138) +++ head/Mk/Scripts/desktop-categories.sh (revision 554139) @@ -1,89 +1,90 @@ #!/bin/sh # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org set -e +set pipefail . "${dp_SCRIPTSDIR}/functions.sh" validate_env dp_CATEGORIES dp_SORT dp_TR dp_ECHO_CMD [ -n "${DEBUG_MK_SCRIPTS}" ] || [ -n "${DEBUG_MK_SCRIPTS_DESKTOP_CATEGORIES}" ] && set -x set -u categories="" for native_category in ${dp_CATEGORIES}; do c="" case ${native_category} in accessibility) c="Utility Accessibility" ;; archivers) c="Utility Archiving" ;; astro) c="Education Science Astronomy" ;; audio) c="AudioVideo Audio" ;; benchmarks) c="System" ;; biology) c="Education Science Biology" ;; cad) c="Graphics Engineering" ;; comms) c="Utility" ;; converters) c="Utility" ;; databases) c="Office Database" ;; deskutils) c="Utility" ;; devel) c="Development" ;; dns) c="Network" ;; elisp) c="Development" ;; editors) c="Utility" ;; emulators) c="System Emulator" ;; finance) c="Office Finance" ;; ftp) c="Network FileTransfer" ;; games) c="Game" ;; geography) c="Education Science Geography" ;; gnome) c="GNOME GTK" ;; graphics) c="Graphics" ;; hamradio) c="HamRadio" ;; haskell) c="Development" ;; irc) c="Network IRCClient" ;; java) c="Development Java" ;; kde) c="KDE Qt" ;; lang) c="Development" ;; lisp) c="Development" ;; mail) c="Office Email" ;; mate) c="MATE GTK" ;; math) c="Education Science Math" ;; mbone) c="Network AudioVideo" ;; multimedia) c="AudioVideo" ;; net) c="Network" ;; net-im) c="Network InstantMessaging" ;; net-mgmt) c="Network" ;; net-p2p) c="Network P2P" ;; net-vpn) c="Network VPN" ;; news) c="Network News" ;; parallel) c="ParallelComputing" ;; pear) c="Development WebDevelopment" ;; perl5) c="Development" ;; python) c="Development" ;; ruby) c="Development" ;; rubygems) c="Development" ;; scheme) c="Development" ;; science) c="Science Education" ;; security) c="System Security" ;; shells) c="System Shell" ;; sysutils) c="System" ;; tcl*|tk*) c="Development" ;; textproc) c="Utility TextTools" ;; www) c="Network" ;; x11-clocks) c="Utility Clock" ;; x11-fm) c="System FileManager" ;; xfce) c="GTK XFCE" ;; zope) c="Development WebDevelopment" ;; esac if [ -n "${c}" ]; then categories="${categories} ${c}" fi done if [ -n "${categories}" ]; then for c in ${categories}; do ${dp_ECHO_CMD} "${c}" done | ${dp_SORT} -u | ${dp_TR} '\n' ';' ${dp_ECHO_CMD} fi Index: head/Mk/Scripts/dialog4ports.sh =================================================================== --- head/Mk/Scripts/dialog4ports.sh (revision 554138) +++ head/Mk/Scripts/dialog4ports.sh (revision 554139) @@ -1,50 +1,51 @@ #! /bin/sh # $FreeBSD$ # Maintainer: portmgr@FreeBSD.org set -e +set pipefail [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_DIALOG4PORTS}" ] && set -x if [ -z "${DIALOG4PORTS}" -o -z "${PORTSDIR}" -o -z "${MAKE}" ]; then echo "DIALOG4PORTS, MAKE and PORTSDIR required in environment." >&2 exit 1 fi : ${DIALOGPORT:=ports-mgmt/dialog4ports} : ${DIALOGNAME:=dialog4ports} OPTIONSFILE="$1" if ! [ -e $DIALOG4PORTS ]; then # If INSTALL_AS_USER is set then just build and use the WRKDIR version # Also do this if PREFIX!=LOCALBASE to avoid missing file or double # installs if [ -n "${INSTALL_AS_USER}" -o "${PREFIX}" != "${LOCALBASE}" ]; then if ! [ -d "${PORTSDIR}/${DIALOGPORT}" ]; then echo "===> Skipping 'config' as ${DIALOGPORT} is not checked out" >&2 exit 1 fi DIALOG4PORTS=$(${MAKE} -C ${PORTSDIR}/${DIALOGPORT} -V DIALOG4PORTS) if ! [ -e "${DIALOG4PORTS}" ]; then echo "===> Building ${DIALOGNAME} as it is required for the config dialog" ${MAKE} -C ${PORTSDIR}/${DIALOGPORT} -D NO_DIALOG clean build fi else # Build+install through su-install as normal echo "===> Building/installing ${DIALOGNAME} as it is required for the config dialog" ${MAKE} -C ${PORTSDIR}/${DIALOGPORT} -D NO_DIALOG clean install # Need to clean again as it can't run twice in 1 call above ${MAKE} -C ${PORTSDIR}/${DIALOGPORT} -D NO_DIALOG clean fi fi # Backwards compat with older version which used stdout [<= 0.1.1] (or stderr [0.1.2]). # Clear environment of PKGNAME or the dialog will show on older versions # that do not understand -v. if ! env -u PKGNAME ${DIALOG4PORTS} -v > /dev/null 2>&1; then exec $DIALOG4PORTS > $OPTIONSFILE 2>&1 fi # Newer versions use stderr to work around a jail issue # http://lists.freebsd.org/pipermail/freebsd-ports/2013-March/082383.html exec $DIALOG4PORTS 2> $OPTIONSFILE Index: head/Mk/Scripts/do-depends.sh =================================================================== --- head/Mk/Scripts/do-depends.sh (revision 554138) +++ head/Mk/Scripts/do-depends.sh (revision 554139) @@ -1,212 +1,213 @@ #!/bin/sh # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org set -e +set pipefail . ${dp_SCRIPTSDIR}/functions.sh validate_env dp_RAWDEPENDS dp_DEPTYPE dp_DEPENDS_TARGET dp_DEPENDS_PRECLEAN \ dp_DEPENDS_CLEAN dp_DEPENDS_ARGS dp_USE_PACKAGE_DEPENDS \ dp_USE_PACKAGE_DEPENDS_ONLY dp_PKG_ADD dp_PKG_INFO dp_WRKDIR \ dp_PKGNAME dp_STRICT_DEPENDS dp_LOCALBASE dp_LIB_DIRS dp_SH \ dp_SCRIPTSDIR PORTSDIR dp_MAKE dp_MAKEFLAGS dp_OVERLAYS [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_DO_DEPENDS}" ] && set -x set -u install_depends() { origin=$1 target=$2 depends_args=$3 if [ -z "${dp_USE_PACKAGE_DEPENDS}" -a -z "${dp_USE_PACKAGE_DEPENDS_ONLY}" ]; then MAKEFLAGS="${dp_MAKEFLAGS}" ${dp_MAKE} -C ${origin} -DINSTALLS_DEPENDS ${target} ${depends_args} return 0 fi port_var_fetch "${origin}" "${depends_args}" \ PKGFILE pkgfile \ PKGBASE pkgbase if [ -r "${pkgfile}" -a "${target}" = "${dp_DEPENDS_TARGET}" ]; then echo "===> Installing existing package ${pkgfile}" if [ "${pkgbase}" = "pkg" ]; then [ -d ${dp_WRKDIR} ] || mkdir -p ${dp_WRKDIR} tar xf ${pkgfile} -C ${dp_WRKDIR} -s ",/.*/,,g" "*/pkg-static" ${dp_WRKDIR}/pkg-static add ${pkgfile} rm -f ${dp_WRKDIR}/pkg-static else ${dp_PKG_ADD} -A ${pkgfile} fi elif [ -n "${dp_USE_PACKAGE_DEPENDS_ONLY}" -a "${target}" = "${dp_DEPENDS_TARGET}" ]; then echo "===> ${dp_PKGNAME} depends on package: ${pkgfile} - not found" >&2 echo "===> USE_PACKAGE_DEPENDS_ONLY set - not building missing dependency from source" >&2 exit 1 else MAKEFLAGS="${dp_MAKEFLAGS}" ${dp_MAKE} -C ${origin} -DINSTALLS_DEPENDS ${target} ${depends_args} fi } find_package() { if ${dp_PKG_INFO} "$1" >/dev/null 2>&1; then echo "===> ${dp_PKGNAME} depends on package: $1 - found" return 0 fi echo "===> ${dp_PKGNAME} depends on package: $1 - not found" return 1 } find_file() { if [ -e "$1" ]; then echo "===> ${dp_PKGNAME} depends on file: $1 - found" return 0 fi echo "===> ${dp_PKGNAME} depends on file: $1 - not found" return 1 } find_file_path() { if which -s $1 ; then echo "===> ${dp_PKGNAME} depends on executable: $1 - found" return 0 fi echo "===> ${dp_PKGNAME} depends on executable: $1 - not found" return 1 } find_lib() { echo -n "===> ${dp_PKGNAME} depends on shared library: $1" libfile=$(env -i PATH="${PATH}" LIB_DIRS="${dp_LIB_DIRS}" LOCALBASE="${dp_LOCALBASE}" ${dp_SH} ${dp_SCRIPTSDIR}/find-lib.sh $1) if [ -z "${libfile}" ]; then echo " - not found" return 1 fi echo " - found (${libfile})" } anynotfound=0 err=0 for _line in ${dp_RAWDEPENDS} ; do # ensure we never leak flavors unset FLAVOR myifs=${IFS} IFS=: set -- ${_line} IFS=${myifs} if [ $# -lt 2 -o $# -gt 3 ]; then echo "Error: bad dependency syntax in ${dp_DEPTYPE}" >&2 echo "expecting: pattern:origin[@flavour][:target]" >&2 echo "got: ${_line}" >&2 err=1 continue fi pattern=$1 origin=$2 last=${3:-} if [ -z "${pattern}" ]; then echo "Error: there is an empty port dependency in ${dp_DEPTYPE}" >&2 err=1 continue fi if [ -z "${origin}" ]; then echo "Error: a dependency has an empty origin in ${dp_DEPTYPE}" >&2 err=1 continue fi case "${origin}" in *@*/*) ;; # Ignore @ in the path which would not be a flavor *@*) export FLAVOR="${origin##*@}" origin=${origin%@*} ;; esac case "${origin}" in /*) ;; *) for overlay in ${dp_OVERLAYS} ${PORTSDIR}; do orig="${overlay}/${origin}" if [ -f "${orig}/Makefile" ]; then break fi done origin="${orig}" ;; esac depends_args="${dp_DEPENDS_ARGS}" target=${dp_DEPENDS_TARGET} if [ -n "${last}" ]; then # In case we depend on the fetch stage, actually run checksum, # this prevent a MITM attack. if [ "${last}" = "fetch" ]; then target=checksum else target=${last} fi if [ -n "${dp_DEPENDS_PRECLEAN}" ]; then target="clean ${target}" depends_args="${depends_args:+${depends_args} }NOCLEANDEPENDS=yes" fi if [ -n "${dp_DEPENDS_CLEAN}" ]; then target="${target} clean" depends_args="${depends_args:+${depends_args} }NOCLEANDEPENDS=yes" fi fi case ${dp_DEPTYPE} in LIB_DEPENDS) case ${pattern} in lib*.so*) fct=find_lib ;; *) echo "Error: pattern ${pattern} in LIB_DEPENDS is not valid" err=1 continue ;; esac ;; *) case ${pattern} in *\>*|*\<*|*=*) fct=find_package ;; /nonexistent) fct=false ;; /*) fct=find_file ;; *) fct=find_file_path ;; esac ;; esac if ${fct} "${pattern}" ; then continue fi [ ${pattern} = "/nonexistent" ] || anynotfound=1 if [ ! -f "${origin}/Makefile" ]; then echo "Error a dependency refers to a non existing origin: ${origin} in ${dp_DEPTYPE}" >&2 err=1 continue fi # Now actually install the dependencies install_depends "${origin}" "${target}" "${depends_args}" # Recheck if the installed dependency validates the pattern except for /nonexistent [ "${fct}" = "false" ] || ${fct} "${pattern}" echo "===> Returning to build of ${dp_PKGNAME}" done if [ $err -eq 1 ]; then echo "Errors with dependencies." exit 1 fi if [ -n "${dp_STRICT_DEPENDS}" -a ${anynotfound} -eq 1 ]; then \ echo "===> STRICT_DEPENDS set - Not installing missing dependencies." echo " This means a dependency is wrong since it was not satisfied in the ${dp_DEPTYPE} phase." exit 1 fi Index: head/Mk/Scripts/do-fetch.sh =================================================================== --- head/Mk/Scripts/do-fetch.sh (revision 554138) +++ head/Mk/Scripts/do-fetch.sh (revision 554139) @@ -1,183 +1,184 @@ #!/bin/sh # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org set -e +set pipefail . "${dp_SCRIPTSDIR}/functions.sh" validate_env dp_DEVELOPER dp_DISABLE_SIZE dp_DISTDIR dp_DISTINFO_FILE \ dp_DIST_SUBDIR dp_ECHO_MSG dp_FETCH_AFTER_ARGS dp_FETCH_BEFORE_ARGS \ dp_FETCH_CMD dp_FETCH_ENV dp_FORCE_FETCH_ALL dp_FORCE_FETCH_LIST \ dp_MASTER_SITE_BACKUP dp_MASTER_SITE_OVERRIDE dp_MASTER_SORT_AWK \ dp_NO_CHECKSUM dp_RANDOMIZE_SITES dp_SITE_FLAVOR dp_TARGET [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_DO_FETCH}" ] && set -x set -u case ${dp_TARGET} in do-fetch|makesum) if [ ! -d "${dp_DISTDIR}" ]; then mkdir -p "${dp_DISTDIR}" fi cd "${dp_DISTDIR}" ;; esac for _file in "${@}"; do file=${_file%%:*} # If this files has groups if [ "$_file" = "$file" ]; then select=DEFAULT else select=$(echo "${_file##*:}" | sed -e 's/,/ /g') fi filebasename=${file##*/} if [ -n "${dp_FORCE_FETCH_ALL}" ]; then force_fetch=true else force_fetch=false for afile in ${dp_FORCE_FETCH_LIST}; do afile=${afile##*/} if [ "x$afile" = "x$filebasename" ]; then force_fetch=true fi done fi if [ -f "${file}" -a "$force_fetch" != "true" ]; then continue fi full_file="${dp_DIST_SUBDIR:+${dp_DIST_SUBDIR}/}${file}" if [ -L "$file" ]; then ${dp_ECHO_MSG} "=> ${dp_DISTDIR}/$file is a broken symlink." ${dp_ECHO_MSG} "=> Perhaps a filesystem (most likely a CD) isn't mounted?" ${dp_ECHO_MSG} "=> Please correct this problem and try again." exit 1 fi if [ -f "${dp_DISTINFO_FILE}" -a -z "${dp_NO_CHECKSUM}" ]; then _sha256sum=$(distinfo_data SHA256 "${full_file}") if [ -z "$_sha256sum" ]; then ${dp_ECHO_MSG} "=> ${dp_DIST_SUBDIR:+$dp_DIST_SUBDIR/}$file is not in ${dp_DISTINFO_FILE}." ${dp_ECHO_MSG} "=> Either ${dp_DISTINFO_FILE} is out of date, or" ${dp_ECHO_MSG} "=> ${dp_DIST_SUBDIR:+$dp_DIST_SUBDIR/}$file is spelled incorrectly." exit 1 fi fi case ${dp_TARGET} in do-fetch|makesum) ${dp_ECHO_MSG} "=> $file doesn't seem to exist in ${dp_DISTDIR}." if [ ! -w "${dp_DISTDIR}" ]; then ${dp_ECHO_MSG} "=> ${dp_DISTDIR} is not writable by you; cannot fetch." exit 1 fi ;; esac __MASTER_SITES_TMP= for group in $select; do # Disable nounset for this, it may come up empty, but # we don't want to fail with a strange error here. set +u eval ___MASTER_SITES_TMP="\${_${dp_SITE_FLAVOR}_SITES_${group}}" set -u if [ -n "${___MASTER_SITES_TMP}" ] ; then __MASTER_SITES_TMP="${__MASTER_SITES_TMP} ${___MASTER_SITES_TMP}" else case ${dp_TARGET} in do-fetch|makesum) if [ -n "${dp_DEVELOPER}" ]; then ${dp_ECHO_MSG} "===> /!\\ Error /!\\" else ${dp_ECHO_MSG} "===> /!\\ Warning /!\\" fi ${dp_ECHO_MSG} " The :${group} group used for $file is missing" ${dp_ECHO_MSG} " from ${dp_SITE_FLAVOR}_SITES. Check for typos, or errors." if [ -n "${dp_DEVELOPER}" ]; then exit 1 fi ;; esac fi done ___MASTER_SITES_TMP= SORTED_MASTER_SITES_CMD_TMP="echo ${dp_MASTER_SITE_OVERRIDE} $(echo -n "${__MASTER_SITES_TMP}" | awk "${dp_MASTER_SORT_AWK}") ${dp_MASTER_SITE_BACKUP}" case ${dp_TARGET} in fetch-list) echo -n "mkdir -p ${dp_DISTDIR} && " echo -n "cd ${dp_DISTDIR} && { " ;; esac sites_remaining=0 if [ -n "${dp_RANDOMIZE_SITES}" ]; then sites="$(${SORTED_MASTER_SITES_CMD_TMP} | ${dp_RANDOMIZE_SITES})" else sites="$(${SORTED_MASTER_SITES_CMD_TMP})" fi for site in ${sites}; do sites_remaining=$((sites_remaining + 1)) done for site in ${sites}; do sites_remaining=$((sites_remaining - 1)) CKSIZE=$(distinfo_data SIZE "${full_file}") # There is a lot of escaping, but the " needs to survive echo/eval. case ${file} in */*) case ${dp_TARGET} in fetch-list|fetch-url-list-int) echo "mkdir -p \"${file%/*}\" && " ;; *) mkdir -p "${file%/*}" ;; esac args="-o ${file} ${site}${file}" ;; *) args="${site}${file}" ;; esac _fetch_cmd="${dp_FETCH_CMD} ${dp_FETCH_BEFORE_ARGS}" if [ -z "${dp_DISABLE_SIZE}" -a -n "${CKSIZE}" ]; then _fetch_cmd="${_fetch_cmd} -S ${CKSIZE}" fi _fetch_cmd="${_fetch_cmd} ${args} ${dp_FETCH_AFTER_ARGS}" case ${dp_TARGET} in do-fetch|makesum) ${dp_ECHO_MSG} "=> Attempting to fetch ${site}${file}" if env -S "${dp_FETCH_ENV}" ${_fetch_cmd}; then actual_size=$(stat -f %z "${file}") if [ -n "${dp_DISABLE_SIZE}" ] || [ -z "${CKSIZE}" ] || [ "${actual_size}" -eq "${CKSIZE}" ]; then continue 2 else ${dp_ECHO_MSG} "=> Fetched file size mismatch (expected ${CKSIZE}, actual ${actual_size})" if [ ${sites_remaining} -gt 0 ]; then ${dp_ECHO_MSG} "=> Trying next site" rm -f "${file}" fi fi fi ;; fetch-list) echo -n "env $(escape "${_fetch_cmd}") || " ;; fetch-url-list-int) echo ${args} ;; esac done case ${dp_TARGET} in do-fetch|makesum) ${dp_ECHO_MSG} "=> Couldn't fetch it - please try to retrieve this" ${dp_ECHO_MSG} "=> port manually into ${dp_DISTDIR} and try again." exit 1 ;; fetch-list) echo "echo \"${file}\" not fetched; }" ;; esac done Index: head/Mk/Scripts/do-patch.sh =================================================================== --- head/Mk/Scripts/do-patch.sh (revision 554138) +++ head/Mk/Scripts/do-patch.sh (revision 554139) @@ -1,168 +1,169 @@ #!/bin/sh # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org set -e +set pipefail . "${dp_SCRIPTSDIR}/functions.sh" validate_env dp_BZCAT dp_CAT dp_DISTDIR dp_ECHO_MSG dp_EXTRA_PATCHES \ dp_EXTRA_PATCH_TREE dp_GZCAT dp_OPSYS dp_PATCH dp_PATCHDIR \ dp_PATCHFILES dp_PATCH_ARGS dp_PATCH_DEBUG_TMP dp_PATCH_DIST_ARGS \ dp_PATCH_SILENT dp_PATCH_WRKSRC dp_PKGNAME dp_PKGORIGIN \ dp_UNZIP_NATIVE_CMD dp_XZCAT [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_DO_PATCH}" ] && set -x set -u has_failed="" cat_file() { case "$1" in *.Z|*.gz) ${dp_GZCAT} "$1" ;; *.bz2) ${dp_BZCAT} "$1" ;; *.xz) ${dp_XZCAT} "$1" ;; *.zip) ${dp_UNZIP_NATIVE_CMD} -p "$1" ;; *) ${dp_CAT} "$1" ;; esac } # If we want to continue when one patch fails, set the flag, otherwise, abort. if [ -n "${dp_PATCH_CONTINUE_ON_FAIL}" ]; then failure_fatal() { has_failed=1 } else failure_fatal() { false } fi apply_one_patch() { local file="$1" local msg="$2" local verbose="$3" shift 3 local patch_strip="" case ${file} in *:-p[0-9]) patch_strip=${file##*:} file=${file%:-p[0-9]} ;; esac if [ -n "${verbose}" -o -n "${dp_PATCH_DEBUG_TMP}" ]; then ${dp_ECHO_MSG} "===> Applying ${msg} ${file}${patch_strip:+ with ${patch_strip}}" fi if ! cat_file "$file" | do_patch "$@" ${patch_strip}; then ${dp_ECHO_MSG} "===> FAILED Applying ${msg} ${file}${patch_strip:+ with ${patch_strip}}" false fi } do_patch() { "${dp_PATCH}" -d "${dp_PATCH_WRKSRC}" "$@" } patch_from_directory() { local dir="$1" local msg="$2" local patches_applied="" local patches_failed="" if [ -d "${dir}" ]; then cd "${dir}" if [ "$(echo patch-*)" != "patch-*" ]; then ${dp_ECHO_MSG} "===> Applying ${msg} patches for ${dp_PKGNAME} from ${dir}" for i in patch-*; do case ${i} in *.orig|*.rej|*~|*,v) ${dp_ECHO_MSG} "====> IGNORING patchfile ${i}" ;; *) if apply_one_patch "${i}" "${msg}" "" ${dp_PATCH_ARGS}; then patches_applied="${patches_applied} ${i}" else patches_failed="${patches_failed} ${i}" if ! failure_fatal; then break fi fi ;; esac done if [ -n "${patches_failed}" -a "${dp_PATCH_SILENT}" != "yes" ]; then if [ -n "${patches_applied}" ]; then ${dp_ECHO_MSG} "===> Cleanly applied ${msg} patch(es) ${patches_applied}" fi ${dp_ECHO_MSG} "===> FAILED to apply cleanly ${msg} patch(es) ${patches_failed}" # If we want to stop after the first failure, this returns false, # let its return value bubble up here and stop everything. failure_fatal fi fi fi } if [ -n "${dp_PATCHFILES}" ]; then ${dp_ECHO_MSG} "===> Applying distribution patches for ${dp_PKGNAME}" cd "${dp_DISTDIR}" for i in ${dp_PATCHFILES}; do if ! apply_one_patch "${i}" \ "distribution patch" \ "" \ ${dp_PATCH_DIST_ARGS}; then failure_fatal fi done fi if [ -n "${dp_EXTRA_PATCHES}" ]; then for i in ${dp_EXTRA_PATCHES}; do if [ -d "${i}" ]; then patch_from_directory "${i}" \ "extra patch" else if ! apply_one_patch "${i}" \ "extra patch" \ "verbose" \ ${dp_PATCH_ARGS}; then failure_fatal fi fi done fi patch_from_directory "${dp_PATCHDIR}" "${dp_OPSYS}" if [ -n "${dp_EXTRA_PATCH_TREE}" ]; then patch_from_directory "${dp_EXTRA_PATCH_TREE}/${dp_PKGORIGIN}" "local" fi if [ -n "$has_failed" ]; then if [ -n "${dp_PATCH_DEBUG_TMP}" ]; then ${dp_ECHO_MSG} "==> Some patches failed to apply cleanly." ${dp_ECHO_MSG} "==> Look for FAILED messages above." fi false fi Index: head/Mk/Scripts/do-users-groups.sh =================================================================== --- head/Mk/Scripts/do-users-groups.sh (revision 554138) +++ head/Mk/Scripts/do-users-groups.sh (revision 554139) @@ -1,222 +1,223 @@ #!/bin/sh # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org set -e +set pipefail . "${dp_SCRIPTSDIR}/functions.sh" validate_env dp_ECHO_MSG dp_GID_FILES dp_GID_OFFSET dp_GROUPS_BLACKLIST \ dp_INSTALL dp_OPSYS dp_OSVERSION dp_PREFIX dp_PW dp_SCRIPTSDIR \ dp_UG_DEINSTALL dp_UG_INSTALL dp_UID_FILES dp_UID_OFFSET \ dp_USERS_BLACKLIST [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_DO_USERS_GROUPS}" ] && set -x set -u USERS=$1 GROUPS=$2 error() { ${dp_ECHO_MSG} "${1}" exit 1 } # Lines from GID and UID files both contain *. As we do not need any pathname # expansion, disable globbing. set -f rm -f "${dp_UG_INSTALL}" "${dp_UG_DEINSTALL}" || : if [ "${dp_OPSYS}" = FreeBSD ] ; then cat >> "${dp_UG_INSTALL}" <<-eot if [ -n "\${PKG_ROOTDIR}" ] && [ "\${PKG_ROOTDIR}" != "/" ]; then PW="${dp_PW} -R \${PKG_ROOTDIR}" else PW=${dp_PW} fi eot else echo "PW=${dp_PW}" >> "${dp_UG_INSTALL}" fi # Both scripts need to start the same, so cp -f "${dp_UG_INSTALL}" "${dp_UG_DEINSTALL}" if [ -n "${GROUPS}" ]; then for file in ${dp_GID_FILES}; do if [ ! -f "${file}" ]; then error "** ${file} doesn't exist. Exiting." fi done ${dp_ECHO_MSG} "===> Creating groups." echo "echo \"===> Creating groups.\"" >> "${dp_UG_INSTALL}" for group in ${GROUPS}; do # _bgpd:*:130: if ! grep -q "^${group}:" ${dp_GID_FILES}; then \ error "** Cannot find any information about group \`${group}' in ${dp_GID_FILES}." fi while read -r line; do # Do not change IFS for more than one command, if we # changed IFS around the while read, it would mess up # the string splitting in the heredoc command. o_IFS=${IFS} IFS=":" set -- ${line} IFS=${o_IFS} group=$1 gid=$3 if [ -z "${gid}" ]; then error "Group line for group ${group} has no gid" fi gid=$((gid+dp_GID_OFFSET)) cat >> "${dp_UG_INSTALL}" <<-eot2 if ! \${PW} groupshow $group >/dev/null 2>&1; then echo "Creating group '$group' with gid '$gid'." \${PW} groupadd $group -g $gid else echo "Using existing group '$group'." fi eot2 done <<-eot $(grep -h "^${group}:" ${dp_GID_FILES} | head -n 1) eot done fi if [ -n "${USERS}" ]; then for file in ${dp_UID_FILES}; do if [ ! -f "${file}" ]; then error "** ${file} doesn't exist. Exiting." fi done ${dp_ECHO_MSG} "===> Creating users" echo "echo \"===> Creating users\"" >> "${dp_UG_INSTALL}" for user in ${USERS}; do # _bgpd:*:130:130:BGP Daemon:/var/empty:/sbin/nologin if ! grep -q "^${user}:" ${dp_UID_FILES} ; then error "** Cannot find any information about user \`${user}' in ${dp_UID_FILES}." fi while read -r line; do # Do not change IFS for more than one command, if we # changed IFS around the while read, it would mess up # the string splitting in the heredoc command. o_IFS=${IFS} IFS=":" set -- ${line} IFS=${o_IFS} login=$1 uid=$3 gid=$4 class=$5 gecos=$8 homedir=$9 shell=${10} if [ -z "$uid" ] || [ -z "$gid" ] || [ -z "$homedir" ] || [ -z "$shell" ]; then error "User line for ${user} is invalid" fi uid=$((uid+dp_UID_OFFSET)) gid=$((gid+dp_GID_OFFSET)) if [ -n "$class" ]; then class="-L $class" fi homedir=$(echo "$homedir" | sed "s|^/usr/local|${dp_PREFIX}|") cat >> "${dp_UG_INSTALL}" <<-eot2 if ! \${PW} usershow $login >/dev/null 2>&1; then echo "Creating user '$login' with uid '$uid'." \${PW} useradd $login -u $uid -g $gid $class -c "$gecos" -d $homedir -s $shell else echo "Using existing user '$login'." fi eot2 case $homedir in /|/nonexistent|/var/empty) ;; *) echo "echo \"===> Creating homedir(s)\"" >> "${dp_UG_INSTALL}" group=$(awk -F: -v gid=${gid} '$1 !~ /^#/ && $3 == gid { print $1 }' ${dp_GID_FILES}) cat >> "${dp_UG_INSTALL}" <<-blah if [ -n "\${PKG_ROOTDIR}" ] && [ "\${PKG_ROOTDIR}" != "/" ]; then HOMEDIR="\${PKG_ROOTDIR}/$homedir" MDBDIR="-N \${PKG_ROOTDIR}/etc/" else HOMEDIR="$homedir" MDBDIR="" fi ${dp_INSTALL} \${MDBDIR} -d -g $group -o $login \${HOMEDIR} blah ;; esac done <<-eot $(grep -h "^${user}:" ${dp_UID_FILES} | head -n 1) eot done fi if [ -n "${GROUPS}" ]; then for group in ${GROUPS}; do # mail:*:6:postfix,clamav while read -r line; do # Do not change IFS for more than one command, if we # changed IFS around the while read, it would mess up # the string splitting in the heredoc command. o_IFS=${IFS} IFS=":" # As some lines do not have a fourth argument, provide # one so $4 always exists. set -- ${line} "" IFS=${o_IFS} group=$1 gid=$3 members=$4 gid=$((gid+dp_GID_OFFSET)) o_IFS=${IFS} IFS="," set -- ${members} IFS=${o_IFS} for login in "$@"; do for user in ${USERS}; do if [ -n "${user}" ] && [ "${user}" = "${login}" ]; then cat >> "${dp_UG_INSTALL}" <<-eot2 if ! \${PW} groupshow ${group} | grep -qw ${login}; then echo "Adding user '${login}' to group '${group}'." \${PW} groupmod ${group} -m ${login} fi eot2 fi done done done <<-eot $(grep -h "^${group}:" ${dp_GID_FILES} | head -n 1) eot done fi if [ -n "${USERS}" ]; then for user in ${USERS}; do if ! echo "${dp_USERS_BLACKLIST}" | grep -qw "${user}"; then cat >> "${dp_UG_DEINSTALL}" <<-eot if \${PW} usershow ${user} >/dev/null 2>&1; then echo "==> You should manually remove the \"${user}\" user. " fi eot fi done fi if [ -n "${GROUPS}" ]; then for group in ${GROUPS}; do if ! echo "${dp_GROUPS_BLACKLIST}" | grep -qw "${group}"; then cat >> "${dp_UG_DEINSTALL}" <<-eot if \${PW} groupshow ${group} >/dev/null 2>&1; then echo "==> You should manually remove the \"${group}\" group " fi eot fi done fi Index: head/Mk/Scripts/find-lib.sh =================================================================== --- head/Mk/Scripts/find-lib.sh (revision 554138) +++ head/Mk/Scripts/find-lib.sh (revision 554139) @@ -1,33 +1,35 @@ #!/bin/sh # MAINTAINER: portmgr@FreeBSD.org # $FreeBSD$ +set pipefail + [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_FIND_LIB}" ] && set -x if [ -z "${LIB_DIRS}" -o -z "${LOCALBASE}" ]; then echo "LIB_DIRS, LOCALBASE required in environment." >&2 exit 1 fi if [ -f /usr/share/misc/magic.mime -o -f /usr/share/misc/magic.mime.mgc ]; then echo >&2 echo "Either /usr/share/misc/magic.mime or /usr/share/misc/magic.mime.mgc exist and must be removed." >&2 echo "These are legacy files from an older release and may safely be deleted." >&2 echo "Please see UPDATING 20150213 for more details." >&2 exit 1 fi if [ $# -ne 1 ]; then echo "$0: no argument provided." >&2 fi lib=$1 dirs="${LIB_DIRS} $(cat ${LOCALBASE}/libdata/ldconfig/* 2>/dev/null || :)" for libdir in ${dirs} ; do test -f ${libdir}/${lib} || continue libfile=${libdir}/${lib} [ "$(/usr/bin/file -b -L --mime-type ${libfile})" = "application/x-sharedlib" ] || continue echo $libfile break done Index: head/Mk/Scripts/generate-symbols.sh =================================================================== --- head/Mk/Scripts/generate-symbols.sh (revision 554138) +++ head/Mk/Scripts/generate-symbols.sh (revision 554139) @@ -1,53 +1,55 @@ #! /bin/sh # $FreeBSD$ # Maintainer: portmgr@FreeBSD.org # # This script will find all ELF files in STAGEDIR and then strip and move # the symbols to LOCALBASE/lib/debug/. # For example: # /var/qmail/bin/qmaild -> /usr/local/lib/debug/var/qmail/bin/qmaild.debug # /usr/local/bin/ssh -> /usr/local/lib/debug/usr/local/bin/ssh.debug LIB_DIR_PREFIX="${LOCALBASE}/lib/debug" +set pipefail + msg() { echo "====> $*" } msg "Finding symbols" # Find all ELF files ELF_FILES=$(mktemp -t elf_files) find ${STAGEDIR} -type f ! -name '*.a' \ -exec /usr/bin/readelf -S /dev/null {} + 2>/dev/null | awk ' \ /File:/ {sub(/File: /, "", $0); file=$0} /[[:space:]]\.debug_info[[:space:]]*PROGBITS/ {print file}' \ > ${ELF_FILES} # Create all of the /usr/local/lib/* dirs lib_dir="${STAGEDIR}${LIB_DIR_PREFIX}" sed -e "s,^${STAGEDIR}/,${lib_dir}/," -e 's,/[^/]*$,,' \ ${ELF_FILES} | sort -u | xargs mkdir -p while read -r staged_elf_file; do elf_file_name="${staged_elf_file##*/}" lib_dir_dest="${lib_dir}/${staged_elf_file#${STAGEDIR}/}" # Strip off filename lib_dir_dest="${lib_dir_dest%/*}" # Save symbols to f.debug debug_file_name="${lib_dir_dest}/${elf_file_name}.debug" objcopy --only-keep-debug "${staged_elf_file}" "${debug_file_name}" # Strip and add a reference to f.debug for finding the symbols. objcopy --strip-debug --strip-unneeded \ --add-gnu-debuglink="${debug_file_name}" "${staged_elf_file}" msg "Saved symbols for ${staged_elf_file}" echo "${debug_file_name#${STAGEDIR}}" >&3 done < ${ELF_FILES} 3>> ${TMPPLIST} # Need @dir entries if PREFIX != LOCALBASE if [ "${PREFIX}" != "${LOCALBASE}" ] && [ -d "${lib_dir}" ]; then find -sd "${lib_dir}" -type d | sed -e "s,^${STAGEDIR},," \ -e 's,^,@dir ,' \ >> ${TMPPLIST} fi rm -f ${ELF_FILES} Index: head/Mk/Scripts/install-desktop-entries.sh =================================================================== --- head/Mk/Scripts/install-desktop-entries.sh (revision 554138) +++ head/Mk/Scripts/install-desktop-entries.sh (revision 554139) @@ -1,66 +1,67 @@ #!/bin/sh # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org set -e +set pipefail . "${dp_SCRIPTSDIR}/functions.sh" validate_env dp_SED dp_ECHO_CMD dp_STAGEDIR dp_DESKTOPDIR [ -n "${DEBUG_MK_SCRIPTS}" ] || [ -n "${DEBUG_MK_SCRIPTS_INSTALL_DESKTOP_ENTRIES}" ] && set -x set -u while [ $# -ge 6 ]; do Name="${1}" Comment="${2}" Icon="${3}" Exec="${4}" Categories="${5}" StartupNotify="${6}" shift 6 filename="$(${dp_ECHO_CMD} "${Exec}" | ${dp_SED} -e 's,^/,,g;s,[/ ],_,g;s,[^_[:alnum:]],,g').desktop" pathname="${dp_STAGEDIR}${dp_DESKTOPDIR}/${filename}" ${dp_ECHO_CMD} "${dp_DESKTOPDIR}/${filename}" >> "${dp_TMPPLIST}" { ${dp_ECHO_CMD} "[Desktop Entry]" ${dp_ECHO_CMD} "Type=Application" ${dp_ECHO_CMD} "Version=1.0" ${dp_ECHO_CMD} "Name=${Name}" } > "${pathname}" if [ -n "${Comment}" ]; then comment="${Comment}" else comment="$(cd "${dp_CURDIR}" && ${dp_MAKE} -VCOMMENT)" fi ${dp_ECHO_CMD} "GenericName=${comment}" >> "${pathname}" ${dp_ECHO_CMD} "Comment=${comment}" >> "${pathname}" if [ -n "${Icon}" ]; then ${dp_ECHO_CMD} "Icon=${Icon}" >> "${pathname}" fi ${dp_ECHO_CMD} "Exec=${Exec}" >> "${pathname}" if [ -n "${Categories}" ]; then categories="${Categories}" else categories="$(cd "${dp_CURDIR}" && ${dp_MAKE} desktop-categories)" fi ${dp_ECHO_CMD} "Categories=${categories}" >> "${pathname}" if [ -n "${StartupNotify}" ]; then ${dp_ECHO_CMD} "StartupNotify=${StartupNotify}" >> "${pathname}" fi done Index: head/Mk/Scripts/makesum.sh =================================================================== --- head/Mk/Scripts/makesum.sh (revision 554138) +++ head/Mk/Scripts/makesum.sh (revision 554139) @@ -1,53 +1,54 @@ #!/bin/sh # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org set -e +set pipefail . "${dp_SCRIPTSDIR}/functions.sh" validate_env dp_CHECKSUM_ALGORITHMS dp_CKSUMFILES dp_DISTDIR dp_DISTINFO_FILE \ dp_ECHO_MSG [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_MAKESUM}" ] && set -x set -u DISTINFO_OLD=$(mktemp -t makesum-old) DISTINFO_NEW=$(mktemp -t makesum-new) trap 'rm -f ${DISTINFO_OLD} ${DISTINFO_NEW}' EXIT INT TERM check_checksum_algorithms cd "${dp_DISTDIR}" # Running `make makesum` a twice should not change the timestamp generated from # the first run. # So, we extract the content of the distinfo file minus the TIMESTAMP, if it # contains a TIMESTAMP. if [ -f "${dp_DISTINFO_FILE}" ] && grep -q "^TIMESTAMP " ${dp_DISTINFO_FILE}; then grep -v "^TIMESTAMP " ${dp_DISTINFO_FILE} > ${DISTINFO_OLD} fi for file in ${dp_CKSUMFILES}; do for alg in ${dp_CHECKSUM_ALGORITHMS}; do eval "alg_executable=\$dp_$alg" if [ "$alg_executable" != "NO" ]; then $alg_executable "$file" >> "${DISTINFO_NEW}" fi done echo "SIZE ($file) = $(stat -f %z "$file")" >> "${DISTINFO_NEW}" done # Now, we generate the distinfo file in two cases: # - If the saved file is empty, it means there was no TIMESTAMP in it, so we # need to add one. # - If the old and new distinfo content minus the TIMESTAMP differ, it means # something was updated or changed, it is time to generate a new timestamp. if [ ! -s ${DISTINFO_OLD} ] || ! cmp -s ${DISTINFO_OLD} ${DISTINFO_NEW}; then echo "TIMESTAMP = $(date '+%s')" > ${dp_DISTINFO_FILE} cat ${DISTINFO_NEW} >> ${dp_DISTINFO_FILE} fi Index: head/Mk/Scripts/plist_sub_sed_sort.sh =================================================================== --- head/Mk/Scripts/plist_sub_sed_sort.sh (revision 554138) +++ head/Mk/Scripts/plist_sub_sed_sort.sh (revision 554139) @@ -1,17 +1,19 @@ #! /bin/sh # $FreeBSD$ # # MAINTAINER: portmgr@FreeBSD.org # # PLIST_SUB_SED helper to sort by longest value first. +set pipefail + awk '{ while (match($0, /s![^!]*![^!]*!g;/)) { sedp=substr($0, RSTART, RLENGTH) $0=substr($0, RSTART+RLENGTH) split(sedp, a, "!") # Convert \. to . for sorting. gsub(/\\./, ".", a[2]) print length(a[2]), sedp } }' | sort -rn | awk '{$1=""; print $0}' > $1 Index: head/Mk/Scripts/ports_env.sh =================================================================== --- head/Mk/Scripts/ports_env.sh (revision 554138) +++ head/Mk/Scripts/ports_env.sh (revision 554139) @@ -1,13 +1,15 @@ #! /bin/sh # MAINTAINER: portmgr@FreeBSD.org # $FreeBSD$ +set pipefail + if [ -z "${SCRIPTSDIR}" ]; then echo "Must set SCRIPTSDIR" >&2 exit 1 fi . ${SCRIPTSDIR}/functions.sh export_ports_env Index: head/Mk/Scripts/qa.sh =================================================================== --- head/Mk/Scripts/qa.sh (revision 554138) +++ head/Mk/Scripts/qa.sh (revision 554139) @@ -1,1030 +1,1032 @@ #!/bin/sh # MAINTAINER: portmgr@FreeBSD.org # $FreeBSD$ +set pipefail + if [ -z "${STAGEDIR}" -o -z "${PREFIX}" -o -z "${LOCALBASE}" ]; then echo "STAGEDIR, PREFIX, LOCALBASE required in environment." >&2 exit 1 fi [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_QA}" ] && set -x LF=$(printf '\nX') LF=${LF%X} notice() { echo "Notice: $*" >&2 } warn() { echo "Warning: $*" >&2 } err() { echo "Error: $*" >&2 } list_stagedir_elfs() { cd ${STAGEDIR} && find -s . -type f \( -perm +111 -o -name '*.so*' \) "$@" } shebangonefile() { local f interp interparg badinterp rc f="$*" rc=0 # whitelist some files case "${f}" in *.pm|*.pod|*.txt|${STAGEDIR}${LINUXBASE}/*) return 0 ;; esac interp=$(sed -n -e '1s/^#![[:space:]]*\([^[:space:]]*\).*/\1/p;2q' "${f}") badinterp="" case "${interp}" in "") ;; /bin/rc) # whitelist some interpreters ;; ${LOCALBASE}/bin/python|${PREFIX}/bin/python|${LOCALBASE}/bin/python2|${PREFIX}/bin/python2|${LOCALBASE}/bin/python3|${PREFIX}/bin/python3) badinterp="${interp}" ;; ${LINUXBASE}/*) ;; ${LOCALBASE}/bin/perl5.* | ${PREFIX}/bin/perl5.*) # lang/perl5* are allowed to have these shebangs. if ! expr ${PKGORIGIN} : '^lang/perl5.*' > /dev/null; then err "'${interp}' is an invalid shebang for '${f#${STAGEDIR}${PREFIX}/}' you must use ${LOCALBASE}/bin/perl." err "Either pass \${PERL} to the build or use USES=shebangfix" rc=1 fi ;; ${LOCALBASE}/*) ;; ${PREFIX}/*) ;; /bin/csh) ;; /bin/sh) ;; /bin/tcsh) ;; /usr/bin/awk) ;; /usr/bin/env) interparg=$(sed -n -e '1s/^#![[:space:]]*[^[:space:]]*[[:space:]]*\([^[:space:]]*\).*/\1/p;2q' "${f}") case "${interparg}" in python|python2|python3) badinterp="${interp} ${interparg}" ;; esac ;; /usr/bin/nawk) ;; /usr/bin/sed) ;; /usr/sbin/dtrace) ;; /usr/bin/make) ;; *) badinterp="${interp}" ;; esac if [ -n "${badinterp}" ]; then err "'${badinterp}' is an invalid shebang you need USES=shebangfix for '${f#${STAGEDIR}${PREFIX}/}'" rc=1 fi return ${rc} } shebang() { local f l link rc rc=0 while read -r f; do # No results presents a blank line from heredoc. [ -z "${f}" ] && continue shebangonefile "${f}" || rc=1 # Use heredoc to avoid losing rc from find|while subshell done <<-EOF $(find ${STAGEDIR}${PREFIX} \ -type f -perm +111 2>/dev/null) EOF return ${rc} } baselibs() { local rc local found_openssl local file [ "${PKGBASE}" = "pkg" -o "${PKGBASE}" = "pkg-devel" ] && return while read -r f; do case ${f} in File:\ .*) file=${f#File: .} ;; *NEEDED*\[libarchive.so.[56]]) err "Bad linking on ${f##* } for ${file} please add USES=libarchive" rc=1 ;; *NEEDED*\[libedit.so.7]) err "Bad linking on ${f##* } for ${file} please add USES=libedit" rc=1 ;; *NEEDED*\[libcrypto.so.*]|*NEEDED*\[libssl.so.*]) found_openssl=1 ;; esac done <<-EOF $(list_stagedir_elfs -exec readelf -d {} + 2>/dev/null) EOF if [ -z "${USESSSL}" -a -n "${found_openssl}" ]; then warn "you need USES=ssl" elif [ -n "${USESSSL}" -a -z "${found_openssl}" ]; then warn "you may not need USES=ssl" fi return ${rc} } symlinks() { local rc rc=0 # Split stat(1) result into 2 lines and read each line separately to # retain spaces in filenames. while read -r l; do # No results presents a blank line from heredoc. [ -z "${l}" ] && continue read -r link case "${link}" in ${STAGEDIR}*) err "Bad symlink '${l#${STAGEDIR}${PREFIX}/}' pointing inside the stage directory" rc=1 ;; /*) # Only warn for symlinks within the package. if [ -e "${STAGEDIR}${link}" ]; then warn "Bad symlink '${l#${STAGEDIR}}' pointing to an absolute pathname '${link}'" fi # Also warn if the symlink exists nowhere. if [ ! -e "${STAGEDIR}${link}" -a ! -e "${link}" ]; then warn "Symlink '${l#${STAGEDIR}}' pointing to '${link}' which does not exist in the stage directory or in localbase" fi ;; esac # Use heredoc to avoid losing rc from find|while subshell. done <<-EOF $(find ${STAGEDIR} -type l -exec stat -f "%N${LF}%Y" {} +) EOF return ${rc} } paths() { local rc rc=0 while read -r f; do # No results presents a blank line from heredoc. [ -z "${f}" ] && continue # Ignore false-positive/harmless files case "${f}" in */lib/ruby/gems/*) continue ;; */share/texmf-var/web2c/*/*.fmt) continue ;; */share/texmf-var/web2c/*/*.log) continue ;; esac err "'${f#${STAGEDIR}${PREFIX}/}' is referring to ${STAGEDIR}" rc=1 # Use heredoc to avoid losing rc from find|while subshell done <<-EOF $(find ${TMPPLIST} ${STAGEDIR} -type f -exec grep -l "${STAGEDIR}" {} +) EOF return ${rc} } # For now do not raise an error, just warnings stripped() { [ -x /usr/bin/file ] || return # this is fatal [ -n "${STRIP}" ] || return 0 # Split file and result into 2 lines and read separately to ensure # files with spaces are kept intact. # Using readelf -h ... /ELF Header:/ will match on all ELF files. find ${STAGEDIR} -type f ! -name '*.a' ! -name '*.o' \ -exec readelf -S {} + 2>/dev/null | awk ' /File:/ {sub(/File: /, "", $0); file=$0} /[[:space:]]\.debug_info[[:space:]]*PROGBITS/ {print file}' | while read -r f; do warn "'${f#${STAGEDIR}${PREFIX}/}' is not stripped consider trying INSTALL_TARGET=install-strip or using \${STRIP_CMD}" done } desktopfileutils() { if [ -z "${USESDESKTOPFILEUTILS}" ]; then grep -q MimeType= ${STAGEDIR}${PREFIX}/share/applications/*.desktop 2>/dev/null && warn "you need USES=desktop-file-utils" else grep -q MimeType= ${STAGEDIR}${PREFIX}/share/applications/*.desktop 2>/dev/null || warn "you may not need USES=desktop-file-utils" fi return 0 } sharedmimeinfo() { local f found found=0 for f in ${STAGEDIR}${PREFIX}/share/mime/packages/*.xml; do [ "${f}" = "${STAGEDIR}${PREFIX}/share/mime/packages/*.xml" ] && break #no matches [ "${f}" = "${STAGEDIR}${PREFIX}/share/mime/packages/freedesktop.org.xml" ] && continue found=1 break done if [ -z "${USESSHAREDMIMEINFO}" -a ${found} -eq 1 ]; then warn "you need USES=shared-mime-info" elif [ -n "${USESSHAREDMIMEINFO}" -a ${found} -eq 0 ]; then warn "you may not need USES=shared-mime-info" fi return 0 } suidfiles() { local filelist filelist=$(find ${STAGEDIR} -type f \ \( -perm -u+x -or -perm -g+x -or -perm -o+x \) \ \( -perm -u+s -or -perm -g+s \)) if [ -n "${filelist}" ]; then warn "setuid files in the stage directory (are these necessary?):" ls -liTd ${filelist} fi return 0 } libtool() { if [ -z "${USESLIBTOOL}" ]; then find ${STAGEDIR} -name '*.la' | while read -r f; do if grep -q 'libtool library' "${f}"; then err ".la libraries found, port needs USES=libtool" return 1 fi done # The return above continues here. fi } libperl() { local has_some_libperl_so files found if [ -n "${SITE_ARCH_REL}" -a -d "${STAGEDIR}${PREFIX}/${SITE_ARCH_REL}" ]; then has_some_libperl_so=0 files=0 while read -r f; do # No results presents a blank line from heredoc. [ -z "${f}" ] && continue files=$((files+1)) found=$(readelf -d ${f} | awk "BEGIN {libperl=1} /NEEDED.*${LIBPERL}/ { libperl = 0 } END {print libperl} ") case "${found}" in 1) warn "${f} is not linked with ${LIBPERL}, not respecting lddlflags?" ;; 0) has_some_libperl_so=1 ;; esac # Use heredoc to avoid losing rc from find|while subshell done <<-EOT $(find ${STAGEDIR}${PREFIX}/${SITE_ARCH_REL} -name '*.so') EOT if [ ${files} -gt 0 -a ${has_some_libperl_so} -eq 0 ]; then err "None of the ${files} .so in ${STAGEDIR}${PREFIX}/${SITE_ARCH_REL} are linked with ${LIBPERL}, see above for the full list." return 1 else return 0 fi fi } prefixvar() { if [ ${PREFIX} != ${LINUXBASE} -a -d ${STAGEDIR}${PREFIX}/var ]; then warn "port uses ${PREFIX}/var instead of /var" fi } terminfo() { local f found for f in ${STAGEDIR}${PREFIX}/share/misc/*.terminfo; do [ "${f}" = "${STAGEDIR}${PREFIX}/share/misc/*.terminfo" ] && break #no matches found=1 break done for f in ${STAGEDIR}${PREFIX}/share/misc/terminfo.db*; do [ "${f}" = "${STAGEDIR}${PREFIX}/share/misc/terminfo.db*" ] && break #no matches found=1 break done if [ -z "${USESTERMINFO}" -a -n "${found}" ]; then warn "you need USES=terminfo" elif [ -n "${USESTERMINFO}" -a -z "${found}" ]; then warn "you may not need USES=terminfo" fi return 0 } listcontains() { local str lst elt str=$1 lst=$2 for elt in ${lst} ; do if [ ${elt} = ${str} ]; then return 0 fi done return 1 } proxydeps_suggest_uses() { local pkg=$1 local lib_file=$2 # miscellaneous USE clauses if [ ${pkg} = 'devel/gettext-runtime' ]; then warn "you need USES+=gettext-runtime" elif [ ${pkg} = 'databases/sqlite3' ]; then warn "you need USES+=sqlite" elif [ ${pkg} = 'databases/sqlite2' ]; then warn "you need USES+=sqlite:2" # Gnome -> same as port # grep LIB_DEPENDS= Mk/Uses/gnome.mk |sed -e 's|\(.*\)_LIB_DEPENDS.*:\(.*\)\/\(.*\)|[ "\1" = "\3" ] \&\& echo "\\${pkg} = \\\"\2/\3\\\" -o \\\\"|'|sort|sh elif [ ${pkg} = "accessibility/atk" -o \ ${pkg} = "accessibility/atkmm" -o \ ${pkg} = "graphics/cairo" -o \ ${pkg} = "graphics/cairomm" -o \ ${pkg} = "devel/dconf" -o \ ${pkg} = "devel/gconf2" -o \ ${pkg} = "devel/gconfmm26" -o \ ${pkg} = "devel/glib20" -o \ ${pkg} = "devel/glibmm" -o \ ${pkg} = "audio/gsound" -o \ ${pkg} = "x11-toolkits/gtk20" -o \ ${pkg} = "x11-toolkits/gtk30" -o \ ${pkg} = "www/gtkhtml3" -o \ ${pkg} = "www/gtkhtml4" -o \ ${pkg} = "x11-toolkits/gtkmm20" -o \ ${pkg} = "x11-toolkits/gtkmm24" -o \ ${pkg} = "x11-toolkits/gtkmm30" -o \ ${pkg} = "x11-toolkits/gtksourceview" -o \ ${pkg} = "x11-toolkits/gtksourceview2" -o \ ${pkg} = "x11-toolkits/gtksourceview3" -o \ ${pkg} = "x11-toolkits/gtksourceviewmm3" -o \ ${pkg} = "devel/libbonobo" -o \ ${pkg} = "x11-toolkits/libbonoboui" -o \ ${pkg} = "databases/libgda5" -o \ ${pkg} = "databases/libgda5-ui" -o \ ${pkg} = "databases/libgdamm5" -o \ ${pkg} = "devel/libglade2" -o \ ${pkg} = "x11/libgnome" -o \ ${pkg} = "graphics/libgnomecanvas" -o \ ${pkg} = "x11/libgnomekbd" -o \ ${pkg} = "x11-toolkits/libgnomeui" -o \ ${pkg} = "devel/libgsf" -o \ ${pkg} = "www/libgtkhtml" -o \ ${pkg} = "x11-toolkits/libgtksourceviewmm" -o \ ${pkg} = "graphics/librsvg2" -o \ ${pkg} = "devel/libsigc++12" -o \ ${pkg} = "devel/libsigc++20" -o \ ${pkg} = "x11-toolkits/libwnck" -o \ ${pkg} = "x11-toolkits/libwnck3" -o \ ${pkg} = "textproc/libxml++26" -o \ ${pkg} = "textproc/libxml2" -o \ ${pkg} = "textproc/libxslt" -o \ ${pkg} = "x11-wm/metacity" -o \ ${pkg} = "x11-toolkits/pango" -o \ ${pkg} = "x11-toolkits/pangomm" -o \ ${pkg} = "x11-toolkits/pangox-compat" -o \ ${pkg} = "x11-toolkits/vte" -o \ ${pkg} = "x11-toolkits/vte3" ]; then warn "you need USE_GNOME+=${pkg#*/}" # Gnome different as port # grep LIB_DEPENDS= Mk/Uses/gnome.mk |sed -e 's|\(.*\)_LIB_DEPENDS.*:\(.*\)\/\(.*\)|[ "\1" = "\3" ] \|\| echo "elif [ \\${pkg} = \\\"\2/\3\\\" ]; then; warn \\\"you need USE_GNOME+=\1\\\""|'|sort|sh elif [ ${pkg} = "databases/evolution-data-server" ]; then warn "you need USE_GNOME+=evolutiondataserver3" elif [ ${pkg} = "graphics/gdk-pixbuf" ]; then warn "you need USE_GNOME+=gdkpixbuf" elif [ ${pkg} = "graphics/gdk-pixbuf2" ]; then warn "you need USE_GNOME+=gdkpixbuf2" elif [ ${pkg} = "x11/gnome-desktop" ]; then warn "you need USE_GNOME+=gnomedesktop3" elif [ ${pkg} = "devel/gnome-vfs" ]; then warn "you need USE_GNOME+=gnomevfs2" elif [ ${pkg} = "devel/gobject-introspection" ]; then warn "you need USE_GNOME+=introspection" elif [ ${pkg} = "graphics/libart_lgpl" ]; then warn "you need USE_GNOME+=libartlgpl2" elif [ ${pkg} = "devel/libIDL" ]; then warn "you need USE_GNOME+=libidl" elif [ ${pkg} = "x11-fm/nautilus" ]; then warn "you need USE_GNOME+=nautilus3" elif [ ${pkg} = "devel/ORBit2" ]; then warn "you need USE_GNOME+=orbit2" # mate # grep LIB_DEPENDS= Mk/Uses/mate.mk |sed -e 's|\(.*\)_LIB_DEPENDS.*:\(.*\)\/\(.*\)|elif [ ${pkg} = "\2/\3" ]; then warn "you need USE_MATE+=\1"|' elif [ ${pkg} = "x11-fm/caja" ]; then warn "you need USE_MATE+=caja" elif [ ${pkg} = "sysutils/mate-control-center" ]; then warn "you need USE_MATE+=controlcenter" elif [ ${pkg} = "x11/mate-desktop" ]; then warn "you need USE_MATE+=desktop" elif [ ${pkg} = "x11/libmatekbd" ]; then warn "you need USE_MATE+=libmatekbd" elif [ ${pkg} = "net/libmateweather" ]; then warn "you need USE_MATE+=libmateweather" elif [ ${pkg} = "x11-wm/marco" ]; then warn "you need USE_MATE+=marco" elif [ ${pkg} = "x11/mate-menus" ]; then warn "you need USE_MATE+=menus" elif [ ${pkg} = "x11/mate-panel" ]; then warn "you need USE_MATE+=panel" elif [ ${pkg} = "sysutils/mate-polkit" ]; then warn "you need USE_MATE+=polkit" # KDE # grep -B1 _LIB= Mk/Uses/kde.mk | grep _PORT=|sed -e 's/^kde-\(.*\)_PORT=[[:space:]]*\([^[:space:]]*\).*/elif [ ${pkg} = "\2" ]; then warn "you need to use USE_KDE+=\1"/' # KDE Applications elif [ ${pkg} = "net/akonadi-contacts" ]; then warn "you need to use USE_KDE+=akonadicontacts" elif [ ${pkg} = "deskutils/akonadi-import-wizard" ]; then warn "you need to use USE_KDE+=akonadiimportwizard" elif [ ${pkg} = "net/akonadi-mime" ]; then warn "you need to use USE_KDE+=akonadimime" elif [ ${pkg} = "net/akonadi-notes" ]; then warn "you need to use USE_KDE+=akonadinotes" elif [ ${pkg} = "net/akonadi-calendar" ]; then warn "you need to use USE_KDE+=akonadicalendar" elif [ ${pkg} = "net/akonadi-search" ]; then warn "you need to use USE_KDE+=akonadisearch" elif [ ${pkg} = "net/kalarmcal" ]; then warn "you need to use USE_KDE+=alarmcalendar" elif [ ${pkg} = "net/calendarsupport" ]; then warn "you need to use USE_KDE+=calendarsupport" elif [ ${pkg} = "net/kcalcore" ]; then warn "you need to use USE_KDE+=calendarcore" elif [ ${pkg} = "net/kcalutils" ]; then warn "you need to use USE_KDE+=calendarutils" elif [ ${pkg} = "net/kcontacts" ]; then warn "you need to use USE_KDE+=contacts" elif [ ${pkg} = "net/eventviews" ]; then warn "you need to use USE_KDE+=eventviews" elif [ ${pkg} = "net/libkgapi" ]; then warn "you need to use USE_KDE+=gapi" elif [ ${pkg} = "deskutils/grantleetheme" ]; then warn "you need to use USE_KDE+=grantleetheme" elif [ ${pkg} = "net/libgravatar" ]; then warn "you need to use USE_KDE+=gravatar" elif [ ${pkg} = "net/kidentitymanagement" ]; then warn "you need to use USE_KDE+=identitymanagement" elif [ ${pkg} = "net/kimap" ]; then warn "you need to use USE_KDE+=imap" elif [ ${pkg} = "net/incidenceeditor" ]; then warn "you need to use USE_KDE+=incidenceeditor" elif [ ${pkg} = "deskutils/kdepim-apps-libs" ]; then warn "you need to use USE_KDE+=kdepim-apps-libs" elif [ ${pkg} = "net/kitinerary" ]; then warn "you need to use USE_KDE+=kitinerary" elif [ ${pkg} = "net/kontactinterface" ]; then warn "you need to use USE_KDE+=kontactinterface" elif [ ${pkg} = "net/kf5-kdav" ]; then warn "you need to use USE_KDE+=kdav" elif [ ${pkg} = "security/kpkpass" ]; then warn "you need to use USE_KDE+=kpkpass" elif [ ${pkg} = "net/ksmtp" ]; then warn "you need to use USE_KDE+=ksmtp" elif [ ${pkg} = "net/kldap" ]; then warn "you need to use USE_KDE+=ldap" elif [ ${pkg} = "deskutils/libkdepim" ]; then warn "you need to use USE_KDE+=libkdepim" elif [ ${pkg} = "security/libkleo" ]; then warn "you need to use USE_KDE+=libkleo" elif [ ${pkg} = "net/libksieve" ]; then warn "you need to use USE_KDE+=libksieve" elif [ ${pkg} = "net/mailcommon" ]; then warn "you need to use USE_KDE+=mailcommon" elif [ ${pkg} = "net/mailimporter" ]; then warn "you need to use USE_KDE+=mailimporter" elif [ ${pkg} = "net/kmailtransport" ]; then warn "you need to use USE_KDE+=mailtransport" elif [ ${pkg} = "net/kmbox" ]; then warn "you need to use USE_KDE+=mbox" elif [ ${pkg} = "net/messagelib" ]; then warn "you need to use USE_KDE+=messagelib" elif [ ${pkg} = "net/kmime" ]; then warn "you need to use USE_KDE+=mime" elif [ ${pkg} = "net/pimcommon" ]; then warn "you need to use USE_KDE+=pimcommon" elif [ ${pkg} = "net/kpimtextedit" ]; then warn "you need to use USE_KDE+=pimtextedit" elif [ ${pkg} = "net/ktnef" ]; then warn "you need to use USE_KDE+=tnef" elif [ ${pkg} = "databases/akonadi" ]; then warn "you need to use USE_KDE+=akonadi" elif [ ${pkg} = "sysutils/baloo-widgets" ]; then warn "you need to use USE_KDE+=baloo-widgets" elif [ ${pkg} = "audio/libkcddb" ]; then warn "you need to use USE_KDE+=libkcddb" elif [ ${pkg} = "audio/libkcompactdisc" ]; then warn "you need to use USE_KDE+=libkcompactdisc" elif [ ${pkg} = "graphics/libkdcraw" ]; then warn "you need to use USE_KDE+=libkdcraw" elif [ ${pkg} = "games/libkdegames" ]; then warn "you need to use USE_KDE+=libkdegames" elif [ ${pkg} = "misc/libkeduvocdocument" ]; then warn "you need to use USE_KDE+=libkeduvocdocument" elif [ ${pkg} = "graphics/libkexiv2" ]; then warn "you need to use USE_KDE+=libkexiv2" elif [ ${pkg} = "graphics/libkipi" ]; then warn "you need to use USE_KDE+=libkipi" elif [ ${pkg} = "graphics/libksane" ]; then warn "you need to use USE_KDE+=libksane" elif [ ${pkg} = "astro/marble" ]; then warn "you need to use USE_KDE+=marble" elif [ ${pkg} = "graphics/okular" ]; then warn "you need to use USE_KDE+=okular" # KDE Plasma elif [ ${pkg} = "x11/plasma5-kactivitymanagerd" ]; then warn "you need to use USE_KDE+=activitymanagerd" elif [ ${pkg} = "x11-wm/plasma5-kdecoration" ]; then warn "you need to use USE_KDE+=decoration" elif [ ${pkg} = "devel/plasma5-khotkeys" ]; then warn "you need to use USE_KDE+=hotkeys" elif [ ${pkg} = "sysutils/plasma5-kmenuedit" ]; then warn "you need to use USE_KDE+=kmenuedit" elif [ ${pkg} = "security/plasma5-kscreenlocker" ]; then warn "you need to use USE_KDE+=kscreenlocker" elif [ ${pkg} = "x11/plasma5-libkscreen" ]; then warn "you need to use USE_KDE+=libkscreen" elif [ ${pkg} = "sysutils/plasma5-libksysguard" ]; then warn "you need to use USE_KDE+=libksysguard" elif [ ${pkg} = "deskutils/plasma5-milou" ]; then warn "you need to use USE_KDE+=milou" elif [ ${pkg} = "x11-themes/plasma5-oxygen" ]; then warn "you need to use USE_KDE+=oxygen" elif [ ${pkg} = "x11/plasma5-plasma-workspace" ]; then warn "you need to use USE_KDE+=plasma-workspace" elif [ ${pkg} = "sysutils/plasma5-powerdevil" ]; then warn "you need to use USE_KDE+=powerdevil" # KDE Frameworks elif [ ${pkg} = "x11-toolkits/kf5-attica" ]; then warn "you need to use USE_KDE+=attica" elif [ ${pkg} = "sysutils/kf5-baloo" ]; then warn "you need to use USE_KDE+=baloo" elif [ ${pkg} = "x11/kf5-frameworkintegration" ]; then warn "you need to use USE_KDE+=frameworkintegration" elif [ ${pkg} = "devel/kf5-kcmutils" ]; then warn "you need to use USE_KDE+=kcmutils" elif [ ${pkg} = "devel/kf5-kdeclarative" ]; then warn "you need to use USE_KDE+=kdeclarative" elif [ ${pkg} = "x11/kf5-kded" ]; then warn "you need to use USE_KDE+=kded" elif [ ${pkg} = "x11/kf5-kdelibs4support" ]; then warn "you need to use USE_KDE+=kdelibs4support" elif [ ${pkg} = "security/kf5-kdesu" ]; then warn "you need to use USE_KDE+=kdesu" elif [ ${pkg} = "www/kf5-kdewebkit" ]; then warn "you need to use USE_KDE+=kdewebkit" elif [ ${pkg} = "www/kf5-khtml" ]; then warn "you need to use USE_KDE+=khtml" elif [ ${pkg} = "devel/kf5-kio" ]; then warn "you need to use USE_KDE+=kio" elif [ ${pkg} = "lang/kf5-kross" ]; then warn "you need to use USE_KDE+=kross" elif [ ${pkg} = "x11/kf5-plasma-framework" ]; then warn "you need to use USE_KDE+=plasma-framework" elif [ ${pkg} = "graphics/kf5-prison" ]; then warn "you need to use USE_KDE+=prison" elif [ ${pkg} = "misc/kf5-purpose" ]; then warn "you need to use USE_KDE+=purpose" elif [ ${pkg} = "devel/kf5-solid" ]; then warn "you need to use USE_KDE+=solid" elif [ ${pkg} = "textproc/kf5-sonnet" ]; then warn "you need to use USE_KDE+=sonnet" elif [ ${pkg} = "net/kf5-syndication" ]; then warn "you need to use USE_KDE+=syndication" elif [ ${pkg} = "textproc/kf5-syntax-highlighting" ]; then warn "you need to use USE_KDE+=syntaxhighlighting" elif [ ${pkg} = "devel/kf5-threadweaver" ]; then warn "you need to use USE_KDE+=threadweaver" elif expr ${pkg} : '.*/kf5-.*' > /dev/null; then warn "you need USE_KDE+=$(echo ${pkg} | sed -E 's|.*/kf5-k||')" # GStreamer 0.10 elif [ ${pkg} = "multimedia/gstreamer" ]; then warn "you need to use USE_GSTREAMER+=yes" elif [ ${pkg} = "multimedia/gstreamer-plugins" ]; then warn "you need to use USE_GSTREAMER+=yes" elif [ ${pkg} = "multimedia/gstreamer-plugins-bad" ]; then warn "you need to use USE_GSTREAMER+=bad" # GStreamer 1 elif [ ${pkg} = "multimedia/gstreamer1" ]; then warn "you need to use USE_GSTREAMER1+=yes" elif [ ${pkg} = "multimedia/gstreamer1-plugins" ]; then warn "you need to use USE_GSTREAMER1+=yes" elif [ ${pkg} = "multimedia/gstreamer1-plugins-bad" ]; then warn "you need to use USE_GSTREAMER1+=bad" # boost related elif [ ${pkg} = "devel/boost-python-libs" ]; then warn "you need to add LIB_DEPENDS+=\${PY_BOOST} and maybe USES+=python" # sdl-related elif [ ${pkg} = 'devel/sdl12' ]; then warn "you need USE_SDL+=sdl" elif echo ${pkg} | grep -E '/sdl_(console|gfx|image|mixer|mm|net|pango|sound|ttf)$' > /dev/null; then warn "you need USE_SDL+=$(echo ${pkg} | sed -E 's|.*/sdl_||')" elif [ ${pkg} = 'devel/sdl20' ]; then warn "you need USE_SDL+=sdl2" elif echo ${pkg} | grep -E '/sdl2_(gfx|image|mixer|net|ttf)$' > /dev/null; then warn "you need USE_SDL+=$(echo ${pkg} | sed -E 's|.*/sdl2_||')2" # gl-related elif expr ${lib_file} : "${LOCALBASE}/lib/libGL.so.*$" > /dev/null; then warn "you need USE_GL+=gl" elif expr ${lib_file} : "${LOCALBASE}/lib/libgbm.so.*$" > /dev/null; then warn "you need USE_GL+=gbm" elif expr ${lib_file} : "${LOCALBASE}/lib/libGLESv2.so.*$" > /dev/null; then warn "you need USE_GL+=glesv2" elif expr ${lib_file} : "${LOCALBASE}/lib/libEGL.so.*$" > /dev/null; then warn "you need USE_GL+=egl" elif [ ${pkg} = 'graphics/glew' ]; then warn "you need USE_GL+=glew" elif [ ${pkg} = 'graphics/libGLU' ]; then warn "you need USE_GL+=glu" elif [ ${pkg} = 'graphics/libGLw' ]; then warn "you need USE_GL+=glw" elif [ ${pkg} = 'graphics/freeglut' ]; then warn "you need USE_GL+=glut" # Xorg-libraries: this should be by XORG_MODULES @ bsd.xorg.mk elif echo ${pkg} | grep -E '/lib(X11|Xau|Xdmcp|Xext|SM|ICE|Xfixes|Xft|Xdamage|Xcomposite|Xcursor|Xinerama|Xmu|Xmuu|Xpm|Xt|Xtst|Xi|Xrandr|Xrender|Xres|XScrnSaver|Xv|Xxf86vm|Xxf86dga|Xxf86misc|xcb)$' > /dev/null; then warn "you need USE_XORG+=$(echo ${pkg} | sed -E 's|.*/lib||' | tr '[:upper:]' '[:lower:]')" elif [ ${pkg} = 'x11/pixman' ]; then warn "you need USE_XORG+=pixman" # Qt5 elif expr ${pkg} : '.*/qt5-.*' > /dev/null; then warn "you need USES=qt:5 and USE_QT+=$(echo ${pkg} | sed -E 's|.*/qt5-||')" # MySQL elif expr ${lib_file} : "${LOCALBASE}/lib/mysql/[^/]*$" > /dev/null; then warn "you need USES+=mysql" # postgresql elif expr ${pkg} : "^databases/postgresql.*-client" > /dev/null; then warn "you need USES+=pgsql" # bdb elif expr ${pkg} : "^databases/db[456]" > /dev/null; then warn "you need USES+=bdb" # fam/gamin elif [ ${pkg} = "devel/fam" -o ${pkg} = "devel/gamin" ]; then warn "you need USES+=fam" # firebird elif [ ${pkg} = "databases/firebird25-client" ]; then warn "you need USES+=firebird" # fuse elif [ ${pkg} = "sysutils/fusefs-libs" ]; then warn "you need USES+=fuse" # gnustep elif [ ${pkg} = "lang/gnustep-base" ]; then warn "you need USES+=gnustep and USE_GNUSTEP+=base" elif [ ${pkg} = "x11-toolkits/gnustep-gui" ]; then warn "you need USES+=gnustep and USE_GNUSTEP+=gui" # iconv elif [ ${pkg} = "converters/libiconv" ]; then warn "you need USES+=iconv, USES+=iconv:wchar_t, or USES+=iconv:translit depending on needs" # jpeg elif [ ${pkg} = "graphics/jpeg" -o ${pkg} = "graphics/jpeg-turbo" ]; then warn "you need USES+=jpeg" # libarchive elif [ ${pkg} = "archivers/libarchive" ]; then warn "you need USES+=libarchive" elif [ ${pkg} = "devel/libedit" ]; then warn "you need USES+=libedit" # lua elif expr ${pkg} : "^lang/lua" > /dev/null; then warn "you need USES+=lua" # motif elif [ ${pkg} = "x11-toolkits/lesstif" -o ${pkg} = "x11-toolkits/open-motif" ]; then warn "you need USES+=motif" # ncurses elif [ ${pkg} = "devel/ncurses" ]; then warn "you need USES+=ncurses" # objc elif [ ${pkg} = "lang/libobjc2" ]; then warn "you need USES+=objc" # openal elif [ ${pkg} = "audio/openal" -o ${pkg} = "audio/openal-soft" -o ${pkg} = "audio/freealut" ]; then warn "you need USES+=openal" # readline elif [ ${pkg} = "devel/readline" ]; then warn "you need USES+=readline" # ssl elif [ ${pkg} = "security/openssl" -o ${pkg} = "security/openssl111" \ -o ${pkg} = "security/libressl" -o ${pkg} = "security/libressl-devel" \ ]; then warn "you need USES=ssl" # Tcl elif expr ${pkg} : "^lang/tcl" > /dev/null; then warn "you need USES+=tcl" # Tk elif expr ${pkg} : "^x11-toolkits/tk" > /dev/null; then warn "you need USES+=tk" # Xfce # grep LIB_DEPENDS= Mk/Uses/xfce.mk |sed -e 's|\(.*\)_LIB_DEPENDS.*:\(.*\)\/\(.*\)|elif [ ${pkg} = "\2/\3" ]; then warn "you need USE_XFCE+=\1"|' elif [ ${pkg} = "sysutils/garcon" ]; then warn "you need USE_XFCE+=garcon" elif [ ${pkg} = "x11/libexo" ]; then warn "you need USE_XFCE+=libexo" elif [ ${pkg} = "x11-toolkits/libxfce4gui" ]; then warn "you need USE_XFCE+=libgui" elif [ ${pkg} = "x11/libxfce4menu" ]; then warn "you need USE_XFCE+=libmenu" elif [ ${pkg} = "x11/libxfce4util" ]; then warn "you need USE_XFCE+=libutil" elif [ ${pkg} = "x11-wm/xfce4-panel" ]; then warn "you need USE_XFCE+=panel" elif [ ${pkg} = "x11-fm/thunar" ]; then warn "you need USE_XFCE+=thunar" elif [ ${pkg} = "x11/xfce4-conf" ]; then warn "you need USE_XFCE+=xfconf" # default elif expr ${lib_file} : "${LOCALBASE}/lib/[^/]*$" > /dev/null; then lib_file=${lib_file#${LOCALBASE}/lib/} lib_file=${lib_file%.so*}.so warn "you need LIB_DEPENDS+=${lib_file}:${pkg}" fi } proxydeps() { local file dep_file dep_file_pkg already rc rc=0 # Check all dynamicaly linked ELF files # Some .so are not executable, but we want to check them too. while read -r file; do # No results presents a blank line from heredoc. [ -z "${file}" ] && continue while read -r dep_file; do # No results presents a blank line from heredoc. [ -z "${dep_file}" ] && continue # Skip files we already checked. if listcontains ${dep_file} "${already}"; then continue fi if pkg which -q ${dep_file} > /dev/null 2>&1; then dep_file_pkg=$(pkg which -qo ${dep_file}) # Check that the .so we need has a SONAME if [ "${dep_file_pkg}" != "${PKGORIGIN}" ]; then if ! readelf -d "${dep_file}" | grep -q SONAME; then err "${file} is linked to ${dep_file} which does not have a SONAME. ${dep_file_pkg} needs to be fixed." fi fi # If we don't already depend on it, and we don't provide it if ! listcontains ${dep_file_pkg} "${LIB_RUN_DEPENDS} ${PKGORIGIN}"; then # If the package has a flavor, check that the dependency is not on that particular flavor. flavor=$(pkg annotate -q -S "$(pkg which -q "${dep_file}")" flavor) if [ -n "${flavor}" ]; then if listcontains ${dep_file_pkg}@${flavor} "${LIB_RUN_DEPENDS} ${PKGORIGIN}"; then continue fi fi err "${file} is linked to ${dep_file} from ${dep_file_pkg} but it is not declared as a dependency" proxydeps_suggest_uses ${dep_file_pkg} ${dep_file} rc=1 fi else err "${file} is linked to ${dep_file} that does not belong to any package" rc=1 fi already="${already} ${dep_file}" done <<-EOT $(env LD_LIBMAP_DISABLE=1 ldd -a "${STAGEDIR}${file}" | \ awk ' BEGIN {section=0} /^\// {section++} !/^\// && section<=1 && ($3 ~ "^'${PREFIX}'" || $3 ~ "^'${LOCALBASE}'") {print $3}') EOT done <<-EOT $(list_stagedir_elfs | \ file -F $'\1' -f - | \ grep -a 'ELF.*FreeBSD.*dynamically linked' | \ cut -f 1 -d $'\1'| \ sed -e 's/^\.//') EOT [ -z "${PROXYDEPS_FATAL}" ] && return 0 return ${rc} } sonames() { [ ! -d ${STAGEDIR}${PREFIX}/lib -o -n "${BUNDLE_LIBS}" ] && return 0 while read -r f; do # No results presents a blank line from heredoc. [ -z "${f}" ] && continue # Ignore symlinks [ -f "${f}" -a ! -L "${f}" ] || continue if ! readelf -d ${f} | grep -q SONAME; then warn "${f} doesn't have a SONAME." warn "pkg(8) will not register it as being provided by the port." warn "If another port depend on it, pkg will not be able to know where it comes from." case "${f}" in ${STAGEDIR}${PREFIX}/lib/*/*) warn "It is in a subdirectory, it may not be used in another port." ;; *) warn "It is directly in ${PREFIX}/lib, it is probably used by other ports." ;; esac fi # Use heredoc to avoid losing rc from find|while subshell done <<-EOT $(find ${STAGEDIR}${PREFIX}/lib -name '*.so.*') EOT } perlcore_port_module_mapping() { case "$1" in Net) echo "Net::Config" ;; libwww) echo "LWP" ;; *) echo "$1" | sed -e 's/-/::/g' ;; esac } perlcore() { local portname version module gotsome [ -x "${LOCALBASE}/bin/corelist" ] || return 0 for dep in ${UNIFIED_DEPENDS}; do portname=$(expr "${dep}" : ".*/p5-\(.*\)") if [ -n "${portname}" ]; then gotsome=1 module=$(perlcore_port_module_mapping "${portname}") version=$(expr "${dep}" : ".*>=*\([^:<]*\)") while read -r l; do case "${l}" in *was\ not\ in\ CORE*) # This never was with Perl # CORE, so nothing to do here ;; *and\ removed*) # This was in Perl CORE but has # been removed since. warn "${dep##*:} was in Perl CORE. Check with \`corelist ${module} ${version}\` and \`corelist -a ${module}\` if it should be conditionally added depending on PERL_LEVEL" ;; *deprecated*in*) # This is in Perl CORE but is # deprecated. warn "${dep##*:} is in Perl CORE but deprecated. Check with \`corelist ${module} ${version}\` and \`corelist -a ${module}\` if the dependency is really needed or if it should be conditionally added depending on PERL_LEVEL" ;; *was\ first\ released*) # This is in Perl CORE and is # maybe not needed. warn "${dep##*:} is present in Perl CORE. Check with \`corelist ${module} ${version}\` and \`corelist -a ${module}\` if the dependency is really needed or if it should be conditionally added depending on PERL_LEVEL" ;; *) err "This line is not handled: \"${l}\"" esac done <<-EOT $(${LOCALBASE}/bin/corelist "${module}"|tail -1) EOT fi done if [ -n "${gotsome}" ] && ! pkg info -e devel/p5-Module-CoreList; then notice "You have some Perl modules as dependencies but you do not have devel/p5-Module-CoreList installed, the perlcore QA check gets better results when using it, especially with older Perl versions." fi } no_arch() { [ -z "$NO_ARCH" ] && return rc=0 while read -r f; do [ -z "$f" ] && continue if [ -n "$NO_ARCH_IGNORE" ]; then skip= for blacklist in $NO_ARCH_IGNORE; do case $f in *$blacklist) skip=1; break;; esac done [ "$skip" ] && continue fi err "'${f#.}' is a architecture specific binary file and you have set NO_ARCH. Either remove NO_ARCH or add '$(basename $f)' to NO_ARCH_IGNORE." rc=1 done <<-EOF $(list_stagedir_elfs \ | file -F $'\1' -f - -N \ | grep -aE 'ELF .* [LM]SB .*, .*, version [0-9]+ \(FreeBSD\)' \ | cut -f 1 -d $'\1') EOF return $rc } gemdeps() { rc=0 if [ "${PKGBASE%%-*}" = "rubygem" ]; then # shellcheck disable=SC2153 # In the heredoc, ${PORTNAME} comes from the environment, not # to be confused with ${portname} while read -r l; do if [ -n "${l}" ]; then name=${l%% *} vers=${l#* } while read -r v; do if ! while read -r p; do ${LOCALBASE}/bin/ruby -e "puts 'OK' if Gem::Dependency.new('${name}','${v}').match?('${name}','${p}')" done | grep -qFx OK; then err RubyGem dependency ${name} ${v} is not satisfied. rc=1 fi <<-EOF $(${LOCALBASE}/bin/gem list -e "${name}" \ | sed "s|.*(\(.*\))|\1|" \ | tr -d ' ' \ | tr , '\n') EOF done <<-EOF $(while echo "${vers}" | grep -q '"'; do echo "${vers}" | cut -d '"' -f2 vers=$(echo "${vers}"|cut -d '"' -f3-) done) EOF fi done <<-EOF $(grep -a 'add_runtime_dependency' ${STAGEDIR}${PREFIX}/lib/ruby/gems/*/specifications/${PORTNAME}-*.gemspec \ | sed 's|.*<\(.*\)>.*\[\(.*\)\])|\1 \2|' \ | sort -u) EOF fi return $rc } # If an non rubygem-port has a 'Gemfile' file # it is checked with bundle to be sure # all dependencies are satisfied. # Without the check missing/wrong dependencies # are just found when executing the application gemfiledeps() { # skip check if port does not use ruby at all if [ -z "$USE_RUBY" ]; then return 0 fi # skip check if port is a rubygem-* one; they have no Gemfiles if [ "${PKGBASE%%-*}" = "rubygem" ]; then return 0 fi # advise install of bundler if its not present for check if ! type bundle > /dev/null 2>&1; then notice "Please install sysutils/rubygem-bundler for additional Gemfile-checks" return 0 fi # locate the Gemfile(s) while read -r f; do # no results presents a blank line from heredoc [ -z "$f" ] && continue # if there is no Gemfile everything is fine - stop here [ ! -f "$f" ] && return 0; # use bundle to check if Gemfile is satisfied # if bundle returns 1 the Gemfile is not satisfied # and so stage-qa isn't also if ! bundle check --dry-run --gemfile $f > /dev/null 2>&1; then warn "Dependencies defined in ${f} are not satisfied" fi done <<-EOF $(find ${STAGEDIR} -name Gemfile) EOF return 0 } flavors() { local rc pkgnames uniques rc=0 if [ -n "${FLAVOR}" ]; then pkgnames=$(make -C "${CURDIR}" flavors-package-names|sort) uniques=$(echo "${pkgnames}"|uniq) if [ "$pkgnames" != "${uniques}" ]; then err "Package names are not unique with flavors:" make -C "${CURDIR}" pretty-flavors-package-names >&2 err "maybe use _PKGNAMEPREFIX/SUFFIX". rc=1 fi fi return ${rc} } license() { local lic autoaccept pkgmirror #distsell distmirror pkgsell if [ -n "$DISABLE_LICENSES" ]; then warn "You have disabled the licenses framework with DISABLE_LICENSES, unable to run checks" elif [ -n "$LICENSE" ]; then for lic in $LICENSE_PERMS; do case "$lic" in auto-accept) autoaccept=1 ;; #dist-mirror) distmirror=1 ;; #dist-sell) distsell=1 ;; pkg-mirror) pkgmirror=1 ;; #pkg-sell) pkgsell=1 ;; esac done if [ -z "$autoaccept" ]; then warn "License is not auto-accepted, packages will not be built, ports depending on this one will be ignored." fi if [ -z "$pkgmirror" ]; then warn "License does not allow package to be distributed, ports depending on this one will be ignored" fi fi return 0 } # This is to prevent adding dependencies to meta ports that are only there to # improve the end user experience. depends_blacklist() { local dep rc instead rc=0 for dep in ${UNIFIED_DEPENDS}; do origin=$(expr "${dep}" : ".*:\([^@]*\)") instead="" case "$origin" in lang/python|lang/python2|lang/python3) # lang/python depends on lang/pythonX, but it's # ok, it is also in the blacklist. if [ ${PKGORIGIN} != lang/python ]; then instead="USES=python:xy with a specific version" fi ;; lang/gcc) instead="USE_GCC" ;; lang/julia) instead="a dependency on lang/julia\${JULIA_DEFAULT:S/.//}" ;; devel/llvm) instead="a dependency on devel/llvm\${LLVM_DEFAULT}" ;; www/py-django) instead="one of the www/py-djangoXYZ port" ;; esac if [ -n "${instead}" ]; then err "$origin should not be depended upon. Instead, use $instead." rc=1 fi done return $rc } pkgmessage() { for message in ${PKGMESSAGES}; do if [ -f "${message}" ]; then if ! head -1 "${message}" | grep -q '^\['; then warn "${message} not in UCL format, will be shown on initial install only." warn "See https://www.freebsd.org/doc/en/books/porters-handbook/pkg-files.html#porting-message" fi fi done return 0 } reinplace() { if [ -f ${REWARNFILE} ]; then warn "Possible REINPLACE_CMD issues:" cat ${REWARNFILE} fi } checks="shebang symlinks paths stripped desktopfileutils sharedmimeinfo" checks="$checks suidfiles libtool libperl prefixvar baselibs terminfo" checks="$checks proxydeps sonames perlcore no_arch gemdeps gemfiledeps flavors" checks="$checks license depends_blacklist pkgmessage reinplace" ret=0 cd ${STAGEDIR} || exit 1 for check in ${checks}; do eval check_test="\$IGNORE_QA_$check" if [ -z "${check_test}" ]; then ${check} || ret=1 else warn "Ignoring $check QA test" fi done exit ${ret} Index: head/Mk/Scripts/rust-compat11-canary.sh =================================================================== --- head/Mk/Scripts/rust-compat11-canary.sh (revision 554138) +++ head/Mk/Scripts/rust-compat11-canary.sh (revision 554139) @@ -1,27 +1,28 @@ #!/bin/sh # MAINTAINER: rust@FreeBSD.org # $FreeBSD$ set -eu +set pipefail if [ "${OPSYS}" != FreeBSD ] || [ "${OSVERSION}" -lt 1200000 ]; then exit 0 fi cat < #include #include int main(void) { return syscall(SYS_freebsd11_mknod, "", 0, 0) < 0 && errno == ENOSYS; } EOF # Canary might be aborted with SIGSYS ulimit -c 0 if ! "${WRKDIR}/compat11_canary"; then echo "=> Sanity check failed: kernel is missing COMPAT_FREEBSD11" echo "=> Aborting build" exit 1 fi Index: head/Mk/Scripts/smart_makepatch.sh =================================================================== --- head/Mk/Scripts/smart_makepatch.sh (revision 554138) +++ head/Mk/Scripts/smart_makepatch.sh (revision 554139) @@ -1,296 +1,298 @@ #!/bin/sh # MAINTAINER: portmgr@FreeBSD.org # $FreeBSD$ # This script regenerates patches. It conserves existing comments and # file names, even if the file name does not meet any current or # previous convention. It will keep multiple patches in the same file # rather than splitting them into individual files. # # If a generated patch was not present before, it will create a file # name where forward slashes are replaced with an underscore and # underscores are appended by another underscore. # # Limitations: # 1) If a file is modified by multiple patches, it will be regenerated # as a single patch. That means if two multi-patch files modified # the same source file, when regenerated, the source file's patch # will only appear in one of patch file. # 2) It's possible that trailing garbage at the end of a patch in a # multipatch file might corrupt the comment (or be interpreted as # a comment) of the following patch. (garbage in, garbage out) # # Reminder # Don't forget to disable post-patch targets before regenerating patches # if those targets modify source files (e.g. with sed). You may also # want to disable EXTRA_PATCHES as well if that is being used. +set pipefail + [ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_SMART_MAKEPATCH}" ] && set -x if [ -z "${PATCHDIR}" -o -z "${PATCH_WRKSRC}" -o -z "${WRKDIR}" ]; then echo "WRKDIR, PATCHDIR, and PATCH_WRKSRC required in environment." >&2 exit 1 fi WORKAREA=${WRKDIR}/.makepatch-tmp PATCHMAP=${WORKAREA}/pregen.map COMMENTS=${WORKAREA}/comments REGENNED=${WORKAREA}/regenerated DESTDIR=${WORKAREA}/staged SAVEDIR=${WORKAREA}/archived-patches case "${STRIP_COMPONENTS}" in [123456789]) ;; 1[0123456789]) ;; *) STRIP_COMPONENTS=0 esac strip_path() { local raw_name=$1 if [ "${STRIP_COMPONENTS}" = "0" ]; then echo ${raw_name} else echo ${raw_name} | awk -v sc=${STRIP_COMPONENTS} -F "/" \ '{ for (x = sc + 1; x <= NF; x++) { slash = (x>sc+1) ? "/" : ""; printf ("%s%s", slash, $x); }}' fi } std_patch_filename() { local sans_cwd local raw_name sans_cwd=$(echo $1 | sed 's|^\.\/||') raw_name=$(strip_path ${sans_cwd}) echo "patch-$(echo ${raw_name} | sed -e 's|_|&&|g; s|/|_|g')" } patchdir_files_list() { if [ -d "${PATCHDIR}" ]; then (cd ${PATCHDIR} && \ find -s . -type f -name "patch-*" -maxdepth 1 \ 2>/dev/null | sed -e 's,^\./,,; /\.orig$/d' ) fi; } valid_name() { local current_patch_name=$1 local result=$3 local first_target local testres local lps first_target=$(echo $2 | sed 's|^\.\/||') for lps in __ - + ; do testres=patch-$(echo ${first_target} | sed -e "s|/|${lps}|g") if [ "${testres}" = "${current_patch_name}" ]; then result=${testres} break fi done echo ${result} } map_existing_patches() { mkdir -p ${WORKAREA} : > ${PATCHMAP} local target local future_name local std_target local P local t for P in ${old_patch_list}; do target=$(cd ${PATCHDIR} && \ grep "^+++ " ${P} | awk '{print $2}' ) # For single patches, we honor previous separators, but use # a standard patch name if the current patch name does not # conform. However, if two or more patches are contained in # single file, then we do *NOT* rename the file future_name= for t in ${target}; do if [ -n "${future_name}" ]; then future_name=${P} break; fi std_target=$(std_patch_filename ${t}) future_name=$(valid_name ${P} ${t} ${std_target}) done for t in ${target}; do std_target=$(std_patch_filename ${t}) echo "${future_name} ${std_target}" >> ${PATCHMAP} done done } extract_comment_from_patch() { local existing_patch=${PATCHDIR}/$1 local contains local rawname local fname local num contains=$(grep "^+++ " ${existing_patch} | awk '{x++; print x}') for num in ${contains}; do rawname=$(grep "^+++ " ${existing_patch} | \ awk -v num=${num} '{x++; if (x==num) print $2}') fname=$(std_patch_filename $rawname) awk -v num=${num} ' BEGIN { done=0; x=0; hunk=0; looking=(num==1) } { if (!done) { if ($1 == "@@") { split ($2,a,","); split ($3,b,","); hca = a[2]; hcb = a[3]; hunk = 1; } else if (hunk) { first=substr($1,1,1); if (first == "-") { hca-- } else if (first == "+") { hcb-- } else {hca--; hcb--} if (hca == 0 && hcb == 0) {hunk = 0} } if ($1 == "---") { x++; if (x == num) { done = 1 } if (x + 1 == num) { looking = 1 } } else if (!hunk && looking) { if ($1!="diff" && $1!="index" && $1!="+++") { print $0 } } } }' ${existing_patch} > ${COMMENTS}/${fname} done } extract_comments() { mkdir -p ${COMMENTS} rm -f ${COMMENTS}/* local P for P in ${old_patch_list}; do extract_comment_from_patch ${P} done } regenerate_patches() { mkdir -p ${REGENNED} rm -f ${REGENNED}/* [ ! -d "${PATCH_WRKSRC}" ] && return local F local NEW local OUT local ORIG local new_list new_list=$(cd "${PATCH_WRKSRC}" && \ find -s . -type f -name '*.orig' 2>/dev/null) (cd "${PATCH_WRKSRC}" && for F in ${new_list}; do ORIG=${F#./} NEW=${ORIG%.orig} cmp -s ${ORIG} ${NEW} && continue OUT=${REGENNED}/$(std_patch_filename ${NEW}) TZ=UTC diff -udp ${ORIG} ${NEW} | sed \ -e '/^---/s|\.[0-9]* +0000$| UTC|' \ -e '/^+++/s|\([[:blank:]][-0-9:.+]*\)*$||' \ > ${OUT} || true done) } get_patch_name() { awk -v name=$1 ' { if ($2 == name) { if (!done) { print $1 }; done = 1; } } END { if (!done) print name }' ${PATCHMAP} } stage_patches() { mkdir -p ${DESTDIR} rm -f ${DESTDIR}/* local P local name local patch_list patch_list=$(cd ${REGENNED} && find -s . -name "patch-*" 2>/dev/null) for P in ${patch_list}; do P=${P#./} name=$(get_patch_name ${P}) [ -e ${COMMENTS}/${P} ] && cat ${COMMENTS}/${P} \ >> ${DESTDIR}/${name} if [ "${P}" = "${name}" ]; then echo "Generated ${P}" else echo "Generated ${P} >> ${name} (legacy)" fi cat ${REGENNED}/${P} >> ${DESTDIR}/${name} done } compare_common_patches() { [ -z "${old_patch_list}" ] && return local archive_patch_list local P local ppatch local ppatch_stripped local cpatch local cpatch_stripped for P in ${old_patch_list}; do if [ -e ${DESTDIR}/${P} ]; then ppatch=${PATCHDIR}/${P} cpatch=${DESTDIR}/${P} ppatch_stripped=$(mktemp -t portpatch) cpatch_stripped=$(mktemp -t portpatch) sed -E -e '/^--- .+ UTC$/d; s/^(@@ [^@]* @@).*/\1/' \ ${ppatch} > ${ppatch_stripped} sed -E -e '/^--- .+ UTC$/d; s/^(@@ [^@]* @@).*/\1/' \ ${cpatch} > ${cpatch_stripped} # Don't replace patches with only metadata changes if ! cmp -s ${ppatch_stripped} ${cpatch_stripped}; then archive_patch_list="${archive_patch_list} ${P}" else echo "${P} only contains metadata changes; not replacing" rm ${cpatch} fi rm ${ppatch_stripped} rm ${cpatch_stripped} fi done old_patch_list=${archive_patch_list} } conserve_old_patches() { mkdir -p ${SAVEDIR} rm -f ${SAVEDIR}/* [ -z "${old_patch_list}" ] && return local P for P in ${old_patch_list}; do mv ${PATCHDIR}/${P} ${SAVEDIR}/${P} done echo "The previous patches have been placed here:" echo ${SAVEDIR} } install_regenerated_patches() { local testdir testdir=$(find ${DESTDIR} -empty) if [ -z "${testdir}" ]; then mkdir -p ${PATCHDIR} find ${DESTDIR} -type f -exec mv {} ${PATCHDIR}/ \; fi } old_patch_list=$(patchdir_files_list) map_existing_patches extract_comments regenerate_patches stage_patches compare_common_patches conserve_old_patches install_regenerated_patches