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; +}