On Sat, 10 Jan 2026, [email protected] wrote:
> From: Denis Mukhin <[email protected]> 
> 
> There can be multiple test harnesses per one test target (e.g. harness.h
> and harness2.h). Account for that by further parametrizing existing
> emit-harness-nested-rule().
> 
> Add guard against HOSTCC != CC (similarly to how its done in PDX unit test).
> 
> Account for multiple test targets in install and uninstall make targets.
> 
> Introduce CFLAGS dedicated for find-next-bit.c only to avoid contaminating
> global CFLAGS.
> 
> Honor mocked hypervisor header over tools/include/xen symlinks.
> 
> Finally, add some clarifications for the functions.
> 
> Amends: 2d5065060710 ("xen/domain: unify domain ID allocation")
> Signed-off-by: Denis Mukhin <[email protected]>
> ---
> Changes since v1:
> - updated commentaries
> - added ability to select the harness header filename
> - fixup for picking up mocked header files
> ---
>  tools/tests/domid/Makefile | 63 ++++++++++++++++++++++++++------------
>  1 file changed, 44 insertions(+), 19 deletions(-)
> 
> diff --git a/tools/tests/domid/Makefile b/tools/tests/domid/Makefile
> index 753129029ed9..dd22a25b038a 100644
> --- a/tools/tests/domid/Makefile
> +++ b/tools/tests/domid/Makefile
> @@ -4,36 +4,55 @@
>  #
>  # Copyright 2025 Ford Motor Company
>  
> -XEN_ROOT=$(CURDIR)/../../..
> -include $(XEN_ROOT)/tools/Rules.mk
> -
>  TESTS := test-domid
>  
> +XEN_ROOT = $(CURDIR)/../../..
> +include $(XEN_ROOT)/tools/Rules.mk
> +
>  define list-c-headers
>  $(shell sed -n \
>      's/^[ \t]*# *include[ \t]*[<"]\([^">]*\)[">].*/\1/p' $(1) 2>/dev/null)
>  endef
>  
> -# NB: $1 cannot be a list
> +# Generate mock environment by replicating header file hierarchy;
> +# each header file will point to a harness header.
> +#
> +# $1 target
> +# $2 list of test harnesses
>  define emit-harness-nested-rule
> -$(1): $(CURDIR)/harness.h
> -     mkdir -p $$(@D);
> -     ln -sf $$< $$@;
> +$(1): $(2)
> +     set -e; \
> +     mkdir -p $$(@D); \
> +     for i in $(2); do [ -e $$@ ] || ln -s $$$$i $$@; done
 
Are you sure this is correct? Everything seems to be escaped too many
times? Shouldn't this be:

  $(1): $(2)
        set -e; \
        mkdir -p "$(@D)"; \
        for i in $(2); do \
                [ -e "$@" ] || ln -s "$$i" "$@"; \
        done
  endef



>  endef
>  
> +# Helper function to emit mocked hypervisor code dependencies.
> +#
> +# $1 Harness file name.
> +# $2 Mocked hypervisor file name.
> +# $3 List of dependencies to mock.
>  define emit-harness-rules
> -$(foreach x,$(2),$(call emit-harness-nested-rule,$(CURDIR)/generated/$(x)))
> -$(1:.c=.o): $(addprefix $(CURDIR)/generated/,$(2))
> +$(foreach x,$(3),$(call emit-harness-nested-rule,\
> +                        $(CURDIR)/generated/$(x),\
> +                        $(addprefix $(CURDIR)/,$(1))))
> +$(2:.c=.o): $(addprefix $(CURDIR)/generated/,$(3))
>  endef
>  
>  define emit-harness-deps
> -$(if $(strip $(2)),$(call emit-harness-rules,$1,$2),)
> +$(if $(strip $(3)),$(call emit-harness-rules,$1,$2,$3),)
>  endef
>  
> +# Emit dependencies for mocked hypervisor code.
> +#
> +# $1 Hypervisor file name.
> +# $2 Hypervisor source path.
> +# $3 Harness header file name (optional).
>  define vpath-with-harness-deps
>  vpath $(1) $(2)
> -$(call emit-harness-deps,$(1),$(call list-c-headers,$(2)$(1)))
> +$(call emit-harness-deps,$(or $(strip $(3)),harness.h),\
> +                         $(1),\
> +                         $(call list-c-headers,$(2)$(1)))
>  endef
>  
>  .PHONY: all
> @@ -41,7 +60,11 @@ all: $(TESTS)
>  
>  .PHONY: run
>  run: $(TESTS)
> +ifeq ($(CC),$(HOSTCC))
>       set -e; $(foreach t,$(TESTS),./$(t);)
> +else
> +     $(warning HOSTCC != CC, will not run test)
> +endif
>  
>  .PHONY: clean
>  clean:
> @@ -55,25 +78,27 @@ distclean: clean
>  .PHONY: install
>  install: all
>       $(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)/tests
> -     $(INSTALL_PROG) test-domid $(DESTDIR)$(LIBEXEC)/tests
> +     set -e; $(foreach t,$(TESTS),$(INSTALL_PROG) $t 
> $(DESTDIR)$(LIBEXEC)/tests;)
>  
>  .PHONY: uninstall
>  uninstall:
> -     $(RM) -- $(DESTDIR)$(LIBEXEC)/tests/test-domid
> +     set -e; $(foreach t,$(TESTS),$(RM) -- $(DESTDIR)$(LIBEXEC)/tests/$t;)
>  
>  CFLAGS += -D__XEN_TOOLS__
> +
>  # find-next-bit.c
> -CFLAGS += '-DEXPORT_SYMBOL(x)=' \
> +CFLAGS-find-next-bit.c += '-DEXPORT_SYMBOL(x)=' \
>            -Dfind_first_bit \
>            -Dfind_first_zero_bit \
>            -Dfind_next_bit \
>            -Dfind_next_bit_le \
>            -Dfind_next_zero_bit_le
> -CFLAGS += $(APPEND_CFLAGS)
> -CFLAGS += $(CFLAGS_xeninclude)
> -CFLAGS += -I./generated/
>  
> -LDFLAGS += $(APPEND_LDFLAGS)

APPEND_CFLAGS and APPEND_LDFLAGS are lost?


> +find-next-bit.o: CFLAGS += $(CFLAGS-find-next-bit.c)
> +
> +# Honor mocked hypervisor header over tools/include/xen symlinks
> +CFLAGS += -I$(CURDIR)/generated/
> +CFLAGS += $(CFLAGS_xeninclude)
>  
>  vpath find-next-bit.c $(XEN_ROOT)/xen/lib/
>  
> @@ -83,6 +108,6 @@ vpath find-next-bit.c $(XEN_ROOT)/xen/lib/
>  $(eval $(call vpath-with-harness-deps,domid.c,$(XEN_ROOT)/xen/common/))
>  
>  test-domid: domid.o find-next-bit.o test-domid.o
> -     $(CC) $^ -o $@ $(LDFLAGS)
> +     $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^

My understanding is that $(LDFLAGS) should be last, e.g.:

$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)


>  -include $(DEPS_INCLUDE)
> -- 
> 2.52.0
> 

Reply via email to