mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
5c5fc5dde4
when we change our build rules to move a C file, we need to remove the old ('stale') .so and .o files from the build directory, or they may be used as part of the new build, which means that old code will be linked in. This expands the list of stale files that we remove on rule changes to include .so and .o files Pair-Programmed-With: Amitay Isaacs <amitay@gmail.com> Autobuild-User: Andrew Tridgell <tridge@samba.org> Autobuild-Date: Wed Oct 19 09:02:23 CEST 2011 on sn-devel-104
113 lines
3.9 KiB
Python
113 lines
3.9 KiB
Python
#! /usr/bin/env python
|
|
# encoding: utf-8
|
|
# Thomas Nagy, 2006-2010 (ita)
|
|
|
|
"""
|
|
Add a pre-build hook to remove all build files
|
|
which do not have a corresponding target
|
|
|
|
This can be used for example to remove the targets
|
|
that have changed name without performing
|
|
a full 'waf clean'
|
|
|
|
Of course, it will only work if there are no dynamically generated
|
|
nodes/tasks, in which case the method will have to be modified
|
|
to exclude some folders for example.
|
|
"""
|
|
|
|
import Logs, Build, os, samba_utils, Options, Utils
|
|
from Runner import Parallel
|
|
|
|
old_refill_task_list = Parallel.refill_task_list
|
|
def replace_refill_task_list(self):
|
|
'''replacement for refill_task_list() that deletes stale files'''
|
|
|
|
iit = old_refill_task_list(self)
|
|
bld = self.bld
|
|
|
|
if not getattr(bld, 'new_rules', False):
|
|
# we only need to check for stale files if the build rules changed
|
|
return iit
|
|
|
|
if Options.options.compile_targets:
|
|
# not safe when --target is used
|
|
return iit
|
|
|
|
# execute only once
|
|
if getattr(self, 'cleanup_done', False):
|
|
return iit
|
|
self.cleanup_done = True
|
|
|
|
def group_name(g):
|
|
tm = self.bld.task_manager
|
|
return [x for x in tm.groups_names if id(tm.groups_names[x]) == id(g)][0]
|
|
|
|
bin_base = bld.bldnode.abspath()
|
|
bin_base_len = len(bin_base)
|
|
|
|
# paranoia
|
|
if bin_base[-4:] != '/bin':
|
|
raise Utils.WafError("Invalid bin base: %s" % bin_base)
|
|
|
|
# obtain the expected list of files
|
|
expected = []
|
|
for i in range(len(bld.task_manager.groups)):
|
|
g = bld.task_manager.groups[i]
|
|
tasks = g.tasks_gen
|
|
for x in tasks:
|
|
try:
|
|
if getattr(x, 'target'):
|
|
tlist = samba_utils.TO_LIST(getattr(x, 'target'))
|
|
ttype = getattr(x, 'samba_type', None)
|
|
task_list = getattr(x, 'compiled_tasks', [])
|
|
if task_list:
|
|
# this gets all of the .o files, including the task
|
|
# ids, so foo.c maps to foo_3.o for idx=3
|
|
for tsk in task_list:
|
|
for output in tsk.outputs:
|
|
objpath = os.path.normpath(output.abspath(bld.env))
|
|
expected.append(objpath)
|
|
for t in tlist:
|
|
if ttype in ['LIBRARY','MODULE']:
|
|
t = samba_utils.apply_pattern(t, bld.env.shlib_PATTERN)
|
|
if ttype == 'PYTHON':
|
|
t = samba_utils.apply_pattern(t, bld.env.pyext_PATTERN)
|
|
p = os.path.join(x.path.abspath(bld.env), t)
|
|
p = os.path.normpath(p)
|
|
expected.append(p)
|
|
for n in x.allnodes:
|
|
p = n.abspath(bld.env)
|
|
if p[0:bin_base_len] == bin_base:
|
|
expected.append(p)
|
|
except:
|
|
pass
|
|
|
|
for root, dirs, files in os.walk(bin_base):
|
|
for f in files:
|
|
p = root + '/' + f
|
|
if os.path.islink(p):
|
|
link = os.readlink(p)
|
|
if link[0:bin_base_len] == bin_base:
|
|
p = link
|
|
if f in ['config.h']:
|
|
continue
|
|
(froot, fext) = os.path.splitext(f)
|
|
if fext not in [ '.c', '.h', '.so', '.o' ]:
|
|
continue
|
|
if f[-7:] == '.inst.h':
|
|
continue
|
|
if p.find("/.conf") != -1:
|
|
continue
|
|
if not p in expected and os.path.exists(p):
|
|
Logs.warn("Removing stale file: %s" % p)
|
|
os.unlink(p)
|
|
return iit
|
|
|
|
|
|
def AUTOCLEANUP_STALE_FILES(bld):
|
|
"""automatically clean up any files in bin that shouldn't be there"""
|
|
old_refill_task_list = Parallel.refill_task_list
|
|
Parallel.refill_task_list = replace_refill_task_list
|
|
Parallel.bld = bld
|
|
Build.BuildContext.AUTOCLEANUP_STALE_FILES = AUTOCLEANUP_STALE_FILES
|