Re: [fsverity-utils PATCH v4 2/2] Allow to build and run sign/digest on Windows

Eric Biggers
2020-12-21T21:41:42Z

On Thu, Dec 17, 2020 at 07:25:16PM +0000, luca.boccassi@gmail.com wrote:
> From: Luca Boccassi <luca.boccassi@microsoft.com>
>
> Add some minimal compat type defs, and stub out the enable/measure
> sources. Also add a way to handle the fact that mingw adds a
> .exe extension automatically in the Makefile install rules, and
> that there is not pkg-config and the libcrypto linker flag is
> different.
>
> Signed-off-by: Luca Boccassi <luca.boccassi@microsoft.com>

This commit message is outdated; can you update it?

> diff --git a/Makefile b/Makefile
> index bfe83c4..a5aa900 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -35,6 +35,11 @@
> cc-option = $(shell if $(CC) $(1) -c -x c /dev/null -o /dev/null > /dev/null 2>&1; \
> then echo $(1); fi)
>
> +# Support building with MinGW for minimal Windows fsverity.exe
> +ifneq ($(findstring -mingw,$(shell $(CC) -dumpmachine 2>/dev/null)),)
> +MINGW = 1
> +endif
> +
> CFLAGS ?= -O2
>
> override CFLAGS := -Wall -Wundef \
> @@ -47,7 +52,7 @@ override CFLAGS := -Wall -Wundef \
> $(call cc-option,-Wvla) \
> $(CFLAGS)
>
> -override CPPFLAGS := -Iinclude -D_FILE_OFFSET_BITS=64 $(CPPFLAGS)
> +override CPPFLAGS := -Iinclude -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE $(CPPFLAGS)
>
> ifneq ($(V),1)
> QUIET_CC = @echo ' CC ' $@;
> @@ -62,7 +67,12 @@ BINDIR ?= $(PREFIX)/bin
> INCDIR ?= $(PREFIX)/include
> LIBDIR ?= $(PREFIX)/lib
> DESTDIR ?=
> +ifneq ($(MINGW),1)
> PKGCONF ?= pkg-config
> +else
> +PKGCONF := false
> +EXEEXT := .exe
> +endif
>
> # Rebuild if a user-specified setting that affects the build changed.
> .build-config: FORCE
> @@ -87,9 +97,9 @@ CFLAGS += $(shell "$(PKGCONF)" libcrypto --cflags 2>/dev/null || echo)
> # If we are dynamically linking, when running tests we need to override
> # LD_LIBRARY_PATH as no RPATH is set
> ifdef USE_SHARED_LIB
> -RUN_FSVERITY = LD_LIBRARY_PATH=./ ./fsverity
> +RUN_FSVERITY = LD_LIBRARY_PATH=./ ./fsverity$(EXEEXT)
> else
> -RUN_FSVERITY = ./fsverity
> +RUN_FSVERITY = ./fsverity$(EXEEXT)
> endif
>
> ##############################################################################
> @@ -99,6 +109,9 @@ endif
> SOVERSION := 0
> LIB_CFLAGS := $(CFLAGS) -fvisibility=hidden
> LIB_SRC := $(wildcard lib/*.c)
> +ifeq ($(MINGW),1)
> +LIB_SRC := $(filter-out lib/enable.c,${LIB_SRC})
> +endif
> LIB_HEADERS := $(wildcard lib/*.h) $(COMMON_HEADERS)
> STATIC_LIB_OBJ := $(LIB_SRC:.c=.o)
> SHARED_LIB_OBJ := $(LIB_SRC:.c=.shlib.o)
> @@ -141,10 +154,13 @@ PROG_COMMON_SRC := programs/utils.c
> PROG_COMMON_OBJ := $(PROG_COMMON_SRC:.c=.o)
> FSVERITY_PROG_OBJ := $(PROG_COMMON_OBJ) \
> programs/cmd_digest.o \
> - programs/cmd_enable.o \
> - programs/cmd_measure.o \
> programs/cmd_sign.o \
> programs/fsverity.o
> +ifneq ($(MINGW),1)
> +FSVERITY_PROG_OBJ += \
> + programs/cmd_enable.o \
> + programs/cmd_measure.o
> +endif
> TEST_PROG_SRC := $(wildcard programs/test_*.c)
> TEST_PROGRAMS := $(TEST_PROG_SRC:programs/%.c=%)
>

The Makefile target to build the binary is still "fsverity", but for Windows it
actually builds "fsverity.exe". I think that when the .exe extension is added,
the name of the Makefile target should change too. Makefile targets should be
either a filename target *or* a special target, not conditionally either one.

> @@ -186,7 +202,7 @@ test_programs:$(TEST_PROGRAMS)
> # want to run the full tests.
> check:fsverity test_programs
> for prog in $(TEST_PROGRAMS); do \
> - $(TEST_WRAPPER_PROG) ./$$prog || exit 1; \
> + $(TEST_WRAPPER_PROG) ./$$prog$(EXEEXT) || exit 1; \
> done

The .exe extension isn't being added to the test programs when they are built.
Did you intend for building the test programs for Windows (and running them on
Windows) to be supported?

- Eric