Skip to content

Commit

Permalink
dnsdist: Fix remaining build issues for YAML with meson
Browse files Browse the repository at this point in the history
  • Loading branch information
rgacogne committed Jan 28, 2025
1 parent 89fb2a0 commit 6e4d700
Show file tree
Hide file tree
Showing 10 changed files with 124 additions and 21 deletions.
2 changes: 1 addition & 1 deletion pdns/dnsdistdist/dnsdist-rust-lib/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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"
Expand Down
29 changes: 17 additions & 12 deletions pdns/dnsdistdist/dnsdist-rust-lib/dnsdist-settings-generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -375,7 +376,7 @@ def generate_flat_settings_for_cxx(definitions, out_file_path):
#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'
Expand Down Expand Up @@ -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 = []
Expand All @@ -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
Expand All @@ -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')

Expand Down
29 changes: 29 additions & 0 deletions pdns/dnsdistdist/dnsdist-rust-lib/meson.build
Original file line number Diff line number Diff line change
@@ -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')
13 changes: 13 additions & 0 deletions pdns/dnsdistdist/dnsdist-rust-lib/rust/build_dnsdist_rust_library
Original file line number Diff line number Diff line change
@@ -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
31 changes: 31 additions & 0 deletions pdns/dnsdistdist/dnsdist-rust-lib/rust/meson.build
Original file line number Diff line number Diff line change
@@ -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('..')],
)
12 changes: 6 additions & 6 deletions pdns/dnsdistdist/dnsdist-rust-lib/rust/src/lib.rs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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++
*/
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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> {
Expand Down Expand Up @@ -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
19 changes: 19 additions & 0 deletions pdns/dnsdistdist/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []

Expand All @@ -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',
Expand All @@ -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',
Expand Down Expand Up @@ -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',
Expand All @@ -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',
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -344,6 +362,7 @@ deps = [
dep_threads,
dep_libbpf,
dep_libxdp,
dep_dnsdist_rust_lib,
]

libdnsdist_dnslabeltext_source = src_dir / 'dnslabeltext.rl'
Expand Down
5 changes: 5 additions & 0 deletions pdns/dnsdistdist/meson/yaml-configuration/meson.build
Original file line number Diff line number Diff line change
@@ -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')
1 change: 1 addition & 0 deletions pdns/dnsdistdist/meson_options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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')

0 comments on commit 6e4d700

Please sign in to comment.