[master] 9305a2d pull out vcs_version.h / vmod_abi.h generation to own file again

Nils Goroll nils.goroll at uplex.de
Mon Mar 5 17:38:09 UTC 2018


commit 9305a2d4c4734eaf93f5ecec2a823f5d493d0be8
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Mon Mar 5 18:12:21 2018 +0100

    pull out vcs_version.h / vmod_abi.h generation to own file again
    
    This basically reverts a29fca70f7ccc75964bcfffb8c8ab1617fcf2bba,
    except that we are using python instead of make-inlined shell code to
    do the work.
    
    Reason: vcs_version.h needs to be up-to-date under all circumstances,
    otherwise we will end up with wrong version information in binary
    builds, which would divert developer resources into unproductive
    confusion compensation.
    
    With an all-in-one generate.py, we basically have the choice between:
    
    - running it with each build, which breaks incremental builds as
      generate.py rewrites central includes like vcl.h
    
    - adding version information to all generate.py-build files or similar
      mechanisms to avoid re-writing them unless they have actually
      changed.
    
    - contradicting the argument given above
    
    I think that, unless there are strong reasons for a single
    generate.py, avoiding these issues by splitting functions is the best
    option.

diff --git a/include/Makefile.am b/include/Makefile.am
index 9ddb077..1b13126 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -101,7 +101,7 @@ nobase_noinst_HEADERS = \
 	vus.h
 
 ## keep in sync with lib/libvcc/Makefile.am
-vmod_abi.h: \
+vcl.h: \
 	    $(top_srcdir)/lib/libvcc/generate.py \
 	    $(top_srcdir)/include/vdef.h \
 	    $(top_srcdir)/include/vrt.h \
@@ -114,15 +114,31 @@ GEN_H = \
 	tbl/vrt_stv_var.h \
 	tbl/vcl_returns.h \
 	tbl/vcc_types.h \
-	vrt_obj.h \
-	vcl.h \
-	vcs_version.h
+	vrt_obj.h
+
+$(GEN_H): vcl.h
+
+GENERATED_H = vcl.h $(GEN_H)
 
-$(GEN_H): vmod_abi.h
+## vcs_version.h / vmod_abi.h need to be up-to-date with every build
+## except when building from a distribution
 
-GENERATED_H = vmod_abi.h $(GEN_H)
+vcs_version.h:
+	if test -d $(top_srcdir)/.git ; then \
+	    @PYTHON@ $(srcdir)/generate.py \
+		$(top_srcdir) $(top_builddir) ; \
+	fi
 
-BUILT_SOURCES = $(GENERATED_H)
+vmod_abi.h: vcs_version.h
+
+.PHONY: vcs_version.h
+
+##
+
+BUILT_SOURCES = \
+	$(GENERATED_H) \
+	vcs_version.h \
+	vmod_abi.h
 
 MAINTAINERCLEANFILES = $(GENERATED_H)
 
diff --git a/include/generate.py b/include/generate.py
new file mode 100755
index 0000000..f6cd339
--- /dev/null
+++ b/include/generate.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2006 Verdens Gang AS
+# Copyright (c) 2006-2015 Varnish Software AS
+# All rights reserved.
+#
+# Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Generate vcs_version.h vmod_abi.h
+
+from __future__ import print_function
+
+import subprocess
+import collections
+import os
+import sys
+
+srcroot = "../.."
+buildroot = "../.."
+if len(sys.argv) == 3:
+	srcroot = sys.argv[1]
+	buildroot = sys.argv[2]
+elif len(sys.argv) != 1:
+	print("Two arguments or none")
+	exit(2)
+
+#######################################################################
+def file_header(fo):
+	fo.write("""/*
+ * NB:  This file is machine generated, DO NOT EDIT!
+ *
+ * Edit and run lib/libvcc/generate.py instead.
+ */
+
+""")
+
+#######################################################################
+
+if os.path.isdir(os.path.join(srcroot, ".git")):
+	v = subprocess.check_output([
+		"git --git-dir=" + os.path.join(srcroot, ".git") +
+		" show -s --pretty=format:%H"
+	], shell=True, universal_newlines=True)
+	v = v.strip()
+else:
+	v = "NOGIT"
+
+vcsfn = os.path.join(srcroot, "include", "vcs_version.h")
+
+try:
+	i = open(vcsfn).readline()
+except IOError:
+	i = ""
+
+ident = "/* " + v + " */\n"
+
+if i != ident:
+	fo = open(vcsfn, "w")
+	fo.write(ident)
+	file_header(fo)
+	fo.write('#define VCS_Version "%s"\n' % v)
+	fo.close()
+
+	for i in open(os.path.join(buildroot, "Makefile")):
+		if i[:14] == "PACKAGE_STRING":
+			break
+	i = i.split("=")[1].strip()
+
+	fo = open(os.path.join(srcroot, "include", "vmod_abi.h"), "w")
+	file_header(fo)
+	fo.write('#define VMOD_ABI_Version "%s %s"\n' % (i, v))
+	fo.close()
diff --git a/lib/libvcc/generate.py b/lib/libvcc/generate.py
index dfe28cd..2d556a7 100755
--- a/lib/libvcc/generate.py
+++ b/lib/libvcc/generate.py
@@ -818,40 +818,3 @@ for i in stv_variables:
 fo.write("#undef VRTSTVVAR\n")
 lint_end(fo)
 fo.close()
-
-#######################################################################
-
-if os.path.isdir(os.path.join(srcroot, ".git")):
-	v = subprocess.check_output([
-		"git --git-dir=" + os.path.join(srcroot, ".git") +
-		" show -s --pretty=format:%H"
-	], shell=True, universal_newlines=True)
-	v = v.strip()
-else:
-	v = "NOGIT"
-
-vcsfn = os.path.join(srcroot, "include", "vcs_version.h")
-
-try:
-	i = open(vcsfn).readline()
-except IOError:
-	i = ""
-
-ident = "/* " + v + " */\n"
-
-if i != ident:
-	fo = open(vcsfn, "w")
-	fo.write(ident)
-	file_header(fo)
-	fo.write('#define VCS_Version "%s"\n' % v)
-	fo.close()
-
-	for i in open(os.path.join(buildroot, "Makefile")):
-		if i[:14] == "PACKAGE_STRING":
-			break
-	i = i.split("=")[1].strip()
-
-	fo = open(os.path.join(srcroot, "include", "vmod_abi.h"), "w")
-	file_header(fo)
-	fo.write('#define VMOD_ABI_Version "%s %s"\n' % (i, v))
-	fo.close()


More information about the varnish-commit mailing list