diff mbox series

[RFC,10/32] qapi: Don't run generators twice

Message ID 20171002152552.27999-11-armbru@redhat.com
State New
Headers show
Series Command line QAPIfication | expand

Commit Message

Markus Armbruster Oct. 2, 2017, 3:25 p.m. UTC
The generators always generate both .c and .h, but they can route one
of them to the bit bucket.  We run them twice, once to generate .c,
and once to generate .h.  Probably because the naive make rule

    FOO.c FOO.h: qapi-schema.json
	RECIPE

runs RECIPE twice, once to generate FOO.c and once to generate FOO.h.

Employ the usual make trick to generate multiple files in one rule:

    .INTERMEDIATE: FOO-gen
    FOO.c FOO.h: FOO-gen ;
    FOO-gen: qapi-schema.json
        RECIPE

When make needs FOO.c or FOO.h, it runs RECIPE once to generate
intermediate target FOO-gen, then considers both FOO.c and FOO.h
updated.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 Makefile               | 58 +++++++++++++++++++++++++++++++++-----------------
 Makefile.objs          |  2 +-
 tests/Makefile.include | 36 +++++++++++++++++++++----------
 3 files changed, 64 insertions(+), 32 deletions(-)

Comments

Marc-André Lureau Oct. 4, 2017, 11:04 a.m. UTC | #1
On Mon, Oct 2, 2017 at 5:25 PM, Markus Armbruster <armbru@redhat.com> wrote:
> The generators always generate both .c and .h, but they can route one
> of them to the bit bucket.  We run them twice, once to generate .c,
> and once to generate .h.  Probably because the naive make rule
>
>     FOO.c FOO.h: qapi-schema.json
>         RECIPE
>
> runs RECIPE twice, once to generate FOO.c and once to generate FOO.h.
>
> Employ the usual make trick to generate multiple files in one rule:
>
>     .INTERMEDIATE: FOO-gen
>     FOO.c FOO.h: FOO-gen ;
>     FOO-gen: qapi-schema.json
>         RECIPE
>
> When make needs FOO.c or FOO.h, it runs RECIPE once to generate
> intermediate target FOO-gen, then considers both FOO.c and FOO.h
> updated.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

As explained in the following stackoverflow answer:
https://stackoverflow.com/a/10609434/1277510

Nice
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


> ---
>  Makefile               | 58 +++++++++++++++++++++++++++++++++-----------------
>  Makefile.objs          |  2 +-
>  tests/Makefile.include | 36 +++++++++++++++++++++----------
>  3 files changed, 64 insertions(+), 32 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index cee6e28659..784b601247 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -384,24 +384,33 @@ qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx $(SRC_PATH)/scripts/hxtool
>  qemu-ga$(EXESUF): LIBS = $(LIBS_QGA)
>  qemu-ga$(EXESUF): QEMU_CFLAGS += -I qga/qapi-generated
>
> -gen-out-type = $(subst .,-,$(suffix $@))
> -
>  qapi-py = $(SRC_PATH)/scripts/qapi.py $(SRC_PATH)/scripts/ordereddict.py
>
> +.INTERMEDIATE: qga/qapi-generated/qga-qapi-types-gen
>  qga/qapi-generated/qga-qapi-types.c qga/qapi-generated/qga-qapi-types.h :\
> +qga/qapi-generated/qga-qapi-types-gen ;
> +qga/qapi-generated/qga-qapi-types-gen: \
>  $(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
>         $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py \
> -               $(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
> +               -o $(dir $@) -p "qga-" $<, \
>                 "GEN","$@")
> +
> +.INTERMEDIATE: qga/qapi-generated/qga-qapi-visit-gen
>  qga/qapi-generated/qga-qapi-visit.c qga/qapi-generated/qga-qapi-visit.h :\
> +qga/qapi-generated/qga-qapi-visit-gen ;
> +qga/qapi-generated/qga-qapi-visit-gen: \
>  $(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
>         $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py \
> -               $(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
> +               -o $(dir $@) -p "qga-" $<, \
>                 "GEN","$@")
> +
> +.INTERMEDIATE: qga/qapi-generated/qga-qapi-commands-gen
>  qga/qapi-generated/qga-qmp-commands.h qga/qapi-generated/qga-qmp-marshal.c :\
> +qga/qapi-generated/qga-qapi-commands-gen ;
> +qga/qapi-generated/qga-qapi-commands-gen: \
>  $(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
>         $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py \
> -               $(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
> +               -o $(dir $@) -p "qga-" $<, \
>                 "GEN","$@")
>
>  qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \
> @@ -419,30 +428,39 @@ qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \
>                 $(SRC_PATH)/qapi/transaction.json \
>                 $(SRC_PATH)/qapi/ui.json
>
> -qapi-types.c qapi-types.h :\
> -$(qapi-modules) $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
> +.INTERMEDIATE: qapi-types-gen
> +qapi-types.c qapi-types.h: qapi-types-gen ;
> +qapi-types-gen: $(qapi-modules) $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
>         $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py \
> -               $(gen-out-type) -o "." -b $<, \
> +               -b $<, \
>                 "GEN","$@")
> -qapi-visit.c qapi-visit.h :\
> -$(qapi-modules) $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
> +
> +.INTERMEDIATE: qapi-visit-gen
> +qapi-visit.c qapi-visit.h: qapi-visit-gen ;
> +qapi-visit-gen: $(qapi-modules) $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
>         $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py \
> -               $(gen-out-type) -o "." -b $<, \
> +               -b $<, \
>                 "GEN","$@")
> -qapi-event.c qapi-event.h :\
> -$(qapi-modules) $(SRC_PATH)/scripts/qapi-event.py $(qapi-py)
> +
> +.INTERMEDIATE: qapi-event-gen
> +qapi-event.c qapi-event.h: qapi-event-gen
> +qapi-event-gen: $(qapi-modules) $(SRC_PATH)/scripts/qapi-event.py $(qapi-py)
>         $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-event.py \
> -               $(gen-out-type) -o "." $<, \
> +               $<, \
>                 "GEN","$@")
> -qmp-commands.h qmp-marshal.c :\
> -$(qapi-modules) $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
> +
> +.INTERMEDIATE: qapi-commands-gen
> +qmp-commands.h qmp-marshal.c: qapi-commands-gen
> +qapi-commands-gen: $(qapi-modules) $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
>         $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py \
> -               $(gen-out-type) -o "." $<, \
> +               $<, \
>                 "GEN","$@")
> -qmp-introspect.h qmp-introspect.c :\
> -$(qapi-modules) $(SRC_PATH)/scripts/qapi-introspect.py $(qapi-py)
> +
> +.INTERMEDIATE: qapi-introspect-gen
> +qmp-introspect.h qmp-introspect.c: qapi-introspect-gen
> +qapi-introspect-gen: $(qapi-modules) $(SRC_PATH)/scripts/qapi-introspect.py $(qapi-py)
>         $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-introspect.py \
> -               $(gen-out-type) -o "." $<, \
> +               $<, \
>                 "GEN","$@")
>
>  QGALIB_GEN=$(addprefix qga/qapi-generated/, qga-qapi-types.h qga-qapi-visit.h qga-qmp-commands.h)
> diff --git a/Makefile.objs b/Makefile.objs
> index bdfa3b6177..cc4f94d77a 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -2,7 +2,7 @@
>  # Common libraries for tools and emulators
>  stub-obj-y = stubs/ crypto/
>  util-obj-y = util/ qobject/ qapi/
> -util-obj-y += qmp-introspect.o qapi-types.o qapi-visit.o qapi-event.o
> +util-obj-y += qapi-types.o qapi-visit.o qapi-event.o
>
>  chardev-obj-y = chardev/
>
> diff --git a/tests/Makefile.include b/tests/Makefile.include
> index de4a713c25..5d53c58506 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -626,30 +626,44 @@ tests/test-logging$(EXESUF): tests/test-logging.o $(test-util-obj-y)
>  tests/test-replication$(EXESUF): tests/test-replication.o $(test-util-obj-y) \
>         $(test-block-obj-y)
>
> -tests/test-qapi-types.c tests/test-qapi-types.h :\
> +.INTERMEDIATE: tests/test-qapi-types-gen
> +tests/test-qapi-types.c tests/test-qapi-types.h: tests/test-qapi-types-gen ;
> +tests/test-qapi-types-gen: \
>  $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
>         $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py \
> -               $(gen-out-type) -o tests -p "test-" $<, \
> +               -o tests -p "test-" $<, \
>                 "GEN","$@")
> -tests/test-qapi-visit.c tests/test-qapi-visit.h :\
> +
> +.INTERMEDIATE: tests/test-qapi-visit-gen
> +tests/test-qapi-visit.c tests/test-qapi-visit.h: tests/test-qapi-visit-gen ;
> +tests/test-qapi-visit-gen: \
>  $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
>         $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py \
> -               $(gen-out-type) -o tests -p "test-" $<, \
> +               -o tests -p "test-" $<, \
>                 "GEN","$@")
> -tests/test-qmp-commands.h tests/test-qmp-marshal.c :\
> +
> +.INTERMEDIATE: tests/test-qapi-commands-gen
> +tests/test-qmp-commands.h tests/test-qmp-marshal.c: tests/test-qapi-commands-gen ;
> +tests/test-qapi-commands-gen: \
>  $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
>         $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py \
> -               $(gen-out-type) -o tests -p "test-" $<, \
> +               -o tests -p "test-" $<, \
>                 "GEN","$@")
> -tests/test-qapi-event.c tests/test-qapi-event.h :\
> +
> +.INTERMEDIATE: tests/test-qapi-event-gen
> +tests/test-qapi-event.c tests/test-qapi-event.h: tests/test-qapi-event-gen ;
> +tests/test-qapi-event-gen: \
>  $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-event.py $(qapi-py)
>         $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-event.py \
> -               $(gen-out-type) -o tests -p "test-" $<, \
> +               -o tests -p "test-" $<, \
>                 "GEN","$@")
> -tests/test-qmp-introspect.c tests/test-qmp-introspect.h :\
> +
> +.INTERMEDIATE: tests/test-qapi-introspect-gen
> +tests/test-qmp-introspect.c tests/test-qmp-introspect.h: tests/test-qapi-introspect-gen ;
> +tests/test-qapi-introspect-gen: \
>  $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-introspect.py $(qapi-py)
>         $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-introspect.py \
> -               $(gen-out-type) -o tests -p "test-" $<, \
> +               -o tests -p "test-" $<, \
>                 "GEN","$@")
>
>  tests/qapi-schema/doc-good.test.texi: $(SRC_PATH)/tests/qapi-schema/doc-good.json $(SRC_PATH)/scripts/qapi2texi.py $(qapi-py)
> @@ -660,7 +674,7 @@ tests/test-string-input-visitor$(EXESUF): tests/test-string-input-visitor.o $(te
>  tests/test-qmp-event$(EXESUF): tests/test-qmp-event.o $(test-qapi-obj-y)
>  tests/test-qobject-output-visitor$(EXESUF): tests/test-qobject-output-visitor.o $(test-qapi-obj-y)
>  tests/test-clone-visitor$(EXESUF): tests/test-clone-visitor.o $(test-qapi-obj-y)
> -tests/test-qobject-input-visitor$(EXESUF): tests/test-qobject-input-visitor.o $(test-qapi-obj-y)
> +tests/test-qobject-input-visitor$(EXESUF): tests/test-qobject-input-visitor.o $(test-qapi-obj-y) qmp-introspect.o
>  tests/test-qmp-commands$(EXESUF): tests/test-qmp-commands.o tests/test-qmp-marshal.o $(test-qapi-obj-y)
>  tests/test-visitor-serialization$(EXESUF): tests/test-visitor-serialization.o $(test-qapi-obj-y)
>  tests/test-opts-visitor$(EXESUF): tests/test-opts-visitor.o $(test-qapi-obj-y)
> --
> 2.13.6
>
>
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index cee6e28659..784b601247 100644
--- a/Makefile
+++ b/Makefile
@@ -384,24 +384,33 @@  qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx $(SRC_PATH)/scripts/hxtool
 qemu-ga$(EXESUF): LIBS = $(LIBS_QGA)
 qemu-ga$(EXESUF): QEMU_CFLAGS += -I qga/qapi-generated
 
-gen-out-type = $(subst .,-,$(suffix $@))
-
 qapi-py = $(SRC_PATH)/scripts/qapi.py $(SRC_PATH)/scripts/ordereddict.py
 
+.INTERMEDIATE: qga/qapi-generated/qga-qapi-types-gen
 qga/qapi-generated/qga-qapi-types.c qga/qapi-generated/qga-qapi-types.h :\
+qga/qapi-generated/qga-qapi-types-gen ;
+qga/qapi-generated/qga-qapi-types-gen: \
 $(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py \
-		$(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
+		-o $(dir $@) -p "qga-" $<, \
 		"GEN","$@")
+
+.INTERMEDIATE: qga/qapi-generated/qga-qapi-visit-gen
 qga/qapi-generated/qga-qapi-visit.c qga/qapi-generated/qga-qapi-visit.h :\
+qga/qapi-generated/qga-qapi-visit-gen ;
+qga/qapi-generated/qga-qapi-visit-gen: \
 $(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py \
-		$(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
+		-o $(dir $@) -p "qga-" $<, \
 		"GEN","$@")
+
+.INTERMEDIATE: qga/qapi-generated/qga-qapi-commands-gen
 qga/qapi-generated/qga-qmp-commands.h qga/qapi-generated/qga-qmp-marshal.c :\
+qga/qapi-generated/qga-qapi-commands-gen ;
+qga/qapi-generated/qga-qapi-commands-gen: \
 $(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py \
-		$(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
+		-o $(dir $@) -p "qga-" $<, \
 		"GEN","$@")
 
 qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \
@@ -419,30 +428,39 @@  qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \
                $(SRC_PATH)/qapi/transaction.json \
                $(SRC_PATH)/qapi/ui.json
 
-qapi-types.c qapi-types.h :\
-$(qapi-modules) $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
+.INTERMEDIATE: qapi-types-gen
+qapi-types.c qapi-types.h: qapi-types-gen ;
+qapi-types-gen: $(qapi-modules) $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py \
-		$(gen-out-type) -o "." -b $<, \
+		-b $<, \
 		"GEN","$@")
-qapi-visit.c qapi-visit.h :\
-$(qapi-modules) $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
+
+.INTERMEDIATE: qapi-visit-gen
+qapi-visit.c qapi-visit.h: qapi-visit-gen ;
+qapi-visit-gen: $(qapi-modules) $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py \
-		$(gen-out-type) -o "." -b $<, \
+		-b $<, \
 		"GEN","$@")
-qapi-event.c qapi-event.h :\
-$(qapi-modules) $(SRC_PATH)/scripts/qapi-event.py $(qapi-py)
+
+.INTERMEDIATE: qapi-event-gen
+qapi-event.c qapi-event.h: qapi-event-gen
+qapi-event-gen: $(qapi-modules) $(SRC_PATH)/scripts/qapi-event.py $(qapi-py)
 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-event.py \
-		$(gen-out-type) -o "." $<, \
+		$<, \
 		"GEN","$@")
-qmp-commands.h qmp-marshal.c :\
-$(qapi-modules) $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
+
+.INTERMEDIATE: qapi-commands-gen
+qmp-commands.h qmp-marshal.c: qapi-commands-gen
+qapi-commands-gen: $(qapi-modules) $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py \
-		$(gen-out-type) -o "." $<, \
+		$<, \
 		"GEN","$@")
-qmp-introspect.h qmp-introspect.c :\
-$(qapi-modules) $(SRC_PATH)/scripts/qapi-introspect.py $(qapi-py)
+
+.INTERMEDIATE: qapi-introspect-gen
+qmp-introspect.h qmp-introspect.c: qapi-introspect-gen
+qapi-introspect-gen: $(qapi-modules) $(SRC_PATH)/scripts/qapi-introspect.py $(qapi-py)
 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-introspect.py \
-		$(gen-out-type) -o "." $<, \
+		$<, \
 		"GEN","$@")
 
 QGALIB_GEN=$(addprefix qga/qapi-generated/, qga-qapi-types.h qga-qapi-visit.h qga-qmp-commands.h)
diff --git a/Makefile.objs b/Makefile.objs
index bdfa3b6177..cc4f94d77a 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -2,7 +2,7 @@ 
 # Common libraries for tools and emulators
 stub-obj-y = stubs/ crypto/
 util-obj-y = util/ qobject/ qapi/
-util-obj-y += qmp-introspect.o qapi-types.o qapi-visit.o qapi-event.o
+util-obj-y += qapi-types.o qapi-visit.o qapi-event.o
 
 chardev-obj-y = chardev/
 
diff --git a/tests/Makefile.include b/tests/Makefile.include
index de4a713c25..5d53c58506 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -626,30 +626,44 @@  tests/test-logging$(EXESUF): tests/test-logging.o $(test-util-obj-y)
 tests/test-replication$(EXESUF): tests/test-replication.o $(test-util-obj-y) \
 	$(test-block-obj-y)
 
-tests/test-qapi-types.c tests/test-qapi-types.h :\
+.INTERMEDIATE: tests/test-qapi-types-gen
+tests/test-qapi-types.c tests/test-qapi-types.h: tests/test-qapi-types-gen ;
+tests/test-qapi-types-gen: \
 $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py \
-		$(gen-out-type) -o tests -p "test-" $<, \
+		-o tests -p "test-" $<, \
 		"GEN","$@")
-tests/test-qapi-visit.c tests/test-qapi-visit.h :\
+
+.INTERMEDIATE: tests/test-qapi-visit-gen
+tests/test-qapi-visit.c tests/test-qapi-visit.h: tests/test-qapi-visit-gen ;
+tests/test-qapi-visit-gen: \
 $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py \
-		$(gen-out-type) -o tests -p "test-" $<, \
+		-o tests -p "test-" $<, \
 		"GEN","$@")
-tests/test-qmp-commands.h tests/test-qmp-marshal.c :\
+
+.INTERMEDIATE: tests/test-qapi-commands-gen
+tests/test-qmp-commands.h tests/test-qmp-marshal.c: tests/test-qapi-commands-gen ;
+tests/test-qapi-commands-gen: \
 $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py \
-		$(gen-out-type) -o tests -p "test-" $<, \
+		-o tests -p "test-" $<, \
 		"GEN","$@")
-tests/test-qapi-event.c tests/test-qapi-event.h :\
+
+.INTERMEDIATE: tests/test-qapi-event-gen
+tests/test-qapi-event.c tests/test-qapi-event.h: tests/test-qapi-event-gen ;
+tests/test-qapi-event-gen: \
 $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-event.py $(qapi-py)
 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-event.py \
-		$(gen-out-type) -o tests -p "test-" $<, \
+		-o tests -p "test-" $<, \
 		"GEN","$@")
-tests/test-qmp-introspect.c tests/test-qmp-introspect.h :\
+
+.INTERMEDIATE: tests/test-qapi-introspect-gen
+tests/test-qmp-introspect.c tests/test-qmp-introspect.h: tests/test-qapi-introspect-gen ;
+tests/test-qapi-introspect-gen: \
 $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-introspect.py $(qapi-py)
 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-introspect.py \
-		$(gen-out-type) -o tests -p "test-" $<, \
+		-o tests -p "test-" $<, \
 		"GEN","$@")
 
 tests/qapi-schema/doc-good.test.texi: $(SRC_PATH)/tests/qapi-schema/doc-good.json $(SRC_PATH)/scripts/qapi2texi.py $(qapi-py)
@@ -660,7 +674,7 @@  tests/test-string-input-visitor$(EXESUF): tests/test-string-input-visitor.o $(te
 tests/test-qmp-event$(EXESUF): tests/test-qmp-event.o $(test-qapi-obj-y)
 tests/test-qobject-output-visitor$(EXESUF): tests/test-qobject-output-visitor.o $(test-qapi-obj-y)
 tests/test-clone-visitor$(EXESUF): tests/test-clone-visitor.o $(test-qapi-obj-y)
-tests/test-qobject-input-visitor$(EXESUF): tests/test-qobject-input-visitor.o $(test-qapi-obj-y)
+tests/test-qobject-input-visitor$(EXESUF): tests/test-qobject-input-visitor.o $(test-qapi-obj-y) qmp-introspect.o
 tests/test-qmp-commands$(EXESUF): tests/test-qmp-commands.o tests/test-qmp-marshal.o $(test-qapi-obj-y)
 tests/test-visitor-serialization$(EXESUF): tests/test-visitor-serialization.o $(test-qapi-obj-y)
 tests/test-opts-visitor$(EXESUF): tests/test-opts-visitor.o $(test-qapi-obj-y)