]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Fix remaining build issues for YAML with meson
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 24 Jan 2025 15:12:44 +0000 (16:12 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 28 Jan 2025 13:59:31 +0000 (14:59 +0100)
pdns/dnsdistdist/dnsdist-rust-lib/Makefile.am
pdns/dnsdistdist/dnsdist-rust-lib/dnsdist-configuration-yaml-items-generated.cc
pdns/dnsdistdist/dnsdist-rust-lib/dnsdist-settings-generator.py
pdns/dnsdistdist/dnsdist-rust-lib/meson.build [new file with mode: 0644]
pdns/dnsdistdist/dnsdist-rust-lib/rust/build_dnsdist_rust_library [new file with mode: 0644]
pdns/dnsdistdist/dnsdist-rust-lib/rust/meson.build [new file with mode: 0644]
pdns/dnsdistdist/dnsdist-rust-lib/rust/src/lib.rs
pdns/dnsdistdist/meson.build
pdns/dnsdistdist/meson/yaml-configuration/meson.build [new file with mode: 0644]
pdns/dnsdistdist/meson_options.txt

index e023c81c8f8785cfcd35c3a4aa0b7b819ac03bb3..e7a683b9a3bade3dca7ff2e3a41938399c9942f2 100644 (file)
@@ -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
index fa81278bbd107c1204045ea5354135277409c3e7..ddbea89ed4946b8ff60c2613cbb3468798d41897 100644 (file)
@@ -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"
index 755f372f3544d6f1b10251d5e4368c1e68c3ec66..e2412e4bb71b30781f2062d7f4a89b049305b997 100644 (file)
@@ -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]} <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 = []
@@ -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 (file)
index 0000000..ee14a75
--- /dev/null
@@ -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 (file)
index 0000000..3abfba8
--- /dev/null
@@ -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 (file)
index 0000000..15c3705
--- /dev/null
@@ -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('..')],
+)
index f6c3fba075e6b6de4ac802f9b192bf5acc4168b5..7366076b88011171d53d6f98bbf72973e387fc01 100644 (file)
@@ -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<DNSResponseActionWrapper>,
     }
-// 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<DNSSelector>;
         fn getTrailingDataSelector(config: &TrailingDataSelectorConfiguration) -> SharedPtr<DNSSelector>;
     }
-// 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<dnsdistsettings::S
     }
     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> {
@@ -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
index a62e50b523aaa154910b23628eb3057ca6ddb2d8..e5e430298e7d267d37ef89e8d1f20bb217c7401c 100644 (file)
@@ -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 (file)
index 0000000..ee3fa42
--- /dev/null
@@ -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')
index 7798899149c5c205185c6665191456464590e512..e860bdf833be5cf14852fdd87c10d23c433b432c 100644 (file)
@@ -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')