summaryrefslogtreecommitdiff
path: root/mk
diff options
context:
space:
mode:
authorobache <obache@pkgsrc.org>2013-03-03 11:53:58 +0000
committerobache <obache@pkgsrc.org>2013-03-03 11:53:58 +0000
commit1fe311e6da74bee2b11acdaf6e70f4451d875ffe (patch)
tree6ccba77f5eb0d4ec4f1c18a48ade2f87b22ea0cd /mk
parent104f4d0233e5b547a7f6134fc577fc6284afc416 (diff)
downloadpkgsrc-1fe311e6da74bee2b11acdaf6e70f4451d875ffe.tar.gz
switch to based on shlib-dylib.awk
Diffstat (limited to 'mk')
-rw-r--r--mk/plist/shlib-pe.awk186
1 files changed, 174 insertions, 12 deletions
diff --git a/mk/plist/shlib-pe.awk b/mk/plist/shlib-pe.awk
index 0f6f152b0a5..8bdc4c74cc5 100644
--- a/mk/plist/shlib-pe.awk
+++ b/mk/plist/shlib-pe.awk
@@ -1,20 +1,182 @@
-# $NetBSD: shlib-pe.awk,v 1.1 2013/02/10 12:03:00 obache Exp $
+# $NetBSD: shlib-pe.awk,v 1.2 2013/03/03 11:53:58 obache Exp $
#
-###
-### PLIST shlib filter for Portable Executable format, PE on Cygwin.
+# Copyright (c) 2006,2013 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Johnny C. Lam.
+#
+# 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.
+
+#
+# This awk script is a filter that reads PLIST entries and transforms
+# and expands entries that match ELF library into the appropriate Portable
+# Executable format, PE on Cygwin dll names.
+#
+
+BEGIN {
+ LIBTOOL_EXPAND = ENVIRON["LIBTOOL_EXPAND"] ? ENVIRON["LIBTOOL_EXPAND"] : "/usr/pkgsrc/mk/plist/libtool-expand"
+ LIBTOOLIZE_PLIST = ENVIRON["LIBTOOLIZE_PLIST"] ? ENVIRON["LIBTOOLIZE_PLIST"] : "yes"
+ PREFIX = ENVIRON["PREFIX"] ? ENVIRON["PREFIX"] : "/usr/pkg"
+ TEST = ENVIRON["TEST"] ? ENVIRON["TEST"] : "test"
+ nentries = 0
+}
+
###
+### add_dll(lib) adds the named "lib" to the PLIST entries list and
+### to the dlls list if we haven't already seen it.
+###
+function add_dll(lib) {
+ if (dlls[lib] == "") {
+ dlls[lib] = lib
+ entries[++nentries] = lib
+ }
+}
-# Libtoolized packages don't need any special attention, but for others we need
-# to manually deal with the .dll library suffix.
+###
+### Stored special PLIST commands, e.g. @comment, @exec, etc., verbatim
+### in the entries array.
+###
+/^@/ {
+ entries[++nentries] = $0
+ next
+}
-# Match shared libs
-/.*\/lib[^\/]+\.so(\.[0-9]+)*$/ {
- sub("\.so\.", ".dll.");
+###
+### Record all of the library names associated with a libtool archive
+### in the "ltnames" array. Also, record the libtool archive in the
+### "entries" array.
+###
+(LIBTOOLIZE_PLIST ~ /[yY][eE][sS]/) && /.*\/[^\/]+\.la$/ {
+ entries[++nentries] = $0
+ cmd = TEST " -f " PREFIX "/" $0
+ if (system(cmd) == 0) {
+ cmd = "cd " PREFIX " && " LIBTOOL_EXPAND " " $0
+ while (cmd | getline) {
+ ltnames[$0] = $0
+ }
+ close(cmd)
+ }
+ next
}
-# Match dynamically loaded modules
-/.*\.so$/ {
- sub("\.so$", ".dll");
+
+###
+### Convert each ELF shlib entry into a dll entry. Also, record all
+### dll names that can be derived from this entry as dlls.
+###
+/.*\/lib[^\/]+\.so(\.[0-9]+)+$/ {
+ lib = $0; sub("\\.so\\.", ".", lib); sub("\\.so$", "", lib)
+ lib = lib ".dll"
+ add_dll(lib)
+ while (sub("\\.[0-9]+$", "")) {
+ lib = $0; sub("\\.so\\.", ".", lib); sub("\\.so$", "", lib)
+ lib = lib ".dll"
+ add_dll(lib)
+ }
+ if (sub("\\.so$", "")) {
+ lib = $0 ".dll"
+ add_dll(lib)
+ }
+ if (sub("-([0-9.]+)$", "")) {
+ lib = $0 ".dll"
+ add_dll(lib)
+ }
+ next
+}
+
+###
+### If the ".so" file actually exists, then it's a dynamically loadable
+### module, so the entry should stay. Convert it into a dll name as
+### well and record it as a dll.
+###
+/.*\/lib[^\/]+\.so$/ {
+ cmd = TEST " -f " PREFIX "/" $0
+ if (system(cmd) == 0) {
+ entries[++nentries] = $0
+ }
+ lib = $0; sub("\\.so$", "", lib)
+ lib = lib ".dll"
+ add_dll(lib)
+ if (sub("-([0-9.]+)$", "")) {
+ lib = $0 ".dll"
+ add_dll(lib)
+ }
+ next
}
+
+###
+### All other entries are stored verbatim in the entries array.
+###
{
- print
+ entries[++nentries] = $0
+}
+
+###
+### Print out the PLIST entries to standard output.
+###
+END {
+ # Drop valid library names associated with a libtool archive from
+ # the list of dlls that will be removed from the PLIST.
+ #
+ for (j in dlls) {
+ for (k in ltnames) {
+ if (dlls[j] == ltnames[k]) {
+ delete dlls[j]
+ break
+ }
+ }
+ }
+
+ # Remove dll entries that *do* exist on the filesystem from the
+ # list of dlls that will be removed from the PLIST.
+ #
+ for (j in dlls) {
+ cmd = TEST " -f " PREFIX "/" dlls[j]
+ if (system(cmd) == 0) {
+ delete dlls[j]
+ }
+ }
+
+ # Remove PLIST entries that match a non-existent dll.
+ for (i in entries) {
+ for (j in dlls) {
+ if (entries[i] == dlls[j]) {
+ delete entries[i]
+ break
+ }
+ }
+ }
+
+ # Output the PLIST entries in order.
+ for (i = 1; i <= nentries; i++) {
+ if (entries[i]) {
+ print entries[i]
+ }
+ }
}