#!/usr/bin/awk -f # # $NetBSD: reduce-resolved-depends.awk,v 1.2 2013/05/09 23:37:26 riastradh Exp $ # # Copyright (c) 2012 The NetBSD Foundation, Inc. # All rights reserved. # # This code is derived from software contributed to The NetBSD Foundation # by Joerg Sonnenberger. # # 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. # # 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. # ###################################################################### # # NAME # reduce-resolved-depends.awk -- drop redundant build dependencies # # SYNOPSIS # reduce-resolved-depends.awk # # DESCRIPTION # reduce-resolved-depends.awk removes build dependencies from the # dependency list on stdin, if they provided as dependency of # one of the full dependencies in the list. # # ENVIRONMENT # CAT # PKG_INFO # HOST_PKG_INFO (for cross-compilation) # ###################################################################### BEGIN { CAT = ENVIRON["CAT"] ? ENVIRON["CAT"] : "cat" PKG_INFO = ENVIRON["PKG_INFO"] ? ENVIRON["PKG_INFO"] : "pkg_info" HOST_PKG_INFO = ENVIRON["HOST_PKG_INFO"] ? ENVIRON["HOST_PKG_INFO"] : "pkg_info" PROGNAME = "reduce-resolved-depends.awk" ERRCAT = CAT " 1>&2" while (getline == 1) { if (NF != 3) { print "ERROR: [" PROGNAME "] invalid dependency line " $0 | ERRCAT exit 1 } if ($1 != "full" && $1 != "build" && $1 != "tool" && $1 != "bootstrap") { print "ERROR: [" PROGNAME "] invalid dependency line " $0 | ERRCAT exit 1 } type[NR] = $1 pattern[NR] = $2 pkg[NR] = $3 } lines = NR + 1 # Register all full dependencies first. # Keep track of the first line for each of them to skip duplicates later. for (i = 0; i < lines; ++i) { if (type[i] == "full" && checked_full[pkg[i]] != 1) { checked_full[pkg[i]] = 1 checked_build[pkg[i]] = 1 checked_tool[pkg[i]] = 1 checked_bootstrap[pkg[i]] = 1 print_line[i] = 1 } } for (i = 0; i < lines; ++i) { if (type[i] == "bootstrap" && checked_bootstrap[pkg[i]] != 1) { checked_bootstrap[pkg[i]] = 1 found = 0 if (PKG_INFO == HOST_PKG_INFO) { cmd = PKG_INFO " -qr " pkg[i] while (cmd | getline dpkg) { if (checked_full[dpkg] == 1) found = 1 } close(cmd) } if (found == 0) print_line[i] = 1 } } for (i = 0; i < lines; ++i) { if (type[i] == "tool" && checked_tool[pkg[i]] != 1) { checked_tool[pkg[i]] = 1 if (checked_bootstrap[pkg[i]] == 1) continue found = 0 if (PKG_INFO == HOST_PKG_INFO) { cmd = PKG_INFO " -qr " pkg[i] while (cmd | getline dpkg) { if (checked_full[dpkg] == 1) found = 1 } close(cmd) } if (found == 0) print_line[i] = 1 } } for (i = 0; i < lines; ++i) { if (type[i] == "build" && checked_build[pkg[i]] != 1) { checked_build[pkg[i]] = 1 if (PKG_INFO == HOST_PKG_INFO) if (checked_bootstrap[pkg[i]] == 1) continue found = 0 cmd = PKG_INFO " -qr " pkg[i] while (cmd | getline dpkg) { if (checked_full[dpkg] == 1) found = 1 } close(cmd) if (found == 0) print_line[i] = 1 } } for (i = 0; i < lines; ++i) { if (print_line[i] == 1) printf("%s\t%s\t%s\n", type[i], pattern[i], pkg[i]) } }