Enhance build-system to perfectly support OpenBSD and macOS - libgrapheme - unicode string library
 (HTM) git clone git://git.suckless.org/libgrapheme
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit a6b3a194f0381c5aef9346d39b02eb058111d2a2
 (DIR) parent d42f53b5baafe01caa48477e204b63e065660117
 (HTM) Author: Laslo Hunhold <dev@frign.de>
       Date:   Sat,  8 Oct 2022 10:40:03 +0200
       
       Enhance build-system to perfectly support OpenBSD and macOS
       
       Studying the source material on OpenBSD[0], it is written that
       
               Quite a few ports need tweaks to build shared libraries correctly
               anyways. Remember that building shared libraries should be done with
       
                       $ cc -shared -fpic|-fPIC -o libfoo.so.4.5 obj1 obj2
       
               Trying to rename the library after the fact to adjust the version
               number does not work: ELF libraries use some extra magic to set the
               library internal name, so you must link it with the correct version
               the first time.
       
       Thus, it is necessary to directly compile into $(SONAME), which is
       changed to in this commit.
       
       The magic flags for macOS were taken from [1]. It sets up the linker
       such that it automatically respects semantic versioning and will load
       any library with a smaller compatible version (e.g. same minor-version).
       
       Additionally, both OpenBSD and macOS have smarter linkers than Linux
       and don't need symlinks from varying versions to work right. Thus a
       flag SOSYMLINK was added to enable toggling this from the config.mk.
       
       For convenience, the best-practices for each platform are added to
       the config.mk in a commented-out form, saving everybody some time.
       
       [0]:https://www.openbsd.org/faq/ports/specialtopics.html#SharedLibs
       [1]:https://begriffs.com/posts/2021-07-04-shared-libraries.html#linking
       
       Signed-off-by: Laslo Hunhold <dev@frign.de>
       
       Diffstat:
         M Makefile                            |      22 +++++++++++-----------
         M config.mk                           |      19 +++++++++++++++++--
       
       2 files changed, 28 insertions(+), 13 deletions(-)
       ---
 (DIR) diff --git a/Makefile b/Makefile
       @@ -99,7 +99,7 @@ MAN3 =\
        MAN7 =\
                man/libgrapheme\
        
       -all: data/LICENSE $(MAN3:=.3) $(MAN7:=.7) libgrapheme.a libgrapheme.so
       +all: data/LICENSE $(MAN3:=.3) $(MAN7:=.7) libgrapheme.a $(SONAME)
        
        data/DerivedCoreProperties.txt:
                wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/DerivedCoreProperties.txt
       @@ -260,7 +260,7 @@ libgrapheme.a: $(SRC:=.o)
                $(AR) -rc $@ $?
                $(RANLIB) $@
        
       -libgrapheme.so: $(SRC:=.o)
       +$(SONAME): $(SRC:=.o)
                $(CC) -o $@ $(SOFLAGS) $(LDFLAGS) $(SRC:=.o)
        
        $(MAN3:=.3):
       @@ -283,10 +283,10 @@ install: all
                cp -f $(MAN3:=.3) "$(DESTDIR)$(MANPREFIX)/man3"
                cp -f $(MAN7:=.7) "$(DESTDIR)$(MANPREFIX)/man7"
                cp -f libgrapheme.a "$(DESTDIR)$(LIBPREFIX)"
       -        cp -f libgrapheme.so "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION)"
       -        i=0; while [ "$$i" -le $(VERSION_MINOR) ]; do ln -sf "libgrapheme.so.$(VERSION)" "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION_MAJOR).$$i"; i=$$((i+1)); done
       -        ln -sf "libgrapheme.so.$(VERSION)" "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION_MAJOR)"
       -        ln -sf "libgrapheme.so.$(VERSION)" "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so"
       +        cp -f $(SONAME) "$(DESTDIR)$(LIBPREFIX)/$(SONAME)"
       +        if [ "$(SOSYMLINK)" = "true" ]; then i=0; while [ "$$i" -le $(VERSION_MINOR) ]; do ln -sf "$(SONAME)" "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION_MAJOR).$$i"; i=$$((i+1)); done; fi
       +        if [ "$(SOSYMLINK)" = "true" ]; then ln -sf "$(SONAME)" "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION_MAJOR)"; fi
       +        if [ "$(SOSYMLINK)" = "true" ]; then ln -sf "$(SONAME)" "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so"; fi
                cp -f grapheme.h "$(DESTDIR)$(INCPREFIX)"
                $(LDCONFIG)
        
       @@ -294,15 +294,15 @@ uninstall:
                for m in $(MAN3:=.3); do rm -f "$(DESTDIR)$(MANPREFIX)/man3/`basename $$m`"; done
                for m in $(MAN7:=.7); do rm -f "$(DESTDIR)$(MANPREFIX)/man7/`basename $$m`"; done
                rm -f "$(DESTDIR)$(LIBPREFIX)/libgrapheme.a"
       -        rm -f "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION)"
       -        i=0; while [ "$$i" -le $(VERSION_MINOR) ]; do rm -f "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION_MAJOR).$$i"; i=$$((i+1)); done
       -        rm -f "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION_MAJOR)"
       -        rm -f "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so"
       +        rm -f "$(DESTDIR)$(LIBPREFIX)/$(SONAME)"
       +        if [ "$(SOSYMLINK)" = "true" ]; then i=0; while [ "$$i" -le $(VERSION_MINOR) ]; do rm -f "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION_MAJOR).$$i"; i=$$((i+1)); done; fi
       +        if [ "$(SOSYMLINK)" = "true" ]; then rm -f "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION_MAJOR)"; fi
       +        if [ "$(SOSYMLINK)" = "true" ]; then rm -f "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so"; fi
                rm -f "$(DESTDIR)$(INCPREFIX)/grapheme.h"
                $(LDCONFIG)
        
        clean:
       -        rm -f $(BENCHMARK:=.o) benchmark/util.o $(BENCHMARK) $(GEN:=.h) $(GEN:=.o) gen/util.o $(GEN) $(SRC:=.o) src/util.o $(TEST:=.o) test/util.o $(TEST) libgrapheme.a libgrapheme.so $(MAN3:=.3) $(MAN7:=.7)
       +        rm -f $(BENCHMARK:=.o) benchmark/util.o $(BENCHMARK) $(GEN:=.h) $(GEN:=.o) gen/util.o $(GEN) $(SRC:=.o) src/util.o $(TEST:=.o) test/util.o $(TEST) libgrapheme.a $(SONAME) $(MAN3:=.3) $(MAN7:=.7)
        
        clean-data:
                rm -f $(DATA)
 (DIR) diff --git a/config.mk b/config.mk
       @@ -15,8 +15,23 @@ BUILD_CPPFLAGS = $(CPPFLAGS)
        BUILD_CFLAGS   = $(CFLAGS)
        BUILD_LDFLAGS  = $(LDFLAGS)
        
       -SHFLAGS  = -fPIC -ffreestanding
       -SOFLAGS  = -shared -nostdlib -Wl,--soname=libgrapheme.so.$(VERSION_MAJOR).$(VERSION_MINOR)
       +SHFLAGS   = -fPIC -ffreestanding
       +
       +SOFLAGS   = -shared -nostdlib -Wl,--soname=libgrapheme.so.$(VERSION_MAJOR).$(VERSION_MINOR)
       +SONAME    = libgrapheme.so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)
       +SOSYMLINK = true
       +
       +# -- OpenBSD -- (also unset LDCONFIG)
       +# SOFLAGS   = -shared -nostdlib
       +# SONAME    = libgrapheme.so.$(VERSION_MAJOR).$(VERSION_MINOR)
       +# SOSYMLINK = false
       +
       +# -- macOS -- (also unset LDCONFIG)
       +# SOFLAGS   = -dynamiclib -install_name "libgrapheme.$(VERSION_MAJOR).dylib" \
       +#             -current_version "$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)" \
       +#             -compatibility_version "$(VERSION_MAJOR).$(VERSION_MINOR).0"
       +# SONAME    = libgrapheme.$(VERSION_MAJOR).dylib
       +# SOSYMLINK = false
        
        # tools
        CC       = cc