Revision 539576ec53104316dacac738fca7bc8fd967de62 authored by Son Ho on 26 February 2021, 12:56:35 UTC, committed by Son Ho on 26 February 2021, 12:56:35 UTC
generate the target architecture #define
1 parent 7fc6186
Makefile.tmpl
# This is the universal Makefile that will build any distribution of EverCrypt.
# - It is copied from hacl-star/providers/dist/Makefile
# - It relies on the KreMLin-generated Makefile.basic and Makefile.include
#
# This Makefile detects whether OpenSSL and BCrypt are enabled automatically. It
# does so by checking for the presence of EverCrypt_OpenSSL.h and
# EverCrypt_BCrypt.h ; as such, it assumes -bundle EverCrypt.OpenSSL and -bundle
# EverCrypt.BCrypt.
#
# This Makefile may (conservatively) link in some Vale assemblies that may end
# up un-needed in the final shared object.
#
# Additionally, this Makefile works out of the box on Linux, OSX and
# Cygwin/MinGW.
#
# When using OpenSSL, it also expects OPENSSL_HOME to be defined (this is a
# temporary fix for missing algorithms).
#
# The Makefile produces:
# - libevercrypt.so, a shared object where unused symbols have been removed
# - libevercrypt.a
# By default, this Makefile relies on the local checkout of kremlib
KREMLIN_HOME ?= ../kremlin
ifeq (,$(wildcard $(KREMLIN_HOME)/include/kremlib.h))
$(error Incorrect KREMLIN_HOME)
endif
-include Makefile.config
# 1. The usual pseudo auto-configuration
# TODO: this should all move to the configure script
# TODO: Makefile.config: configure; ./$<
# TODO: include Makefile.config
UNAME ?= $(shell uname)
MARCH ?= $(shell uname -m)
ifeq ($(UNAME),Darwin)
VARIANT = -darwin
SO = so
else ifeq ($(UNAME),Linux)
CFLAGS += -fPIC
VARIANT = -linux
SO = so
else ifeq ($(OS),Windows_NT)
CFLAGS += -fno-asynchronous-unwind-tables
CC = $(MARCH)-w64-mingw32-gcc
AR = $(MARCH)-w64-mingw32-ar
VARIANT = -mingw
SO = dll
LDFLAGS = -Wl,--out-implib,libevercrypt.dll.a
endif
# 2. Parameters we want to compile with, for the generated Makefile
# 3. Honor configurations
# Backwards-compat
ifneq (,$(MLCRYPTO_HOME))
OPENSSL_HOME = $(MLCRYPTO_HOME)/openssl
endif
# This is the "auto-detection". Since the parent Makefile runs with -bundle
# EverCrypt.OpenSSL, in case the static configuration doesn't call into
# OpenSSL, then EverCrypt_OpenSSL.h is not generated, meaning if the header
# doesn't exist we are not intend to compile against OpenSSL.
ifneq (,$(wildcard EverCrypt_OpenSSL.h))
CFLAGS += -I $(OPENSSL_HOME)/include
LDFLAGS += -L$(OPENSSL_HOME) -lcrypto
ifneq ($(OS),Windows_NT)
LDFLAGS += -ldl -lpthread
endif
SOURCES += evercrypt_openssl.c
endif
ifneq (,$(wildcard EverCrypt_BCrypt.h))
LDFLAGS += -lbcrypt
SOURCES += evercrypt_bcrypt.c
endif
OBJS += $(patsubst %.S,%.o,$(wildcard *-$(MARCH)$(VARIANT).S))
include Makefile.basic
CFLAGS += -Wno-parentheses -Wno-deprecated-declarations -Wno-\#warnings -Wno-error=cpp -Wno-cpp -g -std=gnu11 -O3
Hacl_Poly1305_128.o Hacl_Streaming_Poly1305_128.o Hacl_Chacha20_Vec128.o Hacl_Chacha20Poly1305_128.o Hacl_Blake2s_128.o Hacl_HMAC_Blake2s_128.o Hacl_HKDF_Blake2s_128.o Hacl_Streaming_Blake2s_128.o: CFLAGS += $(CFLAGS_128)
Hacl_Poly1305_256.o Hacl_Streaming_Poly1305_256.o Hacl_Chacha20_Vec256.o Hacl_Chacha20Poly1305_256.o Hacl_Blake2b_256.o Hacl_HMAC_Blake2b_256.o Hacl_HKDF_Blake2b_256.o Hacl_Streaming_Blake2b_256.o: CFLAGS += $(CFLAGS_256)
all: libevercrypt.$(SO)
# This one and the one below are for people who run "make" without running
# configure. It's not perfect but perhaps a tiny bit better than nothing.
Makefile.config:
./configure
# If the configure script has not run, create an empty config.h
config.h:
touch $@
libevercrypt.$(SO): config.h $(OBJS)
$(CC) $(CFLAGS) -shared -o $@ $(filter-out %.h,$^) $(LDFLAGS)
# 4. Compilation of OCaml bindings; conditional on the presence of the lib_gen
# folder, possibly disabled by configure.
ifeq (,$(DISABLE_OCAML_BINDINGS))
ifneq (,$(wildcard lib_gen))
.PRECIOUS: %.cmx
OCAMLOPT=ocamlfind opt -package ctypes,ctypes.foreign,ctypes.stubs -thread -linkpkg -I lib
OCAMLDEP=ocamlfind dep -I lib -slash
OCAMLC=ocamlfind c -g -package ctypes,ctypes.foreign,ctypes.stubs -thread -linkpkg -I lib
CFLAGS += -I "$(shell ocamlfind query ctypes)" -I "$(shell ocamlfind c -where)"
# Don't include bindings for files that cannot be compiled.
BLACKLIST_ML=$(patsubst %.c,%,$(BLACKLIST))
ALL_OCAML=$(filter-out $(BLACKLIST_ML),$(patsubst lib_gen/%_gen.ml,%,$(wildcard lib_gen/*_gen.ml)))
# Just names.
ALL_BINDINGS=$(patsubst %,lib/%_bindings.cmx,$(ALL_OCAML))
ALL_GENERATORS=$(patsubst %,lib_gen/%_gen.exe, $(ALL_OCAML))
ALL_ML_STUBS=$(patsubst %,lib/%_stubs.cmx,$(ALL_OCAML))
ALL_C_STUBS=$(patsubst %,lib/%_c_stubs.o,$(ALL_OCAML))
include .depend.ocaml
include ctypes.depend
lib_gen/Lib_RandomBuffer_System_gen.cmx: lib/Lib_RandomBuffer_System_bindings.cmx
lib_gen/Lib_RandomBuffer_System_gen.exe: lib/Lib_RandomBuffer_System_bindings.cmx lib_gen/Lib_RandomBuffer_System_gen.cmx
.depend.ocaml:
$(OCAMLDEP) $(wildcard lib/*.ml) $(wildcard lib_gen/*.ml) > $@
# Note: for some reason, this minimal Makefile doesn't apply the shortest stem
# rule.
#
# %.exe:
# echo long stem
#
# %_foo.exe: %.b
# cat $<
#
# %.b:
# echo $@ > $@
#
# Which really puzzles me (e.g. make foo_foo.exe always echoes "long stem"),
# even though the shortest stem rule should apply. However, we can cancel a
# previous pattern rule, thanks to
# https://www.gnu.org/software/make/manual/html_node/Canceling-Rules.html
%.exe:
all: ocamlevercrypt.cmxa
lib_gen/%_gen.exe: libevercrypt.a
$(OCAMLOPT) $(filter-out %.a,$^) libevercrypt.a -o $@
%.cmx: %.ml
$(OCAMLOPT) -c $^ -o $@
%.cmo: %.ml
$(OCAMLC) -c $^ -o $@
.PRECIOUS: lib/%_stubs.ml
lib/%_stubs.ml: lib/%_c_stubs.c
ifeq ($(shell uname -s),Darwin)
DY=DYLD_LIBRARY_
else ifeq ($(OS),Windows_NT)
DY=
else
DY=LD_LIBRARY_
endif
lib/%_stubs.ml lib/%_c_stubs.c: lib_gen/%_gen.exe
$<
# Compiling these files raises the pointer sign warning because the Ctypes declaration for bytes expects a char*, not a uint8_t*
# Can be remove once ctypes is upgraded to 0.17
lib/%_c_stubs.o: CFLAGS += -Wno-pointer-sign
BLACKLIST_CMX = $(patsubst %,lib/%_stubs.cmx,$(BLACKLIST_ML))
BLACKLIST_CMX += $(patsubst %,lib/%_bindings.cmx,$(BLACKLIST_ML))
CTYPES_CMX = $(filter-out $(BLACKLIST_CMX),$(CTYPES_DEPS))
CTYPES_CMX += lib/Lib_RandomBuffer_System_stubs.cmx lib/Lib_RandomBuffer_System_bindings.cmx
CTYPES_ML = $(patsubst %.cmx,%.ml,$(CTYPES_CMX))
CTYPES_CMI = $(patsubst %.cmx,%.cmi,$(CTYPES_CMX))
CTYPES_CMO = $(patsubst %.cmx,%.cmo,$(CTYPES_CMX))
ocamlevercrypt.cma: $(ALL_BINDINGS) $(CTYPES_CMO) $(ALL_C_STUBS) $(CTYPES_CMX) libevercrypt.$(SO)
ocamlmklib -o ocamlevercrypt $(CTYPES_CMO) -L. -levercrypt
ocamlevercrypt.cmxa: $(ALL_BINDINGS) $(ALL_ML_STUBS) $(ALL_C_STUBS) libevercrypt.$(SO)
ocamlmklib -o ocamlevercrypt $(CTYPES_CMX) -L. -levercrypt
STUBLIBS_PATH=$(OPAM_SWITCH_PREFIX)/lib/stublibs
dllocamlevercrypt.$(SO): ocamlevercrypt.cmxa ocamlevercrypt.cma
ocamlmklib -o ocamlevercrypt $(ALL_C_STUBS) -L. -L$(STUBLIBS_PATH) -levercrypt
install-hacl-star-raw: dllocamlevercrypt.$(SO)
ocamlfind install hacl-star-raw META $(CTYPES_ML) $(CTYPES_CMX) $(CTYPES_CMO) $(CTYPES_CMI) \
libevercrypt.a libevercrypt.$(SO) ocamlevercrypt.cma ocamlevercrypt.cmxa ocamlevercrypt.a \
libocamlevercrypt.a dllocamlevercrypt.$(SO) config.h
endif
endif
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...