mirror of
https://github.com/samba-team/samba.git
synced 2024-12-22 13:34:15 +03:00
910a331f3e
Signed-off-by: David Mulder <dmulder@samba.org> Reviewed-by: Alexander Bokovoy <ab@samba.org>
90 lines
3.4 KiB
Python
90 lines
3.4 KiB
Python
from waflib.Configure import conf
|
|
from waflib import Build
|
|
import os
|
|
|
|
@conf
|
|
def SAMBA_CHECK_RUST(conf):
|
|
conf.find_program('cargo', var='CARGO',
|
|
mandatory=conf.env.enable_rust)
|
|
|
|
def vendor_sources(bld, enabled=True):
|
|
# force-disable when we can't build rust modules, so
|
|
# every single call doesn't need to pass this in.
|
|
if not bld.env.enable_rust:
|
|
enabled = False
|
|
|
|
# Save time, no need to build rust when fuzzing
|
|
if bld.env.enable_fuzzing:
|
|
enabled = False
|
|
|
|
# Determine the vendor directory
|
|
vendor = bld.path.find_or_declare('./vendor')
|
|
# WAF dependencies can only be explicit files, not directories, so we touch
|
|
# a file to indicate vendoring has been completed.
|
|
vendor_exists = '%s.exists' % vendor
|
|
# Locate the source manifest file
|
|
source_manifest = bld.path.find_or_declare('../../../rust/Cargo.toml')
|
|
|
|
rule = ['${CARGO}', 'vendor',
|
|
'--manifest-path=${SRC[0].abspath(env)}',
|
|
'%s' % vendor,
|
|
'&& touch %s' % vendor_exists]
|
|
bld.SAMBA_GENERATOR('vendor.exists',
|
|
' '.join(rule),
|
|
source=source_manifest,
|
|
target=vendor_exists,
|
|
group='final',
|
|
enabled=enabled)
|
|
Build.BuildContext.vendor_sources = vendor_sources
|
|
|
|
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 not bld.env.enable_rust:
|
|
enabled = False
|
|
|
|
# Save time, no need to build rust when fuzzing
|
|
if bld.env.enable_fuzzing:
|
|
enabled = False
|
|
|
|
release_flag = ''
|
|
if bld.env.debug or bld.env.developer:
|
|
target = os.path.join('debug', target_name)
|
|
else:
|
|
release_flag = '--release'
|
|
target = os.path.join('release', target_name)
|
|
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)}',
|
|
'--target-dir=%s' % target_dir,
|
|
release_flag]
|
|
bld.SAMBA_GENERATOR(target_name,
|
|
' '.join(rule),
|
|
source='%s/Cargo.toml vendor.exists %s' % \
|
|
(rust_subdir, ' '.join(sources)),
|
|
target=target,
|
|
group='final',
|
|
enabled=enabled)
|
|
Build.BuildContext.SAMBA_RUST_LIBRARY = SAMBA_RUST
|
|
Build.BuildContext.SAMBA_RUST_BINARY = SAMBA_RUST
|