355 lines
12 KiB
Makefile
355 lines
12 KiB
Makefile
# $NetBSD: install.mk,v 1.51 2008/06/11 07:30:33 obache Exp $
|
|
#
|
|
# This file provides the code for the "install" phase.
|
|
#
|
|
# Public targets:
|
|
#
|
|
# install:
|
|
# Installs the package files into LOCALBASE.
|
|
#
|
|
|
|
# Interface for other infrastructure components:
|
|
#
|
|
# Hooks for use by the infrastructure:
|
|
#
|
|
# privileged-install-hook:
|
|
# This hook is placed after the package has been installed,
|
|
# before leaving the privileged mode.
|
|
#
|
|
# unprivileged-install-hook:
|
|
# This hook is placed _before_ switching to privileged mode
|
|
# in order to install the package.
|
|
#
|
|
# === Package-settable variables ===
|
|
#
|
|
# INSTALLATION_DIRS
|
|
# A list of directories that should be created at the very
|
|
# beginning of the install phase. These directories are relative
|
|
# to ${PREFIX}. As a convenience, a leading man/ is transformed
|
|
# to ${PKGMANDIR}, to save package authors from typing too much.
|
|
#
|
|
# AUTO_MKDIRS
|
|
# INSTALLATION_DIRS_FROM_PLIST
|
|
# In most (or even all?) cases the PLIST files in the package
|
|
# directory already contain all directories that are needed.
|
|
# When this variable is set to "yes", all directories mentioned
|
|
# in the PLIST files will be created like in INSTALLATION_DIRS.
|
|
#
|
|
|
|
######################################################################
|
|
### install (PUBLIC)
|
|
######################################################################
|
|
### install is a public target to install the package. It will
|
|
### acquire elevated privileges just-in-time.
|
|
###
|
|
_INSTALL_TARGETS+= check-vulnerable
|
|
_INSTALL_TARGETS+= ${_PKGSRC_BUILD_TARGETS}
|
|
_INSTALL_TARGETS+= acquire-install-lock
|
|
_INSTALL_TARGETS+= ${_COOKIE.install}
|
|
_INSTALL_TARGETS+= release-install-lock
|
|
|
|
.PHONY: install
|
|
.if !target(install)
|
|
. if exists(${_COOKIE.install})
|
|
install:
|
|
@${DO_NADA}
|
|
. elif defined(_PKGSRC_BARRIER)
|
|
install: ${_INSTALL_TARGETS}
|
|
. else
|
|
install: barrier
|
|
. endif
|
|
.endif
|
|
|
|
.PHONY: acquire-install-lock release-install-lock
|
|
acquire-install-lock: acquire-lock
|
|
release-install-lock: release-lock
|
|
|
|
.if exists(${_COOKIE.install})
|
|
${_COOKIE.install}:
|
|
@${DO_NADA}
|
|
.else
|
|
${_COOKIE.install}: real-install
|
|
.endif
|
|
|
|
######################################################################
|
|
### real-install (PRIVATE)
|
|
######################################################################
|
|
### real-install is a helper target onto which one can hook all of the
|
|
### targets that do the actual installing of the built objects.
|
|
###
|
|
_REAL_INSTALL_TARGETS+= install-check-interactive
|
|
_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:
|
|
@${PHASE_MSG} "Installing for ${PKGNAME}"
|
|
|
|
######################################################################
|
|
### install-check-interactive (PRIVATE)
|
|
######################################################################
|
|
### install-check-interactive checks whether we must do an interactive
|
|
### install or not.
|
|
###
|
|
install-check-interactive: .PHONY
|
|
.if !empty(INTERACTIVE_STAGE:Minstall) && defined(BATCH)
|
|
@${ERROR_MSG} "The installation stage of this package requires user interaction"
|
|
@${ERROR_MSG} "Please install manually with:"
|
|
@${ERROR_MSG} " \"cd ${.CURDIR} && ${MAKE} install\""
|
|
${RUN} ${FALSE}
|
|
.else
|
|
@${DO_NADA}
|
|
.endif
|
|
|
|
.PHONY: unprivileged-install-hook
|
|
unprivileged-install-hook:
|
|
@${DO_NADA}
|
|
|
|
######################################################################
|
|
### 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: ${_COOKIE.extract}
|
|
${RUN} \
|
|
extractname=`${CAT} ${_COOKIE.extract}`; \
|
|
pkgname=${PKGNAME}; \
|
|
case "$$extractname" in \
|
|
"") ${WARNING_MSG} "${WRKDIR} may contain an older version of ${PKGBASE}" ;; \
|
|
"$$pkgname") ;; \
|
|
*) ${WARNING_MSG} "Package version $$extractname in ${WRKDIR}"; \
|
|
${WARNING_MSG} "Current version $$pkgname in ${PKGPATH}"; \
|
|
${WARNING_MSG} "Cleaning and rebuilding $$pkgname..."; \
|
|
${RECURSIVE_MAKE} ${MAKEFLAGS} clean; \
|
|
${RECURSIVE_MAKE} ${MAKEFLAGS} build ;; \
|
|
esac
|
|
|
|
######################################################################
|
|
### The targets below are run with elevated privileges.
|
|
######################################################################
|
|
|
|
.PHONY: acquire-install-localbase-lock release-install-localbase-lock
|
|
acquire-install-localbase-lock: acquire-localbase-lock
|
|
release-install-localbase-lock: release-localbase-lock
|
|
|
|
######################################################################
|
|
### 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 ${_USE_DESTDIR} != "user-destdir"
|
|
_INSTALL_ALL_TARGETS+= acquire-install-localbase-lock
|
|
.endif
|
|
.if ${_USE_DESTDIR} == "no"
|
|
_INSTALL_ALL_TARGETS+= _flavor-check-conflicts
|
|
_INSTALL_ALL_TARGETS+= _flavor-check-installed
|
|
.endif
|
|
_INSTALL_ALL_TARGETS+= install-check-umask
|
|
.if empty(CHECK_FILES:M[nN][oO]) && !empty(CHECK_FILES_SUPPORTED:M[Yy][Ee][Ss])
|
|
_INSTALL_ALL_TARGETS+= check-files-pre
|
|
.endif
|
|
_INSTALL_ALL_TARGETS+= install-makedirs
|
|
.if defined(INSTALLATION_DIRS_FROM_PLIST) && \
|
|
!empty(INSTALLATION_DIRS_FROM_PLIST:M[Yy][Ee][Ss])
|
|
_INSTALL_ALL_TARGETS+= install-dirs-from-PLIST
|
|
.elif defined(AUTO_MKDIRS) && !empty(AUTO_MKDIRS:M[Yy][Ee][Ss])
|
|
_INSTALL_ALL_TARGETS+= install-dirs-from-PLIST
|
|
.endif
|
|
.if ${_USE_DESTDIR} == "no"
|
|
_INSTALL_ALL_TARGETS+= pre-install-script
|
|
.endif
|
|
_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]) && !empty(CHECK_FILES_SUPPORTED:M[Yy][Ee][Ss])
|
|
_INSTALL_ALL_TARGETS+= check-files-post
|
|
.endif
|
|
.if ${_USE_DESTDIR} == "no"
|
|
_INSTALL_ALL_TARGETS+= post-install-script
|
|
.endif
|
|
.if ${_USE_DESTDIR} == "no"
|
|
_INSTALL_ALL_TARGETS+= _flavor-register
|
|
.else
|
|
_INSTALL_ALL_TARGETS+= _flavor-generate-metadata
|
|
.endif
|
|
_INSTALL_ALL_TARGETS+= privileged-install-hook
|
|
.if ${_USE_DESTDIR} != "user-destdir"
|
|
_INSTALL_ALL_TARGETS+= release-install-localbase-lock
|
|
.endif
|
|
_INSTALL_ALL_TARGETS+= error-check
|
|
|
|
.PHONY: install-all su-install-all
|
|
. if !empty(_MAKE_INSTALL_AS_ROOT:M[Yy][Ee][Ss])
|
|
install-all: su-target
|
|
. else
|
|
install-all: su-install-all
|
|
. endif
|
|
su-install-all: ${_INSTALL_ALL_TARGETS}
|
|
|
|
######################################################################
|
|
### 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:
|
|
${RUN} \
|
|
umask=`${SH} -c umask`; \
|
|
if [ "$$umask" -ne ${DEF_UMASK} ]; then \
|
|
${WARNING_MSG} "Your umask is \`\`$$umask''."; \
|
|
${WARNING_MSG} "If this is not desired, set it to an appropriate value (${DEF_UMASK}) and install"; \
|
|
${WARNING_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. The package is supposed to create
|
|
### all directories not listed in INSTALLATION_DIRS.
|
|
###
|
|
|
|
# A shell command that creates the directory ${DESTDIR}${PREFIX}/$$dir
|
|
# with appropriate permissions and ownership.
|
|
#
|
|
_INSTALL_ONE_DIR_CMD= { \
|
|
ddir="${DESTDIR}${PREFIX}/$$dir"; \
|
|
[ ! -f "$$ddir" ] || ${FAIL_MSG} "[install.mk] $$ddir should be a directory, but is a file."; \
|
|
case "$$dir" in \
|
|
*bin|*bin/*|*libexec|*libexec/*) \
|
|
${INSTALL_PROGRAM_DIR} "$$ddir" ;; \
|
|
${PKGMANDIR}/*) \
|
|
${INSTALL_MAN_DIR} "$$ddir" ;; \
|
|
*) \
|
|
${INSTALL_DATA_DIR} "$$ddir" ;; \
|
|
esac; \
|
|
}
|
|
|
|
.PHONY: install-makedirs
|
|
install-makedirs:
|
|
${RUN} ${INSTALL_DATA_DIR} ${DESTDIR}${PREFIX}
|
|
.if defined(INSTALLATION_DIRS) && !empty(INSTALLATION_DIRS)
|
|
@${STEP_MSG} "Creating installation directories"
|
|
${RUN} \
|
|
for dir in ${INSTALLATION_DIRS:C,^man/,${PKGMANDIR}/,}; do \
|
|
case "$$dir" in \
|
|
${PREFIX}/*) \
|
|
dir=`${ECHO} "$$dir" | ${SED} "s|^${PREFIX}/||"` ;; \
|
|
/*) continue ;; \
|
|
esac; \
|
|
${_INSTALL_ONE_DIR_CMD}; \
|
|
done
|
|
.endif # INSTALLATION_DIRS
|
|
|
|
# Creates the directories for all files that are mentioned in the static
|
|
# PLIST files of the package, to make the declaration of
|
|
# INSTALLATION_DIRS redundant in some cases.
|
|
#
|
|
# To enable this, the variable INSTALLATION_DIRS_FROM_PLIST must be set
|
|
# to "yes".
|
|
#
|
|
.PHONY: install-dirs-from-PLIST
|
|
install-dirs-from-PLIST:
|
|
@${STEP_MSG} "Creating installation directories from PLIST files"
|
|
${RUN} \
|
|
${CAT} ${PLIST_SRC} \
|
|
| sed -n \
|
|
-e 's,\\,\\\\,' \
|
|
-e 's,^man/,${PKGMANDIR}/,' \
|
|
-e 's,^info/,${PKGINFODIR}/,' \
|
|
-e 's,^share/locale/,${PKGLOCALEDIR}/locale/,' \
|
|
-e 's,^\([^$$@]*\)/[^/]*$$,\1,p' \
|
|
| while read dir; do \
|
|
${_INSTALL_ONE_DIR_CMD}; \
|
|
done
|
|
|
|
######################################################################
|
|
### 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?= # none
|
|
INSTALL_TARGET?= install ${USE_IMAKE:D${NO_INSTALL_MANPAGES:D:Uinstall.man}}
|
|
.if ${_USE_DESTDIR} != "no"
|
|
INSTALL_ENV+= DESTDIR=${DESTDIR:Q}
|
|
INSTALL_MAKE_FLAGS+= DESTDIR=${DESTDIR:Q}
|
|
.endif
|
|
|
|
.if !target(do-install)
|
|
do-install:
|
|
. for _dir_ in ${INSTALL_DIRS}
|
|
${RUN} ${_ULIMIT_CMD} \
|
|
cd ${WRKSRC} && cd ${_dir_} && \
|
|
${SETENV} ${INSTALL_ENV} ${MAKE_ENV} \
|
|
${MAKE_PROGRAM} ${MAKE_FLAGS} ${INSTALL_MAKE_FLAGS} \
|
|
-f ${MAKE_FILE} ${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 ${DESTDIR}${PREFIX}
|
|
|
|
.PHONY: install-doc-handling
|
|
install-doc-handling: plist
|
|
@${STEP_MSG} "Automatic manual page handling"
|
|
${RUN} \
|
|
${CAT} ${PLIST} \
|
|
| ${GREP} -v "^@" \
|
|
| ${EGREP} ${_PLIST_REGEXP.man:Q} \
|
|
| ${_DOC_COMPRESS}
|
|
|
|
privileged-install-hook: .PHONY
|
|
@${DO_NADA}
|
|
|
|
######################################################################
|
|
### 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: .PHONY package-clean check-clean _flavor-install-clean
|
|
${RUN} ${RM} -f ${PLIST} ${_COOKIE.install} ${_DEPENDS_PLIST}
|