From 9ffd6c0ec339aa6e70543cfecfb2bab93705e603 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 12 Apr 2010 11:09:44 +1000 Subject: [PATCH] build: cope with symlinks between build components in waf dist This will allow us to have autogen-waf.sh be a symlink to ../buildtools/scripts/autogen-waf.sh in each library. That will prevent people from updating only the script in source4/, and forgetting to udpate the scripts in the other libs, as happened with commit f3f82496 --- buildtools/wafsamba/samba_dist.py | 52 +++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/buildtools/wafsamba/samba_dist.py b/buildtools/wafsamba/samba_dist.py index aea45c57706..05865508149 100644 --- a/buildtools/wafsamba/samba_dist.py +++ b/buildtools/wafsamba/samba_dist.py @@ -6,8 +6,56 @@ from samba_utils import * dist_dirs = None -def add_tarfile(tar, fname, abspath): +def add_symlink(tar, fname, abspath, basedir): + '''handle symlinks to directories that may move during packaging''' + if not os.path.islink(abspath): + return False + tinfo = tar.gettarinfo(name=abspath, arcname=fname) + tgt = os.readlink(abspath) + + if dist_dirs: + # we need to find the target relative to the main directory + # this is here to cope with symlinks into the buildtools + # directory from within the standalone libraries in Samba. For example, + # a symlink to ../../builtools/scripts/autogen-waf.sh needs + # to be rewritten as a symlink to buildtools/scripts/autogen-waf.sh + # when the tarball for talloc is built + + # the filename without the appname-version + rel_fname = '/'.join(fname.split('/')[1:]) + + # join this with the symlink target + tgt_full = os.path.join(os.path.dirname(rel_fname), tgt) + + # join with the base directory + tgt_base = os.path.normpath(os.path.join(basedir, tgt_full)) + + # see if this is inside one of our dist_dirs + for dir in dist_dirs.split(): + if dir.find(':') != -1: + destdir=dir.split(':')[1] + dir=dir.split(':')[0] + else: + destdir = '.' + if dir == basedir: + # internal links don't get rewritten + continue + if dir == tgt_base[0:len(dir)] and tgt_base[len(dir)] == '/': + new_tgt = destdir + tgt_base[len(dir):] + tinfo.linkname = new_tgt + break + + tinfo.uid = 0 + tinfo.gid = 0 + tinfo.uname = 'root' + tinfo.gname = 'root' + tar.addfile(tinfo) + return True + +def add_tarfile(tar, fname, abspath, basedir): '''add a file to the tarball''' + if add_symlink(tar, fname, abspath, basedir): + return try: tinfo = tar.gettarinfo(name=abspath, arcname=fname) except OSError: @@ -61,7 +109,7 @@ def dist(appname='',version=''): if destdir != '.': f = destdir + '/' + f fname = dist_base + '/' + f - add_tarfile(tar, fname, abspath) + add_tarfile(tar, fname, abspath, dir) tar.close() -- 2.34.1