diff mbox

[v5,00/12] Convert over to use keycodemapdb

Message ID 20170919115511.GJ9536@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Daniel P. Berrangé Sept. 19, 2017, 11:55 a.m. UTC
On Tue, Sep 19, 2017 at 12:20:55PM +0100, Daniel P. Berrange wrote:
> On Tue, Sep 19, 2017 at 12:58:20PM +0200, Gerd Hoffmann wrote:
> >   Hi,
> > 
> > > > So I did the keymaps build with a recursive make call too, which
> > > > doesn't look that pretty ...
> > > 
> > > I don't think that's too ugly, but I wonder if there's some way to
> > > avoid
> > > the recursive make call.
> > > 
> > > It feels like this is a similar scenario to 'config-host.mak' being
> > > outdated. I don't entirely understand the logic yet, but we manage to
> > > automatically re-run configure and rebuild config-host.make, when
> > > configure changes, and that in turn affects which dependancies need
> > > rebuild.
> > 
> > Can't spot anything special in the Makefile.  Maybe make is clever
> > enough to figure that a rule updates a include file and starts over
> > then.
> > 
> > > I wonder if we can somehow integrate into that process, so
> > > that configure is responsible for checking out the git submodules,
> > > then make the re-running of configure trigger when .gitmodules
> > > changes content.
> > 
> > .gitmodules only has the repo links, not the checkout hashes.  So it
> > wouldn't be touched on updates.
> > 
> > I can't see an easy way for make to figure a submodule has changed,
> > other than running "git submodule update".
> 
> So I think I figured out the trick libvirt/gnulib uses for this. It
> runs an external script to check the submodule status. This runs
> 'git submodule' to get a list of expected hashes, and compares this
> to a file .git-submodule-status that it previously created (might be
> missing on fresh checkout). If the expected & stores hashes don't
> match this script runs an error.
> 
> The Makefile checks the output of this script, and if it indicates
> that an submodule update is required, it uses an ifeq() to add a
> dependancy between "Makefile" and a phony target that re-runs
> configure (which in turns updates the submodules). If no update was
> required, then no dependancy from Makefile gets added, so build runs
> normally.

Here is an example of integrating this approach with QEMU that seems
like it should work:
diff mbox

Patch

diff --git a/.gitmodules b/.gitmodules
index 84c54cdc49..f3bbc01f82 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -34,3 +34,6 @@ 
 [submodule "roms/QemuMacDrivers"]
 	path = roms/QemuMacDrivers
 	url = git://git.qemu.org/QemuMacDrivers.git
+[submodule "ui/keycodemapdb"]
+	path = ui/keycodemapdb
+	url = https://gitlab.com/keycodemap/keycodemapdb.git
diff --git a/Makefile b/Makefile
index b53fc69a60..62f17d2db5 100644
--- a/Makefile
+++ b/Makefile
@@ -803,6 +803,25 @@  Makefile: $(GENERATED_FILES)
 endif
 endif
 
+ifeq (0,$(MAKELEVEL))
+  git_module_status := $(shell \
+      cd '$(SRC_PATH)'; \
+      test -d .git || test -f .git || { echo 0; exit; }; \
+      ./scripts/git-submodule-status.sh; \
+      echo $$?; \
+  )
+
+ifeq (1,$(git_module_status))
+Makefile: reconfig
+
+.PHONY: reconfig
+
+reconfig:
+	@echo "GIT submodules out of date, re-running configure"
+	./config.status
+endif
+endif
+
 .SECONDARY: $(TRACE_HEADERS) $(TRACE_HEADERS:%=%-timestamp) \
 	$(TRACE_SOURCES) $(TRACE_SOURCES:%=%-timestamp) \
 	$(TRACE_DTRACE) $(TRACE_DTRACE:%=%-timestamp)
diff --git a/configure b/configure
index 94db2d103e..eb29a95ff9 100755
--- a/configure
+++ b/configure
@@ -3583,6 +3583,15 @@  fi
 libs_softmmu="$libs_softmmu $fdt_libs"
 
 ##########################################
+# initialize keycodemapdb module
+
+if test -d "${source_path}/.git"
+then
+    git submodule update --init ui/keycodemapdb
+    git submodule status ui/keycodemapdb | awk '{print $1 " " $2}' > .git-submodule-status
+fi
+
+##########################################
 # opengl probe (for sdl2, gtk, milkymist-tmu2)
 
 if test "$opengl" != "no" ; then
diff --git a/scripts/git-submodule-status.sh b/scripts/git-submodule-status.sh
new file mode 100755
index 0000000000..1a28118ee6
--- /dev/null
+++ b/scripts/git-submodule-status.sh
@@ -0,0 +1,16 @@ 
+#!/bin/sh
+
+if ! test -f .git-submodule-status
+then
+   exit 1
+fi
+
+git submodule status ui/keycodemapdb | awk '{print $1 " " $2}' > .git-submodule-status.tmp
+
+diff .git-submodule-status .git-submodule-status.tmp >/dev/null
+
+ret=$?
+
+rm -f .git-submodule-status.tmp
+
+exit $ret
diff --git a/ui/keycodemapdb b/ui/keycodemapdb
new file mode 160000
index 0000000000..56ce5650d2
--- /dev/null
+++ b/ui/keycodemapdb
@@ -0,0 +1 @@ 
+Subproject commit 56ce5650d2c6ea216b4580df44b9a6dd3bc92c3b