From 2a90325e80ed135cdcacaa8a901f00ddb9630afd Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 11 Dec 2018 10:00:53 +1030 Subject: [PATCH] Makefile: add dependency on external header versions. There were a few reports that upgrading Ubuntu recently caused issues because we assert that the sqlite3 library version matches the one we were built with. 'make' doesn't fix this, because it doesn't know the external libraries have changed. Fix this harder, with a helper which updates a file every binary depends on, which gets relinked every time so we detect link changes. Signed-off-by: Rusty Russell --- Makefile | 12 +++++++++-- tools/headerversions.c | 47 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 tools/headerversions.c diff --git a/Makefile b/Makefile index 8a6ff9e54..149d0a958 100644 --- a/Makefile +++ b/Makefile @@ -334,8 +334,16 @@ gen_version.h: FORCE @(echo "#define VERSION \"$(VERSION)\"" && echo "#define BUILD_FEATURES \"$(FEATURES)\"") > $@.new @if cmp $@.new $@ >/dev/null 2>&2; then rm -f $@.new; else mv $@.new $@; echo Version updated; fi -# All binaries require the external libs, ccan -$(ALL_PROGRAMS) $(ALL_TEST_PROGRAMS): $(EXTERNAL_LIBS) $(CCAN_OBJS) +# We force make to relink this every time, to detect version changes. +tools/headerversions: FORCE tools/headerversions.o $(CCAN_OBJS) + @$(LINK.o) tools/headerversions.o $(CCAN_OBJS) $(LOADLIBES) $(LDLIBS) -o $@ + +# That forces this rule to be run every time, too. +gen_header_versions.h: tools/headerversions + @tools/headerversions $@ + +# All binaries require the external libs, ccan and external library versions. +$(ALL_PROGRAMS) $(ALL_TEST_PROGRAMS): $(EXTERNAL_LIBS) $(CCAN_OBJS) gen_header_versions.h # Each test program depends on its own object. $(ALL_TEST_PROGRAMS): %: %.o diff --git a/tools/headerversions.c b/tools/headerversions.c new file mode 100644 index 000000000..4091dd508 --- /dev/null +++ b/tools/headerversions.c @@ -0,0 +1,47 @@ +/* Updates the given file if any library versions have changed. This + * is important for systemwide updates, such as sqlite3. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + char *file, *new; + + err_set_progname(argv[0]); + + if (argc != 2) + errx(1, "Usage: %s ", argv[0]); + + file = grab_file(NULL, argv[1]); + if (!file && errno != ENOENT) + err(1, "Reading %s", argv[1]); + + new = tal_fmt(NULL, + "/* Generated file by tools/headerversions, do not edit! */\n" + "/* GMP version: %s */\n" + "/* SQLITE3 version: %u */\n" + "/* ZLIB version: %s */\n", + gmp_version, + sqlite3_libversion_number(), + zlibVersion()); + if (!file || !streq(new, file)) { + int fd = open(argv[1], O_TRUNC|O_WRONLY|O_CREAT, 0666); + if (fd < 0) + err(1, "Writing %s", argv[1]); + if (!write_all(fd, new, strlen(new))) + err(1, "Writing to %s", argv[1]); + close(fd); + } + tal_free(new); + tal_free(file); + return 0; +}