diff options
author | jlam <jlam> | 2006-06-03 23:11:42 +0000 |
---|---|---|
committer | jlam <jlam> | 2006-06-03 23:11:42 +0000 |
commit | 2ba15211f78451b7cb0c6bfd8abc9d40d8408181 (patch) | |
tree | bfe84ef2dbbdd59b31ae6e0df262c47f9ad1b342 | |
parent | 2c86d821ce8661815fee8b6eef7cc3cf9fb9a3a1 (diff) | |
download | pkgsrc-2ba15211f78451b7cb0c6bfd8abc9d40d8408181.tar.gz |
First pass at implementing support for package system flavors other
than pkgsrc's current one. This is an important lead-up to any project
that redesigns the pkg_* tools in that it doesn't tie us to past design
(mis)choices. This commit mostly deals with rearranging code, although
there was a considerable amount of rewriting done in cases where I
thought the code was somewhat messy and was difficult to understand.
The design I chose for supporting multiple package system flavors is
that the various depends, install, package, etc. modules would define
default targets and variables that may be overridden in files from
pkgsrc/mk/flavor/${PKG_FLAVOR}. The default targets would do the
sensible thing of doing nothing, and pkgsrc infrastructure would rely
on the appropriate things to be defined in pkgsrc/mk/flavor to do the
real work. The pkgsrc/mk/flavor directory contains subdirectories
corresponding to each package system flavor that we support. Currently,
I only have "pkg" which represents the current pkgsrc-native package
flavor. I've separated out most of the code where we make assumptions
about the package system flavor, mostly either because we directly
use the pkg_* tools, or we make assumptions about the package meta-data
directory, or we directly manipulate the package meta-data files, and
placed it into pkgsrc/mk/flavor/pkg.
There are several new modules that have been refactored out of bsd.pkg.mk
as part of these changes: check, depends, install, package, and update.
Each of these modules has been slimmed down by rewriting them to avoid
some recursive make calls. I've also religiously documented which
targets are "public" and which are "private" so that users won't rely
on reaching into pkgsrc innards to call a private target.
The "depends" module is a complete overhaul of the way that we handle
dependencies. There is now a separate "depends" phase that occurs
before the "extract" phase where dependencies are installed. This
differs from the old way where dependencies were installed just before
extraction occurred. The reduce-depends.mk file is now replaced by
a script that is invoked only once during the depends phase and is
used to generate a cookie file that holds the full set of reduced
dependencies. It is now possible to type "make depends" in a package
directory and all missing dependencies will be installed.
Future work on this project include:
* Resolve the workflow design in anticipation of future work on
staged installations where "package" conceptually happens before
"install".
* Rewrite the buildlink3 framework to not assume the use of the
pkgsrc pkg_* tools.
* Rewrite the pkginstall framework to provide a standard pkg_*
tool to perform the actions, and allowing a purely declarative
file per package to describe what actions need to be taken at
install or deinstall time.
* Implement support for the SVR4 package flavor. This will be
proof that the appropriate abstractions are in place to allow
using a completely different set of package management tools.
42 files changed, 2613 insertions, 1758 deletions
diff --git a/doc/CHANGES-2006 b/doc/CHANGES-2006 index dda2ba05017..0f886a8c8c2 100644 --- a/doc/CHANGES-2006 +++ b/doc/CHANGES-2006 @@ -1,4 +1,4 @@ -$NetBSD: CHANGES-2006,v 1.406 2006/06/03 22:26:04 adrianp Exp $ +$NetBSD: CHANGES-2006,v 1.407 2006/06/03 23:11:42 jlam Exp $ Changes to the packages collection and infrastructure in 2006: @@ -2890,3 +2890,6 @@ Changes to the packages collection and infrastructure in 2006: Updated databases/mysql5-client to 5.0.22 [tron 2006-06-03] Updated databases/mysql5-server to 5.0.22 [tron 2006-06-03] Updated www/drupal to 4.7.2 [adrianp 2006-06-03] + mk/bsd.pkg.mk: refactored depends, install, and package phases to + support additional package system flavors via PKG_FLAVOR + [jlam 2006-06-03] diff --git a/mk/bsd.options.mk b/mk/bsd.options.mk index 2aa59cb1a5b..22092b09db6 100644 --- a/mk/bsd.options.mk +++ b/mk/bsd.options.mk @@ -1,4 +1,4 @@ -# $NetBSD: bsd.options.mk,v 1.54 2006/06/03 08:44:46 seb Exp $ +# $NetBSD: bsd.options.mk,v 1.55 2006/06/03 23:11:42 jlam Exp $ # # This Makefile fragment provides boilerplate code for standard naming # conventions for handling per-package build options. @@ -393,7 +393,7 @@ show-options: .if defined(PKG_SUPPORTED_OPTIONS) .PHONY: supported-options-message -pre-install-depends: supported-options-message +pre-depends-hook: supported-options-message supported-options-message: . if !empty(PKG_SUPPORTED_OPTIONS) @${ECHO} "==========================================================================" diff --git a/mk/bsd.pkg.extract.mk b/mk/bsd.pkg.extract.mk index 4ae799c43e1..fc301d52258 100644 --- a/mk/bsd.pkg.extract.mk +++ b/mk/bsd.pkg.extract.mk @@ -1,4 +1,4 @@ -# $NetBSD: bsd.pkg.extract.mk,v 1.22 2006/05/30 23:51:38 wiz Exp $ +# $NetBSD: bsd.pkg.extract.mk,v 1.23 2006/06/03 23:11:42 jlam Exp $ # # This Makefile fragment is included to bsd.pkg.mk and defines the # relevant variables and targets for the "extract" phase. @@ -165,7 +165,7 @@ _EXTRACT_COOKIE= ${WRKDIR}/.extract_done _EXTRACT_TARGETS+= checksum _EXTRACT_TARGETS+= ${WRKDIR} -_EXTRACT_TARGETS+= ${PKG_DB_TMPDIR} +_EXTRACT_TARGETS+= depends _EXTRACT_TARGETS+= acquire-extract-lock _EXTRACT_TARGETS+= ${_EXTRACT_COOKIE} _EXTRACT_TARGETS+= release-extract-lock @@ -193,7 +193,6 @@ ${_EXTRACT_COOKIE}: _REAL_EXTRACT_TARGETS+= extract-message _REAL_EXTRACT_TARGETS+= extract-vars -_REAL_EXTRACT_TARGETS+= install-depends _REAL_EXTRACT_TARGETS+= pre-extract _REAL_EXTRACT_TARGETS+= do-extract _REAL_EXTRACT_TARGETS+= post-extract diff --git a/mk/bsd.pkg.mk b/mk/bsd.pkg.mk index 9f40fc64f3b..a5115cc8565 100644 --- a/mk/bsd.pkg.mk +++ b/mk/bsd.pkg.mk @@ -1,4 +1,4 @@ -# $NetBSD: bsd.pkg.mk,v 1.1826 2006/05/23 07:39:22 rillig Exp $ +# $NetBSD: bsd.pkg.mk,v 1.1827 2006/06/03 23:11:42 jlam Exp $ # # This file is in the public domain. # @@ -23,8 +23,8 @@ # This has to come first to avoid showing all BUILD_DEFS added by this # Makefile, which are usually not customizable. -.PHONY: pre-install-depends build-defs-message -pre-install-depends: build-defs-message +.PHONY: build-defs-message +pre-depends-hook: build-defs-message .if empty(PKGSRC_SHOW_BUILD_DEFS:M[yY][eE][sS]) build-defs-message: .elif !target(build-defs-message) @@ -58,7 +58,6 @@ build-defs-message: ${WRKDIR} # Transform package Makefile variables and set defaults ############################################################################ -DEINSTALLDEPENDS?= NO # add -R to pkg_delete MKCRYPTO?= YES # build crypto packages by default NOCLEAN?= NO # don't clean up after update REINSTALL?= NO # reinstall upon update @@ -103,31 +102,16 @@ DESCR_SRC?= ${PKGDIR}/DESCR DIGEST_ALGORITHMS?= SHA1 RMD160 DISTFILES?= ${DISTNAME}${EXTRACT_SUFX} DISTINFO_FILE?= ${PKGDIR}/distinfo -INSTALL_DIRS?= ${BUILD_DIRS} -INSTALL_MAKE_FLAGS?= ${MAKE_FLAGS} -INSTALL_TARGET?= install INTERACTIVE_STAGE?= none MAINTAINER?= pkgsrc-users@NetBSD.org MAKE_FLAGS?= # empty MAKEFILE?= Makefile PATCH_DIGEST_ALGORITHM?=SHA1 -PKG_SUFX?= .tgz -PKGFILE?= ${PKGREPOSITORY}/${PKGNAME}${PKG_SUFX} -PKGREPOSITORY?= ${PACKAGES}/${PKGREPOSITORYSUBDIR} -PKGREPOSITORYSUBDIR?= All PKGWILDCARD?= ${PKGBASE}-[0-9]* SVR4_PKGNAME?= ${PKGNAME} USE_DIGEST?= YES WRKSRC?= ${WRKDIR}/${DISTNAME} -# If a package sets INSTALLATION_DIRS, then it's known to pre-create all -# of the directories that it needs at install-time, so we don't need -# mtree to do it for us. -# -.if defined(INSTALLATION_DIRS) && !empty(INSTALLATION_DIRS) -NO_MTREE= yes -.endif - .if (defined(INSTALL_UNSTRIPPED) && !empty(INSTALL_UNSTRIPPED:M[yY][eE][sS])) || defined(DEBUG_FLAGS) _INSTALL_UNSTRIPPED= # set (flag used by platform/*.mk) .endif @@ -138,22 +122,6 @@ _INSTALL_UNSTRIPPED= # set (flag used by platform/*.mk) DIGEST_REQD= 20010302 PKGTOOLS_REQD= ${_OPSYS_PKGTOOLS_REQD:U20051103} -PKG_DB_TMPDIR= ${WRKDIR}/.pkgdb -DDIR= ${WRKDIR}/.DDIR -DESCR= ${PKG_DB_TMPDIR}/+DESC -DLIST= ${WRKDIR}/.DLIST - -# Files to create for versioning and build information -BUILD_VERSION_FILE= ${PKG_DB_TMPDIR}/+BUILD_VERSION -BUILD_INFO_FILE= ${PKG_DB_TMPDIR}/+BUILD_INFO - -# Files containing size of pkg w/o and w/ all required pkgs -SIZE_PKG_FILE= ${PKG_DB_TMPDIR}/+SIZE_PKG -SIZE_ALL_FILE= ${PKG_DB_TMPDIR}/+SIZE_ALL - -# File to denote "no deletion of a package" -PRESERVE_FILE= ${PKG_DB_TMPDIR}/+PRESERVE - ##### Transform USE_* into dependencies .include "../../mk/bsd.pkg.use.mk" @@ -331,8 +299,6 @@ _WRAPPER_COOKIE= ${WRKDIR}/.wrapper_done _CONFIGURE_COOKIE= ${WRKDIR}/.configure_done _BUILD_COOKIE= ${WRKDIR}/.build_done _TEST_COOKIE= ${WRKDIR}/.test_done -_INSTALL_COOKIE= ${WRKDIR}/.install_done -_PACKAGE_COOKIE= ${WRKDIR}/.package_done _INTERACTIVE_COOKIE= .interactive_stage _NULL_COOKIE= ${WRKDIR}/.null @@ -343,10 +309,6 @@ LIBABISUFFIX?= TOUCH_FLAGS?= -f -# Figure out where the local mtree file is -MTREE_FILE?= ${PKGSRCDIR}/mk/platform/${OPSYS}.pkg.dist -MTREE_ARGS?= -U -f ${MTREE_FILE} -d -e -p - # Debugging levels for this file, dependent on PKG_DEBUG_LEVEL definition # 0 == normal, default, quiet operation # 1 == all shell commands echoed before invocation @@ -421,10 +383,6 @@ _PKGSRC_BUILD_TARGETS= build test _PKGSRC_BUILD_TARGETS= build .endif -.if !defined(_BUILD_DATE) -_BUILD_DATE!= ${DATE} "+%Y-%m-%d %H:%M:%S %z" -.endif - # The user can override the NO_PACKAGE by specifying this from # the make command line .if defined(FORCE_PACKAGE) @@ -438,46 +396,6 @@ _BUILD_DATE!= ${DATE} "+%Y-%m-%d %H:%M:%S %z" # INSTALL/DEINSTALL script framework .include "../../mk/pkginstall/bsd.pkginstall.mk" -# If MESSAGE hasn't been defined, then set MESSAGE_SRC to be a space-separated -# list of files to be concatenated together to generate the MESSAGE file. -# -.if !defined(MESSAGE_SRC) && !defined(MESSAGE) -. if exists(${PKGDIR}/MESSAGE) -MESSAGE_SRC= ${PKGDIR}/MESSAGE -. else -. if exists(${PKGDIR}/MESSAGE.common) -MESSAGE_SRC= ${PKGDIR}/MESSAGE.common -. endif -. if exists(${PKGDIR}/MESSAGE.${OPSYS}) -MESSAGE_SRC+= ${PKGDIR}/MESSAGE.${OPSYS} -. endif -. if exists(${PKGDIR}/MESSAGE.${MACHINE_ARCH:C/i[3-6]86/i386/g}) -MESSAGE_SRC+= ${PKGDIR}/MESSAGE.${MACHINE_ARCH:C/i[3-6]86/i386/g} -. endif -. if exists(${PKGDIR}/MESSAGE.${OPSYS}-${MACHINE_ARCH:C/i[3-6]86/i386/g}) -MESSAGE_SRC+= ${PKGDIR}/MESSAGE.${OPSYS}-${MACHINE_ARCH:C/i[3-6]86/i386/g} -. endif -. endif -.endif - -.if defined(MESSAGE_SRC) -MESSAGE= ${PKG_DB_TMPDIR}/+DISPLAY - -# Set MESSAGE_SUBST to substitute "${variable}" to "value" in MESSAGE -MESSAGE_SUBST+= PKGNAME=${PKGNAME} \ - PKGBASE=${PKGBASE} \ - PREFIX=${PREFIX} \ - LOCALBASE=${LOCALBASE} \ - VIEWBASE=${VIEWBASE} \ - X11PREFIX=${X11PREFIX} \ - X11BASE=${X11BASE} \ - PKG_SYSCONFDIR=${PKG_SYSCONFDIR} \ - ROOT_GROUP=${ROOT_GROUP} \ - ROOT_USER=${ROOT_USER} - -MESSAGE_SUBST_SED= ${MESSAGE_SUBST:S/=/}!/:S/$/!g/:S/^/ -e s!\\\${/} -.endif - .PHONY: uptodate-digest uptodate-digest: .if !empty(USE_DIGEST:M[yY][eE][sS]) @@ -499,33 +417,6 @@ uptodate-digest: @${DO_NADA} .endif -.if !defined(PKG_ARGS_COMMON) -PKG_ARGS_COMMON= -v -c -${COMMENT:Q}" " -d ${DESCR} -f ${PLIST} -PKG_ARGS_COMMON+= -l -b ${BUILD_VERSION_FILE} -B ${BUILD_INFO_FILE} -PKG_ARGS_COMMON+= -s ${SIZE_PKG_FILE} -S ${SIZE_ALL_FILE} -PKG_ARGS_COMMON+= -P "`${MAKE} ${MAKEFLAGS} run-depends-list | ${SORT} -u`" -. if defined(CONFLICTS) && (${PKG_INSTALLATION_TYPE} == "overwrite") -PKG_ARGS_COMMON+= -C "${CONFLICTS}" -. endif -. if defined(INSTALL_FILE) && exists(${INSTALL_FILE}) -PKG_ARGS_COMMON+= -i ${INSTALL_FILE} -. endif -. if defined(DEINSTALL_FILE) && exists(${DEINSTALL_FILE}) -PKG_ARGS_COMMON+= -k ${DEINSTALL_FILE} -. endif -PKG_ARGS_COMMON+= ${MESSAGE:D-D ${MESSAGE}} -PKG_ARGS_COMMON+= ${NO_MTREE:D:U-m ${MTREE_FILE}} -PKG_ARGS_COMMON+= ${PKG_PRESERVE:D-n ${PRESERVE_FILE}} - -PKG_ARGS_INSTALL= -p ${PREFIX} ${PKG_ARGS_COMMON} -PKG_ARGS_BINPKG= -p ${PREFIX:S/^${DESTDIR}//} -L ${PREFIX} ${PKG_ARGS_COMMON} -.endif # !PKG_ARGS_COMMON - -.if ${PKG_INSTALLATION_TYPE} == "pkgviews" -PKG_ARGS_INSTALL+= -U # don't update the pkgdb.byfile.db -PKG_ARGS_BINPKG+= -E # create an empty views file in the binpkg -.endif - # Define SMART_MESSAGES in /etc/mk.conf for messages giving the tree # of dependencies for building, and the current target. _PKGSRC_IN?= ===${SMART_MESSAGES:D> ${.TARGET} [${PKGNAME}${_PKGSRC_DEPS}] ===} @@ -676,19 +567,6 @@ USE_TOOLS+= expr USE_TOOLS+= tee tsort .endif -.if !defined(NO_MTREE) -USE_TOOLS+= mtree -.endif - -.if defined(PKG_PRESERVE) -USE_TOOLS+= date -.endif - -# We need a mail command to send mail to ${PKGSRC_MESSAGE_RECIPIENTS}. -.if !empty(PKGSRC_MESSAGE_RECIPIENTS) -USE_TOOLS+= mail -.endif - # We need shlock and sleep if we're using locking to synchronize multiple # builds over the same pkgsrc tree. # @@ -696,58 +574,12 @@ USE_TOOLS+= mail USE_TOOLS+= shlock sleep .endif -# If MANZ is defined, then we want the final man pages to be compressed. -# If MANZ is not defined, then we want the final man pages to be -# uncompressed. -# -# We need to figure out if during installation, we need either gunzip or -# gzip to decompress or compress the installed man pages. If a package -# sets MANCOMPRESSED to "yes" or "no", then it's an indication to the -# install code that the package itself installed the man pages either -# compressed or uncompressed. If a package sets MANCOMPRESSED_IF_MANZ, -# then the package uses BSD-style makefiles, so we need to determine if -# the BSD-style makefile causes the man pages to be compressed or not. -# -.if !defined(_MANCOMPRESSED) -. if defined(MANCOMPRESSED) && !empty(MANCOMPRESSED:M[yY][eE][sS]) -_MANCOMPRESSED= yes -. else -_MANCOMPRESSED= no -. endif -. if defined(MANCOMPRESSED_IF_MANZ) && defined(PKGMAKECONF) -_MANCOMPRESSED!= \ - { ${ECHO} ".include \""${PKGMAKECONF:Q}"\""; \ - ${ECHO} "all:"; \ - ${ECHO} ".if defined(MANZ)"; \ - ${ECHO} " @${ECHO} yes"; \ - ${ECHO} ".else"; \ - ${ECHO} " @${ECHO} no"; \ - ${ECHO} ".endif"; \ - } | ${MAKE} -f - all -. endif -.endif -_MANZ= ${MANZ:Dyes:Uno} -MAKEVARS+= _MANCOMPRESSED _MANZ - -.if !empty(_MANCOMPRESSED:M[yY][eE][sS]) && empty(_MANZ:M[yY][eE][sS]) -USE_TOOLS+= gunzip -.endif -.if empty(_MANCOMPRESSED:M[yY][eE][sS]) && !empty(_MANZ:M[yY][eE][sS]) -USE_TOOLS+= gzip -.endif - # Extract .include "../../mk/bsd.pkg.extract.mk" # Patch .include "../../mk/bsd.pkg.patch.mk" -# Check -.include "../../mk/bsd.pkg.check.mk" - -# Clean -.include "../../mk/bsd.pkg.clean.mk" - # Tools .include "../../mk/tools/bsd.tools.mk" @@ -775,10 +607,6 @@ BUILD_DEFS+= USE_ABI_DEPENDS . endif .endif -# Remove some redundant dependencies from the DEPENDS list. -.include "../../mk/reduce-depends.mk" -DEPENDS:= ${REDUCED_DEPENDS} - # Find out the PREFIX of dependencies where the PREFIX is needed at build time. .if defined(EVAL_PREFIX) FIND_PREFIX:= ${EVAL_PREFIX} @@ -892,7 +720,7 @@ PKG_SKIP_REASON+= "${PKGNAME} is not available for ${MACHINE_PLATFORM}" . if defined(PKG_FAIL_REASON) || defined(PKG_SKIP_REASON) .PHONY: do-check-pkg-fail-or-skip-reason fetch checksum extract patch configure all build install package \ -update install-depends do-check-pkg-fail-or-skip-reason: +update depends do-check-pkg-fail-or-skip-reason: . if defined(SKIP_SILENT) @${DO_NADA} . else @@ -1002,24 +830,6 @@ _build: configure ${_PKG_SILENT}${_PKG_DEBUG}${TOUCH} ${TOUCH_FLAGS} ${_BUILD_COOKIE} .endif -# Disable install -.PHONY: install -.if defined(NO_INSTALL) && !target(install) -install: build - ${_PKG_SILENT}${_PKG_DEBUG}${TOUCH} ${TOUCH_FLAGS} ${_INSTALL_COOKIE} -.endif - -# Disable package -.PHONY: package -.if defined(NO_PACKAGE) && !target(package) -package: -. if defined(SKIP_SILENT) - @${DO_NADA} -. else - @${ECHO_MSG} "${_PKGSRC_IN}> ${PKGNAME} may not be packaged: "${NO_PACKAGE:Q}"." -. endif -.endif - ################################################################ # More standard targets start here. # @@ -1245,24 +1055,6 @@ batch-check-distfiles: ${FALSE} ;; \ esac -# check for any vulnerabilities in the package -# Please do not modify the leading "@" here -.PHONY: check-vulnerable -check-vulnerable: - @if [ ! -z "${PKG_SYSCONFDIR.audit-packages}" -a -f ${PKG_SYSCONFDIR.audit-packages}/audit-packages.conf ]; then \ - . ${PKG_SYSCONFDIR.audit-packages}/audit-packages.conf; \ - elif [ ! -z "${PKG_SYSCONFDIR}" -a -f ${PKG_SYSCONFDIR}/audit-packages.conf ]; then \ - . ${PKG_SYSCONFDIR}/audit-packages.conf; \ - fi; \ - if [ -f ${PKGVULNDIR}/pkg-vulnerabilities ]; then \ - ${SETENV} PKGNAME=${PKGNAME:Q} \ - PKGBASE=${PKGBASE:Q} \ - ${AWK} '/^$$/ { next } \ - /^#.*/ { next } \ - $$1 !~ ENVIRON["PKGBASE"] && $$1 !~ /\{/ { next } \ - { s = sprintf("${PKG_ADMIN} pmatch \"%s\" %s && ${ECHO} \"*** WARNING - %s vulnerability in %s - see %s for more information ***\"", $$1, ENVIRON["PKGNAME"], $$2, ENVIRON["PKGNAME"], $$3); system(s); }' < ${PKGVULNDIR}/pkg-vulnerabilities || ${FALSE}; \ - fi - .PHONY: do-fetch .if !target(do-fetch) do-fetch: @@ -1340,73 +1132,17 @@ show-distfiles: . endif .endif -.PHONY: show-downlevel -.if !target(show-downlevel) -show-downlevel: -. if defined(PKG_FAIL_REASON) - ${_PKG_SILENT}${_PKG_DEBUG}${DO_NADA} -. else - ${_PKG_SILENT}${_PKG_DEBUG} \ - found="`${PKG_BEST_EXISTS} \"${PKGWILDCARD}\" || ${TRUE}`"; \ - if [ "X$$found" != "X" -a "X$$found" != "X${PKGNAME}" ]; then \ - ${ECHO} "${PKGBASE} package: $$found installed, pkgsrc version ${PKGNAME}"; \ - if [ "X$$STOP_DOWNLEVEL_AFTER_FIRST" != "X" ]; then \ - ${ECHO} "stopping after first downlevel pkg found"; \ - exit 1; \ - fi; \ - fi -. endif -.endif - -.PHONY: show-installed-depends -.if !target(show-installed-depends) -show-installed-depends: -. if !empty(DEPENDS) - ${_PKG_SILENT}${_PKG_DEBUG} \ - for i in ${DEPENDS:C/:.*$//:Q:S/\ / /g} ; do \ - echo "$$i =>" `${PKG_BEST_EXISTS} "$$i"` ; \ - done -. endif -.endif - -.PHONY: show-needs-update -.if !target(show-needs-update) -show-needs-update: -. if !empty(DEPENDS) - ${_PKG_SILENT}${_PKG_DEBUG} \ - for i in `${MAKE} show-all-depends-dirs`; do \ - cd ${PKGSRCDIR}/$$i; \ - eval `${MAKE} show-vars-eval VARS='PKGNAME:want PKGWILDCARD:wild'`; \ - have=`${PKG_BEST_EXISTS} "$$wild" || ${TRUE}`; \ - if [ -z "$$have" ]; then \ - ${ECHO} "$$i => (none) => needs install of $$want"; \ - elif [ "$$have" != "$$want" ]; then \ - ${ECHO} "$$i => $$have => needs update to $$want"; \ - fi; \ - done -. endif -.endif - -.PHONY: show-pkgsrc-dir -.if !target(show-pkgsrc-dir) -show-pkgsrc-dir: -. if defined(PKG_FAIL_REASON) - ${_PKG_SILENT}${_PKG_DEBUG}${DO_NADA} -. else - ${_PKG_SILENT}${_PKG_DEBUG} \ - found="`${PKG_BEST_EXISTS} \"${PKGWILDCARD}\" || ${TRUE}`"; \ - if [ "X$$found" != "X" ]; then \ - ${ECHO} ${PKGPATH}; \ - fi -. endif -.endif - # Extract # pkgsrc coarse-grained locking definitions and targets +acquire-lock: .USE + ${_ACQUIRE_LOCK} +release-lock: .USE + ${_RELEASE_LOCK} + .if ${PKGSRC_LOCKTYPE} == "none" -_ACQUIRE_LOCK= ${_PKG_SILENT}${_PKG_DEBUG}${DO_NADA} -_RELEASE_LOCK= ${_PKG_SILENT}${_PKG_DEBUG}${DO_NADA} +_ACQUIRE_LOCK= @${DO_NADA} +_RELEASE_LOCK= @${DO_NADA} .else LOCKFILE= ${WRKDIR}/.lockfile @@ -1480,9 +1216,6 @@ ${WRKDIR}: . endif .endif # WRKOBJDIR -${PKG_DB_TMPDIR}: ${WRKDIR} - ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${PKG_DB_TMPDIR} - # Configure # _CONFIGURE_PREREQ is a list of targets to run after pre-configure but before @@ -1773,266 +1506,25 @@ do-test: . endif .endif -# Install +.include "${PKGSRCDIR}/mk/flavor/bsd.flavor.mk" -.PHONY: do-install -.if !target(do-install) -do-install: -. for _dir_ in ${INSTALL_DIRS} - ${_PKG_SILENT}${_PKG_DEBUG}${_ULIMIT_CMD} \ - cd ${WRKSRC} && cd ${_dir_} && \ - ${SETENV} ${MAKE_ENV} ${MAKE_PROGRAM} ${INSTALL_MAKE_FLAGS} \ - -f ${MAKEFILE} ${INSTALL_TARGET} -. endfor -.endif +# Dependencies +.include "${PKGSRCDIR}/mk/depends/bsd.depends.mk" -# Package +# Check +.include "${PKGSRCDIR}/mk/check/bsd.check.mk" -.PHONY: real-su-package -.if !target(real-su-package) -real-su-package: ${PLIST} ${DESCR} - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${ECHO_MSG} "${_PKGSRC_IN}> Building binary package for ${PKGNAME}"; \ - if ${PKG_INFO} -qe ${PKGNAME}; then \ - : The package is installed. ; \ - else \ - ${ECHO_MSG} "=> ${PKGNAME} is not installed."; \ - exit 1; \ - fi; \ - if [ ! -d ${PKGREPOSITORY} ]; then \ - ${MKDIR} ${PKGREPOSITORY}; \ - if [ $$? -ne 0 ]; then \ - ${ECHO_MSG} "=> Can't create directory ${PKGREPOSITORY}."; \ - exit 1; \ - fi; \ - fi; \ - if ${PKG_CREATE} ${PKG_ARGS_BINPKG} ${PKGFILE}; then \ - ${MAKE} ${MAKEFLAGS} package-links; \ - else \ - ${ECHO} "(pkg_create: exitcode $$?)"; \ - ${MAKE} ${MAKEFLAGS} delete-package; \ - exit 1; \ - fi - ${_PKG_SILENT}${_PKG_DEBUG}${TOUCH} ${TOUCH_FLAGS} ${_PACKAGE_COOKIE} -. if defined(NO_BIN_ON_CDROM) - @${ECHO_MSG} "${_PKGSRC_IN}> Warning: ${PKGNAME} may not be put on a CD-ROM:" - @${ECHO_MSG} "${_PKGSRC_IN}> " ${NO_BIN_ON_CDROM:Q} -. endif -. if defined(NO_BIN_ON_FTP) - @${ECHO_MSG} "${_PKGSRC_IN}> Warning: ${PKGNAME} may not be made available through FTP:" - @${ECHO_MSG} "${_PKGSRC_IN}> " ${NO_BIN_ON_FTP:Q} -. endif -. if defined(ABI_DEPENDS) && !empty(USE_ABI_DEPENDS:M[Nn][Oo]) - @${ECHO_MSG} "${_PKGSRC_IN}> Warning: ABI dependency recommendations are being ignored!" - @${ECHO_MSG} "${_PKGSRC_IN}> ${PKGNAME} should not be uploaded nor" - @${ECHO_MSG} "${_PKGSRC_IN}> otherwise be used as a binary package!" -. endif -.endif +# Clean +.include "../../mk/bsd.pkg.clean.mk" -# Some support rules for real-su-package +# Install +.include "${PKGSRCDIR}/mk/install/bsd.install.mk" -.PHONY: package-links -.if !target(package-links) -package-links: - ${_PKG_SILENT}${_PKG_DEBUG}${MAKE} ${MAKEFLAGS} delete-package-links - ${_PKG_SILENT}${_PKG_DEBUG}for cat in ${CATEGORIES}; do \ - if [ ! -d ${PACKAGES}/$$cat ]; then \ - ${MKDIR} ${PACKAGES}/$$cat; \ - if [ $$? -ne 0 ]; then \ - ${ECHO_MSG} "=> Can't create directory ${PACKAGES}/$$cat."; \ - exit 1; \ - fi; \ - fi; \ - ${RM} -f ${PACKAGES}/$$cat/${PKGNAME}${PKG_SUFX}; \ - ${LN} -s ../${PKGREPOSITORYSUBDIR}/${PKGNAME}${PKG_SUFX} ${PACKAGES}/$$cat; \ - done; -.endif - -.PHONY: delete-package-links -.if !target(delete-package-links) -delete-package-links: - ${_PKG_SILENT}${_PKG_DEBUG}\ - ${FIND} ${PACKAGES} -type l -name ${PKGNAME}${PKG_SUFX} -print | ${XARGS} ${RM} -f -.endif - -.PHONY: delete-package -.if !target(delete-package) -delete-package: - ${_PKG_SILENT}${_PKG_DEBUG}${MAKE} ${MAKEFLAGS} delete-package-links - ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${PKGFILE} -.endif - -_PLIST_REGEXP.info= \ - ^([^\/]*\/)*${PKGINFODIR}/[^/]*(\.info)?(-[0-9]+)?(\.gz)?$$ -_PLIST_REGEXP.man= \ - ^([^/]*/)+(man[1-9ln]/[^/]*\.[1-9ln]|cat[1-9ln]/[^/]*\.[0-9])(\.gz)?$$ - -_DOC_COMPRESS= \ - ${SETENV} ECHO=${TOOLS_ECHO:Q} \ - EXPR=${TOOLS_EXPR:Q} \ - GZIP_CMD=${TOOLS_GZIP_CMD:Q} \ - GUNZIP_CMD=${TOOLS_GUNZIP_CMD:Q} \ - LN=${TOOLS_LN:Q} \ - LS=${TOOLS_LS:Q} \ - MANZ=${_MANZ:Q} \ - PKG_VERBOSE=${PKG_VERBOSE:Q} \ - RM=${TOOLS_RM:Q} \ - TEST=${TOOLS_TEST:Q} \ - ${SH} ${.CURDIR}/../../mk/plist/doc-compress ${PREFIX:Q} - -.PHONY: real-su-install -real-su-install: ${MESSAGE} -.if !defined(NO_PKG_REGISTER) && !defined(FORCE_PKG_REGISTER) && \ - (${PKG_INSTALLATION_TYPE} == "overwrite") -. if defined(CONFLICTS) - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${RM} -f ${WRKDIR}/.CONFLICTS -. for conflict in ${CONFLICTS} - ${_PKG_SILENT}${_PKG_DEBUG} \ - found="`${PKG_BEST_EXISTS} \"${conflict}\" || ${TRUE}`"; \ - if [ X"$$found" != X"" ]; then \ - ${ECHO} "$$found" >> ${WRKDIR}/.CONFLICTS; \ - fi -. endfor - ${_PKG_SILENT}${_PKG_DEBUG} \ - if [ -s ${WRKDIR}/.CONFLICTS ]; then \ - found=`${SED} -e s'|${_PKG_DBDIR}/||g' ${WRKDIR}/.CONFLICTS | tr '\012' ' '`; \ - ${ECHO_MSG} "${_PKGSRC_IN}> ${PKGNAME} conflicts with installed package(s): $$found found."; \ - ${ECHO_MSG} "*** They install the same files into the same place."; \ - ${ECHO_MSG} "*** Please remove $$found first with pkg_delete(1)."; \ - ${RM} -f ${WRKDIR}/.CONFLICTS; \ - exit 1; \ - fi -. endif # CONFLICTS - ${_PKG_SILENT}${_PKG_DEBUG} \ - found="`${PKG_BEST_EXISTS} \"${PKGWILDCARD}\" || ${TRUE}`"; \ - if [ "$$found" != "" ]; then \ - ${ECHO_MSG} "${_PKGSRC_IN}> $$found is already installed - perhaps an older version?"; \ - ${ECHO_MSG} "*** If so, you may use either of:"; \ - ${ECHO_MSG} "*** - \"pkg_delete $$found\" and \"${MAKE} reinstall\" to upgrade properly"; \ - ${ECHO_MSG} "*** - \"${MAKE} update\" to rebuild the package and all of its dependencies"; \ - ${ECHO_MSG} "*** - \"${MAKE} replace\" to replace only the package without re-linking"; \ - ${ECHO_MSG} "*** dependencies, risking various problems."; \ - exit 1; \ - fi -.endif # !NO_PKG_REGISTER && !NO_FORCE_REGISTER && overwrite -.if ${PKG_INSTALLATION_TYPE} == "pkgviews" - ${_PKG_SILENT}${_PKG_DEBUG} \ - found="`${PKG_INFO} -e ${PKGNAME} || ${TRUE}`"; \ - if [ "$$found" != "" ]; then \ - ${ECHO_MSG} "${_PKGSRC_IN}> $$found is already installed."; \ - exit 1; \ - fi -.endif - ${_PKG_SILENT}${_PKG_DEBUG}if [ `${SH} -c umask` -ne ${DEF_UMASK} ]; then \ - ${ECHO_MSG} "${_PKGSRC_IN}> Warning: your umask is \"`${SH} -c umask`"\".; \ - ${ECHO_MSG} "If this is not desired, set it to an appropriate value (${DEF_UMASK})"; \ - ${ECHO_MSG} "and install this package again by \`\`${MAKE} deinstall reinstall''."; \ - fi -.if empty(CHECK_FILES:M[nN][oO]) - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} check-files-pre -.endif -.if defined(INSTALLATION_DIRS) && !empty(INSTALLATION_DIRS) - ${_PKG_SILENT}${_PKG_DEBUG}${ECHO_MSG} "${_PKGSRC_IN}> Creating installation directories" - ${_PKG_SILENT}${_PKG_DEBUG} \ - for dir in ${INSTALLATION_DIRS}; do \ - case $$dir in \ - ${PREFIX}/*) \ - dir=`${ECHO} $$dir | ${SED} "s|^${PREFIX}/||"` ;; \ - /*) continue ;; \ - esac; \ - case $$dir in \ - *bin|*bin/*|*libexec|*libexec/*) \ - ${INSTALL_PROGRAM_DIR} ${PREFIX}/$$dir ;; \ - ${PKGMANDIR}/*) \ - ${INSTALL_MAN_DIR} ${PREFIX}/$$dir ;; \ - *) \ - ${INSTALL_DATA_DIR} ${PREFIX}/$$dir ;; \ - esac; \ - done -.endif # INSTALLATION_DIRS -.if !defined(NO_MTREE) - ${_PKG_SILENT}${_PKG_DEBUG}if [ `${ID} -u` = `${ID} -u ${ROOT_USER}` ]; then \ - if [ ! -f ${MTREE_FILE} ]; then \ - ${ECHO_MSG} "Error: mtree file \"${MTREE_FILE}\" is missing."; \ - exit 1; \ - else \ - if [ ! -d ${PREFIX} ]; then \ - ${MKDIR} ${PREFIX}; \ - fi; \ - ${MTREE} ${MTREE_ARGS} ${PREFIX}/; \ - fi; \ - else \ - ${ECHO_MSG} "Warning: not superuser, can't run mtree."; \ - ${ECHO_MSG} "Become ${ROOT_USER} and try again to ensure correct permissions."; \ - fi -.else - ${_PKG_SILENT}${_PKG_DEBUG}[ -d ${PREFIX} ] || ${MKDIR} ${PREFIX} -.endif # !NO_MTREE -.if !defined(NO_PKG_REGISTER) - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} pre-install-fake-pkg -.endif # !NO_PKG_REGISTER - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} pre-install-script - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} pre-install PKG_PHASE=install - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} do-install PKG_PHASE=install - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} post-install PKG_PHASE=install - ${_PKG_SILENT}${DO_NADA} \ - # \ - # PLIST must be generated at this late point (instead of \ - # depending on it somewhere earlier), because it needs \ - # to be created _after_ the {pre,do,post}-install \ - # targets are run. \ - # \ - # We generate _before_ post-install-script is run so \ - # that the real config files and rc.d scripts aren't \ - # listed in the PLIST. \ - # - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} ${PLIST} - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${ECHO_MSG} "${_PKGSRC_IN}> [Automatic manual page handling]"; \ - ${CAT} ${PLIST} | ${GREP} -v "^@" | \ - ${EGREP} ${_PLIST_REGEXP.man:Q} | ${_DOC_COMPRESS} - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} install-script-data -.if empty(CHECK_FILES:M[nN][oO]) - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} check-files-post -.endif - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} post-install-script -.if defined(MESSAGE) - @${ECHO_MSG} "${_PKGSRC_IN}> Please note the following:" - @${ECHO_MSG} "" - @${CAT} ${MESSAGE} - @${ECHO_MSG} "" -. if !empty(PKGSRC_MESSAGE_RECIPIENTS) - ${_PKG_SILENT}${_PKG_DEBUG} \ - (${ECHO} "The ${PKGNAME} package was installed on `${HOSTNAME_CMD}` at `date`"; \ - ${ECHO} ""; \ - ${ECHO} "Please note the following:"; \ - ${ECHO} ""; \ - ${CAT} ${MESSAGE}; \ - ${ECHO} "") | \ - ${MAIL_CMD} -s"Package ${PKGNAME} installed on `${HOSTNAME_CMD}`" ${PKGSRC_MESSAGE_RECIPIENTS} -. endif -.endif -.if !defined(NO_PKG_REGISTER) - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} register-pkg -.endif # !NO_PKG_REGISTER - ${_PKG_SILENT}${_PKG_DEBUG}${TOUCH} ${TOUCH_FLAGS} ${_INSTALL_COOKIE} -.if empty(CHECK_SHLIBS:M[nN][oO]) - ${_PKG_SILENT}${_PKG_DEBUG}${MAKE} ${MAKEFLAGS} check-shlibs -.endif -.if empty(CHECK_WRKREF:M[nN][oO]) - ${_PKG_SILENT}${_PKG_DEBUG}${MAKE} ${MAKEFLAGS} check-wrkref -.endif -.if empty(CHECK_FILES:M[nN][oO]) - ${_PKG_SILENT}${_PKG_DEBUG}${MAKE} ${MAKEFLAGS} check-files -.endif -.if empty(CHECK_INTERPRETER:M[nN][oO]) - ${_PKG_SILENT}${_PKG_DEBUG}${MAKE} ${MAKEFLAGS} check-interpreter -.endif +# Package +.include "${PKGSRCDIR}/mk/package/bsd.package.mk" .PHONY: acquire-tools-lock .PHONY: acquire-wrapper-lock acquire-configure-lock acquire-build-lock -.PHONY: acquire-install-lock acquire-package-lock acquire-tools-lock: ${_ACQUIRE_LOCK} acquire-wrapper-lock: @@ -2041,14 +1533,9 @@ acquire-configure-lock: ${_ACQUIRE_LOCK} acquire-build-lock: ${_ACQUIRE_LOCK} -acquire-install-lock: - ${_ACQUIRE_LOCK} -acquire-package-lock: - ${_ACQUIRE_LOCK} .PHONY: release-tools-lock .PHONY: release-wrapper-lock release-configure-lock release-build-lock -.PHONY: release-install-lock release-package-lock release-tools-lock: ${_RELEASE_LOCK} release-wrapper-lock: @@ -2057,10 +1544,6 @@ release-configure-lock: ${_RELEASE_LOCK} release-build-lock: ${_RELEASE_LOCK} -release-install-lock: - ${_RELEASE_LOCK} -release-package-lock: - ${_RELEASE_LOCK} ################################################################ # Skeleton targets start here @@ -2105,26 +1588,6 @@ build: pkginstall test: build ${_TEST_COOKIE} .endif -.PHONY: install -.if !target(install) -install: ${_PKGSRC_BUILD_TARGETS} ${PKG_DB_TMPDIR} acquire-install-lock ${_INSTALL_COOKIE} release-install-lock -.endif - -.PHONY: package -.if !target(package) -package: install acquire-package-lock ${_PACKAGE_COOKIE} release-package-lock -.endif - -.PHONY: replace -.if !target(replace) -replace: ${_PKGSRC_BUILD_TARGETS} real-replace -.endif - -.PHONY: undo-replace -.if !target(undo-replace) -undo-replace: real-undo-replace -.endif - ${_TOOLS_COOKIE}: ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} real-tools PKG_PHASE=tools @@ -2188,19 +1651,6 @@ ${_BUILD_COOKIE}: ${_TEST_COOKIE}: ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${SETENV} ${BUILD_ENV} ${MAKE} ${MAKEFLAGS} real-test PKG_PHASE=test -${_INSTALL_COOKIE}: -.if !empty(INTERACTIVE_STAGE:Minstall) && defined(BATCH) - @${ECHO} "*** The installation stage of this package requires user interaction" - @${ECHO} "*** Please install manually with \"cd ${PKGDIR} && ${MAKE} install\"" - @${TOUCH} ${_INTERACTIVE_COOKIE} - @${FALSE} -.else - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${SETENV} ${BUILD_ENV} ${MAKE} ${MAKEFLAGS} real-install PKG_PHASE=install -.endif - -${_PACKAGE_COOKIE}: - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${SETENV} ${BUILD_ENV} ${MAKE} ${MAKEFLAGS} real-package PKG_PHASE=package - .PHONY: tools-message wrapper-message .PHONY: configure-message build-message test-message tools-message: @@ -2239,18 +1689,13 @@ test-cookie: # make i.e. without -j n) .PHONY: real-fetch .PHONY: real-tools real-wrapper -.PHONY: real-configure real-build real-test real-install real-package -.PHONY: real-replace real-undo-replace +.PHONY: real-configure real-build real-test real-fetch: pre-fetch do-fetch post-fetch real-tools: tools-message tools-vars pre-tools do-tools post-tools tools-cookie real-wrapper: wrapper-message wrapper-vars pre-wrapper do-wrapper post-wrapper wrapper-cookie real-configure: configure-message configure-vars pre-configure pre-configure-override do-configure post-configure configure-cookie real-build: build-message build-vars pre-build do-build post-build build-cookie real-test: test-message pre-test do-test post-test test-cookie -real-install: install-vars do-su-install -real-package: package-vars do-su-package -real-replace: do-su-replace -real-undo-replace: do-su-undo-replace _SU_TARGET= \ if [ `${ID} -u` = `${ID} -u ${ROOT_USER}` ]; then \ @@ -2275,51 +1720,28 @@ _SU_TARGET= \ ${SU_CMD} "cd ${.CURDIR}; ${SETENV} PATH='$${PATH}:${SU_CMD_PATH_APPEND}' ${MAKE} $$args ${MAKEFLAGS} $$realtarget $$realflags"; \ fi -.PHONY: do-su-install -do-su-install: - ${_PKG_SILENT}${_PKG_DEBUG} \ - extractname=`${CAT} ${_EXTRACT_COOKIE}`; \ - case "$$extractname" in \ - "") ${ECHO_MSG} "*** Warning: ${WRKDIR} may contain an older version of ${PKGBASE}" ;; \ - "${PKGNAME}") ;; \ - *) ${ECHO_MSG} "*** Warning: Package version $$extractname in ${WRKDIR}"; \ - ${ECHO_MSG} "*** Current version ${PKGNAME} in pkgsrc directory"; \ - ${ECHO_MSG} "*** Cleaning and rebuilding the newer version of the package..."; \ - ${MAKE} clean && ${MAKE} build ;; \ - esac - @${ECHO_MSG} "${_PKGSRC_IN}> Installing for ${PKGNAME}" - ${_PKG_SILENT}${_PKG_DEBUG} \ - realtarget="real-su-install"; \ - action="install"; \ - ${_SU_TARGET} - -.PHONY: do-su-package -do-su-package: - @${ECHO_MSG} "${_PKGSRC_IN}> Packaging ${PKGNAME}" - ${_PKG_SILENT}${_PKG_DEBUG} \ - realtarget="real-su-package"; \ - action="package"; \ - ${_SU_TARGET} - -.PHONY: do-su-replace -do-su-replace: - @${ECHO_MSG} "${_PKGSRC_IN}> Replacing ${PKGNAME}" - ${_PKG_SILENT}${_PKG_DEBUG} \ - realtarget="real-su-replace"; \ - action="replace"; \ - ${_SU_TARGET} - -.PHONY: do-su-undo-replace -do-su-undo-replace: - @${ECHO_MSG} "${_PKGSRC_IN}> Undoing Replacement of ${PKGNAME}" +# su-target is a macro target that does just-in-time su-to-root before +# reinvoking the make process as root. +# +.PHONY: su-target +su-target: .USE ${_PKG_SILENT}${_PKG_DEBUG} \ - realtarget="real-su-undo-replace"; \ - action="undo-replace"; \ - ${_SU_TARGET} + if ${TEST} `${ID} -u` = `${ID} -u ${ROOT_USER}`; then \ + ${MAKE} ${MAKEFLAGS} PKG_DEBUG_LEVEL=${PKG_DEBUG_LEVEL:Q} su-${.TARGET} ${MAKEFLAGS.${.TARGET}}; \ + else \ + case ${PRE_ROOT_CMD:Q}"" in \ + ${TRUE:Q}"") ;; \ + *) ${ECHO} "*** WARNING *** Running: "${PRE_ROOT_CMD:Q} ;; \ + esac; \ + ${PRE_ROOT_CMD}; \ + ${ECHO_MSG} "${_PKGSRC_IN}> Becoming \`\`${ROOT_USER}'' to make su-${.TARGET} (`${ECHO} ${SU_CMD} | ${AWK} '{ print $$1 }'`)"; \ + ${SU_CMD} "cd ${.CURDIR}; ${SETENV} PATH='$${PATH}:${SU_CMD_PATH_APPEND}' ${MAKE} ${MAKEFLAGS} PKG_DEBUG_LEVEL=${PKG_DEBUG_LEVEL} su-${.TARGET} ${MAKEFLAGS.su-${.TARGET}}"; \ + ${ECHO_MSG} "${_PKGSRC_IN}> Dropping \`\`${ROOT_USER}'' privileges."; \ + fi # Empty pre-* and post-* targets -.for name in fetch tools wrapper configure build test install package +.for name in fetch tools wrapper configure build test . if !target(pre-${name}) pre-${name}: @@ -2333,289 +1755,15 @@ post-${name}: .endfor -# Reinstall -# -# Special target to re-run install - -.PHONY: reinstall -.if !target(reinstall) -reinstall: - ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${_INSTALL_COOKIE} ${_PACKAGE_COOKIE} ${PLIST} - ${_PKG_SILENT}${_PKG_DEBUG}DEPENDS_TARGET=${DEPENDS_TARGET:Q} ${MAKE} ${MAKEFLAGS} install -.endif - -# Deinstall -# -# Special target to remove installation - -.PHONY: deinstall do-su-deinstall -.if !target(deinstall) -deinstall: do-su-deinstall - -.if !target(do-su-deinstall) -do-su-deinstall: - @${ECHO_MSG} "${_PKGSRC_IN}> Deinstalling for ${PKGBASE}" - ${_PKG_SILENT}${_PKG_DEBUG} \ - realtarget="real-su-deinstall"; \ - realflags="DEINSTALLDEPENDS=${DEINSTALLDEPENDS}"; \ - action="deinstall"; \ - ${_SU_TARGET} -.endif - -. if (${DEINSTALLDEPENDS} != "NO") -. if (${DEINSTALLDEPENDS} != "ALL") -# used for removing stuff in bulk builds -real-su-deinstall-flags+= -r -R -# used for "update" target -. else -real-su-deinstall-flags+= -r -. endif -. endif -. if defined(PKG_VERBOSE) -real-su-deinstall-flags+= -v -. endif -. if defined(PKG_PRESERVE) -. if (${UPDATE_RUNNING} == "YES") -# used to update w/o removing any files -real-su-deinstall-flags+= -N -f -. endif -. endif - -.PHONY: real-su-deinstall -real-su-deinstall: - ${_PKG_SILENT}${_PKG_DEBUG} \ - found="`${PKG_INFO} -e \"${PKGNAME}\" || ${TRUE}`"; \ - case "$$found" in \ - "") found="`${PKG_BEST_EXISTS} \"${PKGWILDCARD}\" || ${TRUE}`" ;; \ - esac; \ - if [ "$$found" != "" ]; then \ - ${ECHO} Running ${PKG_DELETE} ${real-su-deinstall-flags} $$found ; \ - ${PKG_DELETE} ${real-su-deinstall-flags} $$found || ${TRUE} ; \ - fi -. if (${DEINSTALLDEPENDS} != "NO") && (${DEINSTALLDEPENDS} != "ALL") - @${SHCOMMENT} Also remove BUILD_DEPENDS: -. for pkg in ${BUILD_DEPENDS:C/:.*$//} - ${_PKG_SILENT}${_PKG_DEBUG} \ - found="`${PKG_BEST_EXISTS} \"${pkg}\" || ${TRUE}`"; \ - if [ "$$found" != "" ]; then \ - ${ECHO} Running ${PKG_DELETE} $$found; \ - ${PKG_DELETE} ${real-su-deinstall-flags} $$found || ${TRUE}; \ - fi -. endfor -. endif # DEINSTALLDEPENDS - @${RM} -f ${_INSTALL_COOKIE} ${_PACKAGE_COOKIE} \ - ${_CHECK_FILES_COOKIES} \ - ${_CHECK_FILES_PRE} ${_CHECK_FILES_POST} -.endif # target(deinstall) - - ################################################################ # Some more targets supplied for users' convenience ################################################################ -# The 'update' target can be used to update a package and all -# currently installed packages that depend upon this package. - -.PHONY: update -.if !target(update) -.if exists(${DDIR}) -RESUMEUPDATE?= YES -CLEAR_DIRLIST?= NO - -update: - ${_PKG_SILENT}${_PKG_DEBUG}${ECHO_MSG} \ - "${_PKGSRC_IN}> Resuming update for ${PKGNAME}" -. if ${REINSTALL} != "NO" && ${UPDATE_TARGET} != "replace" - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${MAKE} ${MAKEFLAGS} deinstall UPDATE_RUNNING=YES DEINSTALLDEPENDS=ALL -. endif -.else -RESUMEUPDATE?= NO -CLEAR_DIRLIST?= YES - -update: - ${_PKG_SILENT}${_PKG_DEBUG}${MAKE} ${MAKEFLAGS} ${DDIR} -. if ${UPDATE_TARGET} != "replace" - ${_PKG_SILENT}${_PKG_DEBUG}if ${PKG_INFO} -qe ${PKGBASE}; then \ - ${MAKE} ${MAKEFLAGS} deinstall UPDATE_RUNNING=YES DEINSTALLDEPENDS=ALL \ - || (${RM} ${DDIR} && ${FALSE}); \ - fi -. endif -.endif - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${MAKE} ${MAKEFLAGS} ${UPDATE_TARGET} KEEP_WRKDIR=YES \ - DEPENDS_TARGET=${DEPENDS_TARGET:Q} - ${_PKG_SILENT}${_PKG_DEBUG} \ - [ ! -s ${DDIR} ] || for dep in `${CAT} ${DDIR}` ; do \ - (if cd ../.. && cd "$${dep}" ; then \ - ${ECHO_MSG} "${_PKGSRC_IN}> Installing in $${dep}" && \ - if [ "(" "${RESUMEUPDATE}" = "NO" -o \ - "${REINSTALL}" != "NO" ")" -a \ - "${UPDATE_TARGET}" != "replace" ] ; then \ - ${MAKE} ${MAKEFLAGS} deinstall UPDATE_RUNNING=YES; \ - fi && \ - ${MAKE} ${MAKEFLAGS} ${UPDATE_TARGET} \ - DEPENDS_TARGET=${DEPENDS_TARGET:Q} ; \ - else \ - ${ECHO_MSG} "${_PKGSRC_IN}> Skipping removed directory $${dep}"; \ - fi) ; \ - done -.if ${NOCLEAN} == "NO" - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${MAKE} ${MAKEFLAGS} clean-update CLEAR_DIRLIST=YES -.endif - - -.PHONY: clean-update -clean-update: - ${_PKG_SILENT}${_PKG_DEBUG}${MAKE} ${MAKEFLAGS} ${DDIR} - ${_PKG_SILENT}${_PKG_DEBUG} \ - if [ -s ${DDIR} ] ; then \ - for dep in `${CAT} ${DDIR}` ; do \ - (if cd ../.. && cd "$${dep}" ; then \ - ${MAKE} ${MAKEFLAGS} clean ; \ - else \ - ${ECHO_MSG} "${_PKGSRC_IN}> Skipping removed directory $${dep}";\ - fi) ; \ - done ; \ - fi -.if ${CLEAR_DIRLIST} != "NO" - ${_PKG_SILENT}${_PKG_DEBUG}${MAKE} ${MAKEFLAGS} clean -.else - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${MAKE} ${MAKEFLAGS} clean update-dirlist \ - DIRLIST="`${CAT} ${DDIR}`" PKGLIST="`${CAT} ${DLIST}`" - ${_PKG_SILENT}${_PKG_DEBUG}${ECHO_MSG} \ - "${_PKGSRC_IN}> Warning: preserved leftover directory list. Your next";\ - ${ECHO_MSG} "${_PKGSRC_IN}> \`\`${MAKE} update'' may fail. It is advised to use";\ - ${ECHO_MSG} "${_PKGSRC_IN}> \`\`${MAKE} update REINSTALL=YES'' instead!" -.endif - -.endif # !target(update) - - -.PHONY: update-dirlist -update-dirlist: - ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} -p ${WRKDIR} -.if defined(PKGLIST) -. for __tmp__ in ${PKGLIST} - ${_PKG_SILENT}${_PKG_DEBUG}${ECHO} >>${DLIST} "${__tmp__}" -. endfor -.endif -.if defined(DIRLIST) -. for __tmp__ in ${DIRLIST} - ${_PKG_SILENT}${_PKG_DEBUG}${ECHO} >>${DDIR} "${__tmp__}" -. endfor -.endif - - -${DDIR}: ${DLIST} - ${_PKG_SILENT}${_PKG_DEBUG} \ - ddir=`${SED} 's:-[^-]*$$::' ${DLIST}`; \ - ${ECHO} >${DDIR}; \ - for pkg in $${ddir} ; do \ - if ${PKG_INFO} -b "$${pkg}" >/dev/null 2>&1 ; then \ - ${PKG_INFO} -b "$${pkg}" | ${SED} -ne \ - 's,\([^/]*/[^/]*\)/Makefile:.*,\1,p' | \ - ${HEAD} -1 >>${DDIR}; \ - fi ; \ - done - -${DLIST}: ${WRKDIR} - ${_PKG_SILENT}${_PKG_DEBUG} \ - { ${PKG_DELETE} -n "${PKGWILDCARD}" 2>&1 | \ - ${GREP} '^ ' | \ - ${AWK} '{ l[NR]=$$0 } END { for (i=NR;i>0;--i) print l[i] }' \ - || ${TRUE}; } > ${DLIST} - -# The 'info' target can be used to display information about a package. -.PHONY: info -info: - ${_PKG_SILENT}${_PKG_DEBUG}${PKG_INFO} "${PKGWILDCARD}" - -# The 'check' target can be used to check an installed package. -.PHONY: check -check: - ${_PKG_SILENT}${_PKG_DEBUG}${PKG_ADMIN} check "${PKGWILDCARD}" - -# The 'list' target can be used to list the files installed by a package. -.PHONY: list -list: - ${_PKG_SILENT}${_PKG_DEBUG}${PKG_INFO} -L "${PKGWILDCARD}" - # Run pkglint: .PHONY: lint lint: ${_PKG_SILENT}${_PKG_DEBUG}${LOCALBASE}/bin/pkglint -# Create a binary package from an install package using "pkg_tarup" -.PHONY: tarup -tarup: -.if ${PKG_INSTALLATION_TYPE} == "overwrite" - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${RM} -f ${PACKAGES}/All/${PKGNAME}${PKG_SUFX}; \ - ${SETENV} PKG_DBDIR=${_PKG_DBDIR} PKG_SUFX=${PKG_SUFX} \ - PKGREPOSITORY=${PACKAGES}/All \ - ${LOCALBASE}/bin/pkg_tarup ${PKGNAME}; \ - for CATEGORY in ${CATEGORIES}; do \ - ${MKDIR} ${PACKAGES}/$$CATEGORY; \ - cd ${PACKAGES}/$$CATEGORY; \ - ${RM} -f ${PKGNAME}${PKG_SUFX}; \ - ${LN} -s ../All/${PKGNAME}${PKG_SUFX}; \ - done -.endif - -# shared code for replace and undo-replace -_REPLACE= \ - if [ -f ${_PKG_DBDIR}/$$oldpkgname/+REQUIRED_BY ]; then \ - ${MV} ${_PKG_DBDIR}/$$oldpkgname/+REQUIRED_BY ${WRKDIR}/.req; \ - fi; \ - ${MAKE} deinstall UPDATE_RUNNING=YES; \ - $$replace_action; \ - if [ -f ${WRKDIR}/.req ]; then \ - ${MV} ${WRKDIR}/.req ${_PKG_DBDIR}/$$newpkgname/+REQUIRED_BY; \ - for pkg in `${CAT} ${_PKG_DBDIR}/$$newpkgname/+REQUIRED_BY`; do \ - ${SETENV} NEWPKGNAME=$$newpkgname \ - ${AWK} '/^@pkgdep '$$oldpkgname'/ { print "@pkgdep " ENVIRON["NEWPKGNAME"]; next } { print }' \ - < ${_PKG_DBDIR}/$$pkg/+CONTENTS > ${_PKG_DBDIR}/$$pkg/+CONTENTS.$$$$ && \ - ${MV} ${_PKG_DBDIR}/$$pkg/+CONTENTS.$$$$ ${_PKG_DBDIR}/$$pkg/+CONTENTS; \ - done; \ - fi - -# replace a package in place - not for the faint-hearted -.PHONY: real-su-replace -real-su-replace: - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${ECHO_MSG} "*** WARNING - experimental target - data loss may occur ***"; \ - if [ -x ${LOCALBASE}/bin/pkg_tarup ]; then \ - ${SETENV} PKGREPOSITORY=${WRKDIR} ${LOCALBASE}/bin/pkg_tarup ${PKGBASE}; \ - else \ - ${ECHO} "No ${LOCALBASE}/bin/pkg_tarup binary - can't pkg_tarup ${PKGBASE}"; \ - exit 1; \ - fi - ${_PKG_SILENT}${_PKG_DEBUG} \ - oldpkgname=`${PKG_BEST_EXISTS} "${PKGWILDCARD}"`; \ - newpkgname=${PKGNAME}; \ - ${ECHO} "$$oldpkgname" > ${WRKDIR}/.replace; \ - replace_action="${MAKE} install"; \ - ${_REPLACE} - -# undo the replacement of a package - not for the faint-hearted either -.PHONY: real-su-undo-replace -real-su-undo-replace: - ${_PKG_SILENT}${_PKG_DEBUG} \ - if [ ! -f ${WRKDIR}/.replace ]; then \ - ${ECHO_MSG} "No replacement to undo"; \ - exit 1; \ - fi - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${ECHO_MSG} "*** WARNING - experimental target - data loss may occur ***"; \ - oldpkgname=${PKGNAME}; \ - newpkgname=`${CAT} ${WRKDIR}/.replace`; \ - replace_action="${SETENV} ${PKG_ADD} ${WRKDIR}/$$newpkgname${PKG_SUFX}"; \ - ${_REPLACE}; \ - ${RM} ${WRKDIR}/.replace - # This is for the use of sites which store distfiles which others may # fetch - only fetch the distfile if it is allowed to be # re-distributed freely @@ -3010,88 +2158,6 @@ run-depends-list: . endfor .endif # target(run-depends-list) -# Build a package but don't check the package cookie - -.PHONY: repackage -.if !target(repackage) -repackage: pre-repackage package - -.PHONY: pre-repackage -pre-repackage: - ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${_PACKAGE_COOKIE} -.endif - -# Build a package but don't check the cookie for installation, also don't -# install package cookie - -.PHONY: package-noinstall -.if !target(package-noinstall) -package-noinstall: - ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} PACKAGE_NOINSTALL=yes real-package -.endif - -################################################################ -# Dependency checking -################################################################ - -.PHONY: install-depends pre-install-depends -pre-install-depends: -.if !target(install-depends) -# Tells whether to halt execution if the object formats differ -FATAL_OBJECT_FMT_SKEW?= yes -WARN_NO_OBJECT_FMT?= yes - -install-depends: pre-install-depends -. if !empty(DEPENDS) || !empty(BUILD_DEPENDS) -. if defined(NO_DEPENDS) - @${DO_NADA} -. else # !DEPENDS -. for dep in ${DEPENDS} ${BUILD_DEPENDS} - ${_PKG_SILENT}${_PKG_DEBUG} \ - pkg=${dep:C/:.*//:Q}; \ - dir=${dep:C/[^:]*://:C/:.*$//:Q}; \ - found=`${PKG_BEST_EXISTS} "$$pkg" || ${TRUE}`; \ - if [ "X$$REBUILD_DOWNLEVEL_DEPENDS" != "X" ]; then \ - pkgname=`cd $$dir ; ${MAKE} ${MAKEFLAGS} show-var VARNAME=PKGNAME`; \ - if [ "X$$found" != "X" -a "X$$found" != "X$${pkgname}" ]; then \ - ${ECHO_MSG} "ignoring old installed package \"$$found\""; \ - found=""; \ - fi; \ - fi; \ - if [ "$$found" != "" ]; then \ - instobjfmt=`${PKG_INFO} -B "$$found" | ${AWK} -F'=[ \t]*' '/^OBJECT_FMT/ {print $$2; exit}'`; \ - if [ "$$instobjfmt" = "" ]; then \ - if [ "X${WARN_NO_OBJECT_FMT}" != "Xno" ]; then \ - ${ECHO} "WARNING: Unknown object format for installed package $$found - continuing"; \ - fi; \ - elif [ "$$instobjfmt" != "${OBJECT_FMT}" ]; then \ - ${ECHO} "Installed package $$found is an $$instobjfmt package."; \ - ${ECHO} "You are building an ${OBJECT_FMT} package, which will not inter-operate."; \ - ${ECHO} "Please update the $$found package to ${OBJECT_FMT}"; \ - if [ "X${FATAL_OBJECT_FMT_SKEW}" != "Xno" ]; then \ - exit 1; \ - fi; \ - fi; \ - ${ECHO_MSG} "${_PKGSRC_IN}> Required installed package $${pkg}: $${found} found"; \ - else \ - ${ECHO_MSG} "${_PKGSRC_IN}> Required package $${pkg}: NOT found"; \ - target=${DEPENDS_TARGET:Q}; \ - ${ECHO_MSG} "${_PKGSRC_IN}> Verifying $$target for $$dir"; \ - if [ ! -d $$dir ]; then \ - ${ECHO_MSG} "=> [bsd.pkg.mk] error: The directory $$dir does not exist."; \ - exit 1; \ - else \ - cd $$dir ; \ - ${SETENV} _PKGSRC_DEPS=", ${PKGNAME}${_PKGSRC_DEPS}" PKGNAME_REQD="$$pkg" ${MAKE} ${MAKEFLAGS} _AUTOMATIC=YES $$target || exit 1; \ - ${ECHO_MSG} "${_PKGSRC_IN}> Returning to build of ${PKGNAME}"; \ - fi; \ - fi -. endfor # DEPENDS -. endif # !NO_DEPENDS -. endif # DEPENDS - -.endif - .PHONY: build-depends-list .if !target(build-depends-list) build-depends-list: @@ -3406,331 +2472,6 @@ show-options: @${ECHO} This package does not use the options framework. .endif -# Stat all the files of one pkg and sum the sizes up. -# -# XXX This is intended to be run before pkg_create is called, so the -# existence of ${PLIST} can be assumed. -.PHONY: print-pkg-size-this -print-pkg-size-this: - @${SHCOMMENT} "This pkg's files" ; \ - ${AWK} 'BEGIN { base = "${PREFIX}/" } \ - /^@cwd/ { base = $$2 "/" } \ - /^@/ { next } \ - { print base $$0 }' \ - <${PLIST} \ - | ${SORT} -u \ - | ${SED} -e "s/'/'\\\\''/g" -e "s/.*/'&'/" \ - | ${XARGS} -n 256 ${LS} -ld \ - | ${AWK} 'BEGIN { s = 0; } { s += $$5; } END { print s; }' - -# Sizes of required pkgs (only) -# -# XXX This is intended to be run before pkg_create is called, so the -# dependencies are all installed. -.PHONY: print-pkg-size-depends -print-pkg-size-depends: - @pkglist=`${MAKE} ${MAKEFLAGS} run-depends-list`; \ - if [ "X$${pkglist}" != "X" ]; then \ - ${ECHO} $${pkglist} \ - | ${XARGS} -n 1 ${SETENV} ${PKG_BEST_EXISTS} \ - | ${SORT} -u \ - | ${XARGS} -n 256 ${SETENV} ${PKG_INFO} -qs \ - | ${AWK} '/^[0-9]+$$/ { s += $$1; } END { print s; }'; \ - else \ - ${ECHO} "0"; \ - fi - -# By default, all packages attempt to link into the views. -.if ${PKG_INSTALLATION_TYPE} == "pkgviews" -BUILD_VIEWS?= yes -.endif - -# DEFAULT_VIEW.${PKGBASE} default view for ${PKGBASE} -# VIEWBASE base location of files at run-time -# -DEFAULT_VIEW.${PKGBASE}?= ${DEFAULT_VIEW} -.if ${PKG_INSTALLATION_TYPE} == "pkgviews" -. if empty(DEFAULT_VIEW.${PKGBASE}:M"") -VIEWBASE= ${LOCALBASE}/${DEFAULT_VIEW.${PKGBASE}} -. else -VIEWBASE= ${LOCALBASE} -. endif -.elif ${PKG_INSTALLATION_TYPE} == "overwrite" -VIEWBASE= ${PREFIX} -.endif -MAKE_ENV+= VIEWBASE=${VIEWBASE:Q} - -PKGVIEWS+= ${DEFAULT_VIEW.${PKGBASE}} - -.PHONY: pre-install-fake-pkg -.if !target(pre-install-fake-pkg) -pre-install-fake-pkg: - ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${PRESERVE_FILE} -. if defined(PKG_PRESERVE) - ${_PKG_SILENT}${_PKG_DEBUG}${DATE} > ${PRESERVE_FILE} -. endif - ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${BUILD_VERSION_FILE} - ${_PKG_SILENT}${_PKG_DEBUG} \ - files=""; \ - for f in ${.CURDIR}/Makefile ${FILESDIR}/* ${PKGDIR}/*; do \ - if [ -f "$$f" ]; then \ - files="$$files \"$$f\""; \ - fi; \ - done; \ - if [ -f ${DISTINFO_FILE} ]; then \ - for f in `${AWK} 'NF == 4 && $$3 == "=" { gsub("[()]", "", $$2); print $$2 }' < ${DISTINFO_FILE}`; do \ - if [ -f ${PATCHDIR}/$$f ]; then \ - files="$$files \"${PATCHDIR}/$$f\""; \ - fi; \ - done; \ - fi; \ - if [ -d ${PATCHDIR} ]; then \ - for f in ${PATCHDIR}/patch-*; do \ - case $$f in \ - *.orig|*.rej|*~) ;; \ - ${PATCHDIR}/patch-local-*) \ - files="$$files \"$$f\"" ;; \ - esac; \ - done; \ - fi; \ - eval ${GREP} '\$$NetBSD' $$files | ${SED} -e 's|^${PKGSRCDIR}/||' > ${BUILD_VERSION_FILE} - ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${BUILD_INFO_FILE} -. for def in ${BUILD_DEFS} - @${ECHO} ${def}=${${def}:Q} | ${SED} -e 's|^PATH=[^ ]*|PATH=...|' >> ${BUILD_INFO_FILE} -. endfor -. if !empty(USE_LANGUAGES) - @${ECHO} "CC_VERSION=${CC_VERSION}" >> ${BUILD_INFO_FILE} -. endif -. if !empty(USE_TOOLS:Mperl\:run) - @${ECHO} "PERL=`${PERL5} --version 2>/dev/null | ${GREP} 'This is perl'`" >> ${BUILD_INFO_FILE} -. endif -. if defined(_USE_GMAKE) || !empty(USE_TOOLS:Mgmake) - @${ECHO} "GMAKE=`${GMAKE} --version | ${GREP} Make`" >> ${BUILD_INFO_FILE} -. endif - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${ECHO} "PKGTOOLS_VERSION=${PKGTOOLS_VERSION}" >> ${BUILD_INFO_FILE} -.endif - -.PHONY: post-install-fake-pkg -.if !target(post-install-fake-pkg) -post-install-fake-pkg: ${PLIST} ${DESCR} ${MESSAGE} - ${_PKG_SILENT}${_PKG_DEBUG} \ - if [ ! -f ${PLIST} -o ! -f ${DESCR} ]; then \ - ${ECHO} "** Missing package files for ${PKGNAME} - installation not recorded."; \ - exit 1; \ - fi - ${_PKG_SILENT}${_PKG_DEBUG} \ - if [ ! -d ${_PKG_DBDIR} ]; then \ - ${RM} -f ${_PKG_DBDIR}; \ - ${MKDIR} ${_PKG_DBDIR}; \ - fi -. if defined(FORCE_PKG_REGISTER) - ${_PKG_SILENT}${_PKG_DEBUG}${PKG_ADMIN} delete ${PKGNAME} -. endif - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${ECHO} ${COMMENT:Q} > ${PKG_DB_TMPDIR}/+COMMENT - ${_PKG_SILENT}${_PKG_DEBUG} \ - case "${DESCR}" in \ - ${PKG_DB_TMPDIR}/*|"") ;; \ - *) if ${TEST} -f ${DESCR}; then \ - ${CP} ${DESCR} ${PKG_DB_TMPDIR}/+DESC; \ - fi ;; \ - esac - ${_PKG_SILENT}${_PKG_DEBUG} \ - case "${MESSAGE}" in \ - ${PKG_DB_TMPDIR}/*|"") ;; \ - *) if ${TEST} -f ${MESSAGE}; then \ - ${CP} ${MESSAGE} ${PKG_DB_TMPDIR}/+DISPLAY; \ - fi ;; \ - esac - ${_PKG_SILENT}${_PKG_DEBUG} \ - case ${PKG_INSTALLATION_TYPE} in \ - pkgview) ${TOUCH} ${PKG_DB_TMPDIR}/+VIEWS ;; \ - esac - ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${SIZE_PKG_FILE} ${SIZE_ALL_FILE} -. if !empty(CHECK_SHLIBS_SUPPORTED:M[yY][eE][sS]) - ${_PKG_SILENT}${_PKG_DEBUG} \ - case "${LDD}" in \ - "") ldd=`${TYPE} ldd 2>/dev/null | ${AWK} '{ print $$NF }'`;; \ - *) ldd="${LDD}"; \ - esac; \ - case "${OBJECT_FMT}" in \ - ELF) bins=`${SETENV} PREFIX=${PREFIX} ${AWK} '/^(bin|sbin|libexec)\// { print ENVIRON["PREFIX"] "/" $$0 }' ${PLIST} || ${TRUE}`; \ - libs=`${SETENV} PREFIX=${PREFIX} ${AWK} '/^lib\/lib.*\.so\.[0-9]+$$/ { print ENVIRON["PREFIX"] "/" $$0 }' ${PLIST} || ${TRUE}`; \ - if ${TEST} "$$bins" != "" -o "$$libs" != ""; then \ - requires=`($$ldd $$bins $$libs 2>/dev/null || ${TRUE}) | ${AWK} '$$2 == "=>" && $$3 ~ "/" { print $$3 }' | ${SORT} -u`; \ - fi; \ - linklibs=`${SETENV} PREFIX=${PREFIX} ${AWK} '/^[^@].*\.so\.[0-9\.]+$$/ { print ENVIRON["PREFIX"] "/" $$0 }' ${PLIST} || ${TRUE}`; \ - for i in $${linklibs}; do \ - if ${TEST} -r $$i -a ! -x $$i -a ! -h $$i; then \ - ${TEST} "${PKG_DEVELOPER:Uno}" = "no" || \ - ${ECHO} "$$i: installed without execute permission; fixing (should use [BSD_]INSTALL_LIB)"; \ - ${CHMOD} +x $$i; \ - fi; \ - done; \ - ;; \ - Mach-O) bins=`${SETENV} PREFIX=${PREFIX} ${AWK} '/^(bin|sbin|libexec)\// { print ENVIRON["PREFIX"] "/" $$0 }' ${PLIST} || ${TRUE}`; \ - libs=`${SETENV} PREFIX=${PREFIX} ${AWK} '/^lib\/lib.*\.dylib/ { print ENVIRON["PREFIX"] "/" $$0 }' ${PLIST} || ${TRUE}`; \ - if ${TEST} "$$bins" != "" -o "$$libs" != ""; then \ - requires=`($$ldd $$bins $$libs 2>/dev/null || ${TRUE}) | ${AWK} '/compatibility version/ { print $$1 }' | ${SORT} -u`; \ - fi; \ - ;; \ - esac; \ - for i in "" $$libs; do \ - ${TEST} "$$i" = "" && continue; \ - ${ECHO} "PROVIDES=$$i" >> ${BUILD_INFO_FILE}; \ - done; \ - for req in "" $$requires; do \ - ${TEST} "$$req" = "" && continue; \ - ${ECHO} "REQUIRES=$$req" >> ${BUILD_INFO_FILE}; \ - done -. endif - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${ECHO} "HOMEPAGE=${HOMEPAGE}" >> ${BUILD_INFO_FILE} - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${ECHO} "CATEGORIES=${CATEGORIES}" >> ${BUILD_INFO_FILE} - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${ECHO} "MAINTAINER=${MAINTAINER}" >> ${BUILD_INFO_FILE} - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${ECHO} "BUILD_DATE=${_BUILD_DATE}" >> ${BUILD_INFO_FILE} - ${_PKG_SILENT}${_PKG_DEBUG} \ - size_this=`${MAKE} ${MAKEFLAGS} print-pkg-size-this`; \ - size_depends=`${MAKE} ${MAKEFLAGS} print-pkg-size-depends`; \ - ${ECHO} $$size_this >${SIZE_PKG_FILE}; \ - ${ECHO} $$size_this $$size_depends \ - | ${AWK} '{ print $$1 + $$2; }' >${SIZE_ALL_FILE} -.endif - -# Fake installation of package so that user can pkg_delete it later. -# Also, make sure that an installed package is recognized correctly in -# accordance to the @pkgdep directive in the packing lists. -# -.PHONY: register-pkg -.if !target(register-pkg) -register-pkg: post-install-fake-pkg - ${_PKG_SILENT}${_PKG_DEBUG} \ - doit=yes; \ - case ${PKG_INSTALLATION_TYPE} in \ - overwrite) if [ -d ${_PKG_DBDIR}/${PKGNAME} ]; then \ - doit=no; \ - fi ;; \ - esac; \ - case $$doit in \ - yes) \ - ${ECHO_MSG} "${_PKGSRC_IN}> Registering installation for ${PKGNAME}"; \ - ${PKG_CREATE} ${PKG_ARGS_INSTALL} -O ${PKGFILE} > ${PKG_DB_TMPDIR}/+CONTENTS; \ - list="`${MAKE} ${MAKEFLAGS} run-depends-list ECHO_MSG=${TRUE} | ${SORT} -u`" ; \ - for realdep in `${ECHO} $$list | ${XARGS} -n 1 ${SETENV} ${PKG_BEST_EXISTS} | ${SORT} -u`; do \ - if ${TEST} -z "$$realdep"; then \ - ${ECHO} "$$dep not installed - dependency NOT registered" ; \ - elif [ -d ${_PKG_DBDIR}/$$realdep ]; then \ - if ${TEST} ! -f ${_PKG_DBDIR}/$$realdep/+REQUIRED_BY; then \ - ${TOUCH} ${_PKG_DBDIR}/$$realdep/+REQUIRED_BY; \ - fi; \ - ${AWK} 'BEGIN { found = 0; } \ - $$0 == "${PKGNAME}" { found = 1; } \ - { print $$0; } \ - END { if (!found) { printf("%s\n", "${PKGNAME}"); }}' \ - < ${_PKG_DBDIR}/$$realdep/+REQUIRED_BY > ${_PKG_DBDIR}/$$realdep/reqby.$$$$; \ - ${MV} ${_PKG_DBDIR}/$$realdep/reqby.$$$$ ${_PKG_DBDIR}/$$realdep/+REQUIRED_BY; \ - ${ECHO} "${PKGNAME} requires installed package $$realdep"; \ - fi; \ - done; \ - case ${PKG_INSTALLATION_TYPE} in \ - overwrite) ${RM} -rf ${_PKG_DBDIR}/${PKGNAME} ;; \ - esac; \ - ${MKDIR} ${_PKG_DBDIR}/${PKGNAME}; \ - ${CP} ${PKG_DB_TMPDIR}/+* ${_PKG_DBDIR}/${PKGNAME}; \ - if [ "${_AUTOMATIC}" = "YES" ]; then \ - ${PKG_ADMIN} set automatic=yes ${PKGNAME}; \ - fi; \ - ;; \ - esac -. if (${PKG_INSTALLATION_TYPE} == "pkgviews") && \ - !empty(BUILD_VIEWS:M[yY][eE][sS]) - ${_PKG_SILENT}${_PKG_DEBUG}${MAKE} ${MAKEFLAGS} build-views -. endif # pkgviews -.endif - -.PHONY: build-views -build-views: do-su-build-views - -.PHONY: do-su-build-views -do-su-build-views: - @${ECHO_MSG} "${_PKGSRC_IN}> Building views for ${PKGNAME}" - ${_PKG_SILENT}${_PKG_DEBUG} \ - realtarget="real-su-build-views"; \ - action="build-views"; \ - ${_SU_TARGET} - -.PHONY: real-su-build-views -.if !target(real-su-build-views) -real-su-build-views: -. if (${PKG_INSTALLATION_TYPE} == "pkgviews") && defined(PKGVIEWS) - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${MKDIR} ${LOCALBASE}; \ - for v in ${PKGVIEWS}; do \ - case "$$v" in \ - "") dbdir=${PKG_DBDIR}; viewname=standard ;; \ - *) dbdir=${LOCALBASE}/$$v/.dbdir; viewname=$$v ;; \ - esac; \ - ${ECHO} "=> Performing package view clash check for ${PKGNAME} in $$viewname view"; \ - pkg=`${PKG_INFO_CMD} -K $$dbdir -e ${PKGBASE} || ${TRUE}`; \ - case "$$pkg" in \ - "") ;; \ - *) ${ECHO} "*** ${PKGBASE} exists in $$viewname view - package $$pkg ***"; \ - ${ECHO} "*** Not hoisting ${PKGNAME} into $$viewname view"; \ - continue ;; \ - esac; \ - ${ECHO} "=> Performing package view overwrite check for ${PKGNAME} in $$viewname view"; \ - dups=`${SETENV} PLIST_IGNORE_FILES=${_PLIST_IGNORE_FILES:Q} ${PKG_VIEW} --view=$$v check ${PKGNAME} || ${TRUE}`; \ - case "$$dups" in \ - "") ;; \ - *) ${ECHO} "***********************************************************"; \ - ${ECHO} "**** The following symbolic links will be overwritten *****"; \ - for f in $$dups; do \ - ${LS} -l ${LOCALBASE}/$$v/$$f; \ - done; \ - ${ECHO} "***********************************************************"; \ - ;; \ - esac; \ - ${ECHO} "=> Linking package into $$viewname view"; \ - ${SETENV} PLIST_IGNORE_FILES=${_PLIST_IGNORE_FILES:Q} ${PKG_VIEW} --view=$$v add ${PKGNAME}; \ - done -. else - ${_PKG_SILENT}${_PKG_DEBUG}${DO_NADA} -. endif -.endif - -.PHONY: remove-views -remove-views: do-su-remove-views - -.PHONY: do-su-remove-views -do-su-remove-views: - @${ECHO_MSG} "${_PKGSRC_IN}> Removing ${PKGNAME} from views" - ${_PKG_SILENT}${_PKG_DEBUG} \ - realtarget="real-su-remove-views"; \ - action="remove-views"; \ - ${_SU_TARGET} - -.PHONY: real-su-remove-views -.if !target(real-su-remove-views) -real-su-remove-views: -. if (${PKG_INSTALLATION_TYPE} == "pkgviews") && defined(PKGVIEWS) - ${_PKG_SILENT}${_PKG_DEBUG} \ - for v in ${PKGVIEWS}; do \ - case "$$v" in \ - "") dbdir=${PKG_DBDIR}; viewname=standard ;; \ - *) dbdir=${LOCALBASE}/$$v/.dbdir; viewname=$$v ;; \ - esac; \ - ${ECHO} "=> Removing package from $$viewname view"; \ - ${SETENV} PLIST_IGNORE_FILES=${_PLIST_IGNORE_FILES:Q} ${PKG_VIEW} --view=$$v delete ${PKGNAME}; \ - done -.else - ${_PKG_SILENT}${_PKG_DEBUG}${DO_NADA} -. endif -.endif - # Depend is generally meaningless for arbitrary packages, but if someone wants # one they can override this. This is just to catch people who've gotten into # the habit of typing `${MAKE} depend all install' as a matter of course. @@ -3746,38 +2487,6 @@ depend: tags: .endif -# generate ${MESSAGE} from ${MESSAGE_SRC} by substituting -# for MESSAGE_SUBST entries - -.PHONY: message -message: ${MESSAGE} -.if defined(MESSAGE) -${MESSAGE}: ${MESSAGE_SRC} - ${_PKG_SILENT}${_PKG_DEBUG} \ - if [ -z "${MESSAGE_SRC}" ]; then \ - ${ECHO} "${MESSAGE_SRC} not found."; \ - ${ECHO} "Please set MESSAGE_SRC correctly."; \ - else \ - ${CAT} ${MESSAGE_SRC} | \ - ${SED} ${MESSAGE_SUBST_SED} \ - > ${MESSAGE}; \ - fi -.endif - -# generate ${DESCR} from ${DESCR_SRC} by: -# - Appending the homepage URL, if any - -.PHONY: descr -descr: ${DESCR} -${DESCR}: ${DESCR_SRC} - @${CAT} ${DESCR_SRC} >${DESCR} -.if defined(HOMEPAGE) - @\ - ${ECHO} >>${DESCR} ; \ - ${ECHO} "Homepage:" >>${DESCR} ; \ - ${ECHO} '${HOMEPAGE}' >>${DESCR} -.endif - .include "../../mk/plist/bsd.plist.mk" .include "../../mk/bsd.utils.mk" diff --git a/mk/bsd.pkg.update.mk b/mk/bsd.pkg.update.mk new file mode 100644 index 00000000000..4971da75eb9 --- /dev/null +++ b/mk/bsd.pkg.update.mk @@ -0,0 +1,127 @@ +# $NetBSD: bsd.pkg.update.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +# This Makefile fragment is included by bsd.pkg.mk and contains the targets +# and variables for "make update". +# +# There is no documentation on what "update" actually does. This is merely +# an attempt to separate the magic into a separate module that can be +# reimplemented later. +# + +# The 'update' target can be used to update a package and all +# currently installed packages that depend upon this package. + +_DDIR= ${WRKDIR}/.DDIR +_DLIST= ${WRKDIR}/.DLIST + +.PHONY: update +.if !target(update) +.if exists(${_DDIR}) +RESUMEUPDATE?= YES +CLEAR_DIRLIST?= NO + +update: + ${_PKG_SILENT}${_PKG_DEBUG}${ECHO_MSG} \ + "${_PKGSRC_IN}> Resuming update for ${PKGNAME}" +. if ${REINSTALL} != "NO" && ${UPDATE_TARGET} != "replace" + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${MAKE} ${MAKEFLAGS} deinstall UPDATE_RUNNING=YES DEINSTALLDEPENDS=ALL +. endif +.else +RESUMEUPDATE?= NO +CLEAR_DIRLIST?= YES + +update: + ${_PKG_SILENT}${_PKG_DEBUG}${MAKE} ${MAKEFLAGS} ${_DDIR} +. if ${UPDATE_TARGET} != "replace" + ${_PKG_SILENT}${_PKG_DEBUG}if ${PKG_INFO} -qe ${PKGBASE}; then \ + ${MAKE} ${MAKEFLAGS} deinstall UPDATE_RUNNING=YES DEINSTALLDEPENDS=ALL \ + || (${RM} ${_DDIR} && ${FALSE}); \ + fi +. endif +.endif + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${MAKE} ${MAKEFLAGS} ${UPDATE_TARGET} KEEP_WRKDIR=YES \ + DEPENDS_TARGET=${DEPENDS_TARGET:Q} + ${_PKG_SILENT}${_PKG_DEBUG} \ + [ ! -s ${_DDIR} ] || for dep in `${CAT} ${_DDIR}` ; do \ + (if cd ../.. && cd "$${dep}" ; then \ + ${ECHO_MSG} "${_PKGSRC_IN}> Installing in $${dep}" && \ + if [ "(" "${RESUMEUPDATE}" = "NO" -o \ + "${REINSTALL}" != "NO" ")" -a \ + "${UPDATE_TARGET}" != "replace" ] ; then \ + ${MAKE} ${MAKEFLAGS} deinstall UPDATE_RUNNING=YES; \ + fi && \ + ${MAKE} ${MAKEFLAGS} ${UPDATE_TARGET} \ + DEPENDS_TARGET=${DEPENDS_TARGET:Q} ; \ + else \ + ${ECHO_MSG} "${_PKGSRC_IN}> Skipping removed directory $${dep}"; \ + fi) ; \ + done +.if ${NOCLEAN} == "NO" + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${MAKE} ${MAKEFLAGS} clean-update CLEAR_DIRLIST=YES +.endif + + +.PHONY: clean-update +clean-update: + ${_PKG_SILENT}${_PKG_DEBUG}${MAKE} ${MAKEFLAGS} ${_DDIR} + ${_PKG_SILENT}${_PKG_DEBUG} \ + if [ -s ${_DDIR} ] ; then \ + for dep in `${CAT} ${_DDIR}` ; do \ + (if cd ../.. && cd "$${dep}" ; then \ + ${MAKE} ${MAKEFLAGS} clean ; \ + else \ + ${ECHO_MSG} "${_PKGSRC_IN}> Skipping removed directory $${dep}";\ + fi) ; \ + done ; \ + fi +.if ${CLEAR_DIRLIST} != "NO" + ${_PKG_SILENT}${_PKG_DEBUG}${MAKE} ${MAKEFLAGS} clean +.else + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${MAKE} ${MAKEFLAGS} clean update-dirlist \ + DIRLIST="`${CAT} ${_DDIR}`" PKGLIST="`${CAT} ${_DLIST}`" + ${_PKG_SILENT}${_PKG_DEBUG}${ECHO_MSG} \ + "${_PKGSRC_IN}> Warning: preserved leftover directory list. Your next";\ + ${ECHO_MSG} "${_PKGSRC_IN}> \`\`${MAKE} update'' may fail. It is advised to use";\ + ${ECHO_MSG} "${_PKGSRC_IN}> \`\`${MAKE} update REINSTALL=YES'' instead!" +.endif + +.endif # !target(update) + + +.PHONY: update-dirlist +update-dirlist: + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} -p ${WRKDIR} +.if defined(PKGLIST) +. for __tmp__ in ${PKGLIST} + ${_PKG_SILENT}${_PKG_DEBUG}${ECHO} >>${_DLIST} "${__tmp__}" +. endfor +.endif +.if defined(DIRLIST) +. for __tmp__ in ${DIRLIST} + ${_PKG_SILENT}${_PKG_DEBUG}${ECHO} >>${_DDIR} "${__tmp__}" +. endfor +.endif + + +${_DDIR}: ${_DLIST} + ${_PKG_SILENT}${_PKG_DEBUG} \ + ddir=`${SED} 's:-[^-]*$$::' ${_DLIST}`; \ + ${ECHO} >${_DDIR}; \ + for pkg in $${ddir} ; do \ + if ${PKG_INFO} -b "$${pkg}" >/dev/null 2>&1 ; then \ + ${PKG_INFO} -b "$${pkg}" | ${SED} -ne \ + 's,\([^/]*/[^/]*\)/Makefile:.*,\1,p' | \ + ${HEAD} -1 >>${_DDIR}; \ + fi ; \ + done + +${_DLIST}: ${WRKDIR} + ${_PKG_SILENT}${_PKG_DEBUG} \ + { ${PKG_DELETE} -n "${PKGWILDCARD}" 2>&1 | \ + ${GREP} '^ ' | \ + ${AWK} '{ l[NR]=$$0 } END { for (i=NR;i>0;--i) print l[i] }' \ + || ${TRUE}; } > ${_DLIST} diff --git a/mk/bsd.pkg.use.mk b/mk/bsd.pkg.use.mk index 08a2ce4e860..787471604b5 100644 --- a/mk/bsd.pkg.use.mk +++ b/mk/bsd.pkg.use.mk @@ -1,4 +1,4 @@ -# $NetBSD: bsd.pkg.use.mk,v 1.33 2006/05/25 11:00:39 wiz Exp $ +# $NetBSD: bsd.pkg.use.mk,v 1.34 2006/06/03 23:11:42 jlam Exp $ # # Turn USE_* macros into proper depedency logic. Included near the top of # bsd.pkg.mk, after bsd.prefs.mk. @@ -26,7 +26,6 @@ PLIST_SUBST+= IMAKE_MANNEWSUFFIX=${IMAKE_MANNEWSUFFIX:Q} .if defined(USE_IMAKE) USE_X11BASE?= implied -INSTALL_TARGET+= ${NO_INSTALL_MANPAGES:D:Uinstall.man} MAKE_FLAGS+= CC=${CC:Q} CXX=${CXX:Q} .endif @@ -37,7 +36,6 @@ MTREE_FILE?= ${PKGSRCDIR}/mk/platform/${OPSYS}.x11.dist .if ${PKG_INSTALLATION_TYPE} == "pkgviews" PREFIX= ${DEPOTBASE}/${PKGNAME} -NO_MTREE= yes .elif ${PKG_INSTALLATION_TYPE} == "overwrite" . if defined(INSTALLATION_PREFIX) PREFIX= ${INSTALLATION_PREFIX} @@ -45,7 +43,6 @@ PREFIX= ${INSTALLATION_PREFIX} PREFIX= ${X11PREFIX} . elif defined(USE_CROSSBASE) PREFIX= ${CROSSBASE} -NO_MTREE= yes . else PREFIX= ${LOCALBASE} . endif diff --git a/mk/bsd.prefs.mk b/mk/bsd.prefs.mk index 8ba57d28614..112c663759e 100644 --- a/mk/bsd.prefs.mk +++ b/mk/bsd.prefs.mk @@ -1,4 +1,4 @@ -# $NetBSD: bsd.prefs.mk,v 1.220 2006/03/08 01:56:46 minskim Exp $ +# $NetBSD: bsd.prefs.mk,v 1.221 2006/06/03 23:11:42 jlam Exp $ # # Make file, included to get the site preferences, if any. Should # only be included by package Makefiles before any .if defined() @@ -486,63 +486,6 @@ DIGEST_VERSION!= ${DIGEST} -V 2>/dev/null MAKEFLAGS+= DIGEST_VERSION=${DIGEST_VERSION:Q} .endif -# This is the package database directory for the default view. -PKG_DBDIR?= ${DESTDIR}/var/db/pkg - -# _PKG_DBDIR is the actual packages database directory where we register -# packages. -# -.if ${PKG_INSTALLATION_TYPE} == "overwrite" -_PKG_DBDIR= ${PKG_DBDIR} -.elif ${PKG_INSTALLATION_TYPE} == "pkgviews" -_PKG_DBDIR= ${DEPOTBASE} -.endif - -PKG_ADD_CMD?= ${PKG_TOOLS_BIN}/pkg_add -PKG_ADMIN_CMD?= ${PKG_TOOLS_BIN}/pkg_admin -PKG_CREATE_CMD?= ${PKG_TOOLS_BIN}/pkg_create -PKG_DELETE_CMD?= ${PKG_TOOLS_BIN}/pkg_delete -PKG_INFO_CMD?= ${PKG_TOOLS_BIN}/pkg_info -PKG_VIEW_CMD?= ${PKG_TOOLS_BIN}/pkg_view -LINKFARM_CMD?= ${PKG_TOOLS_BIN}/linkfarm - -.if !defined(PKGTOOLS_VERSION) -PKGTOOLS_VERSION!= ${PKG_INFO_CMD} -V 2>/dev/null || echo 20010302 -MAKEFLAGS+= PKGTOOLS_VERSION=${PKGTOOLS_VERSION:Q} -.endif - -# The binary pkg_install tools all need to consistently to refer to the -# correct package database directory. -# -.if ${PKGTOOLS_VERSION} < 20030823 -PKGTOOLS_ENV?= PKG_DBDIR=${_PKG_DBDIR:Q} -PKGTOOLS_ARGS?= # empty -.else -PKGTOOLS_ENV?= # empty -PKGTOOLS_ARGS?= -K ${_PKG_DBDIR:Q} -.endif - -# Views are rooted in ${LOCALBASE}, all packages are depoted in -# ${DEPOTBASE}, and the package database directory for the default view -# is in ${PKG_DBDIR}. -# -PKG_VIEW_ARGS?= -W ${LOCALBASE} -d ${DEPOTBASE} -k ${PKG_DBDIR} - -PKG_ADD?= ${SETENV} ${PKGTOOLS_ENV} ${PKG_ADD_CMD} ${PKGTOOLS_ARGS} -PKG_ADMIN?= ${SETENV} ${PKGTOOLS_ENV} ${PKG_ADMIN_CMD} ${PKGTOOLS_ARGS} -PKG_CREATE?= ${SETENV} ${PKGTOOLS_ENV} ${PKG_CREATE_CMD} ${PKGTOOLS_ARGS} -PKG_DELETE?= ${SETENV} ${PKGTOOLS_ENV} ${PKG_DELETE_CMD} ${PKGTOOLS_ARGS} -PKG_INFO?= ${SETENV} ${PKGTOOLS_ENV} ${PKG_INFO_CMD} ${PKGTOOLS_ARGS} -PKG_VIEW?= ${SETENV} ${PKGTOOLS_ENV} ${PKG_VIEW_CMD} ${PKG_VIEW_ARGS} -LINKFARM?= ${LINKFARM_CMD} - -# "${PKG_BEST_EXISTS} pkgpattern" prints out the name of the installed -# package that best matches pkgpattern. Use this instead of -# "${PKG_INFO} -e pkgpattern" if the latter would return more than one -# package name. -# -PKG_BEST_EXISTS?= ${PKG_ADMIN} -b -d ${_PKG_DBDIR} -S lsbest - .if exists(${LOCALBASE}/bsd/share/mk/zoularis.mk) PKG_FAIL_REASON+= 'You appear to have a deprecated Zoularis installation.' PKG_FAIL_REASON+= 'Please update your system to bootstrap-pkgsrc and remove the' @@ -612,6 +555,11 @@ PREPEND_PATH+= ${USE_X11:D${X11BASE}/bin} ${LOCALBASE}/bin # Make variable definitions cache .include "${PKGSRCDIR}/mk/bsd.makevars.mk" +.include "${PKGSRCDIR}/mk/flavor/bsd.flavor-vars.mk" +.include "${PKGSRCDIR}/mk/check/bsd.check-vars.mk" +.include "${PKGSRCDIR}/mk/depends/bsd.depends-vars.mk" +.include "${PKGSRCDIR}/mk/install/bsd.install-vars.mk" + USE_TOOLS+= awk:pkgsrc cut:pkgsrc echo:pkgsrc pwd:pkgsrc \ sed:pkgsrc tr:pkgsrc uname:pkgsrc diff --git a/mk/check/bsd.check-vars.mk b/mk/check/bsd.check-vars.mk new file mode 100644 index 00000000000..2d804076f3a --- /dev/null +++ b/mk/check/bsd.check-vars.mk @@ -0,0 +1,10 @@ +# $NetBSD: bsd.check-vars.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +# This Makefile fragment is included by bsd.prefs.mk and defines some +# variables which must be defined earlier than where bsd.check.mk +# is included. +# + +CHECK_SHLIBS_SUPPORTED?= yes + +USE_TOOLS+= awk cat cmp diff echo find grep rm sed test touch true diff --git a/mk/check/bsd.check.mk b/mk/check/bsd.check.mk new file mode 100644 index 00000000000..37bca2bed74 --- /dev/null +++ b/mk/check/bsd.check.mk @@ -0,0 +1,16 @@ +# $NetBSD: bsd.check.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +# This Makefile fragment is included by bsd.pkg.mk and provides all +# variables and targets related to build and install checks. +# +# The following are the "public" targets provided this module: +# +# check-files-pre, check-files-post, check-files +# check-interpreter, check-shlibs, check-vulnerable, check-wrkref +# + +.include "${PKGSRCDIR}/mk/check/check-files.mk" +.include "${PKGSRCDIR}/mk/check/check-interpreter.mk" +.include "${PKGSRCDIR}/mk/check/check-shlibs.mk" +.include "${PKGSRCDIR}/mk/check/check-vulnerable.mk" +.include "${PKGSRCDIR}/mk/check/check-wrkref.mk" diff --git a/mk/bsd.pkg.check.mk b/mk/check/check-files.mk index 19fb74708ac..7d11838c4b3 100644 --- a/mk/bsd.pkg.check.mk +++ b/mk/check/check-files.mk @@ -1,72 +1,11 @@ -# $NetBSD: bsd.pkg.check.mk,v 1.35 2006/05/22 22:22:02 jlam Exp $ -# -# This Makefile fragment is included by bsd.pkg.mk and defines the -# relevant variables and targets for the various install-time "check" -# targets. -# -# The following variables may be set by the user and control which -# checks are run: -# -# CHECK_FILES causes the extra or missing file checks to be run if -# it is any value other than "no". Defaults to "no". -# -# CHECK_FILES_STRICT makes the file checks very strict on errors if -# it is any value other than "no". Defaults to "no". -# -# CHECK_SHLIBS checks that all shared libraries that are used by -# binaries and shared libraries within the package can be found -# at run-time. Defaults to "no". -# -# CHECK_WRKREF is a list of options that trigger the checks for -# ${WRKDIR} or ${TOOLS_DIR} in the package's installed files. -# Valid values are "work", which checks for ${WRKDIR}, and -# "tools", which checks for ${TOOLS_DIR}. Defaults to "no". -# -# CHECK_INTERPRETER can be set to "yes" to check that installed -# #!-scripts will find their interpreter. -# -# The following variables may be set by a package and control which -# checks can be run: -# -# CHECK_SHLIBS_SUPPORTED notes whether the package supports running -# the check-shlibs target. Defaults to "yes", but is often set -# to "no" for syscall-emulation packages. -# -# The following targets are defined by bsd.pkg.check.mk: -# -# check-files-pre & check-files-post generate the list of files on the -# filesystem just before and just after the package's files are -# installed. -# -# check-files compares the "pre" and "post" file lists to determine -# if there are any extra or missing files installed by the -# package. -# -# check-wrkref checks whether a package's installed files contain -# references to ${WRKDIR}. -# -# check-interpreter checks whether a script's interpreter exists. -# +# $NetBSD: check-files.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ -# For PKG_DEVELOPERs, cause some checks to be run automatically by default. .if defined(PKG_DEVELOPER) CHECK_FILES?= yes -CHECK_WRKREF?= tools -CHECK_SHLIBS?= yes .endif CHECK_FILES?= no CHECK_FILES_STRICT?= no -CHECK_WRKREF?= no -CHECK_SHLIBS?= no -CHECK_INTERPRETER?= no - -USE_TOOLS+= awk cat cmp diff echo find grep rm sed test \ - touch true - -########################################################################### -### check-files ########################################################### -########################################################################### ########################################################################### # CHECK_FILES_SKIP is a list of file names that will be skipped when @@ -184,9 +123,6 @@ _CHECK_FILES_POST+= ${_CHECK_FILES_POST.varbase} ########################################################################### # check-files-pre and check-files-post targets and subtargets # -.ORDER: ${_CHECK_FILES_PRE} -.ORDER: ${_CHECK_FILES_POST} - .PHONY: check-files-pre check-files-post check-files-pre: ${_CHECK_FILES_PRE} check-files-post: ${_CHECK_FILES_POST} @@ -229,8 +165,6 @@ check-files-prefix: ${_CHECK_FILES_COOKIE.prefix} check-files-sysconfdir: ${_CHECK_FILES_COOKIE.sysconfdir} check-files-varbase: ${_CHECK_FILES_COOKIE.varbase} -.ORDER: ${_CHECK_FILES_COOKIES} - # The check-files target looks at the cookie files generated by the # check-files-* subtargets, and if they are non-empty, then they # contain the error messages collected during the build of each @@ -257,13 +191,13 @@ ${_CHECK_FILES_COOKIE.prefix}: then \ { exit 0; }; \ fi; \ - f_added=${WRKDIR:Q}/.files.added; \ - f_deleted=${WRKDIR:Q}/.files.deleted; \ - f_expected=${WRKDIR:Q}/.files.expected; \ - f_missing=${WRKDIR:Q}/.files.missing; \ - f_missing_real=${WRKDIR:Q}/.files.missing.real; \ - f_missing_skip=${WRKDIR:Q}/.files.missing.skip; \ - f_extra=${WRKDIR:Q}/.files.extra; \ + f_added=${WRKDIR}/.files.added; \ + f_deleted=${WRKDIR}/.files.deleted; \ + f_expected=${WRKDIR}/.files.expected; \ + f_missing=${WRKDIR}/.files.missing; \ + f_missing_real=${WRKDIR}/.files.missing.real; \ + f_missing_skip=${WRKDIR}/.files.missing.skip; \ + f_extra=${WRKDIR}/.files.extra; \ ${DIFF} -u ${_CHECK_FILES_PRE.prefix} ${_CHECK_FILES_POST.prefix} \ > ${WRKDIR}/.files.diff || ${TRUE}; \ ${GREP} '^+/' ${WRKDIR}/.files.diff | ${SED} "s|^+||" | ${SORT} \ @@ -368,159 +302,12 @@ ${_CHECK_FILES_COOKIE.varbase}: ${_PKG_SILENT}${_PKG_DEBUG}${TOUCH} ${TOUCH_FLAGS} ${.TARGET} ########################################################################### -### check-wrkref ########################################################## -########################################################################### - -########################################################################### -# CHECK_WRKREF_SKIP is a list of shell globs. Installed files that -# match these globs are skipped when running the check-wrkref target. +# check-files-clean removes the state files related to the "check-files" +# target so that the check-files-{pre,post} targets may be re-run. # -.if make(check-wrkref) -. if !defined(_CHECK_WRKREF_SKIP_FILTER) -_CHECK_WRKREF_SKIP_FILTER= ${TRUE} -. if defined(CHECK_WRKREF_SKIP) && !empty(CHECK_WRKREF_SKIP) -_CHECK_WRKREF_SKIP_FILTER= case "$$file" in -. for _pattern_ in ${CHECK_WRKREF_SKIP} -_CHECK_WRKREF_SKIP_FILTER+= ${_pattern_}) continue ;; -. endfor -_CHECK_WRKREF_SKIP_FILTER+= *) ;; -_CHECK_WRKREF_SKIP_FILTER+= esac -. endif -. endif -MAKEVARS+= _CHECK_WRKREF_SKIP_FILTER -.else -_CHECK_WRKREF_SKIP_FILTER= ${TRUE} -.endif - -_CHECK_WRKREF:= ${CHECK_WRKREF} -.if !empty(_CHECK_WRKREF:Mwork) -_CHECK_WRKREF:= work # "work" is the "max" option -.endif - -########################################################################### -# check-wrkref target -# -.PHONY: check-wrkref -check-wrkref: -.if !defined(NO_PKG_REGISTER) - ${_PKG_SILENT}${_PKG_DEBUG}${STEP_MSG} \ - "Checking for work-directory references in ${PKGNAME}" - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${PKG_INFO} -qL ${PKGNAME:Q} | ${SORT} | \ - { while read file; do \ - ${_CHECK_WRKREF_SKIP_FILTER}; \ - ${SHCOMMENT} [$$file]; \ - case ${_CHECK_WRKREF:Mwork:Q}"" in \ - work) \ - if ${GREP} -H ${WRKDIR:Q} "$$file" 2>/dev/null; then \ - found=1; \ - fi; \ - ;; \ - esac; \ - case ${_CHECK_WRKREF:Mtools:Q}"" in \ - tools) \ - if ${GREP} -H ${TOOLS_DIR:Q} "$$file" 2>/dev/null; then \ - found=1; \ - fi; \ - ;; \ - esac; \ - done; \ - if ${TEST} "$$found" = 1; then \ - ${ECHO} "***"; \ - ${ECHO} "*** The above files still have references to the build directory."; \ - ${ECHO} "*** This is possibly an error that should be fixed by unwrapping"; \ - ${ECHO} "*** the files or adding missing tools to the package makefile!"; \ - ${ECHO} "***"; \ - exit 1; \ - fi; } -.endif - -########################################################################### -### check-interpreter ##################################################### -########################################################################### - -########################################################################### -# CHECK_INTERPRETER_SKIP is a list of shell globs. Installed files that -# match these globs are skipped when running the check-interpreter target. -# -CHECK_INTERPRETER_SKIP?= # empty - -_CHECK_INTERP_SKIP_FILTER= case $$file in -.for _pattern_ in ${CHECK_INTERPRETER_SKIP} -_CHECK_INTERP_SKIP_FILTER+= ${PREFIX:Q}/${_pattern_}|${_pattern_}) continue ;; -.endfor -_CHECK_INTERP_SKIP_FILTER+= *) ;; -_CHECK_INTERP_SKIP_FILTER+= esac - -########################################################################### -# check-interpreter target -# -.PHONY: check-interpreter -check-interpreter: - ${_PKG_SILENT}${_PKG_DEBUG}${STEP_MSG} \ - "Checking for non-existent script interpreters in ${PKGNAME}" - ${_PKG_SILENT}${_PKG_DEBUG} \ - ${PKG_INFO} -qL ${PKGNAME:Q} | ${SORT} | ${SED} 's,\\,\\\\,g' | \ - { exitcode=0; \ - while read file; do \ - ${_CHECK_INTERP_SKIP_FILTER}; \ - ${SHCOMMENT} "[$$file]"; \ - interp=`${SED} -n -e '1s/^#! *\([^ ]*\).*/\1/p' -e '2q' < "$$file"` \ - || { ${ECHO} "[bsd.pkg.check.mk] WARNING: sed(1) failed for \"$$file\"." 1>&2; \ - continue; \ - }; \ - case $$interp in \ - "") continue; \ - esac; \ - if ${TEST} ! -f "$$interp"; then \ - if ${TEST} -x "$$file"; then \ - ${ECHO} "[bsd.pkg.check.mk] ERROR: The interpreter \"$$interp\" of \"$$file\" does not exist." 1>&2; \ - exitcode=1; \ - else \ - ${ECHO} "[bsd.pkg.check.mk] WARNING: The interpreter \"$$interp\" of \"$$file\" does not exist." 1>&2; \ - fi; \ - fi; \ - done; \ - exit $$exitcode; } - -########################################################################### -### check-shlibs ########################################################## -########################################################################### - -# All binaries and shared libraries. -_CHECK_SHLIBS_ERE= /(bin/|sbin/|libexec/|lib/lib.*\.so|lib/lib.*\.dylib) - -CHECK_SHLIBS_SUPPORTED?= yes - -########################################################################### -# check-shlibs target -# -.PHONY: check-shlibs -check-shlibs: -.if !empty(CHECK_SHLIBS_SUPPORTED:M[yY][eE][sS]) && !defined(NO_PKG_REGISTER) - ${_PKG_SILENT}${_PKG_DEBUG}${STEP_MSG} \ - "Checking for missing run-time search paths in ${PKGNAME}" +.PHONY: check-files-clean +check-clean: check-files-clean +check-files-clean: ${_PKG_SILENT}${_PKG_DEBUG} \ - case ${LDD:Q}"" in \ - "") ldd=`${TYPE} ldd 2>/dev/null | ${AWK} '{ print $$NF }'` ;; \ - *) ldd=${LDD:Q} ;; \ - esac; \ - ${TEST} -x "$$ldd" || exit 0; \ - ${PKG_INFO} -qL ${PKGNAME} | \ - { ${EGREP} -h ${_CHECK_SHLIBS_ERE:Q} || ${TRUE}; } | \ - { while read file; do \ - ${TEST} -z ${PKG_VERBOSE:Q}"" || ${ECHO} "$$ldd $$file"; \ - err=`{ $$ldd $$file 2>&1 || ${TRUE}; } | { ${GREP} "not found" || ${TRUE}; }`; \ - if ${TEST} -n "$$err"; then \ - ${ECHO} "$$file: $$err"; \ - error=1; \ - fi; \ - done; \ - if ${TEST} "$$error" = 1; then \ - ${ECHO} "*** The above programs/libs will not find the listed shared libraries"; \ - ${ECHO} " at runtime. Please fix the package (add -Wl,-R.../lib in the right"; \ - ${ECHO} " places)!"; \ - ${SHCOMMENT} Might not error-out for non-pkg-developers; \ - exit 1; \ - fi; } -.endif + ${RM} -f ${_CHECK_FILES_COOKIES} \ + ${_CHECK_FILES_PRE} ${_CHECK_FILES_POST} diff --git a/mk/check/check-interpreter.mk b/mk/check/check-interpreter.mk new file mode 100644 index 00000000000..6c8bf28a2fc --- /dev/null +++ b/mk/check/check-interpreter.mk @@ -0,0 +1,47 @@ +# $NetBSD: check-interpreter.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +CHECK_INTERPRETER?= no + +########################################################################### +# CHECK_INTERPRETER_SKIP is a list of shell globs. Installed files that +# match these globs are skipped when running the check-interpreter target. +# +CHECK_INTERPRETER_SKIP?= # empty + +_CHECK_INTERP_SKIP_FILTER= case $$file in +.for _pattern_ in ${CHECK_INTERPRETER_SKIP} +_CHECK_INTERP_SKIP_FILTER+= ${PREFIX}/${_pattern_}|${_pattern_}) continue ;; +.endfor +_CHECK_INTERP_SKIP_FILTER+= *) ;; +_CHECK_INTERP_SKIP_FILTER+= esac + +########################################################################### +# check-interpreter target +# +.PHONY: check-interpreter +check-interpreter: + ${_PKG_SILENT}${_PKG_DEBUG}${STEP_MSG} \ + "Checking for non-existent script interpreters in ${PKGNAME}" + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${PKG_FILELIST_CMD} | ${SORT} | ${SED} 's,\\,\\\\,g' | \ + { exitcode=0; \ + while read file; do \ + ${_CHECK_INTERP_SKIP_FILTER}; \ + ${SHCOMMENT} "[$$file]"; \ + interp=`${SED} -n -e '1s/^#! *\([^ ]*\).*/\1/p' -e '2q' < "$$file"` \ + || { ${ECHO} "[check-interpreter.mk] WARNING: sed(1) failed for \"$$file\"." 1>&2; \ + continue; \ + }; \ + case $$interp in \ + "") continue; \ + esac; \ + if ${TEST} ! -f "$$interp"; then \ + if ${TEST} -x "$$file"; then \ + ${ECHO} "[check-interpreter.mk] ERROR: The interpreter \"$$interp\" of \"$$file\" does not exist." 1>&2; \ + exitcode=1; \ + else \ + ${ECHO} "[check-interpreter.mk] WARNING: The interpreter \"$$interp\" of \"$$file\" does not exist." 1>&2; \ + fi; \ + fi; \ + done; \ + exit $$exitcode; } diff --git a/mk/check/check-shlibs.mk b/mk/check/check-shlibs.mk new file mode 100644 index 00000000000..bbeb6d4119f --- /dev/null +++ b/mk/check/check-shlibs.mk @@ -0,0 +1,43 @@ +# $NetBSD: check-shlibs.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +# For PKG_DEVELOPERs, cause some checks to be run automatically by default. +.if defined(PKG_DEVELOPER) +CHECK_SHLIBS?= yes +.endif +CHECK_SHLIBS?= no + +# All binaries and shared libraries. +_CHECK_SHLIBS_ERE= /(bin/|sbin/|libexec/|lib/lib.*\.so|lib/lib.*\.dylib) + +########################################################################### +# check-shlibs target +# +.PHONY: check-shlibs +check-shlibs: +.if !empty(CHECK_SHLIBS_SUPPORTED:M[yY][eE][sS]) && !defined(NO_PKG_REGISTER) + ${_PKG_SILENT}${_PKG_DEBUG}${STEP_MSG} \ + "Checking for missing run-time search paths in ${PKGNAME}" + ${_PKG_SILENT}${_PKG_DEBUG} \ + case ${LDD:Q}"" in \ + "") ldd=`${TYPE} ldd 2>/dev/null | ${AWK} '{ print $$NF }'` ;; \ + *) ldd=${LDD:Q} ;; \ + esac; \ + ${TEST} -x "$$ldd" || exit 0; \ + ${PKG_FILELIST_CMD} | \ + { ${EGREP} -h ${_CHECK_SHLIBS_ERE:Q} || ${TRUE}; } | \ + { while read file; do \ + ${TEST} -z ${PKG_VERBOSE:Q}"" || ${ECHO} "$$ldd $$file"; \ + err=`{ $$ldd $$file 2>&1 || ${TRUE}; } | { ${GREP} "not found" || ${TRUE}; }`; \ + if ${TEST} -n "$$err"; then \ + ${ECHO} "$$file: $$err"; \ + error=1; \ + fi; \ + done; \ + if ${TEST} "$$error" = 1; then \ + ${ECHO} "*** The above programs/libs will not find the listed shared libraries"; \ + ${ECHO} " at runtime. Please fix the package (add -Wl,-R.../lib in the right"; \ + ${ECHO} " places)!"; \ + ${SHCOMMENT} Might not error-out for non-pkg-developers; \ + exit 1; \ + fi; } +.endif diff --git a/mk/check/check-vulnerable.mk b/mk/check/check-vulnerable.mk new file mode 100644 index 00000000000..ca4425d5250 --- /dev/null +++ b/mk/check/check-vulnerable.mk @@ -0,0 +1,11 @@ +# $NetBSD: check-vulnerable.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +########################################################################### +# check-vulnerable checks for vulnerabilities in the package. This should +# be overridden per package system flavor. +# +.PHONY: check-vulnerable +.if !target(check-vulnerable) +check-vulnerable: + @${ECHO_MSG} "${_PKGSRC_IN} *** Skipping vulnerability checks." +.endif diff --git a/mk/check/check-wrkref.mk b/mk/check/check-wrkref.mk new file mode 100644 index 00000000000..51d93e43148 --- /dev/null +++ b/mk/check/check-wrkref.mk @@ -0,0 +1,70 @@ +# $NetBSD: check-wrkref.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +.if defined(PKG_DEVELOPER) +CHECK_WRKREF?= tools +.endif +CHECK_WRKREF?= no + +########################################################################### +# CHECK_WRKREF_SKIP is a list of shell globs. Installed files that +# match these globs are skipped when running the check-wrkref target. +# +.if make(check-wrkref) +. if !defined(_CHECK_WRKREF_SKIP_FILTER) +_CHECK_WRKREF_SKIP_FILTER= ${TRUE} +. if defined(CHECK_WRKREF_SKIP) && !empty(CHECK_WRKREF_SKIP) +_CHECK_WRKREF_SKIP_FILTER= case "$$file" in +. for _pattern_ in ${CHECK_WRKREF_SKIP} +_CHECK_WRKREF_SKIP_FILTER+= ${_pattern_}) continue ;; +. endfor +_CHECK_WRKREF_SKIP_FILTER+= *) ;; +_CHECK_WRKREF_SKIP_FILTER+= esac +. endif +. endif +MAKEVARS+= _CHECK_WRKREF_SKIP_FILTER +.else +_CHECK_WRKREF_SKIP_FILTER= ${TRUE} +.endif + +_CHECK_WRKREF:= ${CHECK_WRKREF} +.if !empty(_CHECK_WRKREF:Mwork) +_CHECK_WRKREF:= work # "work" is the "max" option +.endif + +########################################################################### +# check-wrkref target +# +.PHONY: check-wrkref +check-wrkref: +.if !defined(NO_PKG_REGISTER) + ${_PKG_SILENT}${_PKG_DEBUG}${STEP_MSG} \ + "Checking for work-directory references in ${PKGNAME}" + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${PKG_FILELIST_CMD} | ${SORT} | \ + { while read file; do \ + ${_CHECK_WRKREF_SKIP_FILTER}; \ + ${SHCOMMENT} [$$file]; \ + case ${_CHECK_WRKREF:Mwork:Q}"" in \ + work) \ + if ${GREP} -H ${WRKDIR} "$$file" 2>/dev/null; then \ + found=1; \ + fi; \ + ;; \ + esac; \ + case ${_CHECK_WRKREF:Mtools:Q}"" in \ + tools) \ + if ${GREP} -H ${TOOLS_DIR} "$$file" 2>/dev/null; then \ + found=1; \ + fi; \ + ;; \ + esac; \ + done; \ + if ${TEST} "$$found" = 1; then \ + ${ECHO} "***"; \ + ${ECHO} "*** The above files still have references to the build directory."; \ + ${ECHO} "*** This is possibly an error that should be fixed by unwrapping"; \ + ${ECHO} "*** the files or adding missing tools to the package makefile!"; \ + ${ECHO} "***"; \ + exit 1; \ + fi; } +.endif diff --git a/mk/depends/bsd.depends-vars.mk b/mk/depends/bsd.depends-vars.mk new file mode 100644 index 00000000000..0807b387eb8 --- /dev/null +++ b/mk/depends/bsd.depends-vars.mk @@ -0,0 +1,8 @@ +# $NetBSD: bsd.depends-vars.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +# This Makefile fragment is included by bsd.prefs.mk and defines some +# variables which must be defined earlier than where bsd.depends.mk +# is included. +# + +_DEPENDS_COOKIE= ${WRKDIR}/.depends_done diff --git a/mk/depends/bsd.depends.mk b/mk/depends/bsd.depends.mk new file mode 100644 index 00000000000..a660d161527 --- /dev/null +++ b/mk/depends/bsd.depends.mk @@ -0,0 +1,60 @@ +# $NetBSD: bsd.depends.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +# This Makefile fragment is included by bsd.pkg.mk and provides all +# variables and targets related to dependencies. +# +# The following are the "public" targets provided by this module: +# +# depends, install-depends +# + +_DEPENDS_COOKIE= ${WRKDIR}/.depends_done + +###################################################################### +### depends (PUBLIC) +###################################################################### +### depends is a public target to install missing dependencies for +### the package. +### +.PHONY: depends +.if defined(NO_DEPENDS) +depends: depends-cookie +.else +. include "${PKGSRCDIR}/mk/depends/depends.mk" +.endif + +###################################################################### +### install-depends (PUBLIC) +###################################################################### +### install-depends is a convenience target that installs all dependencies +### and removes the cookie file afterwards, so that the state of the +### filesystem remains unchanged. +### +### XXX This target is probably not needed and might be removed. +### +.PHONY: install-depends +install-depends: depends depends-clean + +###################################################################### +### depends-clean (PRIVATE) +###################################################################### +### depends-clean removes the state files associated with the "depends" +### target so that "depends" may be re-invoked. +### +depends-clean: + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${_DEPENDS_COOKIE} + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${RMDIR} -p ${_DEPENDS_COOKIE:H} 2>/dev/null || ${TRUE} + +###################################################################### +### depends-cookie (PRIVATE, override) +###################################################################### +### depends-cookie creates the depends "cookie" state file. This should +### be overridden per package system flavor. +### +.if !target(depends-cookie) +.PHONY: depends-cookie +depends-cookie: + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${_DEPENDS_COOKIE:H} + ${_PKG_SILENT}${_PKG_DEBUG}${TOUCH} ${TOUCH_ARGS} ${_DEPENDS_COOKIE} +.endif diff --git a/mk/depends/depends.mk b/mk/depends/depends.mk new file mode 100644 index 00000000000..04253d493d3 --- /dev/null +++ b/mk/depends/depends.mk @@ -0,0 +1,50 @@ +# $NetBSD: depends.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +###################################################################### +### depends (PUBLIC) +###################################################################### +### depends is a public target to install missing dependencies for +### the package. +### +_DEPENDS_TARGETS+= acquire-depends-lock +_DEPENDS_TARGETS+= ${_DEPENDS_COOKIE} +_DEPENDS_TARGETS+= release-depends-lock + +.PHONY: depends +depends: ${_DEPENDS_TARGETS} + +.PHONY: acquire-depends-lock release-depends-lock +acquire-depends-lock: acquire-lock +release-depends-lock: release-lock + +.if !exists(${_DEPENDS_COOKIE}) +${_DEPENDS_COOKIE}: pre-depends-hook depends-install depends-cookie +.else +${_DEPENDS_COOKIE}: + @${DO_NADA} +.endif + +###################################################################### +### depends-install (PRIVATE, override) +###################################################################### +### depends-install checks that all dependencies are installed, and will +### install any missing dependencies. This should be overridden per +### package system flavor. +### +.if !target(depends-install) +.PHONY: depends-install +depends-install: + @${DO_NADA} +.endif + +###################################################################### +### pre-depends-hook (PRIVATE, override, hook) +###################################################################### +### pre-depends-hook is a generic hook target that is run just before +### dependencies are installed for depends-install. +### +.PHONY: pre-depends-hook +.if !target(pre-depends-hook) +pre-depends-hook: + @${DO_NADA} +.endif diff --git a/mk/flavor/bsd.flavor-vars.mk b/mk/flavor/bsd.flavor-vars.mk new file mode 100644 index 00000000000..9e0cf2eb8cb --- /dev/null +++ b/mk/flavor/bsd.flavor-vars.mk @@ -0,0 +1,11 @@ +# $NetBSD: bsd.flavor-vars.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +# This Makefile fragment is included by bsd.prefs.mk and defines some +# variables which must be defined earlier than where bsd.flavor.mk +# is included. +# + +# Default to the pkgsrc-package flavor. +PKG_FLAVOR?= pkg + +.sinclude "${PKGSRCDIR}/mk/flavor/${PKG_FLAVOR}/flavor-vars.mk" diff --git a/mk/flavor/bsd.flavor.mk b/mk/flavor/bsd.flavor.mk new file mode 100644 index 00000000000..385d3a77d53 --- /dev/null +++ b/mk/flavor/bsd.flavor.mk @@ -0,0 +1,7 @@ +# $NetBSD: bsd.flavor.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +# This Makefile fragment is included by bsd.pkg.mk and pulls in the correct +# target and variable overrides for the selected package system flavor. +# + +.include "${PKGSRCDIR}/mk/flavor/${PKG_FLAVOR}/flavor.mk" diff --git a/mk/flavor/pkg/check.mk b/mk/flavor/pkg/check.mk new file mode 100644 index 00000000000..537599df581 --- /dev/null +++ b/mk/flavor/pkg/check.mk @@ -0,0 +1,27 @@ +# $NetBSD: check.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +###################################################################### +### check-vulnerable (PUBLIC, pkgsrc/mk/check/check.mk) +###################################################################### +### check-vulnerable checks for any vulnerabilities in the package +### without needing audit-packages to be installed. +### +### XXX This should really be invoking audit-packages directly. Having +### XXX a separately maintained piece of code that inspects the +### XXX vulnerabilities database is poor. +### +.PHONY: check-vulnerable +check-vulnerable: + @if [ ! -z "${PKG_SYSCONFDIR.audit-packages}" -a -f ${PKG_SYSCONFDIR.audit-packages}/audit-packages.conf ]; then \ + . ${PKG_SYSCONFDIR.audit-packages}/audit-packages.conf; \ + elif [ ! -z "${PKG_SYSCONFDIR}" -a -f ${PKG_SYSCONFDIR}/audit-packages.conf ]; then \ + . ${PKG_SYSCONFDIR}/audit-packages.conf; \ + fi; \ + if [ -f ${PKGVULNDIR}/pkg-vulnerabilities ]; then \ + ${SETENV} PKGNAME=${PKGNAME} \ + PKGBASE=${PKGBASE} \ + ${AWK} '/^$$/ { next } \ + /^#.*/ { next } \ + $$1 !~ ENVIRON["PKGBASE"] && $$1 !~ /\{/ { next } \ + { s = sprintf("${PKG_ADMIN} pmatch \"%s\" %s && ${ECHO} \"*** WARNING - %s vulnerability in %s - see %s for more information ***\"", $$1, ENVIRON["PKGNAME"], $$2, ENVIRON["PKGNAME"], $$3); system(s); }' < ${PKGVULNDIR}/pkg-vulnerabilities || ${FALSE}; \ + fi diff --git a/mk/flavor/pkg/deinstall.mk b/mk/flavor/pkg/deinstall.mk new file mode 100644 index 00000000000..f092c57a84f --- /dev/null +++ b/mk/flavor/pkg/deinstall.mk @@ -0,0 +1,50 @@ +# $NetBSD: deinstall.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +# Set the appropriate flags to pass to pkg_delete(1) based on the value +# of DEINSTALLDEPENDS (see pkgsrc/mk/install/deinstall.mk). +# +.if defined(DEINSTALLDEPENDS) +. if empty(DEINSTALLDEPENDS:M[nN][oO]) +. if !empty(DEINSTALLDEPENDS:M[aA][lL][lL) +_PKG_ARGS_DEINSTALL+= -r # for "update" target +. else +_PKG_ARGS_DEINSTALL+= -r -R # for removing stuff in bulk builds +. endif +. endif +.endif + +.if defined(PKG_VERBOSE) +_PKG_ARGS_DEINSTALL+= -v +.endif + +.if defined(PKG_PRESERVE) +. if !empty(UPDATE_RUNNING:M[yY][eE][sS]) +_PKG_ARGS_DEINSTALL+= -N -f # update w/o removing any files +. endif +.endif + +###################################################################### +### deinstall-pkg (PRIVATE, pkgsrc/mk/install/deinstall.mk) +###################################################################### +### deinstall-pkg removes the package from the system. +### +deinstall-pkg: + ${_PKG_SILENT}${_PKG_DEBUG} \ + found="`${PKG_INFO} -e \"${PKGNAME}\" || ${TRUE}`"; \ + case "$$found" in \ + "") found="`${_PKG_BEST_EXISTS} ${PKGWILDCARD:Q} || ${TRUE}`" ;; \ + esac; \ + if ${TEST} -n "$$found"; then \ + ${ECHO} "Running ${PKG_DELETE} ${_PKG_ARGS_DEINSTALL} $$found"; \ + ${PKG_DELETE} ${_PKG_ARGS_DEINSTALL} "$$found" || ${TRUE} ; \ + fi +.if defined(DEINSTALLDEPENDS) && !empty(DEINSTALLDEPENDS:M[yY][eE][sS]) +. for _pkg_ in ${BUILD_DEPENDS:C/:.*$//} + ${_PKG_SILENT}${_PKG_DEBUG} \ + found="`${_PKG_BEST_EXISTS} ${_pkg_:Q} || ${TRUE}`"; \ + if ${TEST} -n "$$found"; then \ + ${ECHO} "Running ${PKG_DELETE} ${_PKG_ARGS_DEINSTALL} $$found"; \ + ${PKG_DELETE} ${_PKG_ARGS_DEINSTALL} "$$found" || ${TRUE}; \ + fi +. endfor +.endif diff --git a/mk/flavor/pkg/depends.mk b/mk/flavor/pkg/depends.mk new file mode 100644 index 00000000000..788f616db7e --- /dev/null +++ b/mk/flavor/pkg/depends.mk @@ -0,0 +1,109 @@ +# $NetBSD: depends.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +_DEPENDS_FILE= ${WRKDIR}/.depends +_REDUCE_DEPENDS_CMD= ${AWK} -f ${PKGSRCDIR}/mk/flavor/pkg/reduce-depends.awk + +# This command prints out the dependency patterns for all full (run-time) +# dependencies of the package. +# +_DEPENDS_PATTERNS_CMD= \ + if ${TEST} -f ${_DEPENDS_COOKIE}; then \ + ${CAT} ${_DEPENDS_COOKIE} | \ + ${AWK} '/^full/ { print $$2 } { next }'; \ + fi + +.PHONY: show-depends +show-depends: + @case ${VARNAME:Q}"" in \ + BUILD_DEPENDS) ${_REDUCE_DEPENDS_CMD} ${BUILD_DEPENDS:Q} ;; \ + DEPENDS|*) ${_REDUCE_DEPENDS_CMD} ${DEPENDS:Q} ;; \ + esac + +###################################################################### +### depends-cookie (PRIVATE, pkgsrc/mk/depends/bsd.depends.mk) +###################################################################### +### depends-cookie creates the "depends" cookie file. +### +### The "depends" cookie file contains all of the dependency information +### for the package. The format of each line of the cookie file is: +### +### <depends_type> <pattern> <directory> +### +### Valid dependency types are "build" and "full". +### +.PHONY: depends-cookie +depends-cookie: ${_DEPENDS_FILE} + ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${_DEPENDS_FILE} ${_DEPENDS_COOKIE} + +${_DEPENDS_FILE}: + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H} + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}${TOUCH} ${TOUCH_ARGS} ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${_REDUCE_DEPENDS_CMD} ${BUILD_DEPENDS:Q} | \ + while read dep; do \ + pattern=`${ECHO} $$dep | ${SED} -e "s,:.*,,"`; \ + dir=`${ECHO} $$dep | ${SED} -e "s,.*:,,"`; \ + ${TEST} -n "$$pattern" || exit 1; \ + ${TEST} -n "$$dir" || exit 1; \ + ${ECHO} "build $$pattern $$dir" \ + >> ${.TARGET}.tmp; \ + done + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${_REDUCE_DEPENDS_CMD} ${DEPENDS:Q} | \ + while read dep; do \ + pattern=`${ECHO} $$dep | ${SED} -e "s,:.*,,"`; \ + dir=`${ECHO} $$dep | ${SED} -e "s,.*:,,"`; \ + ${TEST} -n "$$pattern" || exit 1; \ + ${TEST} -n "$$dir" || exit 1; \ + ${ECHO} "full $$pattern $$dir" \ + >> ${.TARGET}.tmp; \ + done + ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp ${.TARGET} + +###################################################################### +### depends-install (PRIVATE, pkgsrc/mk/depends/depends.mk) +###################################################################### +### depends-install installs any missing dependencies. +### +.PHONY: depends-install +depends-install: ${_DEPENDS_FILE} + ${_PKG_SILENT}${_PKG_DEBUG}set -e; \ + ${CAT} ${_DEPENDS_FILE} | \ + while read type pattern dir; do \ + pkg=`${_PKG_BEST_EXISTS} "$$pattern" || ${TRUE}`; \ + case "$$pkg" in \ + "") \ + ${ECHO_MSG} "${_PKGSRC_IN}> Required installed package $$pattern: NOT found"; \ + target=${DEPENDS_TARGET}; \ + ${ECHO_MSG} "${_PKGSRC_IN}> Verifying $$target for $$dir"; \ + if ${TEST} ! -d "$$dir"; then \ + ${ERROR_MSG} "=> [depends.mk] The directory \`\`$$dir'' does not exist."; \ + exit 1; \ + fi; \ + cd $$dir; \ + ${SETENV} _PKGSRC_DEPS=", ${PKGNAME}${_PKGSRC_DEPS}" PKGNAME_REQD="$$pattern" ${MAKE} ${MAKEFLAGS} _AUTOMATIC=yes $$target; \ + pkg=`${_PKG_BEST_EXISTS} "$$pattern" || ${TRUE}`; \ + case "$$pkg" in \ + "") ${ERROR_MSG} "[depends.mk] A package matching \`\`$$pattern'' should"; \ + ${ERROR_MSG} " be installed, but one cannot be found. Perhaps there is a"; \ + ${ERROR_MSG} " stale work directory for $$dir?"; \ + exit 1; \ + esac; \ + ${ECHO_MSG} "${_PKGSRC_IN}> Returning to build of ${PKGNAME}"; \ + ;; \ + *) \ + objfmt=`${PKG_INFO} -Q OBJECT_FMT "$$pkg"`; \ + case "$$objfmt" in \ + "") ${WARNING_MSG} "[depends.mk] Unknown object format for installed package $$pkg" ;; \ + ${OBJECT_FMT}) ;; \ + *) ${ERROR_MSG} "[depends.mk] Installed package $$pkg has an"; \ + ${ERROR_MSG} " object format \`\`$$objfmt'' which differs from \`\`${OBJECT_FMT}''. Please"; \ + ${ERROR_MSG} " update the $$pkg package to ${OBJECT_FMT}."; \ + exit 1; \ + ;; \ + esac; \ + ${ECHO_MSG} "${_PKGSRC_IN}> Required installed package $$pattern: $$pkg found"; \ + ;; \ + esac; \ + done diff --git a/mk/flavor/pkg/flavor-vars.mk b/mk/flavor/pkg/flavor-vars.mk new file mode 100644 index 00000000000..95e2a22e405 --- /dev/null +++ b/mk/flavor/pkg/flavor-vars.mk @@ -0,0 +1,78 @@ +# $NetBSD: flavor-vars.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +# This Makefile fragment is included indirectly by bsd.prefs.mk and +# defines some variables which must be defined earlier than where +# flavor.mk is included. +# + +PKGSRC_MESSAGE_RECIPIENTS?= # empty + +.if !empty(PKGSRC_MESSAGE_RECIPIENTS) +USE_TOOLS+= mail +.endif + +.if defined(PKG_PRESERVE) +USE_TOOLS+= date +.endif + +# This is the package database directory for the default view. +PKG_DBDIR?= ${DESTDIR}/var/db/pkg + +# _PKG_DBDIR is the actual packages database directory where we register +# packages. +# +.if ${PKG_INSTALLATION_TYPE} == "overwrite" +_PKG_DBDIR= ${PKG_DBDIR} +.elif ${PKG_INSTALLATION_TYPE} == "pkgviews" +_PKG_DBDIR= ${DEPOTBASE} +.endif + +PKG_ADD_CMD?= ${PKG_TOOLS_BIN}/pkg_add +PKG_ADMIN_CMD?= ${PKG_TOOLS_BIN}/pkg_admin +PKG_CREATE_CMD?= ${PKG_TOOLS_BIN}/pkg_create +PKG_DELETE_CMD?= ${PKG_TOOLS_BIN}/pkg_delete +PKG_INFO_CMD?= ${PKG_TOOLS_BIN}/pkg_info +PKG_VIEW_CMD?= ${PKG_TOOLS_BIN}/pkg_view +LINKFARM_CMD?= ${PKG_TOOLS_BIN}/linkfarm + +.if !defined(PKGTOOLS_VERSION) +PKGTOOLS_VERSION!= ${PKG_INFO_CMD} -V 2>/dev/null || echo 20010302 +MAKEFLAGS+= PKGTOOLS_VERSION=${PKGTOOLS_VERSION} +.endif + +# The binary pkg_install tools all need to consistently to refer to the +# correct package database directory. +# +.if ${PKGTOOLS_VERSION} < 20030823 +PKGTOOLS_ENV?= PKG_DBDIR=${_PKG_DBDIR} +PKGTOOLS_ARGS?= # empty +.else +PKGTOOLS_ENV?= # empty +PKGTOOLS_ARGS?= -K ${_PKG_DBDIR} +.endif + +# Views are rooted in ${LOCALBASE}, all packages are depoted in +# ${DEPOTBASE}, and the package database directory for the default view +# is in ${PKG_DBDIR}. +# +PKG_VIEW_ARGS?= -W ${LOCALBASE} -d ${DEPOTBASE} -k ${PKG_DBDIR} + +PKG_ADD?= ${SETENV} ${PKGTOOLS_ENV} ${PKG_ADD_CMD} ${PKGTOOLS_ARGS} +PKG_ADMIN?= ${SETENV} ${PKGTOOLS_ENV} ${PKG_ADMIN_CMD} ${PKGTOOLS_ARGS} +PKG_CREATE?= ${SETENV} ${PKGTOOLS_ENV} ${PKG_CREATE_CMD} ${PKGTOOLS_ARGS} +PKG_DELETE?= ${SETENV} ${PKGTOOLS_ENV} ${PKG_DELETE_CMD} ${PKGTOOLS_ARGS} +PKG_INFO?= ${SETENV} ${PKGTOOLS_ENV} ${PKG_INFO_CMD} ${PKGTOOLS_ARGS} +PKG_VIEW?= ${SETENV} ${PKGTOOLS_ENV} ${PKG_VIEW_CMD} ${PKG_VIEW_ARGS} +LINKFARM?= ${LINKFARM_CMD} + +# "${_PKG_BEST_EXISTS} pkgpattern" prints out the name of the installed +# package that best matches pkgpattern. Use this instead of +# "${PKG_INFO} -e pkgpattern" if the latter would return more than one +# package name. +# +_PKG_BEST_EXISTS?= ${PKG_ADMIN} -b -d ${_PKG_DBDIR} -S lsbest + +# XXX Leave this here until all uses of this have been purged from the +# XXX public parts of pkgsrc. +# XXX +PKG_BEST_EXISTS= ${_PKG_BEST_EXISTS} diff --git a/mk/flavor/pkg/flavor.mk b/mk/flavor/pkg/flavor.mk new file mode 100644 index 00000000000..120f20b78a4 --- /dev/null +++ b/mk/flavor/pkg/flavor.mk @@ -0,0 +1,21 @@ +# $NetBSD: flavor.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +# This Makefile fragment provides variable and target overrides that are +# specific to the pkgsrc native package format. +# + +# PKG_FILELIST_CMD outputs the list of files owned by ${PKGNAME} as +# registered on the system. +# +PKG_FILELIST_CMD= ${PKG_INFO} -qL ${PKGNAME:Q} + +.include "${PKGSRCDIR}/mk/flavor/pkg/depends.mk" +.include "${PKGSRCDIR}/mk/flavor/pkg/check.mk" +.include "${PKGSRCDIR}/mk/flavor/pkg/metadata.mk" +.include "${PKGSRCDIR}/mk/flavor/pkg/install.mk" +.include "${PKGSRCDIR}/mk/flavor/pkg/deinstall.mk" +.include "${PKGSRCDIR}/mk/flavor/pkg/replace.mk" +.include "${PKGSRCDIR}/mk/flavor/pkg/package.mk" +.include "${PKGSRCDIR}/mk/flavor/pkg/views.mk" + +.include "${PKGSRCDIR}/mk/flavor/pkg/utility.mk" diff --git a/mk/flavor/pkg/install.mk b/mk/flavor/pkg/install.mk new file mode 100644 index 00000000000..d8bec5aa489 --- /dev/null +++ b/mk/flavor/pkg/install.mk @@ -0,0 +1,77 @@ +# $NetBSD: install.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +###################################################################### +### install-check-conflicts (PRIVATE, pkgsrc/mk/install/install.mk) +###################################################################### +### install-check-conflicts checks for conflicts between the package +### and and installed packages. +### +.PHONY: install-check-conflicts +install-check-conflicts: + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${WRKDIR}/.CONFLICTS +.for _conflict_ in ${CONFLICTS} + ${_PKG_SILENT}${_PKG_DEBUG} \ + found="`${_PKG_BEST_EXISTS} ${_conflict_:Q} || ${TRUE}`"; \ + case "$$found" in \ + "") ;; \ + *) ${ECHO} "$$found" >> ${WRKDIR}/.CONFLICTS ;; \ + esac +.endfor + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${TEST} -f ${WRKDIR}/.CONFLICTS || exit 0; \ + ${ERROR_MSG} "${PKGNAME} conflicts with installed package(s):"; \ + while read line; do ${ERROR_MSG} " $line"; done \ + < ${WRKDIR}/.CONFLICTS; \ + ${ERROR_MSG} "They install the same files into the same place."; \ + ${ERROR_MSG} "Please remove conflicts first with pkg_delete(1)."; \ + ${RM} -f ${WRKDIR}/.CONFLICTS; \ + exit 1 + +###################################################################### +### install-check-installed (PRIVATE, pkgsrc/mk/install/install.mk) +###################################################################### +### install-check-installed checks if the package (perhaps an older +### version) is already installed on the system. +### +.PHONY: install-check-installed +install-check-installed: + ${_PKG_SILENT}${_PKG_DEBUG} \ + found="`${_PKG_BEST_EXISTS} ${PKGWILDCARD:Q} || ${TRUE}`"; \ + case "$$found" in \ + "") ;; \ + *) ${ERROR_MSG} "$$found is already installed - perhaps an older version?"; \ + ${ERROR_MSG} "If so, you may use either of:"; \ + ${ERROR_MSG} " - \"pkg_delete $$found\" and \"${MAKE} reinstall\""; \ + ${ERROR_MSG} " to upgrade properly"; \ + ${ERROR_MSG} " - \"${MAKE} update\" to rebuild the package and all"; \ + ${ERROR_MSG} " of its dependencies"; \ + ${ERROR_MSG} " - \"${MAKE} replace\" to replace only the package without"; \ + ${ERROR_MSG} " re-linking dependencies, risking various problems."; \ + exit 1; \ + ;; \ + esac + +###################################################################### +### register-pkg (PRIVATE, pkgsrc/mk/install/install.mk) +###################################################################### +### register-pkg populates the package database with the appropriate +### entries to register the package as being installed on the system. +### +_REGISTER_DEPENDENCIES= \ + ${SETENV} PKG_DBDIR=${_PKG_DBDIR:Q} \ + AWK=${TOOLS_AWK:Q} \ + PKG_ADMIN=${PKG_ADMIN_CMD:Q} \ + ${SH} ${PKGSRCDIR}/mk/flavor/pkg/register-dependencies + +.PHONY: register-pkg +register-pkg: generate-metadata ${_DEPENDS_COOKIE} + @${ECHO_MSG} "${_PKGSRC_IN}> Registering installation for ${PKGNAME}" + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -fr ${_PKG_DBDIR}/${PKGNAME} + ${_PKG_SILENT}${_PKG_DEBUG}${CP} -R ${PKG_DB_TMPDIR} ${_PKG_DBDIR} + ${_PKG_SILENT}${_PKG_DEBUG}${PKG_ADMIN} add ${PKGNAME} + ${_PKG_SILENT}${_PKG_DEBUG} \ + case ${_AUTOMATIC:Q}"" in \ + [yY][eE][sS]) ${PKG_ADMIN} set automatic=yes ${PKGNAME} ;; \ + esac + ${_PKG_SILENT}${_PKG_DEBUG}${_DEPENDS_PATTERNS_CMD} | \ + ${SORT} -u | ${_REGISTER_DEPENDENCIES} ${PKGNAME} diff --git a/mk/flavor/pkg/metadata.mk b/mk/flavor/pkg/metadata.mk new file mode 100644 index 00000000000..086926dcd09 --- /dev/null +++ b/mk/flavor/pkg/metadata.mk @@ -0,0 +1,404 @@ +# $NetBSD: metadata.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +###################################################################### +### The targets below are all PRIVATE. +###################################################################### + +###################################################################### +### +### Temporary package meta-data directory. The contents of this directory +### are copied directly into the real package meta-data directory. +### +PKG_DB_TMPDIR= ${WRKDIR}/.pkgdb/${PKGNAME} + +unprivileged-install-hook: ${PKG_DB_TMPDIR} +${PKG_DB_TMPDIR}: + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET} + +###################################################################### +### +### +BUILD_INFO - Package build environment and settings information +### +_BUILD_INFO_FILE= ${PKG_DB_TMPDIR}/+BUILD_INFO +_BUILD_DATE_cmd= ${DATE} "+%Y-%m-%d %H:%M:%S %z" +_METADATA_TARGETS+= ${_BUILD_INFO_FILE} + +${_BUILD_INFO_FILE}: plist + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H} + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${.TARGET}.tmp +.for _def_ in ${BUILD_DEFS} + ${_PKG_SILENT}${_PKG_DEBUG}${ECHO} ${_def_}=${${_def_}:Q} | \ + ${SED} -e 's|^PATH=[^ ]*|PATH=...|' \ + >> ${.TARGET}.tmp +.endfor +.if !empty(USE_LANGUAGES) + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${ECHO} "CC_VERSION=${CC_VERSION}" >> ${.TARGET}.tmp +.endif +.if !empty(USE_TOOLS:Mperl\:run) + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${ECHO} "PERL=`${PERL5} --version 2>/dev/null | ${GREP} 'This is perl'`" >> ${.TARGET}.tmp +.endif +.if !empty(USE_TOOLS:Mgmake) + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${ECHO} "GMAKE=`${GMAKE} --version | ${GREP} Make`" >> ${.TARGET}.tmp +.endif + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${ECHO} "PKGTOOLS_VERSION=${PKGTOOLS_VERSION}" >> ${.TARGET}.tmp +.if defined(HOMEPAGE) + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${ECHO} "HOMEPAGE=${HOMEPAGE}" >> ${.TARGET}.tmp +.endif + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${ECHO} "CATEGORIES=${CATEGORIES}" >> ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${ECHO} "MAINTAINER=${MAINTAINER}" >> ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${ECHO} "BUILD_DATE=${_BUILD_DATE_cmd:sh}" >> ${.TARGET}.tmp +.if !empty(CHECK_SHLIBS_SUPPORTED:M[yY][eE][sS]) + ${_PKG_SILENT}${_PKG_DEBUG} \ + case ${LDD:Q}"" in \ + "") ldd=`${TYPE} ldd 2>/dev/null | ${AWK} '{ print $$NF }'` ;; \ + *) ldd=${LDD:Q} ;; \ + esac; \ + bins=`${AWK} '/^(bin|sbin|libexec)\// { print "${PREFIX}/" $$0 } END { exit 0 }' ${PLIST}`; \ + case ${OBJECT_FMT:Q}"" in \ + ELF) \ + libs=`${AWK} '/^lib\/lib.*\.so\.[0-9]+$$/ { print "${PREFIX}/" $$0 } END { exit 0 }' ${PLIST}`; \ + if ${TEST} -n "$$bins" -o -n "$$libs"; then \ + requires=`($$ldd $$bins $$libs 2>/dev/null || ${TRUE}) | ${AWK} '$$2 == "=>" && $$3 ~ "/" { print $$3 }' | ${SORT} -u`; \ + fi; \ + linklibs=`${AWK} '/^[^@].*\.so\.[0-9\.]+$$/ { print "${PREFIX}/" $$0 }' ${PLIST}`; \ + for i in $$linklibs; do \ + if ${TEST} -r $$i -a ! -x $$i -a ! -h $$i; then \ + ${TEST} ${PKG_DEVELOPER:Uno:Q} = "no" || \ + ${ECHO} "$$i: installed without execute permission; fixing (should use [BSD_]INSTALL_LIB)"; \ + ${CHMOD} +x $$i; \ + fi; \ + done; \ + ;; \ + Mach-O) \ + libs=`${AWK} '/^lib\/lib.*\.dylib/ { print "${PREFIX}/" $$0 } END { exit 0 }' ${PLIST}`; \ + if ${TEST} "$$bins" != "" -o "$$libs" != ""; then \ + requires=`($$ldd $$bins $$libs 2>/dev/null || ${TRUE}) | ${AWK} '/compatibility version/ { print $$1 }' | ${SORT} -u`; \ + fi; \ + ;; \ + esac; \ + for i in "" $$libs; do \ + ${TEST} "$$i" != "" || continue; \ + ${ECHO} "PROVIDES=$$i" >> ${.TARGET}.tmp; \ + done; \ + for req in "" $$requires; do \ + ${TEST} "$$req" != "" || continue; \ + ${ECHO} "REQUIRES=$$req" >> ${.TARGET}.tmp; \ + done +.endif + ${_PKG_SILENT}${_PKG_DEBUG}${SORT} ${.TARGET}.tmp > ${.TARGET}.tmp2 + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp2 ${.TARGET} + +###################################################################### +### +### +BUILD_VERSION - Package build files versioning information +### +### We extract the ident strings from all of the important pkgsrc files +### involved in building the package, i.e. Makefile and patches. +### +_BUILD_VERSION_FILE= ${PKG_DB_TMPDIR}/+BUILD_VERSION +_METADATA_TARGETS+= ${_BUILD_VERSION_FILE} + +${_BUILD_VERSION_FILE}: + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H} + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}exec 1>>${.TARGET}.tmp; \ + for f in ${.CURDIR}/Makefile ${FILESDIR}/* ${PKGDIR}/*; do \ + ${TEST} ! -f "$$f" || ${ECHO} "$$f"; \ + done + ${_PKG_SILENT}${_PKG_DEBUG}exec 1>>${.TARGET}.tmp; \ + ${TEST} -f ${DISTINFO_FILE:Q} || exit 0; \ + ${CAT} ${DISTINFO_FILE} | \ + ${AWK} 'NF == 4 && $$3 == "=" { gsub("[()]", "", $$2); print $$2 }' | \ + while read file; do \ + ${TEST} ! -f "${PATCHDIR}/$$file" || \ + ${ECHO} "${PATCHDIR}/$$file"; \ + done + ${_PKG_SILENT}${_PKG_DEBUG}exec 1>>${.TARGET}.tmp; \ + ${TEST} -d ${PATCHDIR} || exit 0; \ + cd ${PATCHDIR}; for f in *; do \ + case "$$f" in \ + "*"|*.orig|*.rej|*~) ;; \ + patch-*) ${ECHO} "${PATCHDIR}/$$f" ;; \ + esac; \ + done + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${CAT} ${.TARGET}.tmp | ${XARGS} ${GREP} -H '\$$NetBSD' | \ + ${AWK} '{ sub("^${PKGSRCDIR}/", ""); \ + sub(":.*[$$]NetBSD", ": $$NetBSD"); \ + sub("[$$][^$$]*$$", "$$"); \ + print; }' | ${SORT} -u > ${.TARGET}.tmp1 && \ + ${RM} -f ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp1 ${.TARGET} + +###################################################################### +### +### +COMMENT - Package comment file +### +### This file contains the one-line description of the package. +### +_COMMENT_FILE= ${PKG_DB_TMPDIR}/+COMMENT +_METADATA_TARGETS+= ${_COMMENT_FILE} + +${_COMMENT_FILE}: + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H} + ${_PKG_SILENT}${_PKG_DEBUG}${ECHO} ${COMMENT:Q} > ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp ${.TARGET} + +###################################################################### +### +### +DESC - Package description file +### +### This file contains the paragraph description of the package. +### +_DESCR_FILE= ${PKG_DB_TMPDIR}/+DESC +_METADATA_TARGETS+= ${_DESCR_FILE} + +${_DESCR_FILE}: ${DESCR_SRC} + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H} + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}${CAT} ${.ALLSRC} > ${.TARGET}.tmp +.if defined(HOMEPAGE) + ${_PKG_SILENT}${_PKG_DEBUG}${ECHO} >> ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}${ECHO} "Homepage:" >> ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}${ECHO} ""${HOMEPAGE:Q} >> ${.TARGET}.tmp +.endif + ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp ${.TARGET} + +###################################################################### +### +### +DISPLAY - Package message file +### +### This file contains important messages which apply to this package, +### and are shown during installation. +### +.if !defined(MESSAGE_SRC) +. if exists(${PKGDIR}/MESSAGE) +MESSAGE_SRC= ${PKGDIR}/MESSAGE +. else +. if exists(${PKGDIR}/MESSAGE.common) +MESSAGE_SRC= ${PKGDIR}/MESSAGE.common +. endif +. if exists(${PKGDIR}/MESSAGE.${OPSYS}) +MESSAGE_SRC+= ${PKGDIR}/MESSAGE.${OPSYS} +. endif +. if exists(${PKGDIR}/MESSAGE.${MACHINE_ARCH:C/i[3-6]86/i386/g}) +MESSAGE_SRC+= ${PKGDIR}/MESSAGE.${MACHINE_ARCH:C/i[3-6]86/i386/g} +. endif +. if exists(${PKGDIR}/MESSAGE.${OPSYS}-${MACHINE_ARCH:C/i[3-6]86/i386/g}) +MESSAGE_SRC+= ${PKGDIR}/MESSAGE.${OPSYS}-${MACHINE_ARCH:C/i[3-6]86/i386/g} +. endif +. endif +.endif + +.if defined(MESSAGE_SRC) +_MESSAGE_FILE= ${PKG_DB_TMPDIR}/+DISPLAY +_METADATA_TARGETS+= ${_MESSAGE_FILE} + +# Set MESSAGE_SUBST to substitute "${variable}" to "value" in MESSAGE +MESSAGE_SUBST+= PKGNAME=${PKGNAME} \ + PKGBASE=${PKGBASE} \ + PREFIX=${PREFIX} \ + LOCALBASE=${LOCALBASE} \ + X11PREFIX=${X11PREFIX} \ + X11BASE=${X11BASE} \ + PKG_SYSCONFDIR=${PKG_SYSCONFDIR} \ + ROOT_GROUP=${ROOT_GROUP} \ + ROOT_USER=${ROOT_USER} + +_MESSAGE_SUBST_SED= ${MESSAGE_SUBST:S/=/}!/:S/$/!g/:S/^/ -e s!\\\${/} + +${_MESSAGE_FILE}: ${MESSAGE_SRC} + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H} + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}${CAT} ${.ALLSRC} | \ + ${SED} ${_MESSAGE_SUBST_SED} > ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp ${.TARGET} + + +# Display MESSAGE file and optionally mail the contents to +# PKGSRC_MESSAGE_RECIPIENTS. +# +.PHONY: install-display-message +register-pkg: install-display-message +install-display-message: ${_MESSAGE_FILE} + @${ECHO_MSG} "${_PKGSRC_IN}> Please note the following:" + @${ECHO_MSG} "" + @${CAT} ${_MESSAGE_FILE} + @${ECHO_MSG} "" +. if !empty(PKGSRC_MESSAGE_RECIPIENTS) + ${_PKG_SILENT}${_PKG_DEBUG} \ + (${ECHO} "The ${PKGNAME} package was installed on `${HOSTNAME_CMD}` at `date`"; \ + ${ECHO} ""; \ + ${ECHO} "Please note the following:"; \ + ${ECHO} ""; \ + ${CAT} ${_MESSAGE_FILE}; \ + ${ECHO} "") | \ + ${MAIL_CMD} -s"Package ${PKGNAME} installed on `${HOSTNAME_CMD}`" ${PKGSRC_MESSAGE_RECIPIENTS} +. endif +.endif # MESSAGE_SRC + +###################################################################### +### +### +PRESERVE - Package preserve file +### +### The existence of this file prevents pkg_delete from removing this +### package unless one "force-deletes" the package. +### +.if defined(PKG_PRESERVE) +_PRESERVE_FILE= ${PKG_DB_TMPDIR}/+PRESERVE +_METADATA_TARGETS+= ${_PRESERVE_FILE} + +${_PRESERVE_FILE}: + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H} + ${_PKG_SILENT}${_PKG_DEBUG}${DATE} > ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp ${.TARGET} +.endif + +###################################################################### +### +### +SIZE_ALL - Package size-of-dependencies file +### +### This is the total size of the dependencies that this package was +### built against. +### +_SIZE_ALL_FILE= ${PKG_DB_TMPDIR}/+SIZE_ALL +_METADATA_TARGETS+= ${_SIZE_ALL_FILE} + +${_SIZE_ALL_FILE}: ${_DEPENDS_COOKIE} + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H} + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${_DEPENDS_PATTERNS_CMD} | \ + ${XARGS} -n 1 ${_PKG_BEST_EXISTS} | ${SORT} -u | \ + ${XARGS} -n 256 ${PKG_INFO} -qs | \ + ${AWK} 'BEGIN { s = 0 } /^[0-9]+$$/ { s += $$1 } END { print s }' \ + > ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp ${.TARGET} + +###################################################################### +### +### +SIZE_PKG - Package size file +### +### This is the total size of the files contained in the package. +### +_SIZE_PKG_FILE= ${PKG_DB_TMPDIR}/+SIZE_PKG +_METADATA_TARGETS+= ${_SIZE_PKG_FILE} + +${_SIZE_PKG_FILE}: plist + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H} + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${CAT} ${PLIST} | \ + ${AWK} 'BEGIN { base = "${PREFIX}/" } \ + /^@cwd/ { base = $$2 "/" } \ + /^@/ { next } \ + { print base $$0 }' | \ + ${SORT} -u | \ + ${SED} -e "s/'/'\\\\''/g" -e "s/.*/'&'/" | \ + ${XARGS} -n 256 ${LS} -ld 2>/dev/null | \ + ${AWK} 'BEGIN { s = 0 } { s += $$5 } END { print s }' \ + > ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp ${.TARGET} + +###################################################################### +### +### +CONTENTS - Package manifest file +### +### This file contains the list of files and checksums, along with +### any special "@" commands, e.g. @dirrm. +### +_CONTENTS_FILE= ${PKG_DB_TMPDIR}/+CONTENTS +_METADATA_TARGETS+= ${_CONTENTS_FILE} + +_PKG_CREATE_ARGS+= -v -l -U +_PKG_CREATE_ARGS+= -B ${_BUILD_INFO_FILE} +_PKG_CREATE_ARGS+= -b ${_BUILD_VERSION_FILE} +_PKG_CREATE_ARGS+= -c ${_COMMENT_FILE} +_PKG_CREATE_ARGS+= ${_MESSAGE_FILE:D -D ${_MESSAGE_FILE}} +_PKG_CREATE_ARGS+= -d ${_DESCR_FILE} +_PKG_CREATE_ARGS+= -f ${PLIST} +_PKG_CREATE_ARGS+= ${NO_MTREE:D:U -m ${MTREE_FILE}} +_PKG_CREATE_ARGS+= ${PKG_PRESERVE:D -n ${_PRESERVE_FILE}} +_PKG_CREATE_ARGS+= -S ${_SIZE_ALL_FILE} +_PKG_CREATE_ARGS+= -s ${_SIZE_PKG_FILE} +_PKG_CREATE_ARGS+= ${_DEPENDS_ARG_cmd:sh} +_PKG_CREATE_ARGS+= ${INSTALL_FILE:D ${_INSTALL_ARG_cmd:sh}} +_PKG_CREATE_ARGS+= ${DEINSTALL_FILE:D ${_DEINSTALL_ARG_cmd:sh}} + +_PKG_ARGS_INSTALL+= ${_PKG_CREATE_ARGS} +_PKG_ARGS_INSTALL+= -p ${PREFIX} + +_DEPENDS_ARG_cmd= depends=`${_DEPENDS_PATTERNS_CMD}`; \ + if ${TEST} -n "$$depends"; then \ + ${ECHO} "-P \"$$depends\""; \ + else \ + ${ECHO}; \ + fi + +_DEINSTALL_ARG_cmd= if ${TEST} -f ${DEINSTALL_FILE}; then \ + ${ECHO} "-k "${DEINSTALL_FILE:Q}; \ + else \ + ${ECHO}; \ + fi +_INSTALL_ARG_cmd= if ${TEST} -f ${INSTALL_FILE}; then \ + ${ECHO} "-i "${INSTALL_FILE:Q}; \ + else \ + ${ECHO}; \ + fi + +_CONTENTS_TARGETS+= ${_BUILD_INFO_FILE} +_CONTENTS_TARGETS+= ${_BUILD_VERSION_FILE} +_CONTENTS_TARGETS+= ${_COMMENT_FILE} +_CONTENTS_TARGETS+= ${_DEPENDS_COOKIE} +_CONTENTS_TARGETS+= ${_DESCR_FILE} +_CONTENTS_TARGETS+= ${_MESSAGE_FILE} +_CONTENTS_TARGETS+= plist +_CONTENTS_TARGETS+= ${_PRESERVE_FILE} +_CONTENTS_TARGETS+= ${_SIZE_ALL_FILE} +_CONTENTS_TARGETS+= ${_SIZE_PKG_FILE} +_CONTENTS_TARGETS+= ${NO_MTREE:D:U${MTREE_FILE}} + +${_CONTENTS_FILE}: ${_CONTENTS_TARGETS} + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H} + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${PKG_CREATE} ${_PKG_ARGS_INSTALL} -O ${PKGFILE:T} > ${.TARGET}.tmp + ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp ${.TARGET} + +###################################################################### +### generate-metadata (PRIVATE) +###################################################################### +### generate-metadata is a convenience target for generating all of +### the pkgsrc binary package meta-data files. It populates +### ${PKG_DB_TMPDIR} with the following files: +### +### +BUILD_INFO +### +BUILD_VERSION +### +COMMENT +### +CONTENTS +### +DESC +### +DISPLAY +### +PRESERVE +### +SIZE_ALL +### +SIZE_PKG +### +### See the targets above for descriptions of each of those files. +### +.PHONY: generate-metadata +generate-metadata: ${_METADATA_TARGETS} + +###################################################################### +### clean-metadata (PRIVATE) +###################################################################### +### clean-metadata is a convenience target for removing the meta-data +### directory. +### +.PHONY: clean-metadata +clean-metadata: + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -fr ${PKG_DB_TMPDIR} diff --git a/mk/flavor/pkg/package.mk b/mk/flavor/pkg/package.mk new file mode 100644 index 00000000000..097dc71d195 --- /dev/null +++ b/mk/flavor/pkg/package.mk @@ -0,0 +1,110 @@ +# $NetBSD: package.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +PKG_SUFX?= .tgz +PKGFILE?= ${PKGREPOSITORY}/${PKGNAME}${PKG_SUFX} +PKGREPOSITORY?= ${PACKAGES}/${PKGREPOSITORYSUBDIR} +PKGREPOSITORYSUBDIR?= All + +###################################################################### +### package-check-installed (PRIVATE, pkgsrc/mk/package/package.mk) +###################################################################### +### package-check-installed verifies that the package is installed on +### the system. +### +.PHONY: package-check-installed +package-check-installed: + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${PKG_INFO} -qe ${PKGNAME}; \ + if ${TEST} $$? -ne 0; then \ + ${ECHO_MSG} "=> ${PKGNAME} is not installed."; \ + exit 1; \ + fi + +###################################################################### +### package-create (PRIVATE, pkgsrc/mk/package/package.mk) +###################################################################### +### package-create creates the binary package. +### +.PHONY: package-create +package-create: package-remove ${PKGFILE} package-links + +_PKG_ARGS_PACKAGE+= ${_PKG_CREATE_ARGS} +_PKG_ARGS_PACKAGE+= -p ${PREFIX:S/^${DESTDIR}//} +_PKG_ARGS_PACKAGE+= -L ${PREFIX} # @src ... +.if ${PKG_INSTALLATION_TYPE} == "pkgviews" +_PKG_ARGS_PACKAGE+= -E +.endif + +${PKGFILE}: ${_CONTENTS_TARGETS} + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H} + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${PKG_CREATE} ${_PKG_ARGS_PACKAGE} ${.TARGET}; \ + exitcode=$$?; \ + if ${TEST} $$exitcode -ne 0; then \ + ${ECHO} "(${PKG_CREATE:T}: exitcode $$exitcode)"; \ + ${RM} -f ${.TARGET}; \ + exit 1; \ + fi + +###################################################################### +### package-remove (PRIVATE) +###################################################################### +### package-remove removes the binary package from the package +### repository. +### +.PHONY: package-remove +package-remove: + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${PKGFILE} + +###################################################################### +### package-links (PRIVATE) +###################################################################### +### package-links creates symlinks to the binary package from the +### non-primary categories to which the package belongs. +### +package-links: delete-package-links +.for _dir_ in ${CATEGORIES:S/^/${PACKAGES}\//} + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${_dir_:Q} + ${_PKG_SILENT}${_PKG_DEBUG} \ + if ${TEST} ! -d ${_dir_:Q}; then \ + ${ECHO_MSG} "=> Can't create directory "${_dir_:Q}"."; \ + exit 1; \ + fi + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${_dir_:Q}/${PKGFILE:T} + ${_PKG_SILENT}${_PKG_DEBUG}${LN} -s ../${PKGREPOSITORYSUBDIR}/${PKGFILE:T} ${_dir_:Q} +.endfor + +###################################################################### +### delete-package-links (PRIVATE) +###################################################################### +### delete-package-links removes the symlinks to the binary package from +### the non-primary categories to which the package belongs. +### +delete-package-links: + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${FIND} ${PACKAGES} -type l -name ${PKGFILE:T} -print | \ + ${XARGS} ${RM} -f + +###################################################################### +### tarup (PUBLIC) +###################################################################### +### tarup is a public target to generate a binary package from an +### installed package instance. +### +_PKG_TARUP_CMD= ${LOCALBASE}/bin/pkg_tarup + +.PHONY: tarup +tarup: package-remove tarup-pkg package-links + +###################################################################### +### tarup-pkg (PRIVATE) +###################################################################### +### tarup-pkg creates a binary package from an installed package instance +### using "pkg_tarup". +### +tarup-pkg: + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${TEST} -x ${_PKG_TARUP_CMD} || exit 1; \ + ${SETENV} PKG_DBDIR=${_PKG_DBDIR} PKG_SUFX=${PKG_SUFX} \ + PKGREPOSITORY=${PKGREPOSITORY} \ + ${_PKG_TARUP_CMD} ${PKGNAME} diff --git a/mk/flavor/pkg/reduce-depends.awk b/mk/flavor/pkg/reduce-depends.awk new file mode 100755 index 00000000000..d7c416fb22f --- /dev/null +++ b/mk/flavor/pkg/reduce-depends.awk @@ -0,0 +1,141 @@ +#!/usr/bin/awk -f +# +# $NetBSD: reduce-depends.awk,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +# Copyright (c) 2006 The NetBSD Foundation, Inc. +# All rights reserved. +# +# This code is derived from software contributed to The NetBSD Foundation +# by Johnny C. Lam. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by the NetBSD +# Foundation, Inc. and its contributors. +# 4. Neither the name of The NetBSD Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +###################################################################### +# +# NAME +# reduce-depends.awk -- reduce a list of dependencies +# +# SYNOPSIS +# reduce-depends.awk "depends_list" +# +# DESCRIPTION +# reduce-depends.awk removes some extraneous dependencies from the +# dependency list. The dependency list should be passed as a single +# argument, and the output will be a list of the reduced dependencies, +# echo one on a new line. +# +###################################################################### + +BEGIN { + CAT = ENVIRON["CAT"] ? ENVIRON["CAT"] : "cat" + PKG_ADMIN = ENVIRON["PKG_ADMIN"] ? ENVIRON["PKG_ADMIN"] : "pkg_admin" + PWD_CMD = ENVIRON["PWD_CMD"] ? ENVIRON["PWD_CMD"] : "pwd -P" + TEST = ENVIRON["TEST"] ? ENVIRON["TEST"] : "test" + + PROGNAME = "reduce-depends.awk" + ERRCAT = CAT " 1>&2" + + # Gather all dependencies into the depends array. Index 0 of the + # depends[pkgpath] array is the number of patterns associated with + # that pkgpath. + # + args = ARGV[1] + ARGC = split(args, ARGV); ARGC++ + for (i = 1; i < ARGC; i++) { + pattern = ARGV[i]; sub(":.*", "", pattern) + dir = ARGV[i]; sub(".*:", "", dir) + cmd = TEST " -d " dir + if (system(cmd) == 0) { + cmd = "cd " dir " && " PWD_CMD + while (cmd | getline pkgpath) + if (!(pkgpath in pkgsrcdirs)) { + pkgpaths[P++] = pkgpath + pkgsrcdirs[pkgpath] = dir + } + depends[pkgpath, 0]++; + depends[pkgpath, depends[pkgpath, 0]] = pattern + close(cmd) + } else { + print "ERROR: [" PROGNAME "] " dir " does not exist." | ERRCAT + exit 1 + } + } + + # Reduce dependencies to the strictest set of dependencies it + # can derive from all of depends[...]. It only understands + # dependencies of the form foo>=1.0, and leaves the other + # dependencies undisturbed. + # + # The algorithm takes dependencies of the form foo>=1.0 and + # converts them to foo-1.0. It then compares this pkg name against + # each dependency to see if it satisfies them all. The key fact + # is the the strictest dependency, when converted to a pkg name, + # will satisfy every dependency. + # + for (p = 0; p < P; p++) { + pkgpath = pkgpaths[p] + D = depends[pkgpath, 0]; + for (d = 1; d <= D; d++) { + dep = depends[pkgpath, d] + if (dep ~ /[{]/ || \ + dep ~ />=[0-9]+<[0-9]+/ || \ + dep !~ />=[0-9]+/) + { + reduced[N++] = dep ":" pkgsrcdirs[pkgpath] + continue + } + ge_depends[dep] = dep + } + for (dep in ge_depends) { + dep2pkg = dep; sub(">=", "-", dep2pkg) + match_all = 1 + for (pattern in ge_depends) { + cmd = PKG_ADMIN " pmatch \"" pattern "\" " dep2pkg + if (system(cmd) != 0) { + match_all = 0 + break + } + } + if (match_all == 0) continue + reduced[N++] = dep ":" pkgsrcdirs[pkgpath] + } + # This should theoretically never happen. + if (match_all == "no") { + print "ERROR: [" PROGNAME "] conflicting dependencies" | ERRCAT + exit 1 + } + for (dep in ge_depends) + delete ge_depends[dep] + } + + # Output reduced dependencies. + for (n = 0; n < N; n++) + print reduced[n]; +} diff --git a/mk/flavor/pkg/register-dependencies b/mk/flavor/pkg/register-dependencies new file mode 100755 index 00000000000..0ede219fd85 --- /dev/null +++ b/mk/flavor/pkg/register-dependencies @@ -0,0 +1,54 @@ +#!/bin/sh +# +# $NetBSD: register-dependencies,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +###################################################################### +# +# NAME +# register-dependencies -- register package dependencies +# +# SYNOPSIS +# register-dependencies pkgname +# +# DESCRIPTION +# register-dependencies registers a dependency relationship from +# the named package pkgname and the dependencies passed in via +# standard input. The dependencies may be wildcard patterns. +# +# ENVIRONMENT +# PKG_ADMIN +# This is the path to the pkg_admin command. +# +# PKG_DBDIR +# This is the package meta-data directory in which the +# packages are registered. By default, this is /var/db/pkg. +# +###################################################################### + +: ${AWK:=awk} +: ${ECHO:=echo} +: ${PKG_ADMIN:=pkg_admin} +: ${PKG_DBDIR:=/var/db/pkg} +: ${TEST:=test} +: ${TOUCH:=touch} +: ${TRUE:=true} + +PKGNAME="$1" + +while read dependency; do + pkg=`${PKG_ADMIN} -b -d ${PKG_DBDIR} -S lsbest "$dependency" || ${TRUE}` + pkgdir="${PKG_DBDIR}/$pkg" + if ${TEST} -z "$pkg" -o ! -d "$pkgdir"; then + ${ECHO} 1>&2 "$dependency not found - dependency NOT registered" + continue + fi + req="$pkgdir/+REQUIRED_BY" + tmpreq="$pkgdir/+REQUIRED_BY.$$" + ${TOUCH} $req + ${AWK} -v PKGNAME="${PKGNAME}" \ + 'BEGIN { found = 0 } + $0 == PKGNAME { found = 1 } { print } + END { if (!found) print PKGNAME }' $req > $tmpreq + ${CP} -f $tmpreq $req; ${RM} -f $tmpreq + ${ECHO} "${PKGNAME} requires installed package $pkg" +done diff --git a/mk/flavor/pkg/replace.mk b/mk/flavor/pkg/replace.mk new file mode 100644 index 00000000000..8892d090ed6 --- /dev/null +++ b/mk/flavor/pkg/replace.mk @@ -0,0 +1,173 @@ +# $NetBSD: replace.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +###################################################################### +### replace-pkg (PRIVATE, pkgsrc/mk/install/replace.mk) +###################################################################### +### replace-pkg updates a package in-place on the system. +### +_REPLACE_PKG_TARGETS+= replace-tarup +_REPLACE_PKG_TARGETS+= replace-names +_REPLACE_PKG_TARGETS+= replace-preserve-required-by +_REPLACE_PKG_TARGETS+= deinstall +_REPLACE_PKG_TARGETS+= install-clean +_REPLACE_PKG_TARGETS+= install +_REPLACE_PKG_TARGETS+= replace-fixup-required-by + +replace-pkg: ${_REPLACE_PKG_TARGETS} + +###################################################################### +### undo-replace-pkg (PRIVATE, pkgsrc/mk/install/replace.mk) +###################################################################### +### undo-replace-pkg undoes a "make replace". +### +_UNDO_REPLACE_PKG_TARGETS+= undo-replace-check +_UNDO_REPLACE_PKG_TARGETS+= undo-replace-names +_UNDO_REPLACE_PKG_TARGETS+= replace-preserve-required-by +_UNDO_REPLACE_PKG_TARGETS+= deinstall +_UNDO_REPLACE_PKG_TARGETS+= undo-replace-install +_UNDO_REPLACE_PKG_TARGETS+= replace-fixup-required-by +_UNDO_REPLACE_PKG_TARGETS+= replace-clean + +undo-replace-pkg: ${_UNDO_REPLACE_PKG_TARGETS} + +_REQUIRED_BY_FILE= ${PKG_DB_TMPDIR}/+REQUIRED_BY + +_REPLACE_COOKIE= ${WRKDIR}/.replace_done +_REPLACE_OLDNAME_FILE= ${WRKDIR}/.replace_oldname +_REPLACE_NEWNAME_FILE= ${WRKDIR}/.replace_newname + +###################################################################### +### undo-replace-check (PRIVATE) +###################################################################### +### undo-replace-check verifies that there was a previous "replace" +### action performed that can be undone. +### +.PHONY: undo-replace-check +undo-replace-check: + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${TEST} ! -f ${_REPLACE_COOKIE} || exit 0; \ + ${ERROR_MSG} "No replacment to undo!"; \ + exit 1 + +###################################################################### +### replace-tarup (PRIVATE) +###################################################################### +### replace-tarup generates a binary package for the (older) installed +### package using pkg_tarup. +### +.PHONY: replace-tarup +replace-tarup: + ${_PKG_SILENT}${_PKG_DEBUG} \ + if ${TEST} ! -x ${_PKG_TARUP_CMD:Q}; then \ + ${ERROR_MSG} ${_PKG_TARUP_CMD:Q}" was not found."; \ + exit 1; \ + fi; \ + ${SETENV} PKG_DBDIR=${_PKG_DBDIR} PKG_SUFX=${PKG_SUFX} \ + PKGREPOSITORY=${WRKDIR} \ + ${_PKG_TARUP_CMD} ${PKGBASE} + +###################################################################### +### undo-replace-install (PRIVATE) +###################################################################### +### undo-replace-install re-installs the old package from the binary +### package saved from replace-tarup. +### +.PHONY: undo-replace-install +undo-replace-install: + @${ECHO_MSG} "${_PKGSRC_IN}> Re-adding ${PKGNAME} from saved tar-up package." + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${TEST} -f ${_REPLACE_NEWNAME_FILE} || exit 0; \ + newname=`${CAT} ${_REPLACE_NEWNAME_FILE}`; \ + ${ECHO} "Running "${PKG_ADD} ${WRKDIR}/$$newname${PKG_SUFX}"; \ + ${PKG_ADD} ${WRKDIR}/$$newname${PKG_SUFX} + +###################################################################### +### replace-names, undo-replace-names (PRIVATE) +###################################################################### +### replace-names and undo-replace-names save the correct names of the +### installed and replacement packages into files queried by other +### targets. +### +.PHONY: replace-names +replace-names: + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${_PKG_BEST_EXISTS} ${PKGWILDCARD:Q} > ${_REPLACE_OLDNAME_FILE} + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${ECHO} ${PKGNAME} > ${_REPLACE_NEWNAME_FILE} + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${CP} -f ${_REPLACE_NEWNAME_FILE} ${_REPLACE_COOKIE} + +.PHONY: undo-replace-names +undo-replace-names: + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${ECHO} ${PKGNAME} > ${_REPLACE_OLDNAME_FILE} + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${CP} -f ${_REPLACE_COOKIE} ${_REPLACE_NEWNAME_FILE} + +###################################################################### +### replace-preserve-required-by (PRIVATE) +###################################################################### +### replace-preserve-required-by saves and removes the +REQUIRED_BY +### file from the installed package. +### +.PHONY: replace-preserve-required-by +replace-preserve-required-by: + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${TEST} -f ${_REPLACE_OLDNAME_FILE} || exit 0; \ + ${STEP_MSG} "Preserving existing +REQUIRED_BY file."; + oldname=`${CAT} ${_REPLACE_OLDNAME_FILE}`; \ + required_by="${_PKG_DBDIR}/$$oldname/+REQUIRED_BY"; \ + ${TEST} ! -f "$$required_by" || \ + ${MV} $$required_by ${_REQUIRED_BY_FILE} + +###################################################################### +### replace-fixup-required-by (PRIVATE) +###################################################################### +### replace-fixup-required-by fixes the +CONTENTS files of dependent +### packages to refer to the replacement package. +### +.PHONY: replace-fixup-required-by +replace-fixup-required-by: + @${STEP_MSG} "Fixing @pkgdep entries in dependent packages." + ${_PKG_SILENT}${_PKG_DEBUG} \ + set -e; \ + ${TEST} -f ${_REPLACE_OLDNAME_FILE} || exit 0; \ + ${TEST} -f ${_REPLACE_NEWNAME_FILE} || exit 0; \ + ${TEST} -f ${_REQUIRED_BY_FILE} || exit 0; \ + oldname=`${CAT} ${_REPLACE_OLDNAME_FILE}`; \ + newname=`${CAT} ${_REPLACE_NEWNAME_FILE}`; \ + ${CAT} ${_REQUIRED_BY_FILE} | \ + while read pkg; do \ + case $$pkg in \ + /*) pkgdir="$$pkg" ;; \ + *) pkgdir="${_PKG_DBDIR}/$$pkg" ;; \ + esac; \ + contents="$$pkgdir/+CONTENTS"; \ + newcontents="$$contents.$$$$"; \ + ${SETENV} OLDNAME="$$oldname" NEWNAME="$$newname" \ + ${AWK} '($$0 ~ "^@pkgdep " ENVIRON["OLDNAME"]) \ + { print "@pkgdep " ENVIRON["NEWNAME"]; next } \ + { print }' \ + $$contents > $$newcontents; \ + ${MV} -f $$newcontents $$contents; \ + done + +###################################################################### +### replace-clean (PRIVATE) +###################################################################### +### replace-clean removes the state files for the "replace" target so +### that it may be re-invoked. +### +.PHONY: replace-clean +replace-clean: + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${TEST} -f ${_REPLACE_OLDNAME_FILE} || exit 0; \ + oldname=`${CAT} ${_REPLACE_OLDNAME_FILE}`; \ + ${RM} -f ${WRKDIR}/$$oldname${PKG_SUFX} + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${TEST} -f ${_REPLACE_NEWNAME_FILE} || exit 0; \ + newname=`${CAT} ${_REPLACE_NEWNAME_FILE}`; \ + ${RM} -f ${WRKDIR}/$$newname${PKG_SUFX} + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${RM} -f ${_REPLACE_OLDNAME_FILE} ${_REPLACE_NEWNAME_FILE} \ + ${_REPLACE_COOKIE} diff --git a/mk/flavor/pkg/utility.mk b/mk/flavor/pkg/utility.mk new file mode 100644 index 00000000000..35131b91c6a --- /dev/null +++ b/mk/flavor/pkg/utility.mk @@ -0,0 +1,75 @@ +# $NetBSD: utility.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +###################################################################### +### +### The targets below should probably be removed from pkgsrc. +### +###################################################################### + +# The 'info' target can be used to display information about a package. +.PHONY: info +info: + ${_PKG_SILENT}${_PKG_DEBUG}${PKG_INFO} "${PKGWILDCARD}" + +# The 'check' target can be used to check an installed package. +.PHONY: check +check: + ${_PKG_SILENT}${_PKG_DEBUG}${PKG_ADMIN} check "${PKGWILDCARD}" + +# The 'list' target can be used to list the files installed by a package. +.PHONY: list +list: + ${_PKG_SILENT}${_PKG_DEBUG}${PKG_INFO} -L "${PKGWILDCARD}" + +.PHONY: show-downlevel +show-downlevel: +.if defined(PKG_FAIL_REASON) + ${_PKG_SILENT}${_PKG_DEBUG}${DO_NADA} +.else + ${_PKG_SILENT}${_PKG_DEBUG} \ + found="`${_PKG_BEST_EXISTS} \"${PKGWILDCARD}\" || ${TRUE}`"; \ + if [ "X$$found" != "X" -a "X$$found" != "X${PKGNAME}" ]; then \ + ${ECHO} "${PKGBASE} package: $$found installed, pkgsrc version ${PKGNAME}"; \ + if [ "X$$STOP_DOWNLEVEL_AFTER_FIRST" != "X" ]; then \ + ${ECHO} "stopping after first downlevel pkg found"; \ + exit 1; \ + fi; \ + fi +.endif + +.PHONY: show-installed-depends +show-installed-depends: +.if !empty(DEPENDS) + ${_PKG_SILENT}${_PKG_DEBUG} \ + for i in ${DEPENDS:C/:.*$//:Q:S/\ / /g} ; do \ + echo "$$i =>" `${_PKG_BEST_EXISTS} "$$i"`; \ + done +.endif + +.PHONY: show-needs-update +show-needs-update: +.if !empty(DEPENDS) + ${_PKG_SILENT}${_PKG_DEBUG} \ + for i in `${MAKE} show-all-depends-dirs`; do \ + cd ${PKGSRCDIR}/$$i; \ + eval `${MAKE} show-vars-eval VARS='PKGNAME:want PKGWILDCARD:wild'`; \ + have=`${_PKG_BEST_EXISTS} "$$wild" || ${TRUE}`; \ + if [ -z "$$have" ]; then \ + ${ECHO} "$$i => (none) => needs install of $$want"; \ + elif [ "$$have" != "$$want" ]; then \ + ${ECHO} "$$i => $$have => needs update to $$want"; \ + fi; \ + done +.endif + +.PHONY: show-pkgsrc-dir +show-pkgsrc-dir: +.if defined(PKG_FAIL_REASON) + ${_PKG_SILENT}${_PKG_DEBUG}${DO_NADA} +.else + ${_PKG_SILENT}${_PKG_DEBUG} \ + found="`${_PKG_BEST_EXISTS} \"${PKGWILDCARD}\" || ${TRUE}`"; \ + if [ "X$$found" != "X" ]; then \ + ${ECHO} ${PKGPATH}; \ + fi +.endif diff --git a/mk/flavor/pkg/views.mk b/mk/flavor/pkg/views.mk new file mode 100644 index 00000000000..638b803dc40 --- /dev/null +++ b/mk/flavor/pkg/views.mk @@ -0,0 +1,91 @@ +# $NetBSD: views.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +# By default, all packages attempt to link into the views. +.if ${PKG_INSTALLATION_TYPE} == "pkgviews" +BUILD_VIEWS?= yes +.endif + +# DEFAULT_VIEW.${PKGBASE} default view for ${PKGBASE} +# VIEWBASE base location of files at run-time +# +DEFAULT_VIEW.${PKGBASE}?= ${DEFAULT_VIEW} +.if ${PKG_INSTALLATION_TYPE} == "pkgviews" +. if empty(DEFAULT_VIEW.${PKGBASE}:M"") +VIEWBASE= ${LOCALBASE}/${DEFAULT_VIEW.${PKGBASE}} +. else +VIEWBASE= ${LOCALBASE} +. endif +.elif ${PKG_INSTALLATION_TYPE} == "overwrite" +VIEWBASE= ${PREFIX} +.endif +MAKE_ENV+= VIEWBASE=${VIEWBASE} + +PKGVIEWS+= ${DEFAULT_VIEW.${PKGBASE}} + +.if ${PKG_INSTALLATION_TYPE} == "pkgviews" +privileged-install-hook: build-views +.endif + +###################################################################### +### build-views, su-build-views (PRIVATE) +###################################################################### +### build-views adds the package to each view in PKGVIEWS. +### +.PHONY: build-views su-build-views +build-views: su-target + @${ECHO_MSG} "${_PKGSRC_IN}> Building views for ${PKGNAME}" + +su-build-views: + ${_PKG_SILENT}${_PKG_DEBUG} \ + ${MKDIR} ${LOCALBASE}; \ + for v in "" ${PKGVIEWS}; do \ + ${TEST} -n "$$v" || continue; \ + case "$$v" in \ + "") dbdir=${PKG_DBDIR}; viewname=standard ;; \ + *) dbdir=${LOCALBASE}/$$v/.dbdir; viewname=$$v ;; \ + esac; \ + ${ECHO} "=> Performing package view clash check for ${PKGNAME} in $$viewname view"; \ + pkg=`${PKG_INFO_CMD} -K $$dbdir -e ${PKGBASE} || ${TRUE}`; \ + case "$$pkg" in \ + "") ;; \ + *) ${ECHO} "*** ${PKGBASE} exists in $$viewname view - package $$pkg ***"; \ + ${ECHO} "*** Not hoisting ${PKGNAME} into $$viewname view"; \ + continue; \ + ;; \ + esac; \ + ${ECHO} "=> Performing package view overwrite check for ${PKGNAME} in $$viewname view"; \ + dups=`${SETENV} PLIST_IGNORE_FILES=${_PLIST_IGNORE_FILES:Q} ${PKG_VIEW} --view=$$v check ${PKGNAME} || ${TRUE}`; \ + case "$$dups" in \ + "") ;; \ + *) ${ECHO} "***********************************************************"; \ + ${ECHO} "**** The following symbolic links will be overwritten *****"; \ + for f in $$dups; do \ + ${LS} -l ${LOCALBASE}/$$v/$$f; \ + done; \ + ${ECHO} "***********************************************************"; \ + ;; \ + esac; \ + ${ECHO} "=> Linking package into $$viewname view"; \ + ${SETENV} PLIST_IGNORE_FILES=${_PLIST_IGNORE_FILES:Q} ${PKG_VIEW} --view=$$v add ${PKGNAME}; \ + done + +###################################################################### +### remove-views, su-remove-views (PRIVATE) +###################################################################### +### remove-views removes the package from each view in PKGVIEWS. +### +.PHONY: remove-views su-remove-views +remove-views: su-target + @${ECHO_MSG} "${_PKGSRC_IN}> Removing ${PKGNAME} from views" + +su-remove-views: + ${_PKG_SILENT}${_PKG_DEBUG} \ + for v in "" ${PKGVIEWS}; do \ + ${TEST} -n "$$v" || continue; \ + case "$$v" in \ + "") dbdir=${PKG_DBDIR}; viewname=standard ;; \ + *) dbdir=${LOCALBASE}/$$v/.dbdir; viewname=$$v ;; \ + esac; \ + ${ECHO} "=> Removing package from $$viewname view"; \ + ${SETENV} PLIST_IGNORE_FILES=${_PLIST_IGNORE_FILES:Q} ${PKG_VIEW} --view=$$v delete ${PKGNAME}; \ + done diff --git a/mk/install/bsd.install-vars.mk b/mk/install/bsd.install-vars.mk new file mode 100644 index 00000000000..ec6c429021e --- /dev/null +++ b/mk/install/bsd.install-vars.mk @@ -0,0 +1,65 @@ +# $NetBSD: bsd.install-vars.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +# This Makefile fragment is included by bsd.prefs.mk and defines some +# variables which must be defined earlier than where bsd.install.mk +# is included. +# + +# If a package sets INSTALLATION_DIRS, then it's known to pre-create +# all of the directories that it needs at install-time, so we don't need +# mtree to do it for us. +# +.if defined(INSTALLATION_DIRS) && !empty(INSTALLATION_DIRS) +NO_MTREE= yes +.endif +# +# Certain classes of packages never need to run mtree during installation +# because they manage the creation of their own directories. +# +.if (${PKG_INSTALLATION_TYPE} == "pkgviews") && defined(CROSSBASE) +NO_MTREE= yes +.endif +.if !defined(NO_MTREE) +USE_TOOLS+= mtree +.endif + +# If MANZ is defined, then we want the final man pages to be compressed. +# If MANZ is not defined, then we want the final man pages to be +# uncompressed. +# +# We need to figure out if during installation, we need either gunzip +# or gzip to decompress or compress the installed man pages. If a +# package sets MANCOMPRESSED to "yes" or "no", then it's an indication +# to the install code that the package itself installed the man pages +# either compressed or uncompressed. If a package sets +# MANCOMPRESSED_IF_MANZ, then the package uses BSD-style makefiles, +# so we need to determine if the BSD-style makefile causes the man +# pages to be compressed or not. +# +.if !defined(_MANCOMPRESSED) +. if defined(MANCOMPRESSED) && !empty(MANCOMPRESSED:M[yY][eE][sS]) +_MANCOMPRESSED= yes +. else +_MANCOMPRESSED= no +. endif +. if defined(MANCOMPRESSED_IF_MANZ) && defined(PKGMAKECONF) +_MANCOMPRESSED!= \ + { ${ECHO} ".include \""${PKGMAKECONF:Q}"\""; \ + ${ECHO} "all:"; \ + ${ECHO} ".if defined(MANZ)"; \ + ${ECHO} " @${ECHO} yes"; \ + ${ECHO} ".else"; \ + ${ECHO} " @${ECHO} no"; \ + ${ECHO} ".endif"; \ + } | ${MAKE} -f - all +. endif +.endif +_MANZ= ${MANZ:Dyes:Uno} +MAKEVARS+= _MANCOMPRESSED _MANZ + +.if !empty(_MANCOMPRESSED:M[yY][eE][sS]) && empty(_MANZ:M[yY][eE][sS]) +USE_TOOLS+= gunzip +.endif +.if empty(_MANCOMPRESSED:M[yY][eE][sS]) && !empty(_MANZ:M[yY][eE][sS]) +USE_TOOLS+= gzip +.endif diff --git a/mk/install/bsd.install.mk b/mk/install/bsd.install.mk new file mode 100644 index 00000000000..2cfcb186e04 --- /dev/null +++ b/mk/install/bsd.install.mk @@ -0,0 +1,40 @@ +# $NetBSD: bsd.install.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +# This Makefile fragment is included by bsd.pkg.mk and provides all +# variables and targets related to installing packages. +# +# The following are the "public" targets provided this module: +# +# install, deinstall, reinstall, replace, undo-replace +# +# The following targets may be overridden in a package Makefile: +# +# pre-install, do-install, post-install +# + +_INSTALL_COOKIE= ${WRKDIR}/.install_done + +###################################################################### +### install (PUBLIC) +###################################################################### +### install is a public target to install the package. +### +.if defined(NO_INSTALL) +.PHONY: install +install: ${_PKGSRC_BUILD_TARGETS} install-cookie +.else +. include "${PKGSRCDIR}/mk/install/install.mk" +.endif + +.include "${PKGSRCDIR}/mk/install/deinstall.mk" +.include "${PKGSRCDIR}/mk/install/replace.mk" + +###################################################################### +### install-cookie (PRIVATE) +###################################################################### +### install-cookie creates the "install" cookie file. +### +.PHONY: install-cookie +install-cookie: + ${_PKG_SILENT}${_PKG_DEBUG}${ECHO} ${PKGNAME} >> ${_INSTALL_COOKIE} + diff --git a/mk/install/deinstall.mk b/mk/install/deinstall.mk new file mode 100644 index 00000000000..eccbd639911 --- /dev/null +++ b/mk/install/deinstall.mk @@ -0,0 +1,44 @@ +# $NetBSD: deinstall.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +# DEINSTALLDEPENDS controls whether dependencies and dependents are also +# removed when a package is de-installed. The valid values are: +# +# no only the package is removed (if dependencies allow it) +# yes dependent packages are also removed +# all dependent packages and unused dependencies are also removed +# +DEINSTALLDEPENDS?= no + +###################################################################### +### deinstall, su-deinstall (PUBLIC) +###################################################################### +### deinstall is a public target to remove an installed package. +### It will acquire elevated privileges just-in-time. +### +.PHONY: deinstall su-deinstall +deinstall: su-target + @${ECHO_MSG} "${_PKGSRC_IN}> Deinstalling for ${PKGNAME}" + +su-deinstall: deinstall-pkg install-clean + +MAKEFLAGS.su-deinstall= DEINSTALLDEPENDS=${DEINSTALLDEPENDS} + +###################################################################### +### reinstall (PUBLIC) +###################################################################### +### reinstall is a special target to re-run the install target. +### It will acquire elevated privileges just-in-time. +### +.PHONY: reinstall +reinstall: install-clean install + +###################################################################### +### deinstall-pkg (PRIVATE, override) +###################################################################### +### deinstall-pkg removes the package from the system. This should +### be overridden per package system flavor. +### +.if !target(deinstall-pkg) +deinstall-pkg: + @${DO_NADA} +.endif diff --git a/mk/install/install.mk b/mk/install/install.mk new file mode 100644 index 00000000000..3ccfc610702 --- /dev/null +++ b/mk/install/install.mk @@ -0,0 +1,302 @@ +# $NetBSD: install.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +###################################################################### +### install (PUBLIC) +###################################################################### +### install is a public target to install the package. It will +### acquire elevated privileges just-in-time. +### +_INSTALL_TARGETS+= ${_PKGSRC_BUILD_TARGETS} +_INSTALL_TARGETS+= acquire-install-lock +_INSTALL_TARGETS+= ${_INSTALL_COOKIE} +_INSTALL_TARGETS+= release-install-lock + +.PHONY: install +install: ${_INSTALL_TARGETS} + +.PHONY: acquire-install-lock release-install-lock +acquire-install-lock: acquire-lock +release-install-lock: release-lock + +${_INSTALL_COOKIE}: +.if !empty(INTERACTIVE_STAGE:Minstall) && defined(BATCH) + @${ECHO} "*** The installation stage of this package requires user interaction" + @${ECHO} "*** Please install manually with \"cd ${.CURDIR} && ${MAKE} install\"" + @${TOUCH} ${_INTERACTIVE_COOKIE} + @${FALSE} +.else + ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} real-install PKG_PHASE=install +.endif + +###################################################################### +### real-install (PRIVATE) +###################################################################### +### real-install is a helper target to set the PKG_PHASE explicitly to +### "install" before running the remainder of the install targets. +### +_REAL_INSTALL_TARGETS+= install-check-version +_REAL_INSTALL_TARGETS+= install-message +_REAL_INSTALL_TARGETS+= install-vars +_REAL_INSTALL_TARGETS+= unprivileged-install-hook +_REAL_INSTALL_TARGETS+= install-all +_REAL_INSTALL_TARGETS+= install-cookie + +.PHONY: real-install +real-install: ${_REAL_INSTALL_TARGETS} + +.PHONY: install-message +install-message: + @${ECHO_MSG} "${_PKGSRC_IN}> Installing for ${PKGNAME}" + +###################################################################### +### unprivileged-install-hook (PRIVATE, override, hook) +###################################################################### +### unprivileged-install-hook is a generic hook target that is run just +### before pkgsrc elevates privileges for install-all. +### +.PHONY: unprivileged-install-hook +.if !target(unprivileged-install-hook) +unprivileged-install-hook: + @${DO_NADA} +.endif + +###################################################################### +### install-check-version (PRIVATE) +###################################################################### +### install-check-version will verify that the built package located in +### ${WRKDIR} matches the version specified in the package Makefile. +### This is a check against stale work directories. +### +.PHONY: install-check-version +install-check-version: ${_EXTRACT_COOKIE} + ${_PKG_SILENT}${_PKG_DEBUG} \ + extractname=`${CAT} ${_EXTRACT_COOKIE}`; \ + pkgname=${PKGNAME}; \ + case "$$extractname" in \ + "") ${ECHO_MSG} "*** Warning: ${WRKDIR} may contain an older version of ${PKGBASE}" ;; \ + "$$pkgname") ;; \ + *) ${ECHO_MSG} "*** Warning: Package version $$extractname in ${WRKDIR}"; \ + ${ECHO_MSG} "*** Current version $$pkgname in ${PKG_PATH}"; \ + ${ECHO_MSG} "*** Cleaning and rebuilding $$pkgname..."; \ + ${MAKE} clean && ${MAKE} build ;; \ + esac + +###################################################################### +### The targets below are run with elevated privileges. +###################################################################### + +###################################################################### +### install-all, su-install-all (PRIVATE) +###################################################################### +### install-all is a helper target to run the install target of +### the built software, register the software installation, and run +### some sanity checks. +### +.if !defined(NO_PKG_REGISTER) && !defined(FORCE_PKG_REGISTER) +_INSTALL_ALL_TARGETS+= install-check-conflicts +_INSTALL_ALL_TARGETS+= install-check-installed +.endif +_INSTALL_ALL_TARGETS+= install-check-umask +.if empty(CHECK_FILES:M[nN][oO]) +_INSTALL_ALL_TARGETS+= check-files-pre +.endif +_INSTALL_ALL_TARGETS+= install-makedirs +_INSTALL_ALL_TARGETS+= pre-install-script +_INSTALL_ALL_TARGETS+= pre-install +_INSTALL_ALL_TARGETS+= do-install +_INSTALL_ALL_TARGETS+= post-install +_INSTALL_ALL_TARGETS+= plist +_INSTALL_ALL_TARGETS+= install-doc-handling +_INSTALL_ALL_TARGETS+= install-script-data +.if empty(CHECK_FILES:M[nN][oO]) +_INSTALL_ALL_TARGETS+= check-files-post +.endif +_INSTALL_ALL_TARGETS+= post-install-script +.if !defined(NO_PKG_REGISTER) +_INSTALL_ALL_TARGETS+= register-pkg +.endif +_INSTALL_ALL_TARGETS+= privileged-install-hook + +.if empty(CHECK_SHLIBS:M[nN][oO]) +privileged-install-hook: check-shlibs +.endif +.if empty(CHECK_WRKREF:M[nN][oO]) +privileged-install-hook: check-wrkref +.endif +.if empty(CHECK_FILES:M[nN][oO]) +privileged-install-hook: check-files +.endif +.if empty(CHECK_INTERPRETER:M[nN][oO]) +privileged-install-hook: check-interpreter +.endif + +.PHONY: install-all su-install-all +install-all: su-target +su-install-all: ${_INSTALL_ALL_TARGETS} + +###################################################################### +### install-check-conflicts (PRIVATE, override) +###################################################################### +### install-check-conflicts check for conflicts between the package and +### any installed packages. This should be overridden per package +### system flavor. +### +.PHONY: install-check-conflicts +.if !target(install-check-conflicts) +install-check-conflicts: + @${DO_NADA} +.endif + +###################################################################### +### install-check-installed (PRIVATE, override) +###################################################################### +### install-check-installed checks if the package (perhaps an older +### version) is already installed on the system. This should be +### overridden per package system flavor. +### +.PHONY: install-check-installed +.if !target(install-check-installed) +install-check-installed: + @${DO_NADA} +.endif + +###################################################################### +### install-check-umask (PRIVATE) +###################################################################### +### install-check-umask tests whether the umask is properly set and +### emits a non-fatal warning otherwise. +### +.PHONY: install-check-umask +install-check-umask: + ${_PKG_SILENT}${_PKG_DEBUG} \ + umask=`${SH} -c umask`; \ + if ${TEST} "$$umask" -ne ${DEF_UMASK}; then \ + ${ECHO_MSG} "${_PKGSRC_IN}> Warning: your umask is \`\`$$umask''."; \ + ${ECHO_MSG} "If this is not desired, set it to an appropriate value (${DEF_UMASK}) and install"; \ + ${ECHO_MSG} "this package again by \`\`${MAKE} deinstall reinstall''."; \ + fi + +###################################################################### +### install-makedirs (PRIVATE) +###################################################################### +### install-makedirs is a target to create directories expected to +### exist prior to installation. If a package sets INSTALLATION_DIRS, +### then it's known to pre-create all of the directories that it needs +### at install-time, so we don't need mtree to do it for us. +### +MTREE_FILE?= ${PKGSRCDIR}/mk/platform/${OPSYS}.pkg.dist +MTREE_ARGS?= -U -f ${MTREE_FILE} -d -e -p + +.PHONY: install-makedirs +install-makedirs: + ${_PKG_SILENT}${_PKG_DEBUG}${TEST} -d ${PREFIX} || ${MKDIR} ${PREFIX} +.if !defined(NO_MTREE) + ${_PKG_SILENT}${_PKG_DEBUG}${TEST} ! -f ${MTREE_FILE} || \ + ${MTREE} ${MTREE_ARGS} ${PREFIX}/ +.endif +.if defined(INSTALLATION_DIRS) && !empty(INSTALLATION_DIRS) + @${ECHO_MSG} "${_PKGSRC_IN}> Creating installation directories" + ${_PKG_SILENT}${_PKG_DEBUG} \ + for dir in ${INSTALLATION_DIRS}; do \ + case "$$dir" in \ + ${PREFIX}/*) \ + dir=`${ECHO} $$dir | ${SED} "s|^${PREFIX}/||"` ;; \ + /*) continue ;; \ + esac; \ + case "$$dir" in \ + *bin|*bin/*|*libexec|*libexec/*) \ + ${INSTALL_PROGRAM_DIR} ${PREFIX}/$$dir ;; \ + ${PKGMANDIR}/*) \ + ${INSTALL_MAN_DIR} ${PREFIX}/$$dir ;; \ + *) \ + ${INSTALL_DATA_DIR} ${PREFIX}/$$dir ;; \ + esac; \ + done +.endif # INSTALLATION_DIRS + +###################################################################### +### pre-install, do-install, post-install (PUBLIC, override) +###################################################################### +### {pre,do,post}-install are the heart of the package-customizable +### install targets, and may be overridden within a package Makefile. +### +.PHONY: pre-install do-install post-install + +INSTALL_DIRS?= ${BUILD_DIRS} +INSTALL_MAKE_FLAGS?= ${MAKE_FLAGS} +INSTALL_TARGET?= install ${USE_IMAKE:D${NO_INSTALL_MANPAGES:D:Uinstall.man}} + +.if !target(do-install) +do-install: +. for _dir_ in ${INSTALL_DIRS} + ${_PKG_SILENT}${_PKG_DEBUG}${_ULIMIT_CMD} \ + cd ${WRKSRC} && cd ${_dir_} && \ + ${SETENV} ${MAKE_ENV} ${MAKE_PROGRAM} ${INSTALL_MAKE_FLAGS} \ + -f ${MAKEFILE} ${INSTALL_TARGET} +. endfor +.endif + +.if !target(pre-install) +pre-install: + @${DO_NADA} +.endif +.if !target(post-install) +post-install: + @${DO_NADA} +.endif + +###################################################################### +### install-doc-handling (PRIVATE) +###################################################################### +### install-doc-handling does automatic document (de)compression based +### on the contents of the PLIST. +### +_PLIST_REGEXP.info= \ + ^([^\/]*\/)*${PKGINFODIR}/[^/]*(\.info)?(-[0-9]+)?(\.gz)?$$ +_PLIST_REGEXP.man= \ + ^([^/]*/)+(man[1-9ln]/[^/]*\.[1-9ln]|cat[1-9ln]/[^/]*\.[0-9])(\.gz)?$$ + +_DOC_COMPRESS= \ + ${SETENV} PATH=${PATH:Q} \ + MANZ=${_MANZ} \ + PKG_VERBOSE=${PKG_VERBOSE} \ + TEST=${TOOLS_TEST:Q} \ + ${SH} ${PKGSRCDIR}/mk/plist/doc-compress ${PREFIX} + +.PHONY: install-doc-handling +install-doc-handling: plist + @${ECHO_MSG} "${_PKGSRC_IN}> [Automatic manual page handling]" + ${_PKG_SILENT}${_PKG_DEBUG}${CAT} ${PLIST} | ${GREP} -v "^@" | \ + ${EGREP} ${_PLIST_REGEXP.man:Q} | ${_DOC_COMPRESS} + +###################################################################### +### register-pkg (PRIVATE, override) +###################################################################### +### register-pkg registers the package as being installed on the system. +### +.PHONY: register-pkg +.if !target(register-pkg) +register-pkg: + @${DO_NADA} +.endif + +###################################################################### +### privileged-install-hook (PRIVATE, override, hook) +###################################################################### +### privileged-install-hook is a generic hook target that is run just +### before pkgsrc drops elevated privileges. +### +.PHONY: privileged-install-hook +.if !target(privileged-install-hook) +privileged-install-hook: + @${DO_NADA} +.endif + +###################################################################### +### install-clean (PRIVATE) +###################################################################### +### install-clean removes the state files for the "install" and +### later phases so that the "install" target may be re-invoked. +### +install-clean: package-clean check-clean + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${PLIST} ${_INSTALL_COOKIE} diff --git a/mk/install/replace.mk b/mk/install/replace.mk new file mode 100644 index 00000000000..18623adf950 --- /dev/null +++ b/mk/install/replace.mk @@ -0,0 +1,59 @@ +# $NetBSD: replace.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +###################################################################### +### replace (PUBLIC) +###################################################################### +### replace is a public target to update a package in-place on the +### system. It will acquire elevated privileges just-in-time. +### +_REPLACE_TARGETS+= ${_PKGSRC_BUILD_TARGETS} +_REPLACE_TARGETS+= replace-message +_REPLACE_TARGETS+= unprivileged-install-hook + +.PHONY: replace su-replace +replace: ${_REPLACE_TARGETS} su-target + +replace-message: + @${ECHO_MSG} "${_PKGSRC_IN}> Replacing for ${PKGNAME}" + @${WARNING_MSG} "experimental target - DATA LOSS MAY OCCUR." + +su-replace: replace-pkg +MAKEFLAGS.su-replace= UPDATE_RUNNING=yes + +###################################################################### +### undo-replace (PUBLIC) +###################################################################### +### undo-replace is a public target to undo the effects of the +### "replace" target. It will acquire elevated privileges just-in-time. +### +.PHONY: undo-replace su-undo-replace +undo-replace: undo-replace-message su-target + +undo-replace-message: + @${ECHO_MSG} "${_PKGSRC_IN}> Undoing replacement for ${PKGNAME}" + @${WARNING_MSG} "experimental target - DATA LOSS MAY OCCUR." + +su-undo-replace: undo-replace-pkg +MAKEFLAGS.su-undo-replace= UPDATE_RUNNING=yes + +###################################################################### +### replace-pkg (PRIVATE, override) +###################################################################### +### replace-pkg updates a package in-place on the system. This should +### be overridden per package system flavor. +### +.if !target(replace-pkg) +replace-pkg: + @${DO_NADA} +.endif + +###################################################################### +### undo-replace-pkg (PRIVATE, override) +###################################################################### +### undo-replace-pkg undoes a "make replace". This should be overridden +### per package system flavor. +### +.if !target(undo-replace-pkg) +undo-replace-pkg: + @${DO_NADA} +.endif diff --git a/mk/package/bsd.package.mk b/mk/package/bsd.package.mk new file mode 100644 index 00000000000..d37a9433dc8 --- /dev/null +++ b/mk/package/bsd.package.mk @@ -0,0 +1,45 @@ +# $NetBSD: bsd.package.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ +# +# This Makefile fragment is included by bsd.pkg.mk and provides all +# variables and targets related to binary packages. +# +# The following are the "public" targets provided by this module: +# +# package, repackage +# + +_PACKAGE_COOKIE= ${WRKDIR}/.package_done + +###################################################################### +### package (PUBLIC) +###################################################################### +### package is a public target to generate a binary package. +### +.if defined(NO_PACKAGE) +.PHONY: package +package: install +. if defined(SKIP_SILENT) + @${DO_NADA} +. else + @${ECHO_MSG} "${_PKGSRC_IN}> ${PKGNAME} may not be packaged: "${NO_PACKAGE:Q}"." +. endif +.else +. include "${PKGSRCDIR}/mk/package/package.mk" +.endif + +###################################################################### +### repackage (PUBLIC) +###################################################################### +### repackage is a special target to re-run the package target. +### +.PHONY: repackage +repackage: package-clean package + +###################################################################### +### package-clean (PRIVATE) +###################################################################### +### package-clean removes the state files associated with the "package" +### phase so that the "package" target may be re-invoked. +### +package-clean: + ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${_PACKAGE_COOKIE} diff --git a/mk/package/package.mk b/mk/package/package.mk new file mode 100644 index 00000000000..58617b7eef8 --- /dev/null +++ b/mk/package/package.mk @@ -0,0 +1,109 @@ +# $NetBSD: package.mk,v 1.1 2006/06/03 23:11:42 jlam Exp $ + +_PACKAGE_COOKIE= ${WRKDIR}/.package_done + +###################################################################### +### package (PUBLIC) +###################################################################### +### package is a public target to generate a binary package. It will +### acquire elevated privileges just-in-time. +### +_PACKAGE_TARGETS+= install +_PACKAGE_TARGETS+= acquire-package-lock +_PACKAGE_TARGETS+= ${_PACKAGE_COOKIE} +_PACKAGE_TARGETS+= release-package-lock + +.PHONY: package +package: ${_PACKAGE_TARGETS} + +.PHONY: acquire-package-lock release-package-lock +acquire-package-lock: acquire-lock +release-package-lock: release-lock + +${_PACKAGE_COOKIE}: + ${_PKG_SILENT}${_PKG_DEBUG}cd ${.CURDIR} && ${MAKE} ${MAKEFLAGS} real-package PKG_PHASE=package + +###################################################################### +### real-package (PRIVATE) +###################################################################### +### real-package is a helper target to set the PKG_PHASE explicitly to +### "package" before running the remainder of the package targets. +### +.PHONY: real-package +real-package: package-message package-all package-cookie + +.PHONY: package-message +package-message: + @${ECHO_MSG} "${_PKGSRC_IN}> Building binary package for ${PKGNAME}" + +###################################################################### +### package-cookie (PRIVATE) +###################################################################### +### package-cookie creates the "package" cookie file +### +.PHONY: package-cookie +package-cookie: + ${_PKG_SILENT}${_PKG_DEBUG}${ECHO} ${PKGNAME} >> ${_PACKAGE_COOKIE} + +###################################################################### +### The targets below are run with elevated privileges. +###################################################################### + +###################################################################### +### package-all, su-package-all (PRIVATE) +###################################################################### +### package-all is a helper target to create the binary package and +### generate any necessary warnings. +### +_PACKAGE_ALL_TARGETS+= package-check-installed +_PACKAGE_ALL_TARGETS+= package-create +_PACKAGE_ALL_TARGETS+= package-warnings + +.PHONY: package-all su-package-all +package-all: su-target +su-package-all: ${_PACKAGE_ALL_TARGETS} + +###################################################################### +### package-check-installed (PRIVATE, override) +###################################################################### +### package-check-installed verifies that the package is installed on +### the system. This should be overridden per package system flavor. +### +.if !target(package-check-installed) +.PHONY: package-check-installed +package-check-installed: + @${DO_NADA} +.endif + +###################################################################### +### package-create (PRIVATE, override) +###################################################################### +### package-create creates the binary package. This should be overridden +### per package system flavor. +### +.if !target(package-create) +.PHONY: package-create +package-create: + @${DO_NADA} +.endif + +###################################################################### +### package-warnings (PRIVATE) +###################################################################### +### package-warnings displays warnings about the binary package. +### +.PHONY: package-warnings +package-warnings: +.if defined(NO_BIN_ON_CDROM) + @${ECHO_MSG} "${_PKGSRC_IN}> Warning: ${PKGNAME} may not be put on a CD-ROM:" + @${ECHO_MSG} "${_PKGSRC_IN}> " ${NO_BIN_ON_CDROM:Q} +.endif +.if defined(NO_BIN_ON_FTP) + @${ECHO_MSG} "${_PKGSRC_IN}> Warning: ${PKGNAME} may not be made available through FTP:" + @${ECHO_MSG} "${_PKGSRC_IN}> " ${NO_BIN_ON_FTP:Q} +.endif +.if defined(ABI_DEPENDS) && !empty(USE_ABI_DEPENDS:M[Nn][Oo]) + @${ECHO_MSG} "${_PKGSRC_IN}> Warning: ABI dependency recommendations are being ignored!" + @${ECHO_MSG} "${_PKGSRC_IN}> ${PKGNAME} should not be uploaded nor" + @${ECHO_MSG} "${_PKGSRC_IN}> otherwise be used as a binary package!" +.endif diff --git a/mk/pkginstall/bsd.pkginstall.mk b/mk/pkginstall/bsd.pkginstall.mk index 22182d62087..613cf67a81f 100644 --- a/mk/pkginstall/bsd.pkginstall.mk +++ b/mk/pkginstall/bsd.pkginstall.mk @@ -1,4 +1,4 @@ -# $NetBSD: bsd.pkginstall.mk,v 1.1 2006/05/21 23:50:15 jlam Exp $ +# $NetBSD: bsd.pkginstall.mk,v 1.2 2006/06/03 23:11:43 jlam Exp $ # # This Makefile fragment is included by bsd.pkg.mk and implements the # common INSTALL/DEINSTALL scripts framework. To use the pkginstall @@ -27,6 +27,11 @@ _ZERO_FILESIZE_P= ${AWK} 'END { exit NR ? 1 : 0; }' _PKGINSTALL_DIR= ${WRKDIR}/.pkginstall +# XXX This should not be duplicated from the install module, but we +# XXX need this until pkginstall is refactored. +# XXX +PKG_DB_TMPDIR?= ${WRKDIR}/.pkgdb/${PKGNAME} + # These are the template scripts for the INSTALL/DEINSTALL scripts. # Packages may do additional work in the INSTALL/DEINSTALL scripts by # overriding the variables DEINSTALL_TEMPLATE and INSTALL_TEMPLATE to diff --git a/mk/plist/plist.mk b/mk/plist/plist.mk index c7c7b757da6..fa4b04e5314 100644 --- a/mk/plist/plist.mk +++ b/mk/plist/plist.mk @@ -1,4 +1,4 @@ -# $NetBSD: plist.mk,v 1.11 2006/04/17 06:30:48 jlam Exp $ +# $NetBSD: plist.mk,v 1.12 2006/06/03 23:11:43 jlam Exp $ # # This Makefile fragment handles the creation of PLISTs for use by # pkg_create(8). @@ -226,6 +226,7 @@ plist: ${PLIST} ${PLIST}: ${PLIST_SRC} .endif ${PLIST}: + ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H} ${_PKG_SILENT}${_PKG_DEBUG} \ { ${_GENERATE_PLIST} } | \ ${SETENV} ${_PLIST_AWK_ENV} ${AWK} ${_PLIST_AWK} | \ diff --git a/mk/reduce-depends.mk b/mk/reduce-depends.mk deleted file mode 100644 index 28cd8d929c1..00000000000 --- a/mk/reduce-depends.mk +++ /dev/null @@ -1,128 +0,0 @@ -# $NetBSD: reduce-depends.mk,v 1.3 2005/10/09 08:48:44 rillig Exp $ -# -# Copyright (c) 2004 The NetBSD Foundation, Inc. -# All rights reserved. -# -# This code is derived from software contributed to The NetBSD Foundation -# by Johnny C. Lam. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. All advertising materials mentioning features or use of this software -# must display the following acknowledgement: -# This product includes software developed by the NetBSD -# Foundation, Inc. and its contributors. -# 4. Neither the name of The NetBSD Foundation nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS -# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS -# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -# This Makefile fragment takes the dependencies listed in ${DEPENDS} and -# creates a smaller set of dependencies in ${REDUCED_DEPENDS} that imply -# the same dependency relationships as ${DEPENDS}. - -# We skip the dependency calculation for some phases since they never -# use the dependency information. In these cases, ${REDUCED_DEPENDS} -# is simply empty. -# -_PHASES_SKIP_DEPENDS= fetch patch tools wrapper configure build test -.if !empty(_PHASES_SKIP_DEPENDS:M${PKG_PHASE}) -_DEPENDS= # empty -.else -_DEPENDS= ${DEPENDS} -.endif - -# _DEPENDS_PKGPATHS contains the full physical paths to the pkgsrc -# directories for dependencies. -# _DEPENDS_PKGPATH.<relpkgpath> maps <relpkgpath> to the full physical path. -# _DEPENDS.<physpkgpath> is a list of the wildcard dependencies associated -# with <physpkgpath>. -# -_DEPENDS_PKGPATHS= # empty -.for _dep_ in ${_DEPENDS} -. for _depdir_ in ${_dep_:C/^[^:]*://:C/:.*$//} -. if !defined(_DEPENDS_PKGPATH.${_depdir_}) -. if exists(${_depdir_}) -_DEPENDS_PKGPATH.${_depdir_}!= cd ${_depdir_:Q} && ${PWD_CMD} -. else -PKG_FAIL_REASON+= "[reduce-depends.mk] "${PKGPATH:Q}" depends on "${_depdir_:Q}", but the latter does not exist." -. endif -. endif -_DEPENDS_PKGPATH.${_DEPENDS_PKGPATH.${_depdir_}}?= ${_depdir_} -_DEPENDS.${_DEPENDS_PKGPATH.${_depdir_}}+= ${_dep_:C/:.*$//} -. if empty(_DEPENDS_PKGPATHS:M${_DEPENDS_PKGPATH.${_depdir_}}) -_DEPENDS_PKGPATHS+= ${_DEPENDS_PKGPATH.${_depdir_}} -. endif -. endfor -.endfor - -# This next block of code sets REDUCED_DEPENDS to the strictest set of -# dependencies it can derive from all of ${_DEPENDS.<path>}. It only -# understands dependencies of the form foo>=1.0, and leaves the other -# dependencies undisturbed. -# -# The algorithm takes dependencies of the form foo>=1.0 and converts -# them to foo-1.0. It then compares this pkg name against each -# dependency to see if it satisfies them all. The key fact is the -# the strictest dependency, when converted to a pkg name, will satisfy -# every dependency. -# -REDUCED_DEPENDS= # empty -.for _path_ in ${_DEPENDS_PKGPATHS} -_GE_DEPENDS.${_path_}= ${_DEPENDS.${_path_}:N*\{*:M*>=[0-9]*} -_STRICTEST_DEPENDS.${_path_}?= none -. for _depend_ in ${_GE_DEPENDS.${_path_}} -. for _dep2pkg_ in ${_depend_:S/>=/-/} -. if ${_STRICTEST_DEPENDS.${_path_}} == "none" -_SATISFIES_DEPENDS.${_path_}= YES -. for _dep_ in ${_GE_DEPENDS.${_path_}} -. if !empty(_SATISFIES_DEPENDS.${_path_}:M[yY][eE][sS]) -_SATISFIES_DEPENDS.${_path_}!= \ - if ${PKG_ADMIN} pmatch '${_dep_}' ${_dep2pkg_}; then \ - ${ECHO} "YES"; \ - else \ - ${ECHO} "NO"; \ - fi -. endif -. endfor -. if !empty(_SATISFIES_DEPENDS.${_path_}:M[yY][eE][sS]) -_STRICTEST_DEPENDS.${_path_}= ${_depend_} -. endif -. endif -. endfor -. endfor -. if ${_STRICTEST_DEPENDS.${_path_}} == "none" -# -# The dependencies simply conflict, so just pass them on through to the -# normal dependency handling code. -# -. for _depend_ in ${_DEPENDS.${_path_}} -REDUCED_DEPENDS+= ${_depend_}:${_DEPENDS_PKGPATH.${_path_}} -. endfor -. else -. for _depend_ in ${_DEPENDS.${_path_}} -. if empty(_GE_DEPENDS.${_path_}:M${_depend_}) -REDUCED_DEPENDS+= ${_depend_}:${_DEPENDS_PKGPATH.${_path_}} -. endif -. endfor -REDUCED_DEPENDS+= ${_STRICTEST_DEPENDS.${_path_}}:${_DEPENDS_PKGPATH.${_path_}} -. endif -.endfor |