@if test "$(PYTHON)" = ":"; then echo "Settings definitions have changed, python is needed to regenerate the related settings files but python was not found. Please install python and re-run configure"; exit 1; fi
@if ! $(PYTHON) --version | grep -q "Python 3"; then echo $(PYTHON) should be at least version 3. Please install python 3 and re-run configure; exit 1; fi
$(MAKE) -C rust clean
- (cd ${srcdir} && $(PYTHON) dnsdist-settings-generator.py ../dnsdist-settings-definitions.yml)
+ (cd ${srcdir} && $(PYTHON) dnsdist-settings-generator.py ../dnsdist-settings-definitions.yml ./)
$(PYTHON) dnsdist-settings-documentation-generator.py
// !! This file has been generated by dnsdist-settings-generator.py, do not edit by hand!!
-// START INCLUDE ./dnsdist-configuration-yaml-items-generated-pre-in.cc
+// START INCLUDE dnsdist-configuration-yaml-items-generated-pre-in.cc
/*
* This file is part of PowerDNS or dnsdist.
* Copyright -- PowerDNS.COM B.V. and its contributors
#include "dnsdist-configuration.hh"
#include "dnsdist-configuration-yaml.hh"
-// END INCLUDE ./dnsdist-configuration-yaml-items-generated-pre-in.cc
+// END INCLUDE dnsdist-configuration-yaml-items-generated-pre-in.cc
#if defined(HAVE_YAML_CONFIGURATION)
#include "rust/cxx.h"
#include "rust/lib.rs.h"
def include_file(out_fp, include_file_name):
with open(include_file_name, mode='r', encoding='utf-8') as in_fp:
- out_fp.write(f'// START INCLUDE {include_file_name}\n')
+ basename = os.path.basename(include_file_name)
+ out_fp.write(f'// START INCLUDE {basename}\n')
out_fp.write(in_fp.read())
- out_fp.write(f'// END INCLUDE {include_file_name}\n')
+ out_fp.write(f'// END INCLUDE {basename}\n')
-def generate_flat_settings_for_cxx(definitions, out_file_path):
+def generate_flat_settings_for_cxx(definitions, src_dir, out_file_path):
cxx_flat_settings_fp = get_temporary_file_for_generated_code(out_file_path)
- include_file(cxx_flat_settings_fp, out_file_path + 'dnsdist-configuration-yaml-items-generated-pre-in.cc')
+ include_file(cxx_flat_settings_fp, src_dir + '/dnsdist-configuration-yaml-items-generated-pre-in.cc')
# first we do runtime-settable settings
cxx_flat_settings_fp.write('''#if defined(HAVE_YAML_CONFIGURATION)
#endif /* defined(HAVE_YAML_CONFIGURATION) */
''')
- os.rename(cxx_flat_settings_fp.name, out_file_path + 'dnsdist-configuration-yaml-items-generated.cc')
+ os.rename(cxx_flat_settings_fp.name, out_file_path + '/dnsdist-configuration-yaml-items-generated.cc')
def generate_actions_config(output, response, default_functions):
suffix = 'ResponseAction' if response else 'Action'
return generated_fp
def main():
- if len(sys.argv) != 2:
- print(f'Usage: {sys.argv[0]} <path/to/definitions/file>')
+ if len(sys.argv) != 3 and len(sys.argv) != 4:
+ print(f'Usage: {sys.argv[0]} <path/to/definitions/file> <rust/output/dir> <cxx/output/dir>')
sys.exit(1)
- src_dir = './'
+ src_dir = sys.argv[2]
+ if len(sys.argv) != 4:
+ cxx_dest_dir = src_dir
+ else:
+ cxx_dest_dir = sys.argv[3]
definitions = get_definitions_from_file(sys.argv[1])
default_functions = []
validation_functions = []
generate_cpp_selector_wrappers()
generated_fp = get_temporary_file_for_generated_code(src_dir + '/rust/src/')
- include_file(generated_fp, src_dir + 'rust-pre-in.rs')
+ include_file(generated_fp, src_dir + '/rust-pre-in.rs')
generate_actions_config(generated_fp, False, default_functions)
generate_actions_config(generated_fp, True, default_functions)
generate_selectors_config(generated_fp, default_functions)
- generate_flat_settings_for_cxx(definitions, src_dir)
+ generate_flat_settings_for_cxx(definitions, src_dir, cxx_dest_dir)
handle_structures(generated_fp, definitions, default_functions, validation_functions)
generate_cpp_action_selector_functions_callable_from_rust(generated_fp)
- include_file(generated_fp, src_dir + 'rust-middle-in.rs')
+ include_file(generated_fp, src_dir + '/rust-middle-in.rs')
# we are now outside of the dnsdistsettings namespace
# generate the special global configuration Serde structure
generate_rust_action_to_config(generated_fp, True)
generate_rust_selector_to_config(generated_fp)
- include_file(generated_fp, src_dir + 'rust-post-in.rs')
+ include_file(generated_fp, src_dir + '/rust-post-in.rs')
os.rename(generated_fp.name, src_dir + '/rust/src/lib.rs')
--- /dev/null
+sources = files(
+ 'dnsdist-settings-generator.py',
+ '../dnsdist-settings-definitions.yml',
+ 'dnsdist-configuration-yaml-items-generated-pre-in.cc',
+ 'dnsdist-configuration-yaml-items-generated.cc',
+ 'dnsdist-settings-documentation-generator.py',
+ 'rust-pre-in.rs',
+ 'rust-middle-in.rs',
+ 'rust-post-in.rs',
+)
+
+generated = [
+ 'dnsdist-configuration-yaml-items-generated.cc',
+]
+
+python = find_program('python3')
+
+rust_lib_sources = custom_target(
+ command: [python, '@INPUT0@', '@INPUT1@', '@SOURCE_ROOT@/dnsdist-rust-lib', '@BUILD_ROOT@/dnsdist-rust-lib'],
+ input: sources,
+ output: generated,
+)
+
+dep_rust_lib = declare_dependency(
+ sources: [rust_lib_sources,],
+ include_directories: [include_directories('.'), ]
+)
+
+subdir('rust')
--- /dev/null
+#!/bin/sh -e
+
+#echo "PWD=$PWD"
+#echo "srcdir=$srcdir"
+#echo "builddir=$builddir"
+
+$CARGO build --release $RUST_TARGET --target-dir=$builddir/target --manifest-path $srcdir/Cargo.toml
+
+cp -p target/$RUSTC_TARGET_ARCH/release/libdnsdist_rust.a $builddir/dnsdist-rust-lib/rust/libdnsdist_rust.a
+cp -p target/$RUSTC_TARGET_ARCH/cxxbridge/dnsdist-rust/src/lib.rs.h $srcdir/lib.rs.h
+cp -p target/$RUSTC_TARGET_ARCH/cxxbridge/dnsdist-rust/src/lib.rs.h $builddir/dnsdist-rust-lib/rust/lib.rs.h
+cp -p target/$RUSTC_TARGET_ARCH/cxxbridge/rust/cxx.h $srcdir/cxx.h
+cp -p target/$RUSTC_TARGET_ARCH/cxxbridge/rust/cxx.h $builddir/dnsdist-rust-lib/rust/cxx.h
--- /dev/null
+build = find_program('build_dnsdist_rust_library')
+cargo = find_program('cargo')
+infile = 'Cargo.toml'
+outfile = 'libdnsdist_rust.a'
+
+env = environment()
+env.append('CARGO', cargo.full_path())
+env.append('SYSCONFDIR', conf.get('SYSCONFDIR'))
+env.append('builddir', '.')
+env.append('srcdir', meson.current_source_dir())
+env.append('RUST_TARGET', '')
+env.append('RUSTC_TARGET_ARCH', '')
+
+lib_dnsdist_rust = custom_target('libdnsdist_rust.a',
+ output: [outfile, 'cxx.h'],
+ input: infile,
+ command: [build,
+ ],
+ depend_files: [
+ 'src/helpers.rs',
+ ],
+ depends: rust_lib_sources,
+ env: env,
+ console: true,
+)
+
+dep_dnsdist_rust_lib = declare_dependency(
+ link_with: lib_dnsdist_rust[0],
+ sources: lib_dnsdist_rust[1],
+ include_directories: [include_directories('..')],
+)
// !! This file has been generated by dnsdist-settings-generator.py, do not edit by hand!!
-// START INCLUDE ./rust-pre-in.rs
+// START INCLUDE rust-pre-in.rs
use serde::{Deserialize, Serialize};
mod helpers;
struct SharedDNSResponseAction {
action: SharedPtr<DNSResponseActionWrapper>,
}
-// END INCLUDE ./rust-pre-in.rs
+// END INCLUDE rust-pre-in.rs
#[derive(Deserialize, Serialize, Debug, PartialEq)]
#[serde(deny_unknown_fields)]
struct AllowActionConfiguration {
fn getTCPSelector(config: &TCPSelectorConfiguration) -> SharedPtr<DNSSelector>;
fn getTrailingDataSelector(config: &TrailingDataSelectorConfiguration) -> SharedPtr<DNSSelector>;
}
-// START INCLUDE ./rust-middle-in.rs
+// START INCLUDE rust-middle-in.rs
/*
* Functions callable from C++
*/
Ok(())
}
}
-// END INCLUDE ./rust-middle-in.rs
+// END INCLUDE rust-middle-in.rs
#[derive(Deserialize, Serialize, Debug, PartialEq)]
#[serde(deny_unknown_fields)]
struct GlobalConfigurationSerde {
}
None
}
-// START INCLUDE ./rust-post-in.rs
+// START INCLUDE rust-post-in.rs
fn get_selectors_from_serde(
selectors_from_serde: &Vec<Selector>,
) -> Vec<dnsdistsettings::SharedDNSSelector> {
get_global_configuration_from_serde(serde_config?);
return Ok(config);
}
-// END INCLUDE ./rust-post-in.rs
+// END INCLUDE rust-post-in.rs
subdir('meson' / 'doh2') # DNS over HTTP/2
subdir('meson' / 'doq') # DNS over QUIC
subdir('meson' / 'doh3') # DNS over HTTP/3
+subdir('meson' / 'yaml-configuration') # YAML configuration
common_sources = []
dep_lmdb_safe = declare_dependency()
endif
+if get_option('yaml').allowed()
+ subdir('dnsdist-rust-lib')
+else
+ dep_dnsdist_rust_lib = declare_dependency()
+endif
+
common_sources += files(
src_dir / 'bpf-filter.cc',
src_dir / 'capabilities.cc',
src_dir / 'credentials.cc',
src_dir / 'dns.cc',
src_dir / 'dnscrypt.cc',
+ src_dir / 'dnsdist-actions.cc',
+ src_dir / 'dnsdist-actions-factory.cc',
src_dir / 'dnsdist-async.cc',
src_dir / 'dnsdist-backend.cc',
src_dir / 'dnsdist-cache.cc',
src_dir / 'dnsdist-carbon.cc',
src_dir / 'dnsdist-configuration.cc',
+ src_dir / 'dnsdist-configuration-yaml.cc',
src_dir / 'dnsdist-console.cc',
src_dir / 'dnsdist-crypto.cc',
src_dir / 'dnsdist-discovery.cc',
src_dir / 'dnsdist-lua-bindings-packetcache.cc',
src_dir / 'dnsdist-lua-bindings-protobuf.cc',
src_dir / 'dnsdist-lua-bindings-rings.cc',
+ src_dir / 'dnsdist-lua-configuration-items.cc',
src_dir / 'dnsdist-lua.cc',
src_dir / 'dnsdist-lua-ffi.cc',
src_dir / 'dnsdist-lua-hooks.cc',
src_dir / 'dnsdist-rules.cc',
src_dir / 'dnsdist-secpoll.cc',
src_dir / 'dnsdist-session-cache.cc',
+ src_dir / 'dnsdist-self-answers.cc',
src_dir / 'dnsdist-snmp.cc',
src_dir / 'dnsdist-svc.cc',
src_dir / 'dnsdist-systemd.cc',
],
'condition': dep_libquiche.found(),
},
+ 'yaml': {
+ 'sources': [
+ src_dir / 'dnsdist-rust-lib/dnsdist-configuration-yaml-items-generated.cc',
+ ],
+ 'condition': dep_dnsdist_rust_lib.found(),
+ }
}
foreach name, info: conditional_sources
dep_threads,
dep_libbpf,
dep_libxdp,
+ dep_dnsdist_rust_lib,
]
libdnsdist_dnslabeltext_source = src_dir / 'dnslabeltext.rl'
--- /dev/null
+opt_yaml = get_option('yaml')
+
+conf.set('HAVE_YAML_CONFIGURATION', opt_yaml.allowed(), description: 'Whether we have YAML configuration')
+
+summary('YAML configuration', opt_yaml, bool_yn: true, section: 'YAML configuration')
option('fuzz-targets', type: 'boolean', value: false, description: 'Enable fuzzing targets')
option('ebpf', type: 'feature', value: 'disabled', description: 'Enable eBPF support')
option('fuzzer_ldflags', type: 'string', value: '', description: 'Linker flags used for the fuzzing targets (a path to the libFuzzer static library, for example)')
+option('yaml', type: 'feature', value: 'disabled', description: 'Enable YAML configuration')