# Samba automatic dependency handling and project rules
-import Build, os, sys, re, Environment, Logs, time
-from samba_utils import *
-from samba_autoconf import *
+import os, sys, re, time
+
+import Build, Environment, Options, Logs, Utils
+from Logs import debug
+from Configure import conf
+
from samba_bundled import BUILTIN_LIBRARY
+from samba_utils import LOCAL_CACHE, TO_LIST, get_tgt_list, unique_list, os_path_relpath
+from samba_autoconf import library_flags
@conf
def ADD_GLOBAL_DEPENDENCY(ctx, dep):
# module_name = rpc_epmapper (a module within the dcerpc_server subsystem)
# module = rpc_epmapper (a module object within the dcerpc_server subsystem)
- subsystem = bld.name_to_obj(subsystem_name, bld.env)
+ subsystem = bld.get_tgen_by_name(subsystem_name)
bld.ASSERT(subsystem is not None, "Unable to find subsystem %s" % subsystem_name)
for d in subsystem_list[subsystem_name]:
module_name = d['TARGET']
# extra link flags from pkg_config
libs = self.final_syslibs.copy()
- (ccflags, ldflags, cpppath) = library_flags(self, list(libs))
+ (cflags, ldflags, cpppath) = library_flags(self, list(libs))
new_ldflags = getattr(self, 'samba_ldflags', [])[:]
new_ldflags.extend(ldflags)
self.ldflags = new_ldflags
self.sname, self.uselib, self.uselib_local, self.add_objects)
if self.samba_type in ['SUBSYSTEM']:
- # this is needed for the ccflags of libs that come from pkg_config
+ # this is needed for the cflags of libs that come from pkg_config
self.uselib = list(self.final_syslibs)
self.uselib.extend(list(self.direct_syslibs))
for lib in self.final_libs:
- t = self.bld.name_to_obj(lib, self.bld.env)
+ t = self.bld.get_tgen_by_name(lib)
self.uselib.extend(list(t.final_syslibs))
self.uselib = unique_list(self.uselib)
inc_abs = []
for d in inc_deps:
- t = bld.name_to_obj(d, bld.env)
+ t = bld.get_tgen_by_name(d)
bld.ASSERT(t is not None, "Unable to find dependency %s for %s" % (d, self.sname))
inclist = getattr(t, 'samba_includes_extended', [])[:]
if getattr(t, 'local_include', True):
if m is not None:
modules.append(m)
+ if 'pyembed' in self.features:
+ return
+
sentinel = getattr(self, 'init_function_sentinel', 'NULL')
targets = LOCAL_CACHE(bld, 'TARGET_TYPE')
if modules == []:
sname = sname.replace('-','_')
+ sname = sname.replace('.','_')
sname = sname.replace('/','_')
cflags.append('-DSTATIC_%s_MODULES=%s' % (sname, sentinel))
if sentinel == 'NULL':
proto = "extern void __%s_dummy_module_proto(void)" % (sname)
cflags.append('-DSTATIC_%s_MODULES_PROTO=%s' % (sname, proto))
- self.ccflags = cflags
+ self.cflags = cflags
return
for m in modules:
proto += '_MODULE_PROTO(%s)' % f
proto += "extern void __%s_dummy_module_proto(void)" % (m)
cflags.append('-DSTATIC_%s_MODULES_PROTO=%s' % (m, proto))
- self.ccflags = cflags
+ self.cflags = cflags
def check_duplicate_sources(bld, tgt_list):
- '''see if we are compiling the same source file more than once
- without an allow_duplicates attribute'''
+ '''see if we are compiling the same source file more than once'''
debug('deps: checking for duplicate sources')
-
targets = LOCAL_CACHE(bld, 'TARGET_TYPE')
- ret = True
-
- global tstart
for t in tgt_list:
source_list = TO_LIST(getattr(t, 'source', ''))
tpath = os.path.normpath(os_path_relpath(t.path.abspath(bld.env), t.env.BUILD_DIRECTORY + '/default'))
obj_sources = set()
for s in source_list:
+ if not isinstance(s, str):
+ print('strange path in check_duplicate_sources %r' % s)
+ s = s.abspath()
p = os.path.normpath(os.path.join(tpath, s))
if p in obj_sources:
Logs.error("ERROR: source %s appears twice in target '%s'" % (p, t.sname))
# build a list of targets that each source file is part of
for t in tgt_list:
- sources = []
if not targets[t.sname] in [ 'LIBRARY', 'BINARY', 'PYTHON' ]:
continue
for obj in t.add_objects:
- t2 = t.bld.name_to_obj(obj, bld.env)
+ t2 = t.bld.get_tgen_by_name(obj)
source_set = getattr(t2, 'samba_source_set', set())
for s in source_set:
if not s in subsystems:
if len(subsystems[s][tname]) > 1:
raise Utils.WafError("ERROR: source %s is in more than one subsystem of target '%s': %s" % (s, tname, subsystems[s][tname]))
- return ret
-
-
-def check_orphaned_targets(bld, tgt_list):
- '''check if any build targets are orphaned'''
-
- target_dict = LOCAL_CACHE(bld, 'TARGET_TYPE')
-
- debug('deps: checking for orphaned targets')
-
- for t in tgt_list:
- if getattr(t, 'samba_used', False):
- continue
- type = target_dict[t.sname]
- if not type in ['BINARY', 'LIBRARY', 'MODULE', 'ET', 'PYTHON']:
- if re.search('^PIDL_', t.sname) is None:
- Logs.warn("Target %s of type %s is unused by any other target" % (t.sname, type))
-
+ return True
def check_group_ordering(bld, tgt_list):
'''see if we have any dependencies that violate the group ordering
for t in tgt_list:
tdeps = getattr(t, 'add_objects', []) + getattr(t, 'uselib_local', [])
for d in tdeps:
- t2 = bld.name_to_obj(d, bld.env)
+ t2 = bld.get_tgen_by_name(d)
if t2 is None:
continue
map1 = grp_map[t.samba_group]
ret = False
return ret
-
+Build.BuildContext.check_group_ordering = check_group_ordering
def show_final_deps(bld, tgt_list):
'''show the final dependencies for all targets'''
t.samba_abspath = t.path.abspath(bld.env)
t.samba_deps_extended = t.samba_deps[:]
t.samba_includes_extended = TO_LIST(t.samba_includes)[:]
- t.ccflags = getattr(t, 'samba_cflags', '')
+ t.cflags = getattr(t, 'samba_cflags', '')
def replace_grouping_libraries(bld, tgt_list):
'''replace dependencies based on grouping libraries
global_deps = bld.env.GLOBAL_DEPENDENCIES
global_deps_exclude = set()
for dep in global_deps:
- t = bld.name_to_obj(dep, bld.env)
+ t = bld.get_tgen_by_name(dep)
for d in t.samba_deps:
# prevent loops from the global dependencies list
global_deps_exclude.add(d)
implied, t.sname, targets[implied]))
sys.exit(1)
continue
- t2 = bld.name_to_obj(d, bld.env)
+ t2 = bld.get_tgen_by_name(d)
if t2 is None:
Logs.error("no task %s of type %s in %s" % (d, targets[d], t.sname))
sys.exit(1)
dependency_loop(loops, t, obj)
continue
chain.add(obj)
- t2 = bld.name_to_obj(obj, bld.env)
+ t2 = bld.get_tgen_by_name(obj)
r2 = indirect_libs(bld, t2, chain, loops)
chain.remove(obj)
ret = ret.union(t2.direct_libs)
dependency_loop(loops, t, obj)
continue
chain.add(obj)
- t2 = bld.name_to_obj(obj, bld.env)
+ t2 = bld.get_tgen_by_name(obj)
r2 = indirect_libs(bld, t2, chain, loops)
chain.remove(obj)
ret = ret.union(t2.direct_libs)
dependency_loop(loops, t, lib)
continue
chain.add(lib)
- t2 = bld.name_to_obj(lib, bld.env)
+ t2 = bld.get_tgen_by_name(lib)
r2 = indirect_objects(bld, t2, chain, loops)
chain.remove(lib)
ret = ret.union(t2.direct_objects)
for lib in t.final_libs:
if lib in chain:
continue
- t2 = bld.name_to_obj(lib, bld.env)
+ t2 = bld.get_tgen_by_name(lib)
chain.add(lib)
r2 = extended_objects(bld, t2, chain)
chain.remove(lib)
dependency_loop(inc_loops, t, obj)
continue
chain.add(obj)
- t2 = bld.name_to_obj(obj, bld.env)
+ t2 = bld.get_tgen_by_name(obj)
r2 = includes_objects(bld, t2, chain, inc_loops)
chain.remove(obj)
ret = ret.union(t2.direct_objects)
dependency_loop(inc_loops, t, lib)
continue
chain.add(lib)
- t2 = bld.name_to_obj(lib, bld.env)
+ t2 = bld.get_tgen_by_name(lib)
if t2 is None:
targets = LOCAL_CACHE(bld, 'TARGET_TYPE')
Logs.error('Target %s of type %s not found in direct_libs for %s' % (
# expand indirect subsystem and library loops
for loop in loops.copy():
- t = bld.name_to_obj(loop, bld.env)
+ t = bld.get_tgen_by_name(loop)
if t.samba_type in ['SUBSYSTEM']:
loops[loop] = loops[loop].union(t.indirect_objects)
loops[loop] = loops[loop].union(t.direct_objects)
# expand indirect includes loops
for loop in inc_loops.copy():
- t = bld.name_to_obj(loop, bld.env)
+ t = bld.get_tgen_by_name(loop)
inc_loops[loop] = inc_loops[loop].union(t.includes_objects)
if loop in inc_loops[loop]:
inc_loops[loop].remove(loop)
# if we will indirectly link to a target then we don't need it
new = t.final_objects.copy()
for l in t.final_libs:
- t2 = bld.name_to_obj(l, bld.env)
+ t2 = bld.get_tgen_by_name(l)
t2_obj = extended_objects(bld, t2, set())
dup = new.intersection(t2_obj)
if t.sname in rely_on:
# add back in any objects that were relied upon by the reduction rules
for r in rely_on:
- t = bld.name_to_obj(r, bld.env)
+ t = bld.get_tgen_by_name(r)
t.final_objects = t.final_objects.union(rely_on[r])
return True
def show_library_loop(bld, lib1, lib2, path, seen):
'''show the detailed path of a library loop between lib1 and lib2'''
- t = bld.name_to_obj(lib1, bld.env)
+ t = bld.get_tgen_by_name(lib1)
if not lib2 in getattr(t, 'final_libs', set()):
return
# replace lib deps with objlist deps
for l in t.final_libs:
objname = l + '.objlist'
- t2 = bld.name_to_obj(objname, bld.env)
+ t2 = bld.get_tgen_by_name(objname)
if t2 is None:
Logs.error('ERROR: subsystem %s not found' % objname)
sys.exit(1)
objname = module_name
else:
continue
- t2 = bld.name_to_obj(objname, bld.env)
+ t2 = bld.get_tgen_by_name(objname)
if t2 is None:
Logs.error('ERROR: subsystem %s not found' % objname)
sys.exit(1)
for t in tgt_list:
if t.samba_type in ['LIBRARY', 'PYTHON']:
for l in t.final_libs.copy():
- t2 = bld.name_to_obj(l, bld.env)
+ t2 = bld.get_tgen_by_name(l)
if t.sname in t2.final_libs:
if getattr(bld.env, "ALLOW_CIRCULAR_LIB_DEPENDENCIES", False):
# we could break this in either direction. If one of the libraries
diff.remove(t.sname)
# make sure we don't recreate the loop again!
for d in diff.copy():
- t2 = bld.name_to_obj(d, bld.env)
+ t2 = bld.get_tgen_by_name(d)
if t2.samba_type == 'LIBRARY':
if t.sname in t2.final_libs:
debug('deps: removing expansion %s from %s', d, t.sname)
continue
syslibs = set()
for d in t.final_objects:
- t2 = bld.name_to_obj(d, bld.env)
+ t2 = bld.get_tgen_by_name(d)
syslibs = syslibs.union(t2.direct_syslibs)
# this adds the indirect syslibs as well, which may not be needed
# depending on the linker flags
for d in t.final_libs:
- t2 = bld.name_to_obj(d, bld.env)
+ t2 = bld.get_tgen_by_name(d)
syslibs = syslibs.union(t2.direct_syslibs)
t.final_syslibs = syslibs
for t in tgt_list:
if t.samba_type in ['LIBRARY', 'PYTHON']:
for l in t.final_libs.copy():
- t2 = bld.name_to_obj(l, bld.env)
+ t2 = bld.get_tgen_by_name(l)
if t.sname in t2.final_libs:
Logs.error('ERROR: Unresolved library loop %s from %s' % (t.sname, t2.sname))
lib_loop_error = True
if target in seen:
return
- t = bld.name_to_obj(target, bld.env)
+ t = bld.get_tgen_by_name(target)
if t is None:
Logs.error("ERROR: Unable to find target '%s'" % target)
sys.exit(1)
if not targets[t.sname] in [ 'LIBRARY', 'PYTHON' ]:
continue
for n in getattr(t, 'final_objects', set()):
- t2 = bld.name_to_obj(n, bld.env)
+ t2 = bld.get_tgen_by_name(n)
if not n in used_by:
used_by[n] = set()
used_by[n].add(t.sname)
savedeps_inputs = ['samba_deps', 'samba_includes', 'local_include', 'local_include_first', 'samba_cflags',
'source', 'grouping_library', 'samba_ldflags', 'allow_undefined_symbols',
'use_global_deps', 'global_include' ]
-savedeps_outputs = ['uselib', 'uselib_local', 'add_objects', 'includes', 'ccflags', 'ldflags', 'samba_deps_extended']
+savedeps_outputs = ['uselib', 'uselib_local', 'add_objects', 'includes',
+ 'cflags', 'ldflags', 'samba_deps_extended', 'final_libs']
savedeps_outenv = ['INC_PATHS']
savedeps_envvars = ['NONSHARED_BINARIES', 'GLOBAL_DEPENDENCIES', 'EXTRA_CFLAGS', 'EXTRA_LDFLAGS', 'EXTRA_INCLUDES' ]
savedeps_caches = ['GLOBAL_DEPENDENCIES', 'TARGET_TYPE', 'INIT_FUNCTIONS', 'SYSLIB_DEPS']
denv.outenv[t.sname] = tdeps
depsfile = os.path.join(bld.bdir, "sambadeps")
- denv.store(depsfile)
+ denv.store_fast(depsfile)
denv = Environment.Environment()
try:
debug('deps: checking saved dependencies')
- denv.load(depsfile)
+ denv.load_fast(depsfile)
if (denv.version != savedeps_version or
denv.savedeps_inputs != savedeps_inputs or
denv.savedeps_outputs != savedeps_outputs):
return False
- except:
+ except Exception:
return False
# check if critical files have changed
debug('deps: project rules stage1 completed')
- #check_orphaned_targets(bld, tgt_list)
-
if not check_duplicate_sources(bld, tgt_list):
Logs.error("Duplicate sources present - aborting")
sys.exit(1)
debug("deps: check_duplicate_sources: %f" % (time.clock() - tstart))
- if not check_group_ordering(bld, tgt_list):
+ if not bld.check_group_ordering(tgt_list):
Logs.error("Bad group ordering - aborting")
sys.exit(1)