From b155625606bf50f9c9e1db514f4ec325d151d08c Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Fri, 24 Jan 2025 16:12:44 +0100 Subject: [PATCH] dnsdist: Fix remaining build issues for YAML with meson --- pdns/dnsdistdist/dnsdist-rust-lib/Makefile.am | 2 +- ...dist-configuration-yaml-items-generated.cc | 4 +-- .../dnsdist-settings-generator.py | 29 ++++++++++------- pdns/dnsdistdist/dnsdist-rust-lib/meson.build | 29 +++++++++++++++++ .../rust/build_dnsdist_rust_library | 13 ++++++++ .../dnsdist-rust-lib/rust/meson.build | 31 +++++++++++++++++++ .../dnsdist-rust-lib/rust/src/lib.rs | 12 +++---- pdns/dnsdistdist/meson.build | 19 ++++++++++++ .../meson/yaml-configuration/meson.build | 5 +++ pdns/dnsdistdist/meson_options.txt | 1 + 10 files changed, 124 insertions(+), 21 deletions(-) create mode 100644 pdns/dnsdistdist/dnsdist-rust-lib/meson.build create mode 100644 pdns/dnsdistdist/dnsdist-rust-lib/rust/build_dnsdist_rust_library create mode 100644 pdns/dnsdistdist/dnsdist-rust-lib/rust/meson.build create mode 100644 pdns/dnsdistdist/meson/yaml-configuration/meson.build diff --git a/pdns/dnsdistdist/dnsdist-rust-lib/Makefile.am b/pdns/dnsdistdist/dnsdist-rust-lib/Makefile.am index e023c81c8f..e7a683b9a3 100644 --- a/pdns/dnsdistdist/dnsdist-rust-lib/Makefile.am +++ b/pdns/dnsdistdist/dnsdist-rust-lib/Makefile.am @@ -17,5 +17,5 @@ rust/src/lib.rs dnsdist-configuration-yaml-items-generated.cc: dnsdist-settings- @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 diff --git a/pdns/dnsdistdist/dnsdist-rust-lib/dnsdist-configuration-yaml-items-generated.cc b/pdns/dnsdistdist/dnsdist-rust-lib/dnsdist-configuration-yaml-items-generated.cc index fa81278bbd..ddbea89ed4 100644 --- a/pdns/dnsdistdist/dnsdist-rust-lib/dnsdist-configuration-yaml-items-generated.cc +++ b/pdns/dnsdistdist/dnsdist-rust-lib/dnsdist-configuration-yaml-items-generated.cc @@ -1,5 +1,5 @@ // !! 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 @@ -24,7 +24,7 @@ #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" diff --git a/pdns/dnsdistdist/dnsdist-rust-lib/dnsdist-settings-generator.py b/pdns/dnsdistdist/dnsdist-rust-lib/dnsdist-settings-generator.py index 755f372f35..e2412e4bb7 100644 --- a/pdns/dnsdistdist/dnsdist-rust-lib/dnsdist-settings-generator.py +++ b/pdns/dnsdistdist/dnsdist-rust-lib/dnsdist-settings-generator.py @@ -302,14 +302,15 @@ def get_definitions_from_file(def_file): 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) @@ -375,7 +376,7 @@ void convertRuntimeFlatSettingsFromRust(const dnsdist::rust::settings::GlobalCon #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' @@ -750,11 +751,15 @@ def get_temporary_file_for_generated_code(directory): return generated_fp def main(): - if len(sys.argv) != 2: - print(f'Usage: {sys.argv[0]} ') + if len(sys.argv) != 3 and len(sys.argv) != 4: + print(f'Usage: {sys.argv[0]} ') 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 = [] @@ -766,19 +771,19 @@ def main(): 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 @@ -802,7 +807,7 @@ def main(): 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') diff --git a/pdns/dnsdistdist/dnsdist-rust-lib/meson.build b/pdns/dnsdistdist/dnsdist-rust-lib/meson.build new file mode 100644 index 0000000000..ee14a7547c --- /dev/null +++ b/pdns/dnsdistdist/dnsdist-rust-lib/meson.build @@ -0,0 +1,29 @@ +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') diff --git a/pdns/dnsdistdist/dnsdist-rust-lib/rust/build_dnsdist_rust_library b/pdns/dnsdistdist/dnsdist-rust-lib/rust/build_dnsdist_rust_library new file mode 100644 index 0000000000..3abfba88dd --- /dev/null +++ b/pdns/dnsdistdist/dnsdist-rust-lib/rust/build_dnsdist_rust_library @@ -0,0 +1,13 @@ +#!/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 diff --git a/pdns/dnsdistdist/dnsdist-rust-lib/rust/meson.build b/pdns/dnsdistdist/dnsdist-rust-lib/rust/meson.build new file mode 100644 index 0000000000..15c3705851 --- /dev/null +++ b/pdns/dnsdistdist/dnsdist-rust-lib/rust/meson.build @@ -0,0 +1,31 @@ +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('..')], +) diff --git a/pdns/dnsdistdist/dnsdist-rust-lib/rust/src/lib.rs b/pdns/dnsdistdist/dnsdist-rust-lib/rust/src/lib.rs index f6c3fba075..7366076b88 100644 --- a/pdns/dnsdistdist/dnsdist-rust-lib/rust/src/lib.rs +++ b/pdns/dnsdistdist/dnsdist-rust-lib/rust/src/lib.rs @@ -1,5 +1,5 @@ // !! 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; @@ -82,7 +82,7 @@ mod dnsdistsettings { struct SharedDNSResponseAction { action: SharedPtr, } -// END INCLUDE ./rust-pre-in.rs +// END INCLUDE rust-pre-in.rs #[derive(Deserialize, Serialize, Debug, PartialEq)] #[serde(deny_unknown_fields)] struct AllowActionConfiguration { @@ -2253,7 +2253,7 @@ mod dnsdistsettings { fn getTCPSelector(config: &TCPSelectorConfiguration) -> SharedPtr; fn getTrailingDataSelector(config: &TrailingDataSelectorConfiguration) -> SharedPtr; } -// START INCLUDE ./rust-middle-in.rs +// START INCLUDE rust-middle-in.rs /* * Functions callable from C++ */ @@ -2351,7 +2351,7 @@ impl ResponseRuleConfigurationSerde { Ok(()) } } -// END INCLUDE ./rust-middle-in.rs +// END INCLUDE rust-middle-in.rs #[derive(Deserialize, Serialize, Debug, PartialEq)] #[serde(deny_unknown_fields)] struct GlobalConfigurationSerde { @@ -4390,7 +4390,7 @@ fn get_one_selector_from_serde(selector: &Selector) -> Option, ) -> Vec { @@ -4515,4 +4515,4 @@ pub fn from_yaml_string( get_global_configuration_from_serde(serde_config?); return Ok(config); } -// END INCLUDE ./rust-post-in.rs +// END INCLUDE rust-post-in.rs diff --git a/pdns/dnsdistdist/meson.build b/pdns/dnsdistdist/meson.build index a62e50b523..e5e430298e 100644 --- a/pdns/dnsdistdist/meson.build +++ b/pdns/dnsdistdist/meson.build @@ -78,6 +78,7 @@ subdir('meson' / 'dot') # DNS over TLS 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 = [] @@ -101,6 +102,12 @@ else 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', @@ -109,11 +116,14 @@ common_sources += files( 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', @@ -141,6 +151,7 @@ common_sources += files( 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', @@ -165,6 +176,7 @@ common_sources += files( 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', @@ -235,6 +247,12 @@ conditional_sources = { ], '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 @@ -344,6 +362,7 @@ deps = [ dep_threads, dep_libbpf, dep_libxdp, + dep_dnsdist_rust_lib, ] libdnsdist_dnslabeltext_source = src_dir / 'dnslabeltext.rl' diff --git a/pdns/dnsdistdist/meson/yaml-configuration/meson.build b/pdns/dnsdistdist/meson/yaml-configuration/meson.build new file mode 100644 index 0000000000..ee3fa42193 --- /dev/null +++ b/pdns/dnsdistdist/meson/yaml-configuration/meson.build @@ -0,0 +1,5 @@ +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') diff --git a/pdns/dnsdistdist/meson_options.txt b/pdns/dnsdistdist/meson_options.txt index 7798899149..e860bdf833 100644 --- a/pdns/dnsdistdist/meson_options.txt +++ b/pdns/dnsdistdist/meson_options.txt @@ -36,3 +36,4 @@ option('xsk', type: 'feature', value: 'auto', description: 'Enable AF_XDP / XSK' 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') -- 2.47.2