summaryrefslogtreecommitdiff
path: root/buildtools/wafsamba
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2010-05-28 15:20:03 +1000
committerAndrew Bartlett <abartlet@samba.org>2010-05-28 15:20:03 +1000
commit892a4b24e79a71f5fd81bdb631d93615f2345bd9 (patch)
treec94ced8464b68ef294ea09bbc7b9537693f7892b /buildtools/wafsamba
parent0ca8e2252b14811b9221acc95a510ab6a84f580f (diff)
downloadsamba-892a4b24e79a71f5fd81bdb631d93615f2345bd9.tar.gz
samba-892a4b24e79a71f5fd81bdb631d93615f2345bd9.tar.bz2
samba-892a4b24e79a71f5fd81bdb631d93615f2345bd9.zip
waf Read VERSION file inside WAF to set package version
This replaces the call to mkversion.sh in both the Samba3 and Samba4 WAF builds. Andrew Bartlett
Diffstat (limited to 'buildtools/wafsamba')
-rw-r--r--buildtools/wafsamba/samba_patterns.py27
-rw-r--r--buildtools/wafsamba/samba_version.py170
-rw-r--r--buildtools/wafsamba/wafsamba.py1
3 files changed, 190 insertions, 8 deletions
diff --git a/buildtools/wafsamba/samba_patterns.py b/buildtools/wafsamba/samba_patterns.py
index cce19d3aee..ae0dbe2cf8 100644
--- a/buildtools/wafsamba/samba_patterns.py
+++ b/buildtools/wafsamba/samba_patterns.py
@@ -3,15 +3,26 @@
import Task
from TaskGen import extension
from samba_utils import *
+from wafsamba import samba_version_file
+
+def write_version_header(task):
+ '''print version.h contents'''
+ src = task.inputs[0].srcpath(task.env)
+ tgt = task.outputs[0].bldpath(task.env)
+
+ version = samba_version_file(src)
+ string = str(version)
+
+ f = open(tgt, 'w')
+ s = f.write(string)
+ f.close()
+ return 0
+
def SAMBA_MKVERSION(bld, target):
'''generate the version.h header for Samba'''
- bld.SET_BUILD_GROUP('setup')
- t = bld(rule="cd .. && ${SRC[0].abspath(env)} VERSION ${TGT[0].abspath(env)}",
- source= [ "script/mkversion.sh", 'VERSION' ],
- target=target,
- shell=True,
- on_results=True,
- before="cc")
+ t = bld.SAMBA_GENERATOR('VERSION',
+ rule=write_version_header,
+ source= 'VERSION',
+ target=target)
Build.BuildContext.SAMBA_MKVERSION = SAMBA_MKVERSION
-
diff --git a/buildtools/wafsamba/samba_version.py b/buildtools/wafsamba/samba_version.py
new file mode 100644
index 0000000000..9832c79f28
--- /dev/null
+++ b/buildtools/wafsamba/samba_version.py
@@ -0,0 +1,170 @@
+import os;
+import subprocess;
+
+class samba_version(object):
+ def __init__(self, version_dict):
+ '''Determine the version number of samba
+
+See VERSION for the format. Entries on that file are
+also accepted as dictionary entries here
+ '''
+
+ self.MAJOR=None
+ self.MINOR=None
+ self.RELEASE=None
+ self.REVISION=None
+ self.TP_RELEASE=None
+ self.ALPHA_RELEASE=None
+ self.PRE_RELEASE=None
+ self.RC_RELEASE=None
+ self.IS_GIT_SNAPSHOT=True
+ self.RELEASE_NICKNAME=None
+ self.VENDOR_SUFFIX=None
+ self.VENDOR_PATCH=None
+
+ for a, b in version_dict.iteritems():
+ if a.startswith("SAMBA_VERSION_"):
+ setattr(self, a[14:], b)
+ else:
+ setattr(self, a, b)
+
+ if self.IS_GIT_SNAPSHOT is "yes":
+ self.IS_GIT_SNAPSHOT=True
+ elif self.IS_GIT_SNAPSHOT is "no":
+ self.IS_GIT_SNAPSHOT=False
+
+ ##
+ ## start with "3.0.22"
+ ##
+ self.MAJOR=int(self.MAJOR)
+ self.MINOR=int(self.MINOR)
+ self.RELEASE=int(self.RELEASE)
+
+ SAMBA_VERSION_STRING = ("%u.%u.%u" % (self.MAJOR, self.MINOR, self.RELEASE))
+
+##
+## maybe add "3.0.22a" or "4.0.0tp11" or "4.0.0alpha1" or "3.0.22pre1" or "3.0.22rc1"
+## We do not do pre or rc version on patch/letter releases
+##
+ if self.REVISION is not None:
+ SAMBA_VERSION_STRING += self.REVISION
+ if self.TP_RELEASE is not None:
+ self.TP_RELEASE = int(self.TP_RELEASE)
+ SAMBA_VERSION_STRING += ("tp%u" % self.TP_RELEASE)
+ if self.ALPHA_RELEASE is not None:
+ self.ALPHA_RELEASE = int(self.ALPHA_RELEASE)
+ SAMBA_VERSION_STRING += ("alpha%u" % self.ALPHA_RELEASE)
+ if self.PRE_RELEASE is not None:
+ self.PRE_RELEASE = int(self.PRE_RELEASE)
+ SAMBA_VERSION_STRING += ("pre%u" % self.PRE_RELEASE)
+ if self.RC_RELEASE is not None:
+ self.RC_RELEASE = int(self.RC_RELEASE)
+ SAMBA_VERSION_STRING += ("rc%u" % self.RC_RELEASE)
+
+ if self.IS_GIT_SNAPSHOT:
+ #Get version from GIT
+ try:
+ git = subprocess.Popen('git show --pretty=format:"%h%n%ct%n%H%n%cd" --stat HEAD', stdout=subprocess.PIPE, close_fds=True, shell=True)
+ (output, errors) = git.communicate()
+ lines = output.splitlines();
+ self.GIT_COMMIT_ABBREV = lines[0]
+ self.GIT_COMMIT_TIME = lines[1]
+ self.GIT_COMMIT_FULLREV = lines[2]
+ self.GIT_COMMIT_DATE = lines[3]
+
+ SAMBA_VERSION_STRING += ("-GIT-" + self.GIT_COMMIT_ABBREV)
+ except IndexError:
+ SAMBA_VERSION_STRING += "-GIT-UNKNOWN"
+ pass
+
+ self.OFFICIAL_STRING=SAMBA_VERSION_STRING
+
+ if self.VENDOR_SUFFIX is not None:
+ SAMBA_VERSION_STRING += ("-" + self.VENDOR_SUFFIX)
+ self.VENDOR_SUFFIX = self.VENDOR_SUFFIX
+
+ if self.VENDOR_PATCH is not None:
+ SAMBA_VERSION_STRING += ("-" + self.VENDOR_PATCH)
+ self.VENDOR_PATCH = self.VENDOR_PATCH
+
+ self.STRING = SAMBA_VERSION_STRING
+
+ if self.RELEASE_NICKNAME is not None:
+ self.STRING_WITH_NICKNAME += (" (" + self.RELEASE_NICKNAME + ")")
+ self.RELEASE_NICKNAME = self.RELEASE_NICKNAME
+ else:
+ self.STRING_WITH_NICKNAME = self.STRING
+
+ def __str__(self):
+ string="/* Autogenerated by waf */\n"
+ string+="#define SAMBA_VERSION_MAJOR %u\n" % self.MAJOR
+ string+="#define SAMBA_VERSION_MINOR %u\n" % self.MINOR
+ string+="#define SAMBA_VERSION_RELEASE %u\n" % self.RELEASE
+ if self.REVISION is not None:
+ string+="#define SAMBA_VERSION_REVISION %u\n" % self.REVISION
+
+ if self.TP_RELEASE is not None:
+ string+="#define SAMBA_VERSION_TP_RELEASE %u\n" % self.TP_RELEASE
+
+ if self.ALPHA_RELEASE is not None:
+ string+="#define SAMBA_VERSION_ALPHA_RELEASE %u\n" % self.ALPHA_RELEASE
+
+ if self.PRE_RELEASE is not None:
+ string+="#define SAMBA_VERSION_PRE_RELEASE %u\n" % self.PRE_RELEASE
+
+ if self.RC_RELEASE is not None:
+ string+="#define SAMBA_VERSION_RC_RELEASE %u\n" % self.RC_RELEASE
+
+ try:
+ string+="#define SAMBA_VERSION_GIT_COMMIT_ABBREV " + self.GIT_COMMIT_ABBREV + "\n"
+ string+="#define SAMBA_VERSION_GIT_COMMIT_TIME " + self.GIT_COMMIT_TIME + "\n"
+ string+="#define SAMBA_VERSION_GIT_COMMIT_FULLREV " + self.GIT_COMMIT_TIME + "\n"
+ string+="#define SAMBA_VERSION_GIT_COMMIT_DATE " + self.GIT_COMMIT_DATA + "\n"
+ except AttributeError:
+ pass
+
+ string+="#define SAMBA_VERSION_OFFICIAL_STRING \"" + self.OFFICIAL_STRING + "\"\n"
+
+ if self.VENDOR_SUFFIX is not None:
+ string+="#define SAMBA_VERSION_VENDOR_SUFFIX " + self.VENDOR_SUFFIX + "\n"
+ if self.VENDOR_PATCH is not None:
+ string+="#define SAMBA_VERSION_VENDOR_PATCH " + self.VENDOR_PATCH + "\n"
+
+ if self.RELEASE_NICKNAME is not None:
+ string+="#define SAMBA_VERSION_RELEASE_NICKNAME " + self.RELEASE_NICKNAME + "\n"
+
+ # We need to put this #ifdef in to the headers so that vendors can override the version with a function
+ string+='''
+#ifdef SAMBA_VERSION_VENDOR_FUNCTION
+# define SAMBA_VERSION_STRING SAMBA_VERSION_VENDOR_FUNCTION
+#else /* SAMBA_VERSION_VENDOR_FUNCTION */
+# define SAMBA_VERSION_STRING "''' + self.STRING_WITH_NICKNAME + '''"
+#endif
+'''
+ string+="/* Version for mkrelease.sh: \nSAMBA_VERSION_STRING=" + self.STRING_WITH_NICKNAME + "\n */\n"
+
+ return string
+
+
+class samba_version_file(samba_version):
+ def __init__(self, version_file):
+ '''Parse the version information from a VERSION file'''
+ f = open(version_file, 'r')
+ version_dict = {}
+ for line in f:
+ try:
+ line = line.strip()
+ if line == '':
+ continue
+ if line.startswith("#"):
+ continue
+ split_line=line.split("=")
+ if split_line[1] != "":
+ value = split_line[1].strip('"')
+ version_dict[split_line[0]] = value
+ except:
+ print "Failed to parse line %s from %s" % (line, version_file)
+ raise
+
+ super(samba_version_file, self).__init__(version_dict)
+
diff --git a/buildtools/wafsamba/wafsamba.py b/buildtools/wafsamba/wafsamba.py
index fd6a5523e9..412b0d2d0a 100644
--- a/buildtools/wafsamba/wafsamba.py
+++ b/buildtools/wafsamba/wafsamba.py
@@ -9,6 +9,7 @@ from samba_utils import SUBST_VARS_RECURSIVE
# bring in the other samba modules
from samba_optimisation import *
from samba_utils import *
+from samba_version import *
from samba_autoconf import *
from samba_patterns import *
from samba_pidl import *