diff --git a/.gitignore b/.gitignore index 20bb6ba..1243bae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -liboprf.a +liboprf*.a *.o .arch bench diff --git a/src/makefile b/src/makefile index a06f1a9..5ed9e41 100644 --- a/src/makefile +++ b/src/makefile @@ -1,6 +1,6 @@ PREFIX?=/usr/local INCLUDES=-Inoise_xk/include -Inoise_xk/include/karmel -Inoise_xk/include/karmel/minimal -CFLAGS?=-march=native -Wall -O2 -g \ +CFLAGS?=-march=native -Wall -O2 -g -ffunction-sections -fdata-sections \ -Werror=attributes -Werror=format-security -Werror=format-truncation -Werror=implicit-function-declaration \ -Wformat=2 -Wconversion -Wimplicit-fallthrough \ -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 \ @@ -13,6 +13,9 @@ SOEXT?=so STATICEXT?=a SOVER=0 +# To statically link the noiseXK library, use these LDFLAGS (and comment out the other LDFLAGS) +#LDFLAGS?=-lsodium -l:liboprf-noiseXK.a -Wl,--exclude-libs,ALL -Lnoise_xk + UNAME := $(shell uname -s) ARCH := $(shell uname -m) ifeq ($(UNAME),Darwin) @@ -56,13 +59,18 @@ endif CFLAGS+=$(INCLUDES) -SOURCES=oprf.c toprf.c dkg.c dkg-vss.c utils.c tp-dkg.c mpmult.c stp-dkg.c toprf-update.c $(EXTRA_SOURCES) +LIBOPRF_SOURCES=oprf.c toprf.c dkg.c dkg-vss.c utils.c tp-dkg.c mpmult.c stp-dkg.c toprf-update.c +SOURCES=$(LIBOPRF_SOURCES) $(EXTRA_SOURCES) OBJECTS=$(patsubst %.c,%.o,$(SOURCES)) # Uncomment to use $ORIGIN as the runtime search path #SOFLAGS += -Wl,-rpath,'$$'ORIGIN -all: liboprf.$(SOEXT) liboprf.$(STATICEXT) noise_xk/liboprf-noiseXK.$(SOEXT) liboprf.pc +# Terminal colors: purely for UX, comment out if causing problems +decor = $(shell [ -t 0 ] && printf "\033[38;5;2m====" || printf "====") +endDecor = $(shell [ -t 0 ] && printf "====\033[0m" || printf "====") + +all: liboprf.$(SOEXT) liboprf_release.$(STATICEXT) noise_xk/liboprf-noiseXK.$(SOEXT) liboprf.pc debug: DEFINES=-DTRACE debug: all @@ -82,19 +90,35 @@ asan: all AR ?= ar -liboprf.$(SOEXT): $(SOURCES) noise_xk/liboprf-noiseXK.$(SOEXT) - $(CC) $(CFLAGS) -fPIC -shared $(SOFLAGS) -o $@ $^ $(LDFLAGS) +liboprf.$(SOEXT): liboprf_merged.o noise_xk/liboprf-noiseXK.$(SOEXT) + $(info $(decor) Build dynamic release library: $@ $(endDecor)) + $(CC) $(CFLAGS) -fPIC -shared $(SOFLAGS) -o $@ liboprf_merged.o $(LDFLAGS) + +liboprf-corrupt-dkg.$(SOEXT): liboprf_merged.o noise_xk/liboprf-noiseXK.$(SOEXT) + $(info $(decor) Build unit test library: $@ $(endDecor)) + $(CC) $(CFLAGS) -DUNITTEST -DUNITTEST_CORRUPT -fPIC -shared $(SOFLAGS) -o $@ liboprf_merged.o $(LDFLAGS) + +liboprf_merged.o: $(OBJECTS) + $(info $(decor) Merge object files $(endDecor)) + ld -r -o $@ $^ -liboprf-corrupt-dkg.$(SOEXT): $(SOURCES) noise_xk/liboprf-noiseXK.$(SOEXT) - $(CC) $(CFLAGS) -DUNITTEST -DUNITTEST_CORRUPT -fPIC -shared $(SOFLAGS) -o $@ $^ $(LDFLAGS) +liboprf_merged_localized.o: liboprf_merged.o + $(info $(decor) Localize symbols $(endDecor)) + objcopy --localize-hidden $^ $@ + +liboprf_release.$(STATICEXT): liboprf_merged_localized.o + $(info $(decor) Build static release library: $@ $(endDecor)) + $(AR) rcs $@ $^ liboprf.$(STATICEXT): $(OBJECTS) $(AR) rcs $@ $^ noise_xk/liboprf-noiseXK.$(SOEXT): + $(info $(decor) Compile vendorized noiseXK library: $@ $(endDecor)) make -C noise_xk all noise_xk/liboprf-noiseXK.$(STATICEXT): + $(info $(decor) Compile vendorized noiseXK library: $@ $(endDecor)) make -C noise_xk all liboprf.pc: @@ -103,6 +127,7 @@ liboprf.pc: clean: rm -f *.o liboprf.$(SOEXT) liboprf.$(STATICEXT) liboprf-corrupt-dkg.$(SOEXT) + rm -f aux_/*.o make -C tests clean make -C noise_xk clean @@ -124,12 +149,16 @@ install-noiseXK: uninstall: uninstall-oprf uninstall-noiseXK -uninstall-oprf: $(DESTDIR)$(PREFIX)/lib/liboprf.$(SOEXT) $(DESTDIR)$(PREFIX)/lib/liboprf.$(STATICEXT) \ - $(DESTDIR)$(PREFIX)/include/oprf/oprf.h $(DESTDIR)$(PREFIX)/include/oprf/toprf.h \ - $(PREFIX)/include/oprf/dkg.h $(DESTDIR)$(PREFIX)/include/oprf/toprf-update.h \ - $(DESTDIR)$(PREFIX)/include/oprf/utils.h - rm $^ - rmdir $(PREFIX)/include/oprf/ +uninstall-oprf: + @ \ + if [ ! '$(strip $(DESTDIR)$(PREFIX))' ]; then echo 'liboprf: DESTDIR-PREFIX is empty!' && exit 1; fi; \ + if [ ! -d '$(strip $(DESTDIR)$(PREFIX))' ]; then echo 'liboprf: DESTDIR-PREFIX is not a folder' && exit 1; fi; + + rm -vf '$(DESTDIR)$(PREFIX)/lib/liboprf.$(SOEXT)' '$(DESTDIR)$(PREFIX)/lib/liboprf.$(STATICEXT)' + rm -vf '$(DESTDIR)$(PREFIX)/include/oprf/oprf.h' '$(DESTDIR)$(PREFIX)/include/oprf/toprf.h' + rm -vf '$(DESTDIR)$(PREFIX)/include/oprf/dkg.h' '$(DESTDIR)$(PREFIX)/include/oprf/toprf-update.h' + rm -vf '$(DESTDIR)$(PREFIX)/include/oprf/utils.h' + rmdir -v '$(DESTDIR)$(PREFIX)/include/oprf/' uninstall-noiseXK: make -C noise_xk uninstall @@ -139,7 +168,7 @@ $(DESTDIR)$(PREFIX)/lib/liboprf.$(SOEXT): liboprf.$(SOEXT) cp $< $@.$(SOVER) ln -sf $@.$(SOVER) $@ -$(DESTDIR)$(PREFIX)/lib/liboprf.$(STATICEXT): liboprf.$(STATICEXT) +$(DESTDIR)$(PREFIX)/lib/liboprf.$(STATICEXT): liboprf_release.$(STATICEXT) mkdir -p $(DESTDIR)$(PREFIX)/lib cp $< $@ @@ -180,3 +209,59 @@ test: liboprf-corrupt-dkg.$(SOEXT) liboprf.$(STATICEXT) noise_xk/liboprf-noiseXK make -C noise_xk test PHONY: clean + +# Dynamic rules area + +# NOTE: +# 1. The $(__NL__)'s are required - don't remove them! +# 2. Every variable reference must be double-escaped in the defines ($VAR -> $$VAR) +# 3. There is one exception to the rule: do not escape $1, $2, etc. and $__NL__ +# 4. Change `eval` to `info` to debug. Also, GMake has a `--dry-run` option + +# "New line" variable +# Don't remove these empty comments! +define __NL__ +# +# +endef + +# Compile a first-party C file into an object file +# Input params: +# $(1) = C file path +define compileObject +$(__NL__) + +$(1:.c=.o) : $(1) + $$(info ) + $$(info $$(decor) Compile C source: $$^ $$(endDecor)) + $$(CC) $$(CFLAGS) $$(INCLUDES) -o $$@ -c $$^ + +$(__NL__) +endef + +# Compile a vendorized libsodium C file into an object file +# Static linking DEFINES can be found at +# Input params: +# $(1) = C file path +define compileSodiumObject +$(__NL__) + +$(1:.c=.o) : $(1) + $$(info ) + $$(info $$(decor) Compile vendorized libsodium source: $$^ $$(endDecor)) + $$(CC) $$(CFLAGS) -fvisibility=hidden -DSODIUM_STATIC=1 -DSODIUM_EXPORT="" $$(INCLUDES) -o $$@ -c $$^ + +$(__NL__) +endef + +# Compile liboprf C files +$(foreach var,$(LIBOPRF_SOURCES), \ + $(eval $(call compileObject,$(var) )) \ +) + +# Compile vendor C files +$(foreach var,$(EXTRA_SOURCES), \ + $(eval $(call compileSodiumObject,$(var) )) \ +) + +# END dynamic rules section