diff options
author | jlam <jlam> | 2003-07-24 09:25:54 +0000 |
---|---|---|
committer | jlam <jlam> | 2003-07-24 09:25:54 +0000 |
commit | e1276d9672321c1da76b41f10a3acc1d051febae (patch) | |
tree | d4739b19ec9383446dcb3d5df62fd62423501f9f /mk/scripts/genindex.awk | |
parent | edc58b27d232a2244d37f9c15a9a4ae5e4a65089 (diff) | |
download | pkgsrc-e1276d9672321c1da76b41f10a3acc1d051febae.tar.gz |
Sync with HEAD.
Diffstat (limited to 'mk/scripts/genindex.awk')
-rwxr-xr-x | mk/scripts/genindex.awk | 389 |
1 files changed, 389 insertions, 0 deletions
diff --git a/mk/scripts/genindex.awk b/mk/scripts/genindex.awk new file mode 100755 index 00000000000..b3f813a3ac8 --- /dev/null +++ b/mk/scripts/genindex.awk @@ -0,0 +1,389 @@ +#!/usr/bin/awk -f +# $NetBSD: genindex.awk,v 1.1.2.2 2003/07/24 09:26:02 jlam Exp $ +# +# Copyright (c) 2002, 2003 The NetBSD Foundation, Inc. +# All rights reserved. +# +# This code is derived from software contributed to The NetBSD Foundation +# by Dan McMahill. +# +# 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. +# + + +# Global variables +#----------------- +# The following associative arrays are used for storing the dependency +# information and other information for the packages +# +# topdepends[] : index=pkgdir (math/scilab) +# List of explicitly listed depencencies by name. +# I.e. "xless-[0-9]* pvm-3.4.3" +# +# alldepends[] : index=pkgdir (math/scilab) +# Flattened dependency list by name. +# +# + + +BEGIN { + debug = 0; + printf("Reading database file\n"); +} + +#conflicts /usr/pkgsrc/math/scilab +#depends /usr/pkgsrc/math/scilab xless-[0-9]*:../../x11/xless pvm-3.4.3:../../parallel/pvm3 +# + +/^(build_)?depends / { +# +# Read in the entire depends tree +# These lines look like: +# +#depends /usr/pkgsrc/math/scilab xless-[0-9]*:../../x11/xless pvm-3.4.3:../../parallel/pvm3 +#build_depends /usr/pkgsrc/math/scilab libtool-base>=1.4.20010614nb9:../../devel/libtool-base +# + deptype=$1; +# pkg=fulldir2pkgdir($2); + pkg = $2; + if (pkg in topdepends) {} + else {topdepends[pkg] = "";} + if (pkg in topbuilddepends) {} + else {topbuilddepends[pkg] = "";} + + for (i = 3; i <= NF; i++) { + split($i, a,":"); + pkgpat = a[1]; + pkgdir = a[2]; + sub(/[\.\/]*/, "", pkgdir); + if (pkgdir !~ /\//) { + pkgcat = pkg; + gsub(/\/.*/, "", pkgcat); + pkgdir=pkgcat "/" pkgdir; + if (debug) + printf("Corrected missing category directory to get \"%s\"\n", + pkgdir); + } + if (debug){ + printf("package in directory %s %s on:\n", + pkg, deptype); + printf("\tpkgpat = %s\n", pkgpat); + printf("\tpkgdir = %s\n", pkgdir); + } + + +# +# store the package directory in a associative array with the wildcard +# pattern as the index since we will need to be able to look this up later +# + pat2dir[pkgpat] = pkgdir; + + if (deptype == "depends") { + topdepends[pkg] = topdepends[pkg] " " pkgpat " " ; + if (debug) { + printf("Appending %s to topdepends[%s] (%s)\n", + pkgpat, pkg, topdepends[pkg]); + } + } + else { + if (debug) { + printf("Appending %s to topbuilddepends[%s] (%s)\n", + pkgpat, pkg, topbuilddepends[pkg]); + } + topbuilddepends[pkg] = topbuilddepends[pkg] " " pkgpat " " ; + } + } + + next; +} + +/^categories /{ + dir = $2; + gsub(/^categories[ \t]*/, ""); + tmp = substr($0, length($1) + 1); + gsub(/^[ \t]*/, "", tmp); + categories[dir] = tmp; + next; +} + +/^comment /{ + dir = $2; + gsub(/^comment[ \t]*/, ""); + tmp = substr($0, length($1) + 1); + gsub(/^[ \t]*/, "", tmp); + comment[dir] = tmp; + next; +} + +/^descr /{ + descr[$2] = $3; + next; +} + +/^index / { +# +# read lines like: +#index /usr/pkgsrc/math/scilab scilab-2.6nb3 +# and store the directory name in a associative array where the index +# is the package name and in a associative array that lets us lookup +# name from directory. We use fuldir2pkgdir to get "math/scilab" +# and drop the /usr/pkgsrc part. +# +# pkgname2dir[$3] = fulldir2pkgdir($2); +# pkgdir2name[fulldir2pkgdir($2)] = $3; + pkgname2dir[$3] = $2; + pkgdir2name[$2] = $3; + next; +} + +/^license /{ + license[$2] = $3; + next; +} + +/^maintainer /{ + maintainer[$2] = $3; + next; +} + +/^notfor /{ + dir = $2; + gsub(/^notfor[ \t]*/, ""); + tmp = substr($0, length($1) + 1); + gsub(/^[ \t]*/, "", tmp); + notfor[dir] = tmp; + next; +} + +/^onlyfor /{ + dir = $2; + gsub(/^onlyfor[ \t]*/, ""); + tmp = substr($0, length($1) + 1); + gsub(/^[ \t]*/, "", tmp); + onlyfor[dir] = tmp; + next; +} + +/^prefix /{ + prefix[$2] = $3; + next; +} + +/^wildcard /{ + wildcard[$2] = $3; +} + +# +# Now recurse the tree to give a flattened depends list for each pkg +# + +END { + if( SORT == "" ) { SORT = "sort"; } + indexf = SORT " > INDEX"; + if ( dependsfile == "" ) dependsfile = "/dev/null"; + if ( builddependsfile == "" ) builddependsfile = "/dev/null"; + + printf("Flattening dependencies\n"); + printf("") > dependsfile; + for (toppkg in topdepends){ + if (debug) printf("calling find_all_depends(%s, run)\n", toppkg); + find_all_depends(toppkg, "run"); + if (debug) printf("%s depends on: %s, topdepends on %s\n", + toppkg, alldepends[toppkg], + topdepends[toppkg]); + printf("%s depends on: %s\n", + toppkg, alldepends[toppkg]) >> dependsfile; + flatdepends[toppkg] = alldepends[toppkg]; + } + close(dependsfile); + + +# clear out the flattened depends list and repeat for the build depends + for( pkg in alldepends) { + delete alldepends[pkg]; + } + + printf("Flattening build dependencies\n"); + printf("") > builddependsfile; + for (toppkg in topbuilddepends){ + find_all_depends(toppkg, "build"); + printf("%s build_depends on: %s\n", + toppkg, alldepends[toppkg]) >> builddependsfile; + } + close(builddependsfile); + + printf("Generating INDEX file\n"); + +# Output format: +# package-name|package-path|installation-prefix|comment| \ +# description-file|maintainer|categories|build deps|run deps|for arch| \ +# not for opsys + + pkgcnt = 0; + for (toppkg in topdepends){ + pkgcnt++; + pkgdir = PKGSRCDIR "/" toppkg; + printf("%s|", pkgdir2name[toppkg]) | indexf; + printf("%s|", pkgdir) | indexf; + printf("%s|", prefix[toppkg]) | indexf; + printf("%s|", comment[toppkg]) | indexf; + printf("%s|", descr[toppkg]) | indexf; + printf("%s|", maintainer[toppkg]) | indexf; + printf("%s|", categories[toppkg]) | indexf; + gsub(/^ /, "", alldepends[toppkg]); + gsub(/ $/, "", alldepends[toppkg]); + printf("%s|", alldepends[toppkg]) | indexf; + gsub(/^ /, "", flatdepends[toppkg]); + gsub(/ $/, "", flatdepends[toppkg]); + printf("%s|", flatdepends[toppkg]) | indexf; + printf("%s|", onlyfor[toppkg]) | indexf; + printf("%s", notfor[toppkg]) | indexf; + printf("\n") | indexf; + } + close(indexf); + printf("Indexed %d packages\n", pkgcnt); + exit 0; +} + +function find_all_depends(pkg, type, pkgreg, i, deps, depdir, topdep){ +# pkg is the package directory, like math/scilab + +# printf("find_all_depends(%s, %s)\n", pkg, type); +# if we find the package already has been fully depended +# then return the depends list + if (pkg in alldepends){ + if (debug) printf("\t%s is allready depended. Returning %s\n", + pkg, alldepends[pkg]); + return(alldepends[pkg]); + } + +# if this package has no top dependencies, enter an empty flat dependency +# list for it. + if( type == "run" ) { +# we only want DEPENDS + topdep = topdepends[pkg]; + } else { +# we want BUILD_DEPENDS and DEPENDS + topdep = topdepends[pkg] " " topbuilddepends[pkg]; + } + if (topdep ~ "^[ \t]*$") { + alldepends[pkg] = " "; + if (debug) printf("\t%s has no depends(%s). Returning %s\n", + pkg, topdep, alldepends[pkg]); + return(alldepends[pkg]); + } + +# recursively gather depends that each of the depends has + pkgreg = reg2str(pkg); + split(topdep, deps); + i = 1; + alldepends[pkg] = " "; + while ( i in deps ) { + +# figure out the directory name associated with the package hame +# in (wild card/dewey) version form + depdir = pat2dir[deps[i]]; + if (debug) printf("\tadding dependency #%d on \"%s\" (%s)\n", + i, deps[i], depdir); + +# do not add ourselves to the list (should not happen, but +# we would like to not get stuck in a loop if one exists) +# if (" "deps[i]" " !~ pkgreg){ + +# if we do not already have this dependency (deps[i]) listed, then add +# it. However, we may have already added it because another package +# we depend on may also have depended on +# deps[i]. + if (alldepends[pkg] !~ reg2str(deps[i])){ + alldepends[pkg] = alldepends[pkg] " " deps[i] " " find_all_depends(depdir, type); + } + else { + if (debug) printf("\t%s is already listed in %s\n", + deps[i], alldepends[pkg]); + } + + i = i + 1; + } # while i + + if (debug) printf("\tcalling uniq() on alldepends[%s] = %s\n", + pkg, alldepends[pkg]); + alldepends[pkg] = uniq(alldepends[pkg]); + if (debug) printf("\tuniq() output alldepends[%s] = %s\n", + pkg, alldepends[pkg]); + return(alldepends[pkg]); +} + +# +# take a string which has special characters like '+' in it and +# escape them. Also put a space before and after since that's how +# we'll distinguish things like gnome from gnome-libs +# +function reg2str(reg){ + gsub(/\./, "\\\.", reg); + gsub(/\+/, "\\\+", reg); + gsub(/\*/, "\\\*", reg); + gsub(/\?/, "\\\?", reg); + gsub(/\[/, "\\\[", reg); + gsub(/\]/, "\\\]", reg); + reg = " "reg" "; + return(reg); +} + +# +# accepts a full path to a package directory, like "/usr/pkgsrc/math/scilab" +# and returns just the last 2 directories, like "math/scilab" +# +function fulldir2pkgdir(d, i){ + i = match(d, /\/[^\/]+\/[^\/]+$/); + return substr(d, i + 1); +} + +# +# take the depends lists and uniq them. +# +function uniq(list, deps, i, ulist){ + +# split out the depends + split(list, deps); + + i = 1; + ulist = " "; + while (i in deps){ +# printf("uniq(): Checking \"%s\"\n", ulist); +# printf(" for \"%s\"\n", reg2str(deps[i])); + if (ulist !~reg2str(deps[i])){ + ulist = ulist deps[i]" "; + } + i++; + } + return(ulist); +} + + + |