summaryrefslogtreecommitdiff
path: root/mk/scripts
diff options
context:
space:
mode:
authordmcmahill <dmcmahill@pkgsrc.org>2003-01-04 21:13:34 +0000
committerdmcmahill <dmcmahill@pkgsrc.org>2003-01-04 21:13:34 +0000
commit98812f4595901ebe1b5e371dab42b6ffcc29d0a7 (patch)
tree6621d884e9cea5598c8ce745bc89da437a3dd10d /mk/scripts
parent06ea622f25d508f14e3fa6c80d6cc14818d2987f (diff)
downloadpkgsrc-98812f4595901ebe1b5e371dab42b6ffcc29d0a7.tar.gz
move bulk/{mkreadme,genreadme.awk} to scripts/ as this is a more suitable
location. They are not really part of the bulk build stuff.
Diffstat (limited to 'mk/scripts')
-rwxr-xr-xmk/scripts/genreadme.awk644
-rwxr-xr-xmk/scripts/mkreadme487
2 files changed, 1131 insertions, 0 deletions
diff --git a/mk/scripts/genreadme.awk b/mk/scripts/genreadme.awk
new file mode 100755
index 00000000000..14581ec6782
--- /dev/null
+++ b/mk/scripts/genreadme.awk
@@ -0,0 +1,644 @@
+ #!/usr/bin/awk -f
+# $NetBSD: genreadme.awk,v 1.1 2003/01/04 21:13:37 dmcmahill Exp $
+#
+# Copyright (c) 2002 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 {
+ do_pkg_readme=1;
+# set to 1 to use "README-new.html" as the name
+ use_readme_new=0;
+ printf("Reading database file\n");
+ fflush("/dev/stdout");
+ }
+
+#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'll 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;
+}
+
+/^comment /{
+ dir = $2;
+ gsub(/^comment[ \t]*/,"");
+ tmp=substr($0,length($1)+1);
+ gsub(/^[ \t]*/,"",tmp);
+ gsub(/&/,"\\\\\\&amp;",tmp);
+ comment[dir]=tmp;
+ next;
+}
+
+/^homepage /{
+ homepage[$2] = $3;
+ next;
+}
+
+
+/^htmlname / {
+#
+# read lines like:
+# htmlname /usr/pkgsrc/archivers/arc <a href=../../archivers/arc/README.html>arc-5.21e</A>
+#
+# dir=fulldir2pkgdir($2);
+ dir = $2;
+ htmlname=$3;
+ for(i=4;i<=NF;i++){
+ htmlname=htmlname " " $i;
+ }
+ dir2htmlname[dir]=htmlname;
+ if(debug) printf("added dir2htmlname[%s]=%s\n",dir,htmlname);
+ 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;
+}
+
+/^wildcard /{
+ wildcard[$2] = $3;
+}
+
+#
+# Now recurse the tree to give a flattened depends list for each pkg
+#
+
+END {
+ if(use_readme_new) {
+ readme_name="README-new.html"
+ }
+ else {
+ readme_name="README.html";
+ }
+ readme=TMPDIR "/" readme_name;
+
+ if( dependsfile == "" ) dependsfile="/dev/stdout";
+ if( builddependsfile == "" ) builddependsfile="/dev/stdout";
+
+ printf("Flattening dependencies\n");
+ fflush("/dev/stdout");
+ printf("") > dependsfile;
+ for (toppkg in topdepends){
+ if(debug) printf("calling find_all_depends(%s)\n",toppkg);
+ find_all_depends(toppkg);
+ 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
+ delete alldepends;
+ printf("Flattening build dependencies\n");
+ fflush("/dev/stdout");
+ printf("") > builddependsfile;
+ for (toppkg in topbuilddepends){
+ find_all_depends(toppkg);
+ printf("%s build_depends on: %s\n",
+ toppkg,alldepends[toppkg]) >> builddependsfile;
+ }
+ close(builddependsfile);
+
+
+ vfile=DISTDIR "/vulnerabilities";
+
+# extract date for vulnerabilities file
+ cmd="ls -l " vfile;
+ if((cmd | getline) > 0) {
+ vuldate=sprintf("at %s %s %s\n",$6,$7,$8);
+# read the vulnerabilities file
+ printf("Reading vulnerability file \"%s\"\n which was updated %s\n",
+ vfile,vuldate);
+ fflush("/dev/stdout");
+ i=1;
+ while((getline < vfile) > 0) {
+ if($0 !~ /^\#/) {
+ vulpkg[i]=$1;
+ vultype[i]=$2;
+ vulref[i]=$3;
+ i=i+1;
+ }
+ }
+ printf(" Loaded %d vulnerabilities\n",i-1);
+ close(vfile);
+ have_vfile=1;
+ } else {
+ vuldate="<TR><TD><I>(no vulnerabilities list available)</I>";
+ printf("No vulnerability file found (%s).\n",vfile);
+ have_vfile=0;
+ }
+ close(cmd);
+ fflush("/dev/stdout");
+
+ if(SINGLEPKG != "" ) {
+ printf("Only creating README for %s\n",SINGLEPKG);
+ delete topdepends;
+ topdepends[SINGLEPKG]="yes";
+ }
+
+ printf("Generating README.html files\n");
+ fflush("/dev/stdout");
+ pkgcnt=0;
+ if(do_pkg_readme) {
+ templatefile=PKGSRCDIR "/templates/README.pkg";
+ fatal_check_file(templatefile);
+ for (toppkg in topdepends){
+ pkgcnt++;
+ pkgdir=PKGSRCDIR "/" toppkg;
+ readmenew=pkgdir "/" readme_name;
+
+ if(debug)printf("Creating %s for %s\n",readme,readmenew);
+ printf(".");
+ if((pkgcnt % 100) == 0) {
+ printf("\n%d\n",pkgcnt);
+ }
+ fflush("/dev/stdout");
+ printf("") > readme;
+ htmldeps="";
+ delete dpkgs;
+ split(alldepends[toppkg],dpkgs);
+ i=1;
+ while(i in dpkgs){
+ if(debug) printf("\tdpkg=%s, pat2dir[%s] = %s\n",
+ dpkgs[i],dpkgs[i],pat2dir[dpkgs[i]]);
+ nm=dpkgs[i];
+# we need a zillion escapes here because we need to end up with \\&lt; in 'htmldeps' so that when
+# we gsub htmldeps into the output file, we end up with &lt;
+ gsub(/&/,"\\\\\\&amp;",nm);
+ gsub(/</,"\\\\\\&lt;",nm);
+ gsub(/>/,"\\\\\\&gt;",nm);
+ htmldeps=sprintf("%s<a href=\"../../%s/%s\">%s</a>\n",
+ htmldeps,pat2dir[dpkgs[i]],readme_name,nm);
+ i=i+1;
+ }
+ if(debug) printf("htmldeps = \"%s\"\n",htmldeps);
+
+ vul="";
+ if(have_vfile) {
+ i=1;
+ pkgbase=gensub(/-[^-]*$/,"","G",pkgdir2name[toppkg]);
+ if(debug) printf("Checking for %s (%s) vulnerabilities\n",toppkg,pkgbase);
+ while(i in vulpkg) {
+ nm=vulpkg[i];
+ gsub(/&/,"\\\\\\&amp;",nm);
+ gsub(/</,"\\\\\\&lt;",nm);
+ gsub(/>/,"\\\\\\&gt;",nm);
+ url=vulref[i];
+ gsub(/&/,"\\\\\\&",url);
+ printurl=vulref[i];
+ gsub(/&/,"\\\\\\&amp;",printurl);
+ gsub(/</,"\\\\\\&lt;",printurl);
+ gsub(/>/,"\\\\\\&gt;",printurl);
+ if(vulpkg[i] ~ "^"pkgbase"[-<>=]+[0-9]") {
+ vul=sprintf("%s<STRONG><LI> %s has a %s exploit (see <a href=\"%s\">%s</a> for more details)</STRONG>\n",
+ vul,nm,vultype[i],url,printurl);
+ }
+ i=i+1;
+ }
+ if( vul == "" ){
+ vul="<I>(no vulnerabilities known)</I>";
+ }
+ }
+
+ if(MULTIARCH == "no"){
+ cmd="ls -1 "PACKAGES "/" PKGREPOSITORYSUBDIR "/" wildcard[toppkg] PKG_SUFX " 2>/dev/null";
+ if(debug)printf("Checking for binary package with %s\n",cmd);
+ binpkgs="";
+ while((cmd | getline) > 0) {
+ pkgfile=$0;
+ gsub(/.*\//,"",pkgfile);
+ pkgnm=pkgfile;
+ gsub(/\.tgz$/,"",pkgnm);
+ binpkgs=sprintf("%s\n<TR><TD>%s:<TD><a href=\"%s/%s\">%s</a><TD>(%s %s)",
+ binpkgs,MACHINE_ARCH,PKG_URL,pkgfile,pkgnm,OPSYS,OS_VERSION);
+ }
+ close(cmd);}
+ else {
+ cmd="ls -1 -d "PACKAGES"/[0-9].*/*/" PKGREPOSITORYSUBDIR "/" wildcard[toppkg] PKG_SUFX " 2>/dev/null";
+ oldfs=FS;
+ FS="[/]";
+ binpkgs="";
+ while((cmd | getline) > 0) {
+ release = $(NF-3);
+ arch = $(NF-2);
+ pkg = $NF;
+ pkgnm=pkg;
+ gsub(PKG_SUFX "$","",pkgnm)
+ if(debug) printf("%s:%s:%s (%s)\n",release,arch,pkg,pkgnm);
+ binpkgs=sprintf("%s\n<TR><TD>%s:<TD><a href=\"%s/%s/%s/%s/%s\">%s</a><TD>(%s-%s)",
+ binpkgs,arch,PKG_URL,release,arch,PKGREPOSITORYSUBDIR,pkg,pkgnm,OPSYS,release);
+ }
+ FS=oldfs;
+ close(cmd);
+ }
+
+# sort the binary pkgs (XXX would be nice to implement in memory in awk)
+ sfile=TMPDIR "/sorted";
+ spipe="sort > " sfile;
+ printf("%s",binpkgs) | spipe;
+ close(spipe);
+ binpkgs="";
+ while((getline < sfile) > 0) {
+ binpkgs=sprintf("%s\n%s",binpkgs,$0);
+ }
+ close(sfile);
+
+ if(debug) printf("binary packages: \n%s\n\n",binpkgs);
+
+ while((getline < templatefile) > 0){
+ gsub(/%%PORT%%/,toppkg);
+ gsub(/%%PKG%%/,pkgdir2name[toppkg]);
+ gsub(/%%COMMENT%%/,comment[toppkg]);
+ if(homepage[toppkg] == "") {
+ gsub(/%%HOMEPAGE%%/,"");
+ } else {
+ gsub(/%%HOMEPAGE%%/,"<p>This package has a home page at <a HREF=\"" homepage[toppkg] "\">" homepage[toppkg] "</a>.</p>");
+ }
+ if(license[toppkg] == "") {
+ gsub(/%%LICENSE%%/,"");
+ } else {
+ gsub(/%%LICENSE%%/,"<p>Please note that this package has a " license[toppkg] " license.</p>");
+ }
+ gsub(/%%VULNERABILITIES%%/,""vul"");
+ gsub(/%%VULDATE%%/,""vuldate"");
+ gsub(/%%BUILD_DEPENDS%%/,""htmldeps"");
+ gsub(/%%RUN_DEPENDS%%/,""flatdepends[toppkg]"");
+ gsub(/%%BIN_PKGS%%/,""binpkgs"");
+ gsub(/README.html/,readme_name);
+ print >> readme;
+ }
+ close(readme);
+ close(templatefile);
+ cmd="if [ ! -d " pkgdir " ]; then echo "pkgdir" does not exist ; exit 1 ; fi ; if [ ! -f "readmenew" ] || ! cmp -s "readme" "readmenew" ; then mv -f " readme " " readmenew " ; fi";
+ if(debug) printf("Execute: %s\n",cmd);
+ rc=system(cmd);
+ if(rc != 0) {
+ printf("**** WARNING ****\nCould not create %s (rc=%d)\n",readmenew,rc) > "/dev/stderr";
+ printf("**** ------- ****\n") > "/dev/stderr";
+ }
+ }
+ printf("\n");
+ } # if(do_pkg_readme)
+ printf("\n");
+ if(SINGLEPKG != "" ) {
+ close("/dev/stderr");
+ exit 0;
+ }
+ printf("Generating category readmes\n");
+ templatefile=PKGSRCDIR "/templates/README.category";
+ fatal_check_file(templatefile);
+
+# string with URL's for all categories (used by the top README.html)
+ allcat="";
+# string with URL's for all pkgs (used by the top README-all.html)
+ tot_numpkg=0;
+ top_make=PKGSRCDIR"/Makefile";
+ while((getline < top_make) > 0){
+ if($0 ~ /^[ \t]*SUBDIR.*=[^\$]*$/) {
+ category=$0;
+ gsub(/^[ \t]*SUBDIR.*=[ \t]*/,"",category);
+ catdir=PKGSRCDIR"/"category;
+ readmenew=catdir"/"readme_name;
+ printf("Category = %s\n",category);
+ cat_make=catdir"/Makefile";
+ pkgs="";
+ numpkg=0;
+ print "" > readme;
+ while((getline < cat_make) > 0){
+ if($0 ~ /^[ \t]*SUBDIR.*=[^\$]*$/) {
+ pkg=$0;
+ gsub(/^[ \t]*SUBDIR.*=[ \t]*/,"",pkg);
+ dir=category"/"pkg;
+ numpkg++;
+ tot_numpkg++;
+ if(debug) printf("\tAdding %s (%s : %s)\n",dir,pkgdir2name[dir],comment[dir]);
+ pkgs=sprintf("%s<TR><TD VALIGN=TOP><a href=\"%s/%s\">%s</a>: %s<TD>\n",
+ pkgs,pkg,readme_name,pkgdir2name[dir],comment[dir]);
+ allpkg[tot_numpkg]=sprintf("<!-- %s (for sorting) --><TR VALIGN=TOP><TD><a href=\"%s/%s/%s\">%s</a>: <TD>(<a href=\"%s/%s\">%s</a>) <td>%s\n",
+ pkgdir2name[dir],category,pkg,readme_name,pkgdir2name[dir],category,readme_name,category,comment[dir]);
+# we need slightly fewer escapes here since we're not gsub()-ing allpkg[] into the output files but
+# just printf()-ing it.
+ gsub(/\\&/,"\\&",allpkg[tot_numpkg]);
+ } else if($0 ~ /^[ \t]*COMMENT/) {
+ descr=$0;
+ gsub(/^[ \t]*COMMENT.*=[ \t]*/,"",descr);
+ }
+ }
+ while((getline < templatefile) > 0){
+ gsub(/%%CATEGORY%%/,category);
+ gsub(/%%NUMITEMS%%/,numpkg);
+ gsub(/%%DESCR%%/,descr);
+ gsub(/%%SUBDIR%%/,pkgs);
+ gsub(/README.html/,readme_name);
+ print >> readme;
+ }
+ close(readme);
+ close(templatefile);
+ cmd="if [ ! -f "readmenew" ]; then mv -f "readme " " readmenew " ; fi ; if ! cmp -s "readme" "readmenew" ; then mv -f " readme " " readmenew " ; fi ";
+ if(debug) printf("Execute: %s\n",cmd);
+ rc=system(cmd);
+ if(rc != 0) {
+ printf("**** WARNING ****\nCould not create %s (rc=%d)\n",readmenew,rc) > "/dev/stderr";
+ printf("**** ------- ****\n") > "/dev/stderr";
+ }
+
+ gsub(/href=\"/,"href=\""category"/",pkgs);
+ allcat=sprintf("%s<TR><TD VALIGN=TOP><a href=\"%s/%s\">%s</a>: %s<TD>\n",
+ allcat,category,readme_name,category,descr);
+ close(cat_make);
+ }
+ }
+ close(top_make);
+
+ printf("Generating toplevel readmes:\n");
+ templatefile=PKGSRCDIR "/templates/README.top";
+ fatal_check_file(templatefile);
+ readmenew=PKGSRCDIR "/"readme_name;
+ printf("\t%s\n",readmenew);
+ print "" > readme;
+ while((getline < templatefile) > 0){
+ gsub(/%%DESCR%%/,"");
+ gsub(/%%SUBDIR%%/,allcat);
+ gsub(/README.html/,readme_name);
+ print >> readme;
+ }
+ close(readme);
+ close(templatefile);
+ cmd="if [ ! -f "readmenew" ]; then mv -f "readme " " readmenew " ; fi ; if ! cmp -s "readme" "readmenew" ; then mv -f " readme " " readmenew " ; fi ";
+ if(debug) printf("Execute: %s\n",cmd);
+ rc=system(cmd);
+ if(rc != 0) {
+ printf("**** WARNING ****\nCould not create %s (rc=%d)\n",readmenew,rc) > "/dev/stderr";
+ printf("**** ------- ****\n") > "/dev/stderr";
+ }
+
+ templatefile=PKGSRCDIR "/templates/README.all";
+ fatal_check_file(templatefile);
+ readmenew=PKGSRCDIR "/README-all.html";
+ printf("\t%s\n",readmenew);
+# sort the pkgs
+ sfile=TMPDIR"/unsorted";
+ spipe= "sort " sfile;
+ i=1;
+ print "" >sfile;
+ while(i in allpkg) {
+ printf("%s",allpkg[i]) >> sfile;
+ i++;
+ }
+ close(sfile);
+
+ print "" > readme;
+ while((getline < templatefile) > 0){
+ line=$0;
+ if($0 ~ /%%PKGS%%/) {
+ while((spipe | getline) > 0) {
+ print >> readme;
+ }
+ close(spipe);
+ } else {
+ gsub(/%%DESCR%%/,"",line);
+ gsub(/%%NPKGS%%/,tot_numpkg,line);
+ gsub(/README.html/,readme_name,line);
+ print line >> readme;
+ }
+ }
+ close(readme);
+ close(templatefile);
+ cmd="if [ ! -f "readmenew" ]; then mv -f "readme " " readmenew " ; fi ; if ! cmp -s "readme" "readmenew" ; then mv -f " readme " " readmenew " ; fi ";
+ if(debug) printf("Execute: %s\n",cmd);
+ rc=system(cmd);
+ if(rc != 0) {
+ printf("**** WARNING ****\nCould not create %s (rc=%d)\n",readmenew,rc) > "/dev/stderr";
+ printf("**** ------- ****\n") > "/dev/stderr";
+ }
+
+ close("/dev/stderr");
+ exit 0;
+}
+
+function find_all_depends(pkg,pkgreg,i,deps,depdir){
+# pkg is the package directory, like math/scilab
+
+# printf("find_all_depends(%s)\n",pkg);
+# 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 (topdepends[pkg] ~ "^[ \t]*$") {
+ alldepends[pkg] = " ";
+ if(debug) printf("\t%s has no depends(%s). Returning %s\n",pkg,topdepends[pkg],alldepends[pkg]);
+ return(alldepends[pkg]);
+ }
+
+# recursively gather depends that each of the depends has
+ pkgreg=reg2str(pkg);
+ split(topdepends[pkg],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);
+# don't add ourselves to the list (shouldn't happen, but
+# we'd like to not get stuck in a loop if one exists)
+# if (" "deps[i]" "!~pkgreg){
+
+# if we don't 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);
+ }
+ else {
+ if(debug) printf("\t%s is already listed in %s\n",deps[i],alldepends[pkg]);
+ }
+
+# }
+ i=i+1;
+ }
+ 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){
+ d=gensub(/^(.*)(\/)([^\/]*\/[^\/]*)$/,"\\3","g",d);
+ return(d);
+}
+
+#
+# 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);
+}
+
+function fatal_check_file(file,cmd){
+ cmd="test -f "file ;
+ if(debug) printf("Execute: %s\n",cmd);
+ if(system(cmd) != 0) {
+ printf("**** FATAL ****\nRequired file %s does not exist\n",file) > "/dev/stderr";
+ printf("**** ------- ****\n") > "/dev/stderr";
+ close("/dev/stderr");
+ exit(1);
+ }
+}
+
diff --git a/mk/scripts/mkreadme b/mk/scripts/mkreadme
new file mode 100755
index 00000000000..0b02077f32c
--- /dev/null
+++ b/mk/scripts/mkreadme
@@ -0,0 +1,487 @@
+#!/bin/sh
+# $NetBSD: mkreadme,v 1.1 2003/01/04 21:13:37 dmcmahill Exp $
+#
+# Script for README.html generation
+#
+# Copyright (c) 2002 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.
+#
+
+
+TMPDIR=${TMPDIR:-/tmp/mkreadme}
+PKGSRCDIR=${PKGSRCDIR:-/usr/pkgsrc}
+BMAKE=${BMAKE:-make}
+AWK=${AWK:-/usr/bin/awk}
+
+usage(){
+ echo "$prog - Generates README.html files for a pkgsrc tree"
+ echo "Usage: $prog [-c|--cdrom] [-C|--prune] [-d|--debug] [-f|--ftp] "
+ echo " [-m|--multi-arch] [-p|--pkgsrc directory] "
+ echo " [-P|--packages directory] [-r|--restart] "
+ echo " [-s|--single-arch] [-S|--save-database]"
+ echo " "
+ echo " $prog -h|--help"
+ echo " "
+ echo " $prog -v|--version"
+ echo " "
+ echo "The options supported by $prog are: "
+ echo " "
+ echo " -C|--prune Prune unused README.html files which may exist in"
+ echo " pkg directories which have been removed from CVS."
+ echo " "
+ echo " -c|--cdrom Generates CD-ROM README.html files"
+ echo " "
+ echo " -d|--debug Enables (extremely verbose) debug output"
+ echo " "
+ echo " -f|--ftp Generates FTP README.html files"
+ echo " "
+ echo " -h|--help Displays this help message"
+ echo " "
+ echo " -m|--multi-arch Assumes a packages directory layout like:"
+ echo " OS_VERSION/MACHINE_ARCH/ for example:"
+ echo " 1.{5,6}/{alpha,i386,sparc,vax}"
+ echo " "
+ echo " -p|--pkgsrc dir Specifies the pkgsrc directory. Defaults to"
+ echo " The value of the PKGSRCDIR environment variable"
+ echo " if set or /usr/pkgsrc otherwise."
+ echo " "
+ echo " -P|--packages dir Specifies the packages directory."
+ echo " "
+ echo " -r|--restart Restart. This option assumes that the database file"
+ echo " from a previous run still exists and that the script"
+ echo " should use that instead of recreating the database."
+ echo " "
+ echo " -s|--single-arch Assumes a single OS release and MACHINE_ARCH binary"
+ echo " packages directory structure."
+ echo " "
+ echo " -S|--save-database Does not delete the database file after the run."
+ echo " This is useful for debugging or re-running this script"
+ echo " with the -r option."
+ echo " "
+ echo " -v|--version Displays the version of this script and exits."
+ echo " "
+ echo "Example: $prog -p /pub/NetBSD/packages/pkgsrc -P /pub/NetBSD/packages -m -f"
+ echo " "
+}
+
+clean_and_exit(){
+ if [ "x$DEBUG" = "xno" -a "x$restart" = "xno" -a "x$save" = "xno" ]; then
+ rm -fr $TMPDIR
+ else
+ echo "Debugging output left in $TMP"
+ fi
+ exit 1
+}
+
+prog=$0
+
+
+######################################################################
+#
+# Handle command line options
+#
+######################################################################
+
+ftp_readme=no
+restart=no
+prune=no
+DEBUG=no
+save=no
+
+while
+ test -n "$1"
+do
+ case "$1"
+ in
+
+ # We're generating README.html's for a CD-ROM
+ -c|--cdrom)
+ ftp_readme=no
+ shift
+ ;;
+
+ # Prune old README.html files from pkgs which no longer exist
+ -C|--prune)
+ prune=yes
+ shift
+ ;;
+
+ # Turn on debugging
+ -d|--debug)
+ DEBUG=yes
+ shift
+ ;;
+
+ # We're generating README.html's for a CD-ROM
+ -f|--ftp)
+ ftp_readme=yes
+ shift
+ ;;
+
+
+ # Help
+ -h|--help)
+ usage
+ exit 0
+ ;;
+
+ # assume a OS_RELEASE/MACHINE_ARCH/ layout for the binary pkgs
+ -m|--multi-arch)
+ multiarch=yes
+ shift
+ ;;
+
+ # Specify pkgsrc directory
+ -p|--pkgsrc)
+ PKGSRCDIR=$2
+ shift 2
+ ;;
+
+ # Specify PACKAGES directory
+ -P|--packages)
+ PKGDIR=$2
+ shift 2
+ ;;
+
+ # Restart (ie, don't re-generate the database file)
+ -r|--restart)
+ restart=yes
+ shift
+ ;;
+
+ # assume a single directory structure layout for the binary pkgs
+ -s|--single-arch)
+ multiarch=no
+ shift
+ ;;
+
+ # Save the database files
+ -S|--save-database)
+ save=yes
+ shift
+ ;;
+
+ # Version
+ -v|--version)
+ ${AWK} '/^#[ \t]*\$NetBSD/ {gsub(/,v/,"",$3);printf("%s: Version %s, %s\n",$3,$4,$5); exit 0;}' $prog
+ exit 0
+ ;;
+
+ -*) echo "$prog: ERROR: $1 is not a valid option"
+ usage
+ clean_and_exit
+ ;;
+
+ *)
+ break
+ ;;
+
+ esac
+done
+
+if [ "x$DEBUG" = "xyes" ]; then
+ set -v
+fi
+
+if [ ! -d ${PKGSRCDIR} ]; then
+ echo "ERROR: package source directory ${PKGSRCDIR} does not exist"
+ echo ""
+ clean_and_exit
+fi
+
+if [ ! -d $TMPDIR ]; then
+ mkdir -p $TMPDIR
+fi
+
+DEPENDSTREEFILE=$TMPDIR/dependstree
+export DEPENDSTREEFILE
+DEPENDSFILE=$TMPDIR/depends
+export DEPENDSFILE
+SUPPORTSFILE=$TMPDIR/supports
+export SUPPORTSFILE
+INDEXFILE=$TMPDIR/index
+export SUPPORTSFILE
+ORDERFILE=$TMPDIR/order
+export ORDERFILE
+DATABASEFILE=$TMPDIR/database
+export DATABASEFILE
+BINPKGFILE=$TMPDIR/binpkglist
+
+echo "Starting README.html generation: `date`"
+
+######################################################################
+#
+# Extract key pkgsrc configuration variables
+#
+######################################################################
+
+echo " "
+echo "Extracting configuration variables:"
+echo " "
+if [ -d ${PKGSRCDIR}/pkgtools/pkglint ]; then
+ cd ${PKGSRCDIR}/pkgtools/pkglint
+
+ for v in DISTDIR PACKAGES PKGREPOSITORYSUBDIR PKG_SUFX MACHINE_ARCH PKG_URL OPSYS OS_VERSION FTP_PKG_URL_HOST FTP_PKG_URL_DIR CDROM_PKG_URL_HOST CDROM_PKG_URL_DIR
+ do
+ val=`make show-var VARNAME=${v}`
+ if [ $? != 0 ]; then
+ echo "Error: make show-var VARNAME=${v} in `pwd` "
+ echo "Failed. This is a fatal error"
+ clean_and_exit
+ fi
+ echo "$v=$val"
+ eval ${v}=${val}
+ done
+else
+ echo "Error: ${PKGSRCDIR}/pkgtools/pkglint does not seem to exist"
+ exit 1
+fi
+
+
+######################################################################
+#
+# Decide on FTP vs CDROM README.html files
+#
+######################################################################
+
+if [ "$ftp_readme" = "yes" ]; then
+ PKG_URL=${FTP_PKG_URL_HOST}${FTP_PKG_URL_DIR}
+ echo "Will generate FTP readme files with PKG_URL=$PKG_URL"
+else
+ PKG_URL=${CDROM_PKG_URL_HOST}${CDROM_PKG_URL_DIR}
+ echo "Will generate CD-ROM readme files with PKG_URL=$PKG_URL"
+fi
+
+######################################################################
+#
+# Check for command line switch for packages directory
+#
+######################################################################
+
+# we've been given the directory as a command line switch
+if [ ! -z "$PKGDIR" ]; then
+ PACKAGES=$PKGDIR
+ echo "PACKAGES specified on command line to be $PKGDIR"
+fi
+
+######################################################################
+#
+# Decide in binary package directory layout
+#
+######################################################################
+
+
+# If PACKAGES is set to the default (../../pkgsrc/packages), the current
+# ${MACHINE_ARCH} and "release" (uname -r) will be used. Otherwise a directory
+# structure of ...pkgsrc/packages/`uname -r`/${MACHINE_ARCH} is assumed.
+#
+# This is the logic from bsd.pkg.mk, but I think I'd like to change it to
+# come from a command line switch
+
+if [ -z "$multiarch" -a -e ${PACKAGES} ]; then
+ cd ${PACKAGES}
+ case `pwd` in
+ */pkgsrc/packages)
+ multiarch=no
+ ;;
+
+ *)
+ multiarch=yes
+ ;;
+ esac
+fi
+
+if [ "x$multiarch" = "xyes" ]; then
+ echo "Will generate multi-release, multi-arch readme files"
+else
+ echo "Will generate single-release, single-arch readme files"
+fi
+
+
+######################################################################
+#
+# Extract Database for All Packages (longest step)
+#
+######################################################################
+
+if [ "x$restart" = "xno" ] ; then
+ echo " "
+ echo "Extracting data. This could take a while"
+ echo " "
+ npkg=1
+
+ # make sure we don't have an old database lying around
+ rm -fr $DATABASEFILE
+
+ cd ${PKGSRCDIR}
+ list=`grep '^[[:space:]]*'SUBDIR */Makefile | sed 's,/Makefile.*=[[:space:]]*,/,'`
+ for pkgdir in $list
+ do
+ if [ ! -d $pkgdir ]; then
+ echo " "
+ echo "WARNING: the package directory $pkgdir is listed in" > /dev/stderr
+ echo $pkgdir | sed 's;/.*;/Makefile;g' > /dev/stderr
+ echo "but the directory does not exist. Please fix this!" > /dev/stderr
+ else
+ cd $pkgdir
+ l=`${BMAKE} print-summary-data`
+ if [ $? != 0 ]; then
+ echo "WARNING (printdepends): the package in $pkgdir had problem with" \
+ > /dev/stderr
+ echo " ${BMAKE} print-summary-data" > /dev/stderr
+ echo " database information for this package" > /dev/stderr
+ echo " will be dropped." > /dev/stderr
+ ${BMAKE} print-summary-data 2>&1 > /dev/stderr
+ else
+ echo "$l" >> $DATABASEFILE
+ fi
+ fi
+ echo -n "."
+ if [ `expr $npkg % 100 = 0` -eq 1 ]; then
+ echo " "
+ echo "$npkg"
+ fi
+ npkg=`expr $npkg + 1`
+ cd $PKGSRCDIR
+ done
+else
+ echo " "
+ echo "Using existing database (are you sure you wanted the -r/--restart flag?)"
+ echo " "
+ if [ ! -f $DATABASEFILE ]; then
+ echo " "
+ echo "ERROR: You have use the -r/--restart flag but the database "
+ echo " file $DATABASEFILE does not exist"
+ echo " "
+ exit 1
+ fi
+fi
+
+######################################################################
+#
+# Generate the package and category README.html files
+#
+######################################################################
+
+echo " "
+echo "Generating package README.html files"
+echo " "
+if [ "x$DEBUG" = "xyes" ]; then
+ debug=1;
+else
+ debug=0;
+fi
+
+${AWK} -f ${PKGSRCDIR}/mk/scripts/genreadme.awk \
+ builddependsfile=${TMPDIR}/pkgsrc.builddepends.debug \
+ debug=$debug \
+ dependsfile=${TMPDIR}/pkgsrc.depends.debug \
+ DISTDIR=$DISTDIR \
+ MACHINE_ARCH=$MACHINE_ARCH \
+ MULTIARCH=$multiarch \
+ OPSYS=$OPSYS \
+ OS_VERSION=$OS_VERSION \
+ PACKAGES=$PACKAGES \
+ PKG_SUFX=$PKG_SUFX \
+ PKG_URL=$PKG_URL \
+ PKGREPOSITORYSUBDIR=$PKGREPOSITORYSUBDIR \
+ PKGSRCDIR=$PKGSRCDIR \
+ TMPDIR=$TMPDIR \
+ ${DATABASEFILE}
+
+if [ $? != 0 ]; then
+ echo "Error: genreadme.awk failed to create README.html files"
+ clean_and_exit
+fi
+
+######################################################################
+#
+# Generate the README-IPv6.html file
+#
+######################################################################
+
+echo " "
+echo "Generating the README-IPv6.html file"
+echo " "
+cd ${PKGSRCDIR}
+ipv6=${TMPDIR}/ipv6pkgs
+ipv6_entries=${TMPDIR}/ipv6_entries
+grep -l '^BUILD_DEFS.*=.*USE_INET6' */*/Makefile | sed 's;Makefile;;g' > $ipv6
+fgrep -f $ipv6 README-all.html | sort -t/ +1 > $ipv6_entries
+sed \
+ -e "/%%TRS%%/r${ipv6_entries}" \
+ -e '/%%TRS%%/d' \
+ templates/README.ipv6 > ${TMPDIR}/README-IPv6.html
+if [ $? != 0 ]; then
+ echo "Error: README-IPv6.html generation failed (on sed script)"
+ clean_and_exit
+fi
+if [ ! -f README-IPv6.html ] || ! cmp -s ${TMPDIR}/README-IPv6.html README-IPv6.html ; then
+ mv -f ${TMPDIR}/README-IPv6.html README-IPv6.html
+else
+ echo "README-IPv6.html is unchanged (no changes were needed)"
+fi
+
+######################################################################
+#
+# Prune README.html files which are no longer needed
+#
+######################################################################
+if [ "x$prune" = "xyes" ]; then
+ echo " "
+ echo "Pruning unused README.html files"
+ echo " "
+ cd ${PKGSRCDIR}
+ for d in `ls -d */*` ; do
+ if [ -d $d -a ! -f ${d}/Makefile -a -f ${d}/README.html ]; then
+ echo "Pruning ${d}/README.html which is no longer used"
+ rm -f ${d}/README.html
+ fi
+ done
+fi
+
+######################################################################
+#
+# All done. Clean (if needed) and exit
+#
+######################################################################
+echo " "
+echo "README.html generation finished: `date`"
+echo " "
+if [ "x$DEBUG" = "xno" -a "x$restart" = "xno" -a "x$save" = "xno" ]; then
+ rm -fr $TMPDIR
+else
+ echo "Debugging output left in $TMPDIR"
+fi
+