]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Hopefully fixes consistency issues in our build
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 3 Jun 2025 11:10:16 +0000 (13:10 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 5 Jun 2025 14:13:49 +0000 (16:13 +0200)
Signed-off-by: Remi Gacogne <remi.gacogne@powerdns.com>
14 files changed:
pdns/dnsdistdist/.gitignore
pdns/dnsdistdist/Makefile.am
pdns/dnsdistdist/dnsdist-actions-factory.cc
pdns/dnsdistdist/dnsdist-configuration-yaml.cc
pdns/dnsdistdist/dnsdist-lua-actions.cc
pdns/dnsdistdist/dnsdist-lua-rules.cc
pdns/dnsdistdist/dnsdist-rules-generator.py
pdns/dnsdistdist/dnsdist-rules.cc
pdns/dnsdistdist/dnsdist-rust-lib/Makefile.am
pdns/dnsdistdist/dnsdist-rust-lib/dnsdist-settings-generator.py
pdns/dnsdistdist/dnsdist-rust-lib/meson.build
pdns/dnsdistdist/dnsdist-rust-lib/rust/build.rs
pdns/dnsdistdist/dnsdist-rust-lib/rust/meson.build
pdns/dnsdistdist/meson.build

index f9b24a1f5e36a30e3d2bcb04a1dc53d899efd296..c115271593a62ed83247a4c536c965bd5b715111 100644 (file)
@@ -52,4 +52,4 @@ latex/
 /.cache
 /*-generated-body.hh
 /*-generated.hh
-/dnsdist-rust-lib/dnsdist-configuration-yaml-items-generated.cc
+dnsdist-configuration-yaml-items-generated.cc
index 24baff75799f4fa4e0bb19c677cadd9e034b66e5..5b64130ea668f12fa6187356542ea55e330e75db 100644 (file)
@@ -35,14 +35,15 @@ dnslabeltext.cc: dnslabeltext.rl
        $(AM_V_GEN)$(RAGEL) $< -o dnslabeltext.cc
 
 BUILT_SOURCES=htmlfiles.h \
-       dnsdist-actions-factory-generated.cc dnsdist-actions-factory-generated.hh \
+       dnsdist-actions-factory-generated-body.hh dnsdist-actions-factory-generated.hh \
        dnsdist-lua-ffi-interface.inc \
-       dnsdist-lua-actions-generated.cc dnsdist-lua-response-actions-generated.cc \
-       dnsdist-response-actions-factory-generated.cc dnsdist-response-actions-factory-generated.hh \
-       dnsdist-rust-bridge-actions-generated.cc dnsdist-rust-bridge-actions-generated.hh \
-       dnsdist-rust-bridge-selectors-generated.cc dnsdist-rust-bridge-selectors-generated.hh \
-       dnsdist-selectors-factory-generated.cc dnsdist-selectors-factory-generated.hh \
-       dnslabeltext.cc
+       dnsdist-lua-actions-generated-body.hh dnsdist-lua-response-actions-generated-body.hh \
+       dnsdist-response-actions-factory-generated-body.hh dnsdist-response-actions-factory-generated.hh \
+       dnsdist-rust-bridge-actions-generated-body.hh dnsdist-rust-bridge-actions-generated.hh \
+       dnsdist-rust-bridge-selectors-generated-body.hh dnsdist-rust-bridge-selectors-generated.hh \
+       dnsdist-selectors-factory-generated-body.hh dnsdist-selectors-factory-generated.hh \
+       dnslabeltext.cc \
+       docs/reference/yaml-settings.rst
 
 htmlfiles.h: $(srcdir)/html/* $(srcdir)/incfiles
        $(AM_V_GEN)$(srcdir)/incfiles $(srcdir) > $@.tmp
@@ -55,10 +56,15 @@ dnsdist-lua-ffi-interface.inc: dnsdist-lua-ffi-interface.h dnsdist-lua-inspectio
 SRC_JS_FILES := $(wildcard src_js/*.js)
 MIN_JS_FILES := $(patsubst src_js/%.js,html/js/%.min.js,$(SRC_JS_FILES))
 
-dnsdist%generated.cc dnsdist%generated.hh: dnsdist-rules-generator.py dnsdist-actions-definitions.yml dnsdist-response-actions-definitions.yml dnsdist-selectors-definitions.yml
+dnsdist%generated-body.hh dnsdist%generated.hh: dnsdist-rules-generator.py dnsdist-actions-definitions.yml dnsdist-response-actions-definitions.yml dnsdist-selectors-definitions.yml
        @if test "$(PYTHON)" = ":"; then echo "Actions or selectors definitions have changed, python is needed to regenerate the related 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
-       $(PYTHON) dnsdist-rules-generator.py
+       $(PYTHON) dnsdist-rules-generator.py . .
+
+docs/reference/yaml-%.rst: dnsdist-settings-documentation-generator.py dnsdist-settings-definitions.yml dnsdist-actions-definitions.yml dnsdist-response-actions-definitions.yml dnsdist-selectors-definitions.yml
+       @if test "$(PYTHON)" = ":"; then echo "Settings definitions have changed, python is needed to regenerate the related 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
+       $(PYTHON) dnsdist-settings-documentation-generator.py .
 
 html/js/%.min.js: src_js/%.js
        uglifyjs $< > $@
@@ -113,10 +119,6 @@ EXTRA_DIST=COPYING \
           dnsdist-actions-definitions.yml \
           dnsdist-response-actions-definitions.yml \
           dnsdist-rust-bridge.hh \
-          dnsdist-rust-bridge-actions-generated.cc \
-          dnsdist-rust-bridge-actions-generated.hh \
-          dnsdist-rust-bridge-selectors-generated.cc \
-          dnsdist-rust-bridge-selectors-generated.hh \
           dnsdist-selectors-definitions.yml \
           dnsdist-settings-definitions.yml \
           dnslabeltext.rl \
@@ -173,7 +175,6 @@ dnsdist_SOURCES = \
        dns.cc dns.hh \
        dns_random.hh \
        dnscrypt.cc dnscrypt.hh \
-       dnsdist-actions-factory-generated.hh \
        dnsdist-actions-factory.cc dnsdist-actions-factory.hh \
        dnsdist-actions.cc dnsdist-actions.hh \
        dnsdist-async.cc dnsdist-async.hh \
@@ -240,7 +241,6 @@ dnsdist_SOURCES = \
        dnsdist-rules-factory.hh \
        dnsdist-rules.cc dnsdist-rules.hh \
        dnsdist-secpoll.cc dnsdist-secpoll.hh \
-       dnsdist-selectors-factory-generated.hh \
        dnsdist-self-answers.cc dnsdist-self-answers.hh \
        dnsdist-session-cache.cc dnsdist-session-cache.hh \
        dnsdist-snmp.cc dnsdist-snmp.hh \
@@ -302,6 +302,8 @@ dnsdist_SOURCES = \
        views.hh \
        xsk.cc xsk.hh
 
+nodist_dnsdist_SOURCES =
+
 testrunner_SOURCES = \
        base64.hh \
        bpf-filter.cc bpf-filter.hh \
@@ -531,13 +533,13 @@ testrunner_LDADD += $(QUICHE_LDFLAGS) $(QUICHE_LIBS)
 endif
 
 if HAVE_YAML_CONFIGURATION
-dnsdist_SOURCES += dnsdist-rust-lib/dnsdist-configuration-yaml-items-generated.cc
+nodist_dnsdist_SOURCES += dnsdist-configuration-yaml-items-generated.cc
 dnsdist_LDADD += $(DNSDIST_RUST_LIBS)
 endif
 
 if !HAVE_LUA_HPP
 BUILT_SOURCES += lua.hpp
-nodist_dnsdist_SOURCES = lua.hpp
+nodist_dnsdist_SOURCES += lua.hpp
 endif
 
 CLEANFILES += lua.hpp
index ec14364129f5c3a2bc4945674adda9e431b7efeb..596c7fcd83430a5389a9936ac63636a6df61c82f 100644 (file)
@@ -2549,8 +2549,6 @@ std::shared_ptr<DNSAction> getTeeAction(const ComboAddress& rca, std::optional<C
   return std::shared_ptr<DNSAction>(new TeeAction(rca, lca, addECS, addProxyProtocol));
 }
 
-// NOLINTNEXTLINE(bugprone-suspicious-include)
-#include "dnsdist-actions-factory-generated.cc"
-// NOLINTNEXTLINE(bugprone-suspicious-include)
-#include "dnsdist-response-actions-factory-generated.cc"
+#include "dnsdist-actions-factory-generated-body.hh"
+#include "dnsdist-response-actions-factory-generated-body.hh"
 }
index bca2dde2fa64be42851df71dbae0c11884dbbdf8..46c260915de8092bc52d4fd1b122389b680fbda3 100644 (file)
@@ -1738,9 +1738,7 @@ std::shared_ptr<DNSSelector> getByNameSelector(const ByNameSelectorConfiguration
   return dnsdist::configuration::yaml::getRegisteredTypeByName<DNSSelector>(config.selector_name);
 }
 
-// NOLINTNEXTLINE(bugprone-suspicious-include)
-#include "dnsdist-rust-bridge-actions-generated.cc"
-// NOLINTNEXTLINE(bugprone-suspicious-include)
-#include "dnsdist-rust-bridge-selectors-generated.cc"
+#include "dnsdist-rust-bridge-actions-generated-body.hh"
+#include "dnsdist-rust-bridge-selectors-generated-body.hh"
 }
 #endif /* defined(HAVE_YAML_CONFIGURATION) */
index 0f8f4f40e930b921f1273552958f02cc41af493d..11066b005e322ced28853d47fa4eab5c79c09cce 100644 (file)
@@ -437,8 +437,6 @@ void setupLuaActions(LuaContext& luaCtx)
     return dnsdist::actions::getSetProxyProtocolValuesAction(values);
   });
 
-// NOLINTNEXTLINE(bugprone-suspicious-include)
-#include "dnsdist-lua-actions-generated.cc"
-// NOLINTNEXTLINE(bugprone-suspicious-include)
-#include "dnsdist-lua-response-actions-generated.cc"
+#include "dnsdist-lua-actions-generated-body.hh"
+#include "dnsdist-lua-response-actions-generated-body.hh"
 }
index d86fca27ac4ce3edf159679249096b17d053d8a4..a12eed23ea74fe6d509a1f74afeb9f94a47e02ab 100644 (file)
@@ -640,6 +640,5 @@ void setupLuaRules(LuaContext& luaCtx)
   });
 #endif /* defined(HAVE_LMDB) || defined(HAVE_CDB) */
 
-// NOLINTNEXTLINE(bugprone-suspicious-include)
-#include "dnsdist-lua-selectors-generated.cc"
+#include "dnsdist-lua-selectors-generated-body.hh"
 }
index 830c684f7cb9eee70be754b27dad27457813c1d7..c62922651c5eac0a08720d77118fae9a0e0ad006 100644 (file)
@@ -5,21 +5,21 @@
 # - dnsdist-response-actions-definitions.yml
 # and generates C++ factory to create the objects
 # for these actions from the corresponding parameters:
-# - dnsdist-actions-factory-generated.cc
+# - dnsdist-actions-factory-generated-body.hh
 # - dnsdist-actions-factory-generated.hh
-# - dnsdist-response-actions-factory-generated.cc
+# - dnsdist-response-actions-factory-generated-body.hh
 # - dnsdist-response-actions-factory-generated.hh
 # as well as Lua bindings for them:
-# - dnsdist-lua-actions-generated.cc
-# - dnsdist-lua-response-actions-generated.cc
+# - dnsdist-lua-actions-generated-body.hh
+# - dnsdist-lua-response-actions-generated-body.hh
 # 2/ Loads the selector definitions from:
 # - dnsdist-selectors-definitions.yml
 # and generates C++ factory to create the objects
 # for these selectors from the corresponding parameters:
-# - dnsdist-selectors-factory-generated.cc
+# - dnsdist-selectors-factory-generated-body.hh
 # - dnsdist-selectors-factory-generated.hh
 # as well as the Lua bindings for them:
-# - dnsdist-lua-selectors-generated.cc
+# - dnsdist-lua-selectors-generated-body.hh
 # The format of the definitions, in YAML, is a simple list of items.
 # Each item has a name and an optional list of parameters.
 # Parameters have a name, a type, and optionally a default value
@@ -33,6 +33,7 @@
 # - 'skip-rust' is not used by this script but is used by the dnsdist-settings-generator.py one, where it means that the C++ code to create the Rust-side version of an action or selector will not generated
 # - 'skip-serde' is not used by this script but is used by the dnsdist-settings-generator.py one, where it means that the Rust structure representing that action or selector in the YAML setting will not be directly created by Serde. It is used for selectors that reference another selector themselves, or actions referencing another action.
 import os
+import sys
 import tempfile
 import yaml
 
@@ -134,22 +135,26 @@ def get_cpp_parameters(parameters, lua_interface):
 
         if default == '':
             default = '""'
-        if default == True:
+        if default is True:
             default = '{}'
 
         output += f'{pname} ? *{pname} : {default}'
 
     return output
 
-def get_temporary_file_for_generated_code():
-    generated_fp = tempfile.NamedTemporaryFile(mode='w+t', encoding='utf-8', dir='.', delete=False)
+def get_temporary_file_for_generated_code(dest_dir):
+    generated_fp = tempfile.NamedTemporaryFile(mode='w+t', encoding='utf-8', dir=dest_dir, delete=False)
     generated_fp.write('// !! This file has been generated by dnsdist-rules-generator.py, do not edit by hand!!\n')
     return generated_fp
 
-def generate_actions_factory_header(definitions, response=False):
+def handle_generated_file(generated_file_name, output_file_name, build_dir):
+    build_dir_file = f'{build_dir}/{output_file_name}'
+    os.rename(generated_file_name, build_dir_file)
+
+def generate_actions_factory_header(definitions, build_dir, response=False):
     suffix = 'ResponseAction' if response else 'Action'
     shared_object_type = f'DNS{suffix}'
-    generated_fp = get_temporary_file_for_generated_code()
+    generated_fp = get_temporary_file_for_generated_code(build_dir)
 
     for action in definitions:
         if 'skip-cpp' in action and action['skip-cpp']:
@@ -162,11 +167,11 @@ def generate_actions_factory_header(definitions, response=False):
         generated_fp.write(output)
 
     output_file_name = 'dnsdist-response-actions-factory-generated.hh' if response else 'dnsdist-actions-factory-generated.hh'
-    os.rename(generated_fp.name, output_file_name)
+    handle_generated_file(generated_fp.name, output_file_name, build_dir)
 
-def generate_actions_factory(definitions, response=False):
+def generate_actions_factory(definitions, build_dir, response=False):
     suffix = 'ResponseAction' if response else 'Action'
-    generated_fp = get_temporary_file_for_generated_code()
+    generated_fp = get_temporary_file_for_generated_code(build_dir)
 
     for action in definitions:
         if 'skip-cpp' in action and action['skip-cpp']:
@@ -183,12 +188,12 @@ def generate_actions_factory(definitions, response=False):
         output += '}\n'
         generated_fp.write(output)
 
-    output_file_name = 'dnsdist-response-actions-factory-generated.cc' if response else 'dnsdist-actions-factory-generated.cc'
-    os.rename(generated_fp.name, output_file_name)
+    output_file_name = 'dnsdist-response-actions-factory-generated-body.hh' if response else 'dnsdist-actions-factory-generated-body.hh'
+    handle_generated_file(generated_fp.name, output_file_name, build_dir)
 
-def generate_lua_actions_bindings(definitions, response=False):
+def generate_lua_actions_bindings(definitions, build_dir, response=False):
     suffix = 'ResponseAction' if response else 'Action'
-    generated_fp = get_temporary_file_for_generated_code()
+    generated_fp = get_temporary_file_for_generated_code(build_dir)
 
     for action in definitions:
         if 'skip-cpp' in action and action['skip-cpp']:
@@ -207,11 +212,11 @@ def generate_lua_actions_bindings(definitions, response=False):
         output += '});\n'
         generated_fp.write(output)
 
-    output_file_name = 'dnsdist-lua-response-actions-generated.cc' if response else 'dnsdist-lua-actions-generated.cc'
-    os.rename(generated_fp.name, output_file_name)
+    output_file_name = 'dnsdist-lua-response-actions-generated-body.hh' if response else 'dnsdist-lua-actions-generated-body.hh'
+    handle_generated_file(generated_fp.name, output_file_name, build_dir)
 
-def generate_selectors_factory_header(definitions):
-    generated_fp = get_temporary_file_for_generated_code()
+def generate_selectors_factory_header(definitions, build_dir):
+    generated_fp = get_temporary_file_for_generated_code(build_dir)
 
     for selector in definitions:
         if 'skip-cpp' in selector and selector['skip-cpp']:
@@ -224,10 +229,10 @@ def generate_selectors_factory_header(definitions):
         generated_fp.write(output)
 
     output_file_name = 'dnsdist-selectors-factory-generated.hh'
-    os.rename(generated_fp.name, output_file_name)
+    handle_generated_file(generated_fp.name, output_file_name, build_dir)
 
-def generate_selectors_factory(definitions, response=False):
-    generated_fp = get_temporary_file_for_generated_code()
+def generate_selectors_factory(definitions, build_dir):
+    generated_fp = get_temporary_file_for_generated_code(build_dir)
 
     for selector in definitions:
         if 'skip-cpp' in selector and selector['skip-cpp']:
@@ -244,11 +249,11 @@ def generate_selectors_factory(definitions, response=False):
         output += '}\n'
         generated_fp.write(output)
 
-    output_file_name = 'dnsdist-selectors-factory-generated.cc'
-    os.rename(generated_fp.name, output_file_name)
+    output_file_name = 'dnsdist-selectors-factory-generated-body.hh'
+    handle_generated_file(generated_fp.name, output_file_name, build_dir)
 
-def generate_lua_selectors_bindings(definitions):
-    generated_fp = get_temporary_file_for_generated_code()
+def generate_lua_selectors_bindings(definitions, build_dir):
+    generated_fp = get_temporary_file_for_generated_code(build_dir)
 
     for selector in definitions:
         if 'skip-cpp' in selector and selector['skip-cpp']:
@@ -267,24 +272,31 @@ def generate_lua_selectors_bindings(definitions):
         output += '});\n'
         generated_fp.write(output)
 
-    output_file_name = 'dnsdist-lua-selectors-generated.cc'
-    os.rename(generated_fp.name, output_file_name)
+    output_file_name = 'dnsdist-lua-selectors-generated-body.hh'
+    handle_generated_file(generated_fp.name, output_file_name, build_dir)
 
 def main():
-    definitions = get_definitions_from_file('dnsdist-actions-definitions.yml')
-    generate_actions_factory_header(definitions)
-    generate_actions_factory(definitions)
-    generate_lua_actions_bindings(definitions)
-
-    definitions = get_definitions_from_file('dnsdist-response-actions-definitions.yml')
-    generate_actions_factory_header(definitions, response=True)
-    generate_actions_factory(definitions, response=True)
-    generate_lua_actions_bindings(definitions, response=True)
-
-    definitions = get_definitions_from_file('dnsdist-selectors-definitions.yml')
-    generate_selectors_factory_header(definitions)
-    generate_selectors_factory(definitions)
-    generate_lua_selectors_bindings(definitions)
+    if len(sys.argv) != 3:
+        print(f'Usage: {sys.argv[0]} <path/to/source/dir> </path/to/build/dir>')
+        sys.exit(1)
+
+    source_dir = sys.argv[1]
+    build_dir = sys.argv[2]
+
+    definitions = get_definitions_from_file(f'{source_dir}/dnsdist-actions-definitions.yml')
+    generate_actions_factory_header(definitions, build_dir)
+    generate_actions_factory(definitions, build_dir)
+    generate_lua_actions_bindings(definitions, build_dir)
+
+    definitions = get_definitions_from_file(f'{source_dir}/dnsdist-response-actions-definitions.yml')
+    generate_actions_factory_header(definitions, build_dir, response=True)
+    generate_actions_factory(definitions, build_dir, response=True)
+    generate_lua_actions_bindings(definitions, build_dir, response=True)
+
+    definitions = get_definitions_from_file(f'{source_dir}/dnsdist-selectors-definitions.yml')
+    generate_selectors_factory_header(definitions, build_dir)
+    generate_selectors_factory(definitions, build_dir)
+    generate_lua_selectors_bindings(definitions, build_dir)
 
 if __name__ == '__main__':
     main()
index f4b661c917ff1cf4c260960217b0742983b41b08..e13cdbd5fccd5cab2e4701b4d165b7e72f404670 100644 (file)
@@ -200,7 +200,6 @@ std::shared_ptr<LuaFFIRule> getLuaFFISelector(const dnsdist::selectors::LuaSelec
   return std::make_shared<LuaFFIRule>(func);
 }
 
-// NOLINTNEXTLINE(bugprone-suspicious-include)
-#include "dnsdist-selectors-factory-generated.cc"
+#include "dnsdist-selectors-factory-generated-body.hh"
 
 }
index 741b53c152f8389eb0d0d1a1536939a0b597ef9b..d22a0594279fffcd57f7d678eeca95a8305d10d5 100644 (file)
@@ -3,16 +3,15 @@ EXTRA_DIST = \
        dnsdist-settings-generator.py \
        rust-pre-in.rs \
        rust-middle-in.rs \
-       rust-post-in.rs \
-       rust/src/lib.rs
+       rust-post-in.rs
 
 BUILT_SOURCES=rust/src/lib.rs \
-       dnsdist-configuration-yaml-items-generated.cc
+       ../dnsdist-configuration-yaml-items-generated.cc
 
-all: rust/src/lib.rs dnsdist-configuration-yaml-items-generated.cc
+all: rust/src/lib.rs ../dnsdist-configuration-yaml-items-generated.cc
 
-rust/src/lib.rs dnsdist-configuration-yaml-items-generated.cc: dnsdist-settings-generator.py ../dnsdist-settings-definitions.yml rust-pre-in.rs rust-middle-in.rs rust-post-in.rs dnsdist-configuration-yaml-items-pre-in.cc ../dnsdist-actions-definitions.yml ../dnsdist-response-actions-definitions.yml ../dnsdist-selectors-definitions.yml
+rust/src/lib.rs ../dnsdist-configuration-yaml-items-generated.cc: dnsdist-settings-generator.py ../dnsdist-settings-definitions.yml rust-pre-in.rs rust-middle-in.rs rust-post-in.rs dnsdist-configuration-yaml-items-pre-in.cc ../dnsdist-actions-definitions.yml ../dnsdist-response-actions-definitions.yml ../dnsdist-selectors-definitions.yml
        @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 ../ ./ ../ ../)
+       (cd ${srcdir} && $(PYTHON) dnsdist-settings-generator.py ../ ./ ../)
index 7f160676752af0c16cb538ab02b476b513ba0f1c..5ab4362af33233db841e76e0af55f814d19140a4 100644 (file)
 # and generates C++ headers and code to create the wrappers
 # for these actions from the Rust structures:
 # - dnsdist-rust-bridge-actions-generated.hh
-# - dnsdist-rust-bridge-actions-generated.cc
+# - dnsdist-rust-bridge-actions-generated-body.hh
 # 2/ Loads the selector definitions from:
 # - dnsdist-selectors-definitions.yml
 # - dnsdist-rust-bridge-selectors-generated.hh
-# - dnsdist-rust-bridge-selectors-generated.cc
+# - dnsdist-rust-bridge-selectors-generated-body.hh
 # and generates C++ headers and code to create the wrappers
 # for these selectors from the Rust structures:
 # The format of the definitions, in YAML, is a simple list of items.
@@ -307,7 +307,7 @@ def include_file(out_fp, include_file_name):
         out_fp.write(in_fp.read())
         out_fp.write(f'// END INCLUDE {basename}\n')
 
-def generate_flat_settings_for_cxx(definitions, src_dir, out_file_path, build_dir_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, src_dir + '/dnsdist-configuration-yaml-items-pre-in.cc')
@@ -377,11 +377,6 @@ void convertRuntimeFlatSettingsFromRust(const dnsdist::rust::settings::GlobalCon
 ''')
 
     os.rename(cxx_flat_settings_fp.name, out_file_path + '/dnsdist-configuration-yaml-items-generated.cc')
-    target = build_dir_path + '/dnsdist-configuration-yaml-items-generated.cc'
-    if out_file_path != build_dir_path:
-        if os.path.exists(target):
-            os.unlink(target)
-        os.symlink(os.path.abspath(out_file_path + '/dnsdist-configuration-yaml-items-generated.cc'), target)
 
 def generate_actions_config(output, def_dir, response, default_functions):
     suffix = 'ResponseAction' if response else 'Action'
@@ -541,7 +536,7 @@ def generate_cpp_action_wrappers(def_dir, cxx_dest_dir):
 '''
 
     cpp_action_wrappers_fp.write(wrappers_buffer)
-    os.rename(cpp_action_wrappers_fp.name, f'{cxx_dest_dir}/dnsdist-rust-bridge-actions-generated.cc')
+    os.rename(cpp_action_wrappers_fp.name, f'{cxx_dest_dir}/dnsdist-rust-bridge-actions-generated-body.hh')
 
 def generate_cpp_selector_wrappers(def_dir, cxx_dest_dir):
     cpp_selector_wrappers_fp = get_temporary_file_for_generated_code(cxx_dest_dir)
@@ -563,7 +558,7 @@ def generate_cpp_selector_wrappers(def_dir, cxx_dest_dir):
 '''
 
     cpp_selector_wrappers_fp.write(wrappers_buffer)
-    os.rename(cpp_selector_wrappers_fp.name, f'{cxx_dest_dir}/dnsdist-rust-bridge-selectors-generated.cc')
+    os.rename(cpp_selector_wrappers_fp.name, f'{cxx_dest_dir}/dnsdist-rust-bridge-selectors-generated-body.hh')
 
 def generate_rust_actions_enum(output, def_dir, response):
     suffix = 'ResponseAction' if response else 'Action'
@@ -753,22 +748,21 @@ def get_temporary_file_for_generated_code(directory):
     return generated_fp
 
 def main():
-    if len(sys.argv) != 5:
-        print(f'Usage: {sys.argv[0]} <path/to/definitions/files> <rust/output/dir> <cxx/output/dir> <cxx/build/root/dir>')
+    if len(sys.argv) != 4:
+        print(f'Usage: {sys.argv[0]} <path/to/definitions/files> <rust/output/dir> <cxx/build/root/dir>')
         sys.exit(1)
 
     definitions_dir = sys.argv[1]
     rust_dir = sys.argv[2]
-    cxx_dest_dir = sys.argv[3]
-    cxx_build_dir = sys.argv[4]
+    cxx_build_dir = sys.argv[3]
     definitions = get_definitions_from_file(definitions_dir + '/dnsdist-settings-definitions.yml')
     default_functions = []
     validation_functions = []
 
-    generate_cpp_action_headers(definitions_dir, cxx_dest_dir)
-    generate_cpp_action_wrappers(definitions_dir, cxx_dest_dir)
-    generate_cpp_selector_headers(definitions_dir, cxx_dest_dir)
-    generate_cpp_selector_wrappers(definitions_dir, cxx_dest_dir)
+    generate_cpp_action_headers(definitions_dir, cxx_build_dir)
+    generate_cpp_action_wrappers(definitions_dir, cxx_build_dir)
+    generate_cpp_selector_headers(definitions_dir, cxx_build_dir)
+    generate_cpp_selector_wrappers(definitions_dir, cxx_build_dir)
 
     generated_fp = get_temporary_file_for_generated_code(f'{rust_dir}/rust/src/')
     include_file(generated_fp, f'{rust_dir}/rust-pre-in.rs')
@@ -777,8 +771,6 @@ def main():
     generate_actions_config(generated_fp, definitions_dir, True, default_functions)
     generate_selectors_config(generated_fp, definitions_dir, default_functions)
 
-    generate_flat_settings_for_cxx(definitions, rust_dir, f'{cxx_dest_dir}/dnsdist-rust-lib/', f'{cxx_build_dir}/dnsdist-rust-lib/')
-
     handle_structures(generated_fp, definitions, default_functions, validation_functions)
 
     generate_cpp_action_selector_functions_callable_from_rust(generated_fp, definitions_dir)
@@ -811,5 +803,7 @@ def main():
 
     os.rename(generated_fp.name, rust_dir + '/rust/src/lib.rs')
 
+    generate_flat_settings_for_cxx(definitions, rust_dir, f'{cxx_build_dir}')
+
 if __name__ == '__main__':
     main()
index 1d2b7c18d79fd1aa92f99a1549425dffbc747ac3..b752e9b413b4535ca83530f5842b14ca3953869a 100644 (file)
@@ -9,19 +9,30 @@ sources = files(
 
 generated = [
   'dnsdist-configuration-yaml-items-generated.cc',
+  'dnsdist-rust-bridge-actions-generated.hh',
+  'dnsdist-rust-bridge-actions-generated-body.hh',
+  'dnsdist-rust-bridge-selectors-generated.hh',
+  'dnsdist-rust-bridge-selectors-generated-body.hh',
 ]
 
 python = find_program('python3')
 
 rust_lib_sources = custom_target(
-  command: [python, '@INPUT0@', '@SOURCE_ROOT@', '@SOURCE_ROOT@/dnsdist-rust-lib', '@SOURCE_ROOT@', '@BUILD_ROOT@'],
+  command: [python, '@INPUT0@', '@SOURCE_ROOT@', '@SOURCE_ROOT@/dnsdist-rust-lib', '@OUTDIR@'],
   input: sources,
   output: generated,
 )
 
 dep_rust_lib = declare_dependency(
-  sources: [rust_lib_sources,],
-  include_directories: [include_directories('.'), ]
+  sources: [
+    rust_lib_sources[1],
+    rust_lib_sources[2],
+    rust_lib_sources[3],
+    rust_lib_sources[4],
+  ],
+  include_directories: [
+    include_directories('.'),
+  ]
 )
 
 if get_option('yaml').allowed()
index 18d00f906a583aa74ed98ac47aafae2b3b2c3757..a3a0bb3e4f2115a7bb6012527956d5da323d0a64 100644 (file)
@@ -1,11 +1,25 @@
+use std::fs;
+use std::path::PathBuf;
+use std::env;
+
 fn main() {
-    cxx_build::bridge("src/lib.rs")
-        .flag_if_supported("-std=c++17")
-        .flag("-Isrc")
-        .flag("-I.")
-        .flag("-I..")
-        .flag("-I../..")
-        .compile("dnsdist_rust");
+    let mut bridge = cxx_build::bridge("src/lib.rs");
+    let mut build = bridge
+            .flag_if_supported("-std=c++17")
+            .flag("-Isrc")
+            .flag("-I.")
+            .flag("-I..")
+            .flag("-I../..");
+    let generated_headers_dir_env = env::var("generatedheadersdir");
+    if generated_headers_dir_env.is_ok() {
+      let generated_headers_dir = PathBuf::from(generated_headers_dir_env.unwrap());
+      let generated_headers_dir_canon = fs::canonicalize(&generated_headers_dir);
+      if generated_headers_dir_canon.is_ok() {
+        build = build.flag(format!("-I{}", generated_headers_dir_canon.unwrap().display()))
+      }
+    }
+
+    build.compile("dnsdist_rust");
 
     println!("cargo:rerun-if-changed=src/lib.rs");
     println!("cargo:rerun-if-changed=src/helpers.rs");
index 15c3705851e876e51f9cc8cd016eb73d3d8ba4eb..2559ef2b49ce8d3896831e5ab39f02f1cf0e53c8 100644 (file)
@@ -7,6 +7,7 @@ env = environment()
 env.append('CARGO', cargo.full_path())
 env.append('SYSCONFDIR', conf.get('SYSCONFDIR'))
 env.append('builddir', '.')
+env.append('generatedheadersdir', meson.current_build_dir() + '/..')
 env.append('srcdir', meson.current_source_dir())
 env.append('RUST_TARGET', '')
 env.append('RUSTC_TARGET_ARCH', '')
index e8e229feffeaa694f8c5a4c6f725d57340cc8e6a..bd2c91a9819ef70f550dbedcd1e082e5768df5a2 100644 (file)
@@ -35,6 +35,7 @@ conf.set_quoted('PACKAGE_VERSION', meson.project_version(), description: 'versio
 subdir('meson' / 'config')                  # Config
 subdir('meson' / 'version')                 # Generate version define
 subdir('meson' / 'compiler-setup')          # Common compiler setup
+subdir('meson' / 'dlopen')                  # our Rust static library needs dlopen (needs to happen _after_ compiler-setup)
 subdir('meson' / 'summary')                 # Print a system/project summary
 subdir('meson' / 'sysconfdir')              # Sysconfdir
 subdir('meson' / 'platform')                # Platform detection
@@ -109,10 +110,6 @@ endif
 
 subdir('dnsdist-rust-lib')
 
-if get_option('yaml').allowed()
-  subdir('meson' / 'dlopen') # our Rust static library needs dlopen
-endif
-
 common_sources += files(
   src_dir / 'bpf-filter.cc',
   src_dir / 'capabilities.cc',
@@ -246,12 +243,6 @@ 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
@@ -334,6 +325,29 @@ dep_ffi_interface = declare_dependency(
 py = import('python')
 python = py.find_installation('python3', required: true)
 
+selectors_actions_sources = custom_target(
+  command: [
+    python,
+    '@INPUT0@',
+    '@SOURCE_ROOT@',
+    '@OUTDIR@',
+  ],
+  input: [
+    'dnsdist-rules-generator.py',
+    'dnsdist-actions-definitions.yml',
+    'dnsdist-response-actions-definitions.yml',
+    'dnsdist-selectors-definitions.yml',
+  ],
+  output: [
+    'dnsdist-actions-factory-generated.hh',
+    'dnsdist-actions-factory-generated-body.hh',
+    'dnsdist-response-actions-factory-generated.hh',
+    'dnsdist-response-actions-factory-generated-body.hh',
+    'dnsdist-selectors-factory-generated.hh',
+    'dnsdist-selectors-factory-generated-body.hh',
+  ],
+)
+
 yaml_settings_docs = custom_target(
   'yaml-settings-docs',
   command: [
@@ -412,12 +426,24 @@ libdnsdist_common = declare_dependency(
     common_sources,
     config_h,
     libdnsdist_dnslabeltext_gen,
+    rust_lib_sources,
+    selectors_actions_sources,
     dependencies: [
       deps,
     ],
   )
 )
 
+libdnsdist_yaml_items = declare_dependency(
+  link_with: static_library(
+    'dnsdist-yaml-items',
+    rust_lib_sources,
+    dependencies: [
+      dep_dnsdist_rust_lib,
+    ],
+  )
+)
+
 tools = {
   'dnsdist': {
     'main': src_dir / 'dnsdist.cc',
@@ -429,6 +455,7 @@ tools = {
       src_dir / 'dnsdist-lua-ffi.cc',
       src_dir / 'dnsdist-lua-inspection-ffi.cc',
       mplexer_sources,
+      selectors_actions_sources,
     ],
     'manpages': ['dnsdist.1'],
     'deps-extra': [
@@ -440,6 +467,7 @@ tools = {
       dep_json11,
       dep_libsystemd,
       dep_yahttp,
+      libdnsdist_yaml_items,
     ],
     'install': true,
   },
@@ -519,6 +547,7 @@ if get_option('unit-tests')
       'dnsdist-test',
       config_h,
       test_sources,
+      selectors_actions_sources,
       dependencies: [
           dep_boost,
           dep_boost_test,