summaryrefslogtreecommitdiff
path: root/mk/plist/shlib-dylib.awk
diff options
context:
space:
mode:
Diffstat (limited to 'mk/plist/shlib-dylib.awk')
-rw-r--r--mk/plist/shlib-dylib.awk182
1 files changed, 182 insertions, 0 deletions
diff --git a/mk/plist/shlib-dylib.awk b/mk/plist/shlib-dylib.awk
new file mode 100644
index 00000000000..1c99c37a026
--- /dev/null
+++ b/mk/plist/shlib-dylib.awk
@@ -0,0 +1,182 @@
+# $NetBSD: shlib-dylib.awk,v 1.1 2006/01/12 23:43:57 jlam Exp $
+#
+# Copyright (c) 2006 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 Mach-O
+# dylib names.
+#
+
+BEGIN {
+ LIBTOOL_EXPAND = ENVIRON["LIBTOOL_EXPAND"]
+ LIBTOOLIZE_PLIST = ENVIRON["LIBTOOLIZE_PLIST"]
+ PREFIX = ENVIRON["PREFIX"]
+ TEST = ENVIRON["TEST"]
+ nentries = 0
+}
+
+###
+### add_dylib(lib) adds the named "lib" to the PLIST entries list and
+### to the dylibs list if we haven't already seen it.
+###
+function add_dylib(lib) {
+ if (dylibs[lib] == "") {
+ dylibs[lib] = lib
+ entries[++nentries] = lib
+ }
+}
+
+###
+### Stored special PLIST commands, e.g. @comment, @exec, etc., verbatim
+### in the entries array.
+###
+/^@/ {
+ entries[++nentries] = $0
+ next
+}
+
+###
+### 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
+}
+
+###
+### Convert each ELF shlib entry into a dylib entry. Also, record all
+### dylib names that can be derived from this entry as dylibs.
+###
+/.*\/lib[^\/]+\.so(\.[0-9]+)+$/ {
+ lib = $0; sub("\.so\.", ".", lib); sub("\.so$", "", lib)
+ lib = lib ".dylib"
+ add_dylib(lib)
+ while (sub("\.[0-9]+$", "")) {
+ lib = $0; sub("\.so\.", ".", lib); sub("\.so$", "", lib)
+ lib = lib ".dylib"
+ add_dylib(lib)
+ }
+ if (sub("\.so$", "")) {
+ lib = $0 ".dylib"
+ add_dylib(lib)
+ }
+ if (sub("-([0-9.]+)$", "")) {
+ lib = $0 ".dylib"
+ add_dylib(lib)
+ }
+ next
+}
+
+###
+### If the ".so" file actually exists, then it's a dynamically loadable
+### module, so the entry should stay. Convert it into a dylib name as
+### well and record it as a dylib.
+###
+/.*\/lib[^\/]+\.so$/ {
+ cmd = TEST " -f " PREFIX "/" $0
+ if (system(cmd) == 0) {
+ entries[++nentries] = $0
+ }
+ lib = $0; sub("\.so$", "", lib)
+ lib = lib ".dylib"
+ add_dylib(lib)
+ if (sub("-([0-9.]+)$", "")) {
+ lib = $0 ".dylib"
+ add_dylib(lib)
+ }
+ next
+}
+
+###
+### All other entries are stored verbatim in the entries array.
+###
+{
+ 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 dylibs that will be removed from the PLIST.
+ #
+ for (j in dylibs) {
+ for (k in ltnames) {
+ if (dylibs[j] == ltnames[k]) {
+ delete dylibs[j]
+ break
+ }
+ }
+ }
+
+ # Remove dylib entries that *do* exist on the filesystem from the
+ # list of dylibs that will be removed from the PLIST.
+ #
+ for (j in dylibs) {
+ cmd = TEST " -f " PREFIX "/" dylibs[j]
+ if (system(cmd) == 0) {
+ delete dylibs[j]
+ }
+ }
+
+ # Remove PLIST entries that match a non-existent dylib.
+ for (i in entries) {
+ for (j in dylibs) {
+ if (entries[i] == dylibs[j]) {
+ delete entries[i]
+ break
+ }
+ }
+ }
+
+ # Output the PLIST entries in order.
+ for (i = 1; i <= nentries; i++) {
+ if (entries[i]) {
+ print entries[i]
+ }
+ }
+}