From 10000626e1b8b7e823140f4f3f08c729deb543ea Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <30379873+carlocab@users.noreply.github.com> Date: Sun, 6 Feb 2022 15:25:11 +0800 Subject: Fix library install name in `install` target on macOS On macOS, libraries have "install names" which the linker records in a binary that links against the library. At runtime, the dynamic loader uses this install name to work out where to find the linked library. Currently, the Makefile passes no information about the install name to the linker, and so the DSO has an install name of `libkeccak.dylib`. This is a problem when you link something against `libkeccak` but install it outside the default linker search path, because the dynamic loader won't be able to find it. This change fixes that by making sure the dynamic loader will always be able to find `libkeccak.dylib` regardless of where it's been installed. We use `LIBMAJOREXT` since this is the typical convention for library install names. For example, the system libc++ has an install name of `libc++.1.dylib`, in the same way that `SONAME` also typically includes the library major version on Linux. --- Makefile | 3 +++ 1 file changed, 3 insertions(+) (limited to 'Makefile') diff --git a/Makefile b/Makefile index a6aa425..c52fe9e 100644 --- a/Makefile +++ b/Makefile @@ -175,6 +175,9 @@ run-benchmark: benchmark benchfile for i in $$(seq 7) ; do ./benchmark ; done | median install: libkeccak.$(LIBEXT) libkeccak.a +ifeq ($(shell uname),Darwin) + install_name_tool -id "$(PREFIX)/lib/libkeccak.$(LIBMAJOREXT)" libkeccak.$(LIBEXT) +endif mkdir -p -- "$(DESTDIR)$(PREFIX)/lib" cp -- libkeccak.$(LIBEXT) "$(DESTDIR)$(PREFIX)/lib/libkeccak.$(LIBMINOREXT)" ln -sf -- libkeccak.$(LIBMINOREXT) "$(DESTDIR)$(PREFIX)/lib/libkeccak.$(LIBMAJOREXT)" -- cgit v1.2.3-70-g09d2