Avoid empty libtool -export-symbols-regex pattern 44/12944/2
authorAndrew Deason <adeason@sinenomine.net>
Wed, 7 Mar 2018 19:11:03 +0000 (13:11 -0600)
committerBenjamin Kaduk <kaduk@mit.edu>
Fri, 9 Mar 2018 03:19:24 +0000 (22:19 -0500)
Currently, in LT_LDLIB_shlib_missing, we construct our
-export-symbols-regex pattern like so (with some escaping):

    "($(sed -e 's/^/^/' -e 's/$/$/' xxx.sym | tr '\n' '|' | sed -e 's/|$//'))"

The idea is that for a .sym file consisting of, for example:

    foo
    bar

We then generate a regex like (^foo$|^bar$). However, since the 'tr'
removes all newlines, the line given to the last 'sed' in the pipeline
has no trailing newline. On some systems, such as Solaris, this causes
sed to not output anything at all, resulting in a regex pattern of
just "()".

For example:

    # on Debian
    $ echo -n foo | sed -e 's/foo/bar/'
    bar$

    # on Solaris
    $ echo -n foo | sed -e 's/foo/bar/'
    $

To avoid this, we can change the sed pipeline to not remove the
newlines until the very end. Change the way we construct our regex to
this instead:

    "($(sed -e 's/^/^/' -e 's/$/$|/' -e '$ s/|$//' xxx.sym | tr -d '\n'))"

So the sed removes the extra '|' in the last element by looking at the
last line, instead of looking at the end of the line after the 'tr'
conversion.

Change-Id: Id382132f6b400bf961dbaa52138a9abd0168118d
Reviewed-on: https://gerrit.openafs.org/12944
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/config/Makefile.config.in

index af51d6e..90a47f3 100644 (file)
@@ -260,8 +260,8 @@ LT_LDLIB_shlib_common=$(LIBTOOL) --quiet --mode=link --tag=CC \
 LT_LDLIB_shlib=$(LT_LDLIB_shlib_common) -export-symbols $(srcdir)/$@.sym
 
 LT_LDLIB_shlib_missing=$(LT_LDLIB_shlib_common) -export-symbols-regex \
-       "($$(sed -e 's/^/^/' -e 's/$$/$$/' $(srcdir)/$@.sym | tr '\n' '|' | \
-       sed -e 's/|$$//'))"
+       "($$(sed -e 's/^/^/' -e 's/$$/$$|/' -e '$$ s/|$$//' $(srcdir)/$@.sym | \
+       tr -d '\n'))"
 
 # Link a static convenience library (contains no PIC code)
 LT_LDLIB_static=$(LIBTOOL) --quiet --mode=link --tag=CC \