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 $@ $^