pkgsrc/mk/plist/print-plist.mk
jperkin c6fe57f401 Introduce PKGGNUDIR as a way to control gnu prefix.
By default pkgsrc uses LOCABASE/gnu as a prefix for packages to install
native versions of GNU tools, which are them symbolically linked back to
the 'g' versions of the files in LOCALBASE, and users can then add
LOCALBASE/gnu/bin to PATH to pick up those tools.

On systems where the GNU environment is desired, PKGGNUDIR now allows
users to install the non-'g' files directly into LOCALBASE, making them
the default without having to alter PATH, whilst retaining the 'g' files
in order to ensure dependencies and tool paths remain the same.
2012-12-06 11:36:30 +00:00

194 lines
6.4 KiB
Makefile

# $NetBSD: print-plist.mk,v 1.21 2012/12/06 11:36:31 jperkin Exp $
###
### Automatic PLIST generation
### - files & symlinks first
### - empty directories are handled properly
### - dirs from mtree files are excluded
### - substitute for platform or package specifics substrings
###
### Usage:
### - make install
### - make print-PLIST | brain >PLIST
###
_PRINT_PLIST_AWK_SUBST={
.if !defined(EMUL_PLATFORMS)
_PRINT_PLIST_AWK_SUBST+= \
gsub(/${OPSYS}/, "$${OPSYS}"); \
gsub(/${OS_VERSION:S/./\./g}/, "$${OS_VERSION}"); \
gsub(/${MACHINE_GNU_PLATFORM}/, "$${MACHINE_GNU_PLATFORM}"); \
gsub(/${MACHINE_ARCH}/, "$${MACHINE_ARCH}"); \
gsub(/${MACHINE_GNU_ARCH}/, "$${MACHINE_GNU_ARCH}");
_PRINT_PLIST_AWK_SUBST+= \
gsub(/${LOWER_OS_VERSION:S/./\./g}/, "$${LOWER_OS_VERSION}"); \
gsub(/${LOWER_OPSYS}/, "$${LOWER_OPSYS}");
.endif
_PRINT_PLIST_AWK_SUBST+= \
gsub(/${PKGNAME_NOREV}/, "$${PKGNAME}"); \
gsub(/${PKGVERSION:S/./\./g:C/nb[0-9]*$$//}/, "$${PKGVERSION}");\
gsub(/^${PKGLOCALEDIR}\/locale/, "share/locale"); \
gsub("^${PKGGNUDIR}", "gnu/"); \
gsub("^${PKGINFODIR}/", "info/"); \
gsub("^${PKGMANDIR}/", "man/");
_PRINT_PLIST_AWK_SUBST+=}
_PRINT_PLIST_AWK_IGNORE= ($$0 ~ /^${PKG_DBDIR:S|^${PREFIX}/||:S|/|\\/|g}\//)
_PRINT_PLIST_AWK_IGNORE+= || ($$0 ~ /emul\/linux\/proc/)
.if defined(INFO_FILES)
_PRINT_PLIST_AWK_IGNORE+= || ($$0 ~ /^${PKGINFODIR:S|/|\\/|g}\/dir$$/)
_PRINT_PLIST_AWK_IGNORE+= || ($$0 ~ /^${PKGINFODIR:S|/|\\/|g}\/[^\/]+(-[0-9]+)(\.gz)?$$/)
_PRINT_PLIST_AWK_IGNORE+= || ($$0 ~ /^([^\/]*\/)*(info\/[^\/]+|[^\/]+\.info)(-[0-9]+)(\.gz)?$$/)
.endif
.if (defined(FONTS_DIRS.x11) && !empty(FONTS_DIRS.x11:M*))
_PRINT_PLIST_AWK_IGNORE+= || ($$0 ~ /^.*\/encodings\.dir/)
_PRINT_PLIST_AWK_IGNORE+= || ($$0 ~ /^.*\/fonts\.dir/)
.endif
.if (defined(FONTS_DIRS.ttf) && !empty(FONTS_DIRS.ttf:M*)) || \
(defined(FONTS_DIRS.type1) && !empty(FONTS_DIRS.type1:M*))
_PRINT_PLIST_AWK_IGNORE+= || ($$0 ~ /^.*\/fonts\.scale/)
.endif
.if (defined(FONTS_DIRS.ttf) && !empty(FONTS_DIRS.ttf:M*)) || \
(defined(FONTS_DIRS.type1) && !empty(FONTS_DIRS.type1:M*)) || \
(defined(FONTS_DIRS.x11) && !empty(FONTS_DIRS.x11:M*))
_PRINT_PLIST_AWK_IGNORE+= || ($$0 ~ /^.*\/fonts\.cache-1/)
.endif
# Common (system) directories not to generate @dirrm statements for
# Reads _MTREE_FILE and generate awk statements that will
# sort out which directories NOT to include into the PLIST @dirrm list
_COMMON_MTREE_FILE= ${PKGSRCDIR}/mk/plist/common-dirs.mtree
.if make(print-PLIST)
_PRINT_PLIST_COMMON_DIRS!= ${AWK} 'BEGIN { \
i=0; \
stack[i]="${PREFIX}" ; \
cwd=""; \
} \
! ( /^\// || /^\#/ || /^$$/ ) { \
if ( $$1 == ".." ){ \
i=i-1; \
cwd = stack[i]; \
} else if ( $$1 == "." ){ \
} else { \
stack[i] = cwd ; \
if ( i == 0 ){ \
cwd = $$1 ; \
} else { \
cwd = cwd "\\/" $$1 ; \
} \
print "/^" cwd "$$$$/ { next; }"; \
i=i+1 ; \
} \
} \
END { print "{ print $$$$0; }"; } \
' <${_COMMON_MTREE_FILE}
.endif
# scan $PREFIX for any files/dirs modified since the package was extracted
# will emit "@exec mkdir"-statements for empty directories
# XXX will fail for data files that were copied using tar (e.g. emacs)!
# XXX should check $LOCALBASE and $X11BASE, and add @cwd statements
.if ${_USE_DESTDIR} == "no"
_PRINT_PLIST_FILES_CMD= \
${FIND} ${DESTDIR}${PREFIX}/. -xdev -newer ${_COOKIE.extract} \! -type d -print
_PRINT_PLIST_DIRS_CMD= \
${FIND} ${DESTDIR}${PREFIX}/. -xdev -newer ${_COOKIE.extract} -type d -print
.else
_PRINT_PLIST_FILES_CMD= \
${FIND} ${DESTDIR}${PREFIX}/. \! -type d -print
_PRINT_PLIST_DIRS_CMD= \
${FIND} ${DESTDIR}${PREFIX}/. -type d -print
.endif
.if !empty(LIBTOOLIZE_PLIST:M[yY][eE][sS])
_PRINT_PLIST_LIBTOOLIZE_FILTER?= \
( \
if ${TEST} -d ${WRKDIR}; then \
tmpdir="${WRKDIR}"; \
else \
tmpdir="$${TMPDIR-/tmp}"; \
fi; \
fileslist="$$tmpdir/print.plist.files.$$$$"; \
libslist="$$tmpdir/print.plist.libs.$$$$"; \
while read file; do \
case $$file in \
*.la) \
${_LIBTOOL_EXPAND} $$file >> $$libslist; \
;; \
esac; \
${ECHO} "$$file"; \
done > $$fileslist; \
if ${TEST} -f "$$libslist"; then \
${GREP} -hvxF "`${SORT} -u $$libslist`" "$$fileslist"; \
else \
${CAT} "$$fileslist"; \
fi; \
${RM} -f "$$fileslist" "$$libslist"; \
)
.else
_PRINT_PLIST_LIBTOOLIZE_FILTER?= ${CAT}
.endif
.PHONY: print-PLIST
.if !target(print-PLIST)
print-PLIST:
${RUN} ${ECHO} '@comment $$'NetBSD'$$'
${RUN}\
shlib_type=${SHLIB_TYPE:Q}; \
case $$shlib_type in \
"a.out") genlinks=1 ;; \
*) genlinks=0 ;; \
esac; \
${_PRINT_PLIST_FILES_CMD} \
| ${_PRINT_PLIST_LIBTOOLIZE_FILTER} \
| ${SORT} \
| ${AWK} ' \
{ sub("${DESTDIR:S|+|\\\\+|g}${PREFIX}/\\./", ""); } \
${_PRINT_PLIST_AWK_IGNORE} { next; } \
${PRINT_PLIST_AWK} \
${_PRINT_PLIST_AWK_SUBST} \
/^@/ { print $$0; next } \
/.*\/lib[^\/]+\.so\.[0-9]+\.[0-9]+\.[0-9]+$$/ { \
print $$0; \
sub("\\.[0-9]+$$", ""); \
if ('$$genlinks') print $$0; \
sub("\\.[0-9]+$$", ""); \
if ('$$genlinks') print $$0; \
sub("\\.[0-9]+$$", ""); \
if ('$$genlinks') print $$0; \
next; \
} \
/.*\/lib[^\/]+\.so\.[0-9]+\.[0-9]+$$/ { \
print $$0; \
sub("\\.[0-9]+$$", ""); \
if ('$$genlinks') print $$0; \
sub("\\.[0-9]+$$", ""); \
if ('$$genlinks') print $$0; \
next; \
} \
{ print $$0; }'
${RUN}\
for i in `${_PRINT_PLIST_DIRS_CMD} \
| ${SORT} -r \
| ${AWK} ' \
/emul\/linux\/proc/ { next; } \
/${DESTDIR:S|/|\\/|g:S/+/\\\\+/g}${PREFIX:S|/|\\/|g}\/\.$$/ { next; } \
/${PKG_DBDIR:S|/|\\/|g}\// { next; } \
{ sub("${DESTDIR:S/+/\\\\\\+/g}${PREFIX}/\\\\./", ""); } \
{ sub("^${PKGGNUDIR}", "gnu/"); } \
{ sub("^${PKGINFODIR}/", "info/"); } \
{ sub("^${PKGMANDIR}/", "man/"); } \
/^${PKG_DBDIR:S|^${PREFIX}/||:S|/|\\/|g}(\/|$$)/ { next; } \
/^${PKGINFODIR:S|/|\\/|g}$$/ { next; } \
${_PRINT_PLIST_COMMON_DIRS}'` ; \
do \
if [ `${LS} -la ${DESTDIR}${PREFIX}/$$i | ${WC} -l` = 3 ]; then \
${ECHO} @pkgdir $$i | ${AWK} ' \
${PRINT_PLIST_AWK} \
{ print $$0; }' ; \
fi ; \
done \
| ${AWK} '${_PRINT_PLIST_AWK_SUBST} { print $$0; }'
.endif # target(print-PLIST)