diff --git a/.gitignore b/.gitignore index a1969cc53..39c837231 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,12 @@ # suppress compiler/linker output *.[oa] *.obj -*.l[oa] +*.dylib* +*.dll* +*.so* [Dd]ebug/ [Rr]elease/ /MSVC_* -.libs/ # release files /libtomcrypt-* diff --git a/bin.in b/bin.in new file mode 100644 index 000000000..e0582791c --- /dev/null +++ b/bin.in @@ -0,0 +1,17 @@ +#!/bin/sh +# Shell wrapper script for the built executables when built with the +# shared libtomcrypt library. + +set -euf + +rootdir="$(cd -- "${0%/*}/" && pwd -P)" + +LD_LIBRARY_PATH="${LD_LIBRARY_PATH:-$rootdir}" + +export LD_LIBRARY_PATH + +if [ "${1+x}" ]; then + exec "$rootdir"/@EXE@ "${@:-}" +else + exec "$rootdir"/@EXE@ +fi diff --git a/helper.pl b/helper.pl index a6bd14588..e5bbd03f9 100755 --- a/helper.pl +++ b/helper.pl @@ -272,7 +272,7 @@ sub patch_file { sub version_from_tomcrypt_h { my $h = read_file(shift); if ($h =~ /\n#define\s*SCRYPT\s*"([0-9]+)\.([0-9]+)\.([0-9]+)(\S*)"/s) { - return "VERSION_PC=$1.$2.$3", "VERSION_LT=1:1", "VERSION=$1.$2.$3$4", "PROJECT_NUMBER=$1.$2.$3$4"; + return "VERSION_PC=$1.$2.$3", "VERSION_MAJOR=1", "VERSION_MINOR=0", "VERSION_PATCH=1", "VERSION=$1.$2.$3$4", "PROJECT_NUMBER=$1.$2.$3$4"; } else { die "#define SCRYPT not found in tomcrypt.h"; diff --git a/makefile.shared b/makefile.shared index 182be80aa..0e5f2ae7b 100644 --- a/makefile.shared +++ b/makefile.shared @@ -1,6 +1,6 @@ # MAKEFILE for linux GCC # -# This makefile produces a shared object and requires libtool to be installed. +# This makefile produces a shared object. # # Thanks to Zed Shaw for helping debug this on BSD/OSX. # Tom St Denis @@ -24,69 +24,82 @@ PLATFORM := $(shell uname | sed -e 's/_.*//') # Linux (on all Linux distros) # Darwin (on macOS, OS X) -ifeq ($(LIBTOOL),rlibtool) - TGTLIBTOOL:=slibtool-shared -else - ifndef LIBTOOL - ifeq ($(PLATFORM), Darwin) - TGTLIBTOOL:=glibtool - else - TGTLIBTOOL:=libtool - endif - else - TGTLIBTOOL=$(LIBTOOL) - endif +ifneq ($(findstring $(PLATFORM),Linux CYGWIN MINGW32 MINGW64 MSYS),) + NO_UNDEFINED := -Wl,--no-undefined endif -ifneq ($(findstring $(PLATFORM),CYGWIN MINGW32 MINGW64 MSYS),) - NO_UNDEFINED:=-no-undefined -endif +INSTALL_CMD := install +UNINSTALL_CMD := rm -f + +NAME := libtomcrypt +PIC := -fPIC -LTCOMPILE = $(TGTLIBTOOL) --mode=compile --tag=CC $(CC) -INSTALL_CMD = $(TGTLIBTOOL) --mode=install install -UNINSTALL_CMD = $(TGTLIBTOOL) --mode=uninstall rm +ifeq ($(PLATFORM), Darwin) + SHARED += -dynamiclib + TARGET := $(NAME).dylib +else ifeq ($(OS), Windows_NT) + SHARED += -shared + TARGET := $(NAME).dll +else + SHARED += -shared + TARGET := $(NAME).so +endif #Output filenames for various targets. ifndef LIBNAME - LIBNAME=libtomcrypt.la + LIBNAME = $(TARGET).$(VERSION_LT) endif - include makefile_include.mk +.PHONY: check install install_bins uninstall #ciphers come in two flavours... enc+dec and enc src/ciphers/aes/aes_enc.o: src/ciphers/aes/aes.c src/ciphers/aes/aes_tab.c - $(LTCOMPILE) $(LTC_CFLAGS) $(CPPFLAGS) $(LTC_LDFLAGS) -DENCRYPT_ONLY -c src/ciphers/aes/aes.c -o src/ciphers/aes/aes_enc.o + $(CC) $(LTC_CFLAGS) $(PIC) $(CPPFLAGS) $(LTC_LDFLAGS) -DENCRYPT_ONLY -c src/ciphers/aes/aes.c -o src/ciphers/aes/aes_enc.o .c.o: - $(LTCOMPILE) $(LTC_CFLAGS) $(CPPFLAGS) $(LTC_LDFLAGS) -o $@ -c $< - -LOBJECTS = $(OBJECTS:.o=.lo) + $(CC) $(LTC_CFLAGS) $(PIC) $(CPPFLAGS) $(LTC_LDFLAGS) -o $@ -c $< $(LIBNAME): $(OBJECTS) - $(TGTLIBTOOL) --mode=link --tag=CC $(CC) $(LTC_LDFLAGS) $(LOBJECTS) $(EXTRALIBS) -o $@ -rpath $(LIBPATH) -version-info $(VERSION_LT) $(NO_UNDEFINED) + $(CC) $(LTC_LDFLAGS) $(OBJECTS) $(EXTRALIBS) $(SHARED) -Wl,-soname,$(TARGET).$(VERSION_MAJOR) $(NO_UNDEFINED) -o $@ + ln -sf $(LIBNAME) $(TARGET).$(VERSION_MAJOR) + ln -sf $(LIBNAME) $(TARGET) -test: $(call print-help,test,Builds the library and the 'test' application to run all self-tests) $(LIBNAME) $(TOBJECTS) - $(TGTLIBTOOL) --mode=link --tag=CC $(CC) $(LTC_LDFLAGS) -o $(TEST) $(TOBJECTS) $(LIBNAME) $(EXTRALIBS) +tests/$(TEST): $(LIBNAME) $(TOBJECTS) + $(CC) $(LTC_LDFLAGS) $(TOBJECTS) -L. -ltomcrypt $(EXTRALIBS) $(NO_UNDEFINED) -o $@ + +test: $(call print-help,test,Builds the library and the 'test' application to run all self-tests) tests/$(TEST) bin.in + sed -e 's|@EXE@|tests/$@|' bin.in > $@.out + $(INSTALL_CMD) -m 755 $@.out $@ + @rm -f $@.out # build the demos from a template define DEMO_template -$(1): $(call print-help,$(1),Builds the library and the '$(1)' demo) demos/$(1).o $$(LIBNAME) - $$(TGTLIBTOOL) --mode=link --tag=CC $$(CC) $$(LTC_LDFLAGS) $$^ $$(EXTRALIBS) -o $(1) +demos/$(1): demos/$(1).o $$(LIBNAME) + $$(CC) $$(LTC_LDFLAGS) $$< -L. -ltomcrypt $$(EXTRALIBS) -o $$@ + +$(1): $(call print-help,$(1),Builds the library and the '$(1)' demo) demos/$(1) bin.in + sed -e 's|@EXE@|demos/$(1)|' bin.in > $(1).out + $$(INSTALL_CMD) -m 755 $(1).out $(1) + @rm -f $(1).out endef $(foreach demo, $(strip $(DEMOS)), $(eval $(call DEMO_template,$(demo)))) install: $(call print-help,install,Installs the library + headers + pkg-config file) .common_install + ln -sf $(LIBNAME) $(DESTDIR)/$(LIBPATH)/$(TARGET).$(VERSION_MAJOR) + ln -sf $(LIBNAME) $(DESTDIR)/$(LIBPATH)/$(TARGET) sed -e 's,^prefix=.*,prefix=$(PREFIX),' -e 's,^Version:.*,Version: $(VERSION_PC),' libtomcrypt.pc.in > libtomcrypt.pc - install -p -d $(DESTDIR)$(LIBPATH)/pkgconfig - install -p -m 644 libtomcrypt.pc $(DESTDIR)$(LIBPATH)/pkgconfig/ + $(INSTALL_CMD) -p -d $(DESTDIR)$(LIBPATH)/pkgconfig + $(INSTALL_CMD) -p -m 644 libtomcrypt.pc $(DESTDIR)$(LIBPATH)/pkgconfig/ install_bins: $(call print-help,install_bins,Installs the useful demos ($(USEFUL_DEMOS))) .common_install_bins uninstall: $(call print-help,uninstall,Uninstalls the library + headers + pkg-config file) .common_uninstall - rm $(DESTDIR)$(LIBPATH)/pkgconfig/libtomcrypt.pc + $(UNINSTALL_CMD) $(DESTDIR)/$(LIBPATH)/$(TARGET).$(VERSION_MAJOR) + $(UNINSTALL_CMD) $(DESTDIR)/$(LIBPATH)/$(TARGET) + $(UNINSTALL_CMD) $(DESTDIR)$(LIBPATH)/pkgconfig/libtomcrypt.pc # ref: $Format:%D$ # git commit: $Format:%H$ diff --git a/makefile_include.mk b/makefile_include.mk index 2fa3bac94..241c1f76f 100644 --- a/makefile_include.mk +++ b/makefile_include.mk @@ -5,8 +5,11 @@ # The version - BEWARE: VERSION, VERSION_PC and VERSION_LT are updated via ./updatemakes.sh VERSION=1.18.2-develop VERSION_PC=1.18.2 -# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html -VERSION_LT=1:1 +# https://semver.org/ +VERSION_MAJOR=1 +VERSION_MINOR=0 +VERSION_PATCH=1 +VERSION_LT=$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH) # Compiler and Linker Names ifndef CROSS_COMPILE @@ -478,30 +481,30 @@ install_hooks: $(call print-help,install_hooks,Installs the git hooks) HEADER_FILES=$(notdir $(HEADERS_PUB)) .common_uninstall: $(UNINSTALL_CMD) $(DESTDIR)$(LIBPATH)/$(LIBNAME) - rm $(HEADER_FILES:%=$(DESTDIR)$(INCPATH)/%) + $(UNINSTALL_CMD) $(HEADER_FILES:%=$(DESTDIR)$(INCPATH)/%) #This rule cleans the source tree of all compiled code, not including the pdf #documentation. clean: $(call print-help,clean,Clean everything besides the pdf documentation) find . -type f -name "*.o" \ - -o -name "*.lo" \ - -o -name "*.a" \ - -o -name "*.la" \ - -o -name "*.obj" \ - -o -name "*.lib" \ - -o -name "*.exe" \ - -o -name "*.dll" \ - -o -name "*.so" \ - -o -name "*.gcov"\ - -o -name "*.gcda"\ - -o -name "*.gcno"\ - -o -name "*.il" \ - -o -name "*.dyn" \ + -o -name "*.a" \ + -o -name "*.obj" \ + -o -name "*.lib" \ + -o -name "*.exe" \ + -o -name "*.dll*" \ + -o -name "*.dylib*"\ + -o -name "*.so*" \ + -o -name "*.out" \ + -o -name "*.gcov" \ + -o -name "*.gcda" \ + -o -name "*.gcno" \ + -o -name "*.il" \ + -o -name "*.dyn" \ -o -name "*.dpi" | xargs rm -f - rm -f $(TIMING) $(TEST) $(DEMOS) + rm -f $(TIMING) $(TEST) tests/$(TEST) $(DEMOS) + rm -f $(foreach demo, $(strip $(DEMOS)),demos/$(demo)) rm -f *_tv.txt rm -f *.pc - rm -rf `find . -type d -name "*.libs" | xargs` $(MAKE) -C doc/ clean zipup: $(call print-help,zipup,Prepare the archives for a release) doc/crypt.pdf