# $NetBSD: plist.mk,v 1.59 2023/11/05 08:23:31 pho Exp $ # # This Makefile fragment handles the creation of PLISTs for use by # pkg_create(8). # # The following variables affect the PLIST generation: # # PLIST_TYPE specifies whether the generated PLIST is derived # automatically from the installed files, or if the PLIST entries # are listed in files. Valid values are "dynamic" and "static", # and the default value is "static". # # PLIST_VARS is the list of names corresponding to automatic variables # generated by plist.mk to simplify having conditionally-present # entries in the PLIST. If "var" is listed in PLIST_VARS, then the # automatic variable is named PLIST.var. If PLIST.var is defined, # then in the PLIST generation, the ${PLIST.var} symbol is replaced # with the empty string, or "@comment " otherwise. # # PLIST_AWK_ENV holds the shell environment passed to PLIST_AWK. # # PLIST_AWK is the awk script that does post-processing of the PLIST. # # PLIST_SRC is the list of source files from which the PLIST file of # the binary package will be generated. By default, its value is # constructed from the PLIST.* files within the package directory, # in the following order (if the files are present): # # PLIST.common # PLIST.${OPSYS} (e.g., PLIST.NetBSD) # PLIST.${MACHINE_ARCH} (e.g., PLIST.powerpc) # PLIST.${OPSYS}-${MACHINE_ARCH} (e.g., PLIST.NetBSD-powerpc) # PLIST # PLIST.common_end # # GENERATE_PLIST is a sequence of commands, each terminated with a # semicolon. These commands output contents for a PLIST to stdout, # which is appended to the contents of ${PLIST_SRC}. # # IGNORE_INFO_DIRS is a list of ${PREFIX}-relative paths that do # *not* contain info files. # _VARGROUPS+= plist _USER_VARS.plist= # none _PKG_VARS.plist= PLIST_SUBST PLIST_VARS PLIST_SRC GENERATE_PLIST _SYS_VARS.plist= PLIST_TYPE PLIST _SORTED_VARS.plist= *_SUBST *_VARS _LISTED_VARS.plist= *_SRC GENERATE_PLIST PLIST_VARS?= # empty PLIST_AWK?= # empty PLIST_AWK_ENV?= # empty PLIST_TYPE?= static ###################################################################### .for f in \ PLIST.common \ PLIST.${OPSYS} \ PLIST.${MACHINE_ARCH:C/i[3-6]86/i386/g} \ PLIST.${OPSYS}-${MACHINE_ARCH:C/i[3-6]86/i386/g} \ ${defined(EMUL_PLATFORM):?PLIST.${EMUL_PLATFORM}:} \ PLIST \ PLIST.common_end . if exists(${PKGDIR}/${f}) PLIST_SRC_DFLT+= ${PKGDIR}/${f} . endif .endfor # # If the following 3 conditions hold, then fail the package build: # # (1) The package doesn't set PLIST_TYPE to dynamic. # (2) The package doesn't set PLIST_SRC. # (3) The package doesn't set GENERATE_PLIST. # (4) There are no PLIST files. # .if ${PLIST_TYPE} == "static" . if !defined(PLIST_SRC) && !defined(GENERATE_PLIST) . if !defined(PLIST_SRC_DFLT) || empty(PLIST_SRC_DFLT) PKG_FAIL_REASON+= "Missing PLIST file or PLIST/GENERATE_PLIST definition." . endif . endif .endif PLIST_SRC?= ${PLIST_SRC_DFLT} # This is the path to the generated PLIST file. PLIST= ${WRKDIR}/.PLIST # The nokeywords PLIST file strips out any pkg_create(1) "@" commands. _PLIST_NOKEYWORDS= ${PLIST}_nokeywords ###################################################################### .if (defined(USE_IMAKE) || !empty(USE_TOOLS:Mimake)) _IMAKE_MANINSTALL= ${IMAKE_MANINSTALL} _PLIST_MANINSTALL= ${IMAKE_MANINSTALL} .else _IMAKE_MANINSTALL= # empty _PLIST_MANINSTALL= ${MANINSTALL} .endif _LIBTOOL_EXPAND= \ ${PKGSRC_SETENV} ECHO=${TOOLS_ECHO:Q} GREP=${TOOLS_GREP:Q} \ SORT=${TOOLS_SORT:Q} TEST=${TOOLS_TEST:Q} \ BASENAME=${BASENAME:Q} DIRNAME=${DIRNAME:Q} \ PWD_CMD=${PWD_CMD:Q} \ SHLIB_TYPE=${SHLIB_TYPE:Q} \ ${SH} ${.CURDIR}/../../mk/plist/libtool-expand .if !defined(_IGNORE_INFO_PATH) . for _dir_ in ${IGNORE_INFO_DIRS} _IGNORE_INFO_PATH:= ${_IGNORE_INFO_PATH}:${_dir_} . endfor _IGNORE_INFO_PATH:= ${_IGNORE_INFO_PATH:S/^://} .endif MAKEVARS+= _IGNORE_INFO_PATH # _PLIST_AWK_ENV holds the shell environment passed to the awk script # that does post-processing of the PLIST. See the individual *.awk # scripts for information on each of the variable set in the environment. # _PLIST_AWK_ENV+= PKGLOCALEDIR=${PKGLOCALEDIR:Q} _PLIST_AWK_ENV+= USE_PKGLOCALEDIR=${USE_PKGLOCALEDIR:Dyes:Uno} _PLIST_AWK_ENV+= CATMAN_SECTION_SUFFIX=${CATMAN_SECTION_SUFFIX:Q} _PLIST_AWK_ENV+= IMAKE_MANINSTALL=${_IMAKE_MANINSTALL:Q} _PLIST_AWK_ENV+= IGNORE_INFO_PATH=${_IGNORE_INFO_PATH:Q} _PLIST_AWK_ENV+= PKGINFODIR=${PKGINFODIR:Q} _PLIST_AWK_ENV+= IGNORE_LIBTOOLIZE=${IGNORE_LIBTOOLIZE:Q} _PLIST_AWK_ENV+= LIBTOOLIZE_PLIST=${LIBTOOLIZE_PLIST:Q} _PLIST_AWK_ENV+= LIBTOOL_EXPAND=${_LIBTOOL_EXPAND:Q} _PLIST_AWK_ENV+= LS=${TOOLS_LS:Q} _PLIST_AWK_ENV+= MANINSTALL=${_PLIST_MANINSTALL:Q} _PLIST_AWK_ENV+= MANZ=${_MANZ:Q} _PLIST_AWK_ENV+= PKGGNUDIR=${PKGGNUDIR:Q} _PLIST_AWK_ENV+= PKGMANDIR=${PKGMANDIR:Q} _PLIST_AWK_ENV+= PREFIX=${DESTDIR:Q}${PREFIX:Q} _PLIST_AWK_ENV+= TEST=${TOOLS_TEST:Q} _PLIST_AWK_ENV+= ${PLIST_AWK_ENV} # PLIST_SUBST contains package-settable VAR=value substitutions that are # used when generating the actual file list for the package from the # package's PLIST files, as listed in PLIST_SRC. These files may contain # placeholders of the form ${VAR}, which are then substituted by their # corresponding value from PLIST_SUBST. # # Example: PLIST_SUBST+= PKGNAME=${PKGNAME_NOREV} means that the package's # PLIST file may contain the placeholder ${PKGNAME}, which will be replaced # with the package version excluding the "nb13" extension. # # The other direction of generating the package's PLIST file from the list # of actually installed files is covered by EARLY_PRINT_PLIST_AWK and # PRINT_PLIST_AWK. This is only needed when developing the package itself, # for example after an update. # PLIST_SUBST+= OPSYS=${OPSYS:Q} \ OS_VERSION=${OS_VERSION:Q} \ MACHINE_ARCH=${MACHINE_ARCH:Q} \ MACHINE_GNU_ARCH=${MACHINE_GNU_ARCH:Q} \ MACHINE_GNU_PLATFORM=${MACHINE_GNU_PLATFORM:Q} \ LN=${LN:Q} \ LOWER_VENDOR=${LOWER_VENDOR:Q} \ LOWER_OPSYS=${LOWER_OPSYS:Q} \ PKGBASE=${PKGBASE:Q} \ PKGNAME=${PKGNAME_NOREV:Q} \ PKGLOCALEDIR=${PKGLOCALEDIR:Q} \ PKGVERSION=${PKGVERSION:C/nb[0-9]*$//:Q} \ LOCALBASE=${LOCALBASE:Q} \ VIEWBASE=${VIEWBASE:Q} \ X11BASE=${X11BASE:Q} \ CHGRP=${CHGRP:Q} \ CHMOD=${CHMOD:Q} \ CHOWN=${CHOWN:Q} \ MKDIR=${MKDIR:Q} \ RMDIR=${RMDIR:Q} \ RM=${RM:Q} \ TRUE=${TRUE:Q} \ PKGGNUDIR=${PKGGNUDIR:Q} \ PKGMANDIR=${PKGMANDIR:Q} .for _var_ in ${PLIST_VARS} PLIST_SUBST+= ${PLIST.${_var_}:DPLIST.${_var_}=:UPLIST.${_var_}="@comment "} .endfor # Pass the PLIST_SUBST substitutions to the subst.awk script by prepending # PLIST_" to all of the variable names and adding them into the environment. # _PLIST_AWK_ENV+= ${PLIST_SUBST:S/^/PLIST_/} _PLIST_AWK_ENV+= PLIST_SUBST_VARS=${PLIST_SUBST:S/^/PLIST_/:C/=.*//:M*:Q} _PLIST_1_AWK+= -f ${PKGSRCDIR}/mk/plist/plist-functions.awk _PLIST_1_AWK+= -f ${PKGSRCDIR}/mk/plist/plist-subst.awk _PLIST_1_AWK+= -f ${PKGSRCDIR}/mk/plist/plist-macros.awk _PLIST_AWK+= -f ${.CURDIR}/../../mk/plist/plist-functions.awk _PLIST_AWK+= -f ${.CURDIR}/../../mk/plist/plist-locale.awk _PLIST_AWK+= -f ${.CURDIR}/../../mk/plist/plist-gnu.awk _PLIST_AWK+= -f ${.CURDIR}/../../mk/plist/plist-info.awk _PLIST_AWK+= -f ${.CURDIR}/../../mk/plist/plist-man.awk _PLIST_AWK+= -f ${.CURDIR}/../../mk/plist/plist-libtool.awk .if ${OPSYS} == "Cygwin" _PLIST_AWK+= -f ${.CURDIR}/../../mk/plist/plist-cygwin.awk .endif _PLIST_AWK+= ${PLIST_AWK} _PLIST_AWK+= -f ${.CURDIR}/../../mk/plist/plist-default.awk _PLIST_INFO_AWK+= -f ${.CURDIR}/../../mk/plist/plist-functions.awk _PLIST_INFO_AWK+= -f ${.CURDIR}/../../mk/plist/plist-info.awk _PLIST_SHLIB_AWK= -f ${_SHLIB_AWKFILE.${SHLIB_TYPE}} _SHLIB_AWKFILE.ECOFF= ${.CURDIR}/../../mk/plist/shlib-elf.awk _SHLIB_AWKFILE.ELF= ${.CURDIR}/../../mk/plist/shlib-elf.awk _SHLIB_AWKFILE.SOM= ${.CURDIR}/../../mk/plist/shlib-som.awk _SHLIB_AWKFILE.aixlib= ${.CURDIR}/../../mk/plist/shlib-elf.awk _SHLIB_AWKFILE.a.out= ${.CURDIR}/../../mk/plist/shlib-aout.awk _SHLIB_AWKFILE.PEwin= ${.CURDIR}/../../mk/plist/shlib-pe.awk _SHLIB_AWKFILE.dylib= ${.CURDIR}/../../mk/plist/shlib-dylib.awk _SHLIB_AWKFILE.none= ${.CURDIR}/../../mk/plist/shlib-none.awk ###################################################################### # GENERATE_PLIST is a sequence of commands, terminating in a semicolon, # that outputs contents for a PLIST to stdout and is appended to # the contents of ${PLIST_SRC}. # .if empty(PLIST_SRC) GENERATE_PLIST?= ${ECHO} "@comment "${PKGNAME:Q}" has no files."; .else GENERATE_PLIST?= ${TRUE}; .endif _BUILD_DEFS+= _PLIST_IGNORE_FILES .if ${PLIST_TYPE} == "dynamic" _PLIST_IGNORE_CMD= \ ( while read i; do \ ignore=no; \ for p in ${_PLIST_IGNORE_FILES}; do \ case "$$i" in \ $$p) ignore=yes; break ;; \ esac; \ done; \ [ "$$ignore" = "yes" ] || ${ECHO} "$$i"; \ done ) _GENERATE_PLIST= \ ${FIND} ${DESTDIR}${PREFIX} \! -type d -print | ${SORT} | \ ${SED} -e "s|^${DESTDIR}${PREFIX}/||" | \ ${_PLIST_IGNORE_CMD} .else _GENERATE_PLIST= ${CAT} /dev/null ${PLIST_SRC}; ${GENERATE_PLIST} .endif .PHONY: plist plist: ${PLIST} ${_PLIST_NOKEYWORDS} .if (${PLIST_TYPE} == "static") && !empty(PLIST_SRC) ${PLIST}: ${PLIST_SRC} .endif ${PLIST}: ${RUN} \ ${TEST} -d ${.TARGET:H} || ${MKDIR} ${.TARGET:H}; \ { ${_GENERATE_PLIST} } > ${.TARGET}-1src; \ ${PKGSRC_SETENV} ${_PLIST_AWK_ENV} ${AWK} \ ${_PLIST_1_AWK} < ${.TARGET}-1src > ${.TARGET}-2mac; \ ${PKGSRC_SETENV} ${_PLIST_AWK_ENV} ${AWK} \ ${_PLIST_AWK} < ${.TARGET}-2mac > ${.TARGET}-3mag; \ ${PKGSRC_SETENV} ${_PLIST_AWK_ENV} ${AWK} \ ${_PLIST_SHLIB_AWK} < ${.TARGET}-3mag > ${.TARGET} ${_PLIST_NOKEYWORDS}: ${PLIST} ${RUN} ${AWK} < ${PLIST} > ${.TARGET} ' \ $$0 ~ /^@/ { next }; \ { print }' .if defined(INFO_FILES) INFO_FILES_cmd= \ ${PKGSRC_SETENV} ${_PLIST_AWK_ENV} ${AWK} \ ${_PLIST_INFO_AWK} ${PLIST} | \ ${AWK} '($$0 !~ "-[0-9]*(\\.gz)?$$") { print }' .endif ICON_THEMES_cmd= \ ${PKGSRC_SETENV} ${_PLIST_AWK_ENV} ${AWK} -F / \ '$$0 ~ "^share/icons/[^/]+/.*$$" { print $$3 }' \ ${PLIST} | ${SORT} -u ###################################################################### ### plist-clean (PRIVATE) ###################################################################### ### plist-clean removes the files for the "plist" ### so that the "plist" target may be re-invoked. ### .PHONY: plist-clean plist-clean: ${RUN} ${RM} -f ${PLIST} ${_PLIST_NOKEYWORDS} ${_DEPENDS_PLIST}