diff --git a/.gitignore b/.gitignore index 2a1e6fe6..e0efc30d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,10 @@ *.a *.so *.so.* +*.dll +*.dylib *.out +*.out.exe *.vec *.gch *.sav diff --git a/makefile b/makefile index d747ff2b..c94ee997 100644 --- a/makefile +++ b/makefile @@ -52,15 +52,48 @@ .POSIX: .SUFFIXES: +ifeq ($(OS),Windows_NT) +WIN32 = 1 +else +UNAME := $(shell uname -s || :) +ifeq ($(UNAME),Darwin) +DARWIN = 1 +endif +endif + CC ?= gcc -std=c99 CFLAGS ?= -pedantic -Wall -Wextra -O3 -march=native DESTDIR ?= PREFIX ?= /usr/local +BINDIR ?= $(PREFIX)/bin LIBDIR ?= $(PREFIX)/lib INCLUDEDIR ?= $(PREFIX)/include PKGCONFIGDIR ?= $(LIBDIR)/pkgconfig MANDIR ?= $(PREFIX)/share/man/man3 -SONAME = libmonocypher.so.4 +SOVERSION = 4 +# MinGW/CygWin convention + implib generation +ifdef WIN32 +SONAME = libmonocypher-$(SOVERSION).dll +EXESUFFIX = .exe +SOSUFFIX = .dll +SOFLAGS = -Wl,-soname,$(SONAME),--out-implib,lib/libmonocypher.dll.a +# Darwin convention +else ifdef DARWIN +SONAME = libmonocypher.$(SOVERSION).dylib +EXESUFFIX = +SOSUFFIX = .dylib +SOFLAGS = -install_name $(SONAME) -current_version $(SOVERSION) \ + -compatibility_version $(SOVERSION) +else +SONAME = libmonocypher.so.$(SOVERSION) +EXESUFFIX = +SOSUFFIX = .so +SOFLAGS = -Wl,-soname,$(SONAME) +endif + +ifdef DARWIN +else +endif .PHONY: all library static-library dynamic-library \ install install-lib install-pc install-doc \ @@ -73,14 +106,14 @@ SONAME = libmonocypher.so.4 all : library doc/man3/intro.3monocypher check: test -test: test.out - ./test.out +test: test.out$(EXESUFFIX) + ./test.out$(EXESUFFIX) -tis-ci: tis-ci.out - ./tis-ci.out +tis-ci: tis-ci.out$(EXESUFFIX) + ./tis-ci.out$(EXESUFFIX) -ctgrind: ctgrind.out - valgrind ./ctgrind.out +ctgrind: ctgrind.out$(EXESUFFIX) + valgrind ./ctgrind.out$(EXESUFFIX) clean: rm -rf lib/ doc/html/ doc/man3/ @@ -94,9 +127,21 @@ install: install-lib install-pc install-doc install-lib: library mkdir -p $(DESTDIR)$(INCLUDEDIR) mkdir -p $(DESTDIR)$(LIBDIR) - cp -P lib/libmonocypher.a lib/libmonocypher.so* $(DESTDIR)$(LIBDIR) - cp -P src/monocypher.h $(DESTDIR)$(INCLUDEDIR) - cp -P src/optional/monocypher-ed25519.h $(DESTDIR)$(INCLUDEDIR) +# Dynamic library should be installed into `bin` on Windows +ifdef WIN32 + mkdir -p $(DESTDIR)$(BINDIR) + cp -P lib/libmonocypher.a lib/libmonocypher.dll.a $(DESTDIR)$(LIBDIR) + cp -P lib/libmonocypher*.dll $(DESTDIR)$(BINDIR) +else ifdef DARWIN + cp -P lib/libmonocypher.a lib/libmonocypher*.dylib $(DESTDIR)$(LIBDIR) +# Adjust install name + install_name_tool -change $(SONAME) $(DESTDIR)$(LIBDIR)/$(SONAME) \ + $(DESTDIR)$(LIBDIR)/$(SONAME) +else + cp -P lib/libmonocypher.a lib/libmonocypher.so* $(DESTDIR)$(LIBDIR) +endif + cp -P src/monocypher.h $(DESTDIR)$(INCLUDEDIR) + cp -P src/optional/monocypher-ed25519.h $(DESTDIR)$(INCLUDEDIR) install-pc: monocypher.pc mkdir -p $(DESTDIR)$(PKGCONFIGDIR) @@ -109,7 +154,14 @@ install-doc: doc/man3/intro.3monocypher uninstall: rm -f $(DESTDIR)$(LIBDIR)/libmonocypher.a +ifdef WIN32 + rm -f $(DESTDIR)$(LIBDIR)/libmonocypher.dll.a + rm -f $(DESTDIR)$(BINDIR)/libmonocypher*.dll +else ifdef DARWIN + rm -f $(DESTDIR)$(LIBDIR)/libmonocypher*.dylib +else rm -f $(DESTDIR)$(LIBDIR)/libmonocypher.so* +endif rm -f $(DESTDIR)$(INCLUDEDIR)/monocypher.h rm -f $(DESTDIR)$(INCLUDEDIR)/monocypher-ed25519.h rm -f $(DESTDIR)$(PKGCONFIGDIR)/monocypher.pc @@ -120,7 +172,15 @@ uninstall: ################## library: static-library dynamic-library static-library : lib/libmonocypher.a -dynamic-library: lib/libmonocypher.so lib/$(SONAME) +# On Windows implib used instead of symlink +ifdef WIN32 +# Created by library target +lib/libmonocypher.dll.a: lib/$(SONAME) + +dynamic-library: lib/$(SONAME) lib/libmonocypher.dll.a +else +dynamic-library: lib/libmonocypher$(SOSUFFIX) lib/$(SONAME) +endif MAIN_O=lib/monocypher.o lib/monocypher-ed25519.o MAIN_I=-I src -I src/optional @@ -128,11 +188,11 @@ MAIN_I=-I src -I src/optional lib/libmonocypher.a: $(MAIN_O) $(AR) cr $@ $(MAIN_O) -lib/libmonocypher.so: lib/$(SONAME) +lib/libmonocypher$(SOSUFFIX): lib/$(SONAME) ln -sf `basename lib/$(SONAME)` $@ lib/$(SONAME): $(MAIN_O) - $(CC) $(CFLAGS) $(LDFLAGS) -shared -Wl,-soname,$(SONAME) -o $@ $(MAIN_O) + $(CC) $(CFLAGS) $(LDFLAGS) -shared $(SOFLAGS) -o $@ $(MAIN_O) lib/monocypher.o: src/monocypher.c src/monocypher.h @mkdir -p $(@D) @@ -170,13 +230,13 @@ lib/ctgrind.o: tests/ctgrind.c $(TEST_COMMON) ###################### TEST_OBJ = lib/utils.o lib/monocypher.o lib/monocypher-ed25519.o -test.out: lib/test.o $(TEST_OBJ) +test.out$(EXESUFFIX): lib/test.o $(TEST_OBJ) $(CC) $(CFLAGS) -o $@ lib/test.o $(TEST_OBJ) -tis-ci.out: lib/tis-ci.o $(TEST_OBJ) +tis-ci.out$(EXESUFFIX): lib/tis-ci.o $(TEST_OBJ) $(CC) $(CFLAGS) -o $@ lib/tis-ci.o $(TEST_OBJ) -ctgrind.out: lib/ctgrind.o $(TEST_OBJ) +ctgrind.out$(EXESUFFIX): lib/ctgrind.o $(TEST_OBJ) $(CC) $(CFLAGS) -o $@ lib/ctgrind.o $(TEST_OBJ) # Remove lines below for the tarball diff --git a/tests/gen/makefile b/tests/gen/makefile index 0adc5120..d4b7ad69 100644 --- a/tests/gen/makefile +++ b/tests/gen/makefile @@ -49,8 +49,14 @@ # You should have received a copy of the CC0 Public Domain Dedication along # with this software. If not, see # -CC ?= gcc -std=c99 -CFLAGS ?= -pedantic -Wall -Wextra + +CC ?= gcc -std=c99 +CFLAGS ?= -pedantic -Wall -Wextra +ifeq ($(OS),Windows_NT) +EXESUFFIX = .exe +else +EXESUFFIX = +endif .PHONY: all clean @@ -67,7 +73,7 @@ VECTORS = ../vectors.h all: $(VECTORS) clean: - rm -f *.out *.vec *.o + rm -f *.out$(EXESUFFIX) *.vec *.o rm -f $(VECTORS) elligator_inv.vec: elligator-inverse.py elligator.py elligator_scalarmult.py @@ -76,7 +82,7 @@ elligator_dir.vec: elligator-direct.py elligator.py ./$< >$@ sha512_hkdf.vec: sha512_hkdf.py ./$< >$@ -%.vec: %.out +%.vec: %.out$(EXESUFFIX) ./$< > $@ utils.o: utils.c utils.h @@ -90,7 +96,7 @@ utils.o: utils.c utils.h -I ../../src/optional \ $$(pkg-config --cflags libsodium) -%.out: %.o ed25519.o utils.o +%.out$(EXESUFFIX): %.o ed25519.o utils.o $(CC) $(CFLAGS) -o $@ $^ \ $$(pkg-config --libs libsodium) @@ -105,7 +111,7 @@ ed25519.o: ../externals/ed25519-donna/ed25519.c \ -DED25519_NO_INLINE_ASM \ -DED25519_FORCE_32BIT -vector_to_header.out: vector_to_header.c +vector_to_header.out$(EXESUFFIX): vector_to_header.c $(CC) $(CFLAGS) $< -o $@ chacha20.all.vec : chacha20.vec vectors/chacha20 @@ -134,8 +140,8 @@ $(VEC2): mkdir -p $(@D) cat $^ > $@ -%.h.vec: %.all.vec vector_to_header.out - ./vector_to_header.out $(patsubst %.all.vec,%,$<) < $< > $@ +%.h.vec: %.all.vec vector_to_header.out$(EXESUFFIX) + ./vector_to_header.out$(EXESUFFIX) $(patsubst %.all.vec,%,$<) < $< > $@ prelude.h.vec: @echo "creating prelude.h.vec" diff --git a/tests/speed/makefile b/tests/speed/makefile index 3934bac0..681357b5 100644 --- a/tests/speed/makefile +++ b/tests/speed/makefile @@ -49,8 +49,13 @@ # with this software. If not, see # -CC ?= gcc -std=gnu99 -CFLAGS ?= -pedantic -Wall -Wextra -O3 -march=native +CC ?= gcc -std=gnu99 +CFLAGS ?= -pedantic -Wall -Wextra -O3 -march=native +ifeq ($(OS),Windows_NT) +EXESUFFIX = .exe +else +EXESUFFIX = +endif .PHONY: speed speed-sodium speed-hydrogen speed-tweetnacl speed-c25519 \ speed-donna \ @@ -62,23 +67,23 @@ CFLAGS ?= -pedantic -Wall -Wextra -O3 -march=native ################## all: speed -speed : speed.out +speed : speed.out$(EXESUFFIX) ./$< -speed-sodium : speed-sodium.out +speed-sodium : speed-sodium.out$(EXESUFFIX) ./$< -speed-hydrogen : speed-hydrogen.out +speed-hydrogen : speed-hydrogen.out$(EXESUFFIX) ./$< -speed-tweetnacl: speed-tweetnacl.out +speed-tweetnacl: speed-tweetnacl.out$(EXESUFFIX) ./$< -speed-c25519 : speed-c25519.out +speed-c25519 : speed-c25519.out$(EXESUFFIX) ./$< -speed-donna : speed-donna.out +speed-donna : speed-donna.out$(EXESUFFIX) ./$< -speed-tinyssh : speed-tinyssh.out +speed-tinyssh : speed-tinyssh.out$(EXESUFFIX) ./$< clean: - rm -f *.o *.out + rm -f *.o *.out$(EXESUFFIX) #################### ## Base libraries ## @@ -186,23 +191,23 @@ speed-donna.o : speed-donna.c speed.h ../utils.h $(DONNA_HEADERS) speed-tinyssh.o : speed-tinyssh.c speed.h ../utils.h $(TSSH_H) $(CC) -c $(CFLAGS) $< -o $@ -I .. -I $(TSSH) -speed.out: speed.o utils.o monocypher.o monocypher-ed25519.o +speed.out$(EXESUFFIX): speed.o utils.o monocypher.o monocypher-ed25519.o $(CC) $(CFLAGS) -o $@ $^ -speed-sodium.out: speed-sodium.o utils.o +speed-sodium.out$(EXESUFFIX): speed-sodium.o utils.o $(CC) $(CFLAGS) -o $@ $^ \ `pkg-config --cflags libsodium` \ `pkg-config --libs libsodium` -speed-donna.out: speed-donna.o donna.o utils.o +speed-donna.out$(EXESUFFIX): speed-donna.o donna.o utils.o $(CC) $(CFLAGS) -o $@ $^ \ `pkg-config --cflags libsodium` \ `pkg-config --libs libsodium` -speed-hydrogen.out: speed-hydrogen.o utils.o +speed-hydrogen.out$(EXESUFFIX): speed-hydrogen.o utils.o $(CC) $(CFLAGS) -o $@ $^ \ `pkg-config --cflags libhydrogen` \ `pkg-config --libs libhydrogen` -speed-tweetnacl.out: speed-tweetnacl.o tweetnacl.o utils.o +speed-tweetnacl.out$(EXESUFFIX): speed-tweetnacl.o tweetnacl.o utils.o $(CC) $(CFLAGS) -o $@ $^ -speed-c25519.out : speed-c25519.o $(C25519_OBJECTS) utils.o +speed-c25519.out$(EXESUFFIX) : speed-c25519.o $(C25519_OBJECTS) utils.o $(CC) $(CFLAGS) -o $@ $^ -speed-tinyssh.out : speed-tinyssh.o $(TSSH_O) utils.o +speed-tinyssh.out$(EXESUFFIX) : speed-tinyssh.o $(TSSH_O) utils.o $(CC) $(CFLAGS) -o $@ $^