from waflib.Configure import conf
from waflib import Build
-import os.path
+import os
@conf
def SAMBA_CHECK_RUST(conf):
conf.find_program('cargo', var='CARGO',
mandatory=not conf.env.disable_rust)
-def SAMBA_RUST(bld, rust_subdir, target_name, source, enabled=True):
+def find_sources(source_dir, dep_crate):
+ sources = []
+ for root, dirs, files in os.walk(os.path.join(source_dir, dep_crate)):
+ for file in files:
+ if os.path.splitext(file)[-1] in ['.rs', '.c', '.h']:
+ sources.append(os.path.join(root, file))
+ return sources
+
+def SAMBA_RUST(bld, rust_subdir, target_name, dep_crates=[], enabled=True):
# force-disable when we can't build rust modules, so
# every single call doesn't need to pass this in.
if bld.env.disable_rust:
target = bld.path.find_or_declare(target)
# The Rust target directory is one directory above the located target
target_dir = os.path.join(os.path.dirname('%s' % target), '../')
+ # Try to determine the source directory
+ source_dir = os.path.abspath(os.path.join(target_dir, '../../../rust'))
+ if not os.path.exists(source_dir):
+ raise Exception('Failed to determine rust source directory')
+ # Now determine the sources of each local crate
+ sources = find_sources(source_dir, rust_subdir)
+ for dep_crate in dep_crates:
+ sources.extend(find_sources(source_dir, dep_crate))
+ sources = [os.path.relpath(p, source_dir) for p in sources]
rule = ['${CARGO}', 'build',
'--manifest-path=${SRC[0].abspath(env)}',
release_flag]
bld.SAMBA_GENERATOR(target_name,
' '.join(rule),
- source='%s/Cargo.toml %s' % (rust_subdir, source),
+ source='%s/Cargo.toml %s' % (rust_subdir, ' '.join(sources)),
target=target,
group='final',
enabled=enabled)
#!/usr/bin/env python
if conf.env.enable_himmelblau:
- bld.SAMBA_RUST_BINARY('himmelblaud', 'himmelblaud', 'himmelblaud/src/main.rs param/src/lib.rs chelps/src/lib.rs dbg/src/lib.rs ntstatus_gen/src/lib.rs sock/src/lib.rs tdb/src/lib.rs version/src/lib.rs')
- bld.SAMBA_RUST_LIBRARY('nss', 'libnss_himmelblau.so', 'nss/src/lib.rs sock/src/lib.rs ntstatus_gen/src/lib.rs param/src/lib.rs version/src/lib.rs')
- bld.SAMBA_RUST_LIBRARY('pam', 'libpam_himmelblau.so', 'pam/src/lib.rs pam/src/pam/constants.rs pam/src/pam/conv.rs pam/src/pam/items.rs pam/src/pam/items.rs pam/src/pam/macros.rs pam/src/pam/mod.rs pam/src/pam/module.rs sock/src/lib.rs ntstatus_gen/src/lib.rs param/src/lib.rs version/src/lib.rs')
+ bld.SAMBA_RUST_BINARY('himmelblaud', 'himmelblaud',
+ ['param',
+ 'chelps',
+ 'dbg',
+ 'ntstatus_gen',
+ 'sock',
+ 'tdb',
+ 'version',
+ 'idmap'])
+ bld.SAMBA_RUST_LIBRARY('nss', 'libnss_himmelblau.so', ['sock',
+ 'ntstatus_gen',
+ 'param',
+ 'version'])
+ bld.SAMBA_RUST_LIBRARY('pam', 'libpam_himmelblau.so', ['sock',
+ 'chelps',
+ 'param',
+ 'version'])