diff --git a/CHANGES.md b/CHANGES.md index d1d91219e0b..7f84a209551 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,10 @@ Unreleased ---------- +- Add the `enabled_if` field to `inline_tests` within the `library` stanza. + This allows us to disable executing the inline tests while still allowing for + compilation (#4939, @rgrinberg) + - Generate a `dune-project` when initializing projects with `dune init proj ...` (#4881, closes #4367, @shonfeder) diff --git a/src/dune_rules/inline_tests.ml b/src/dune_rules/inline_tests.ml index acab067101e..3e1d49f27ff 100644 --- a/src/dune_rules/inline_tests.ml +++ b/src/dune_rules/inline_tests.ml @@ -76,8 +76,7 @@ include Sub_system.Register_end_point (struct module Mode_conf = Inline_tests_info.Mode_conf module Info = Inline_tests_info.Tests - let gen_rules c ~(info : Info.t) ~backends = - let open Memo.Build.O in + let gen_rules c ~expander ~(info : Info.t) ~backends = let { Sub_system.Library_compilation_context.super_context = sctx ; dir ; stanza = lib @@ -104,8 +103,8 @@ include Sub_system.Register_end_point (struct let src_dir = Path.build inline_test_dir in Module.generated ~src_dir name in + let open Memo.Build.O in let modules = Modules.singleton_exe main_module in - let* expander = Super_context.expander sctx ~dir in let runner_libs = let open Resolve.Build.O in let* libs = @@ -258,6 +257,20 @@ include Sub_system.Register_end_point (struct (Path.Build.extend_basename (Path.as_in_build_dir_exn fn) ~suffix:".corrected"))))) + + let gen_rules c ~(info : Info.t) ~backends = + let open Memo.Build.O in + let { dir; Sub_system.Library_compilation_context.super_context = sctx; _ } + = + c + in + let* expander = Super_context.expander sctx ~dir in + let* enabled_if = Expander.eval_blang expander info.enabled_if in + if enabled_if then + gen_rules c ~expander ~info ~backends + else + let alias = Alias.runtest ~dir in + Simple_rules.Alias_rules.add_empty sctx ~alias ~loc:(Some info.loc) end) let linkme = () diff --git a/src/dune_rules/inline_tests_info.ml b/src/dune_rules/inline_tests_info.ml index e1960aa22f2..5c51eeef2f5 100644 --- a/src/dune_rules/inline_tests_info.ml +++ b/src/dune_rules/inline_tests_info.ml @@ -94,6 +94,7 @@ module Tests = struct ; executable : Ocaml_flags.Spec.t ; backend : (Loc.t * Lib_name.t) option ; libraries : (Loc.t * Lib_name.t) list + ; enabled_if : Blang.t } type Sub_system_info.t += T of t @@ -122,8 +123,12 @@ module Tests = struct field "modes" (Dune_lang.Syntax.since syntax (1, 11) >>> Mode_conf.Set.decode) ~default:Mode_conf.Set.default + and+ enabled_if = + Enabled_if.decode ~allowed_vars:Any ~is_error:true + ~since:(Some (3, 0)) + () in - { loc; deps; flags; executable; backend; libraries; modes }) + { loc; deps; flags; executable; backend; libraries; modes; enabled_if }) (* We don't use this at the moment, but we could implement it for debugging purposes *) diff --git a/src/dune_rules/inline_tests_info.mli b/src/dune_rules/inline_tests_info.mli index 283c88787c3..ff21db6ced1 100644 --- a/src/dune_rules/inline_tests_info.mli +++ b/src/dune_rules/inline_tests_info.mli @@ -45,6 +45,7 @@ module Tests : sig ; executable : Ocaml_flags.Spec.t ; backend : (Loc.t * Lib_name.t) option ; libraries : (Loc.t * Lib_name.t) list + ; enabled_if : Blang.t } val backends : t -> (Loc.t * Lib_name.t) list option diff --git a/test/blackbox-tests/test-cases/inline_tests/enabled-if.t b/test/blackbox-tests/test-cases/inline_tests/enabled-if.t new file mode 100644 index 00000000000..2be8585e400 --- /dev/null +++ b/test/blackbox-tests/test-cases/inline_tests/enabled-if.t @@ -0,0 +1,22 @@ +enabled_if inside the inline_tests field in the library stanza + + $ mkdir tmp && cd tmp + $ cat >dune-project <<EOF + > (lang dune 3.0) + > EOF + $ cat >dune <<EOF + > (library + > (name backend_mbc) + > (modules ()) + > (inline_tests.backend + > (generate_runner (echo "print_endline \"backend_mbc\"")))) + > + > (library + > (name foo_mbc) + > (inline_tests + > (enabled_if false) + > (backend backend_mbc)) + > (libraries backend_mbc)) + > EOF + + $ dune runtest