diff --git a/doc/changes/10962.md b/doc/changes/10962.md new file mode 100644 index 00000000000..b5073d70591 --- /dev/null +++ b/doc/changes/10962.md @@ -0,0 +1,2 @@ +- Call the C++ compiler with `-std=c++11` when using OCaml >= 5.0 + (#10962, @kit-ty-kate) diff --git a/src/dune_rules/cxx_flags.ml b/src/dune_rules/cxx_flags.ml index 22aa0ea1a2a..00524d806e5 100644 --- a/src/dune_rules/cxx_flags.ml +++ b/src/dune_rules/cxx_flags.ml @@ -1,24 +1,29 @@ open Import -type phase = - | Compile - | Link - type ccomp_type = | Gcc | Msvc | Clang | Other of string -let base_cxx_flags ~for_ cc = - match cc, for_ with - | Gcc, Compile -> [ "-x"; "c++" ] - | Gcc, Link -> [ "-lstdc++"; "-shared-libgcc" ] - | Clang, Compile -> [ "-x"; "c++" ] - | Clang, Link -> [ "-lc++" ] - | Msvc, Compile -> [ "/TP" ] - | Msvc, Link -> [] - | Other _, (Link | Compile) -> [] +type phase = + | Compile of Ocaml.Version.t + | Link + +let base_cxx_compile_flags version = function + | Gcc | Clang -> + "-x" + :: "c++" + :: (if Ocaml.Version.add_std_cxx_flag version then [ "-std=c++11" ] else []) + | Msvc -> [ "/TP" ] + | Other _ -> [] +;; + +let base_cxx_link_flags = function + | Gcc -> [ "-lstdc++"; "-shared-libgcc" ] + | Clang -> [ "-lc++" ] + | Msvc -> [] + | Other _ -> [] ;; let fdiagnostics_color = function @@ -63,5 +68,8 @@ let ccomp_type (ctx : Build_context.t) = let get_flags ~for_ ctx = let open Action_builder.O in let+ ccomp_type = ccomp_type ctx in - base_cxx_flags ~for_ ccomp_type + (match for_ with + | Compile version -> base_cxx_compile_flags version + | Link -> base_cxx_link_flags) + ccomp_type ;; diff --git a/src/dune_rules/cxx_flags.mli b/src/dune_rules/cxx_flags.mli index eed02da3c9f..0c01ae86bb8 100644 --- a/src/dune_rules/cxx_flags.mli +++ b/src/dune_rules/cxx_flags.mli @@ -4,7 +4,7 @@ open Import type phase = - | Compile + | Compile of Ocaml.Version.t | Link (** The detected compiler *) diff --git a/src/dune_rules/foreign_rules.ml b/src/dune_rules/foreign_rules.ml index d4472f819f6..477f72cd03b 100644 --- a/src/dune_rules/foreign_rules.ml +++ b/src/dune_rules/foreign_rules.ml @@ -28,7 +28,11 @@ let default_context_flags (ctx : Build_context.t) ocaml_config ~project = in let cxx = let+ fdiagnostics_color = fdiagnostics_color - and+ db_flags = Cxx_flags.get_flags ~for_:Compile ctx in + and+ db_flags = + Cxx_flags.get_flags + ~for_:(Compile (Ocaml.Version.make (Ocaml_config.version ocaml_config))) + ctx + in List.concat [ db_flags; cxxflags; fdiagnostics_color ] in c, cxx diff --git a/src/ocaml/version.ml b/src/ocaml/version.ml index fba7b9e1a25..51f71e75187 100644 --- a/src/ocaml/version.ml +++ b/src/ocaml/version.ml @@ -29,3 +29,5 @@ let supports_alerts version = version >= (4, 8, 0) let has_sandboxed_otherlibs version = version >= (5, 0, 0) let has_META_files version = version >= (5, 0, 0) let supports_bin_annot_occurrences version = version >= (5, 2, 0) +let supports_hidden_includes version = version >= (5, 2, 0) +let add_std_cxx_flag version = version >= (5, 0, 0) diff --git a/src/ocaml/version.mli b/src/ocaml/version.mli index f7da69ad2b1..c8d1fdb15ca 100644 --- a/src/ocaml/version.mli +++ b/src/ocaml/version.mli @@ -76,3 +76,8 @@ val has_META_files : t -> bool (** Whether the compiler supports occurrences indexation *) val supports_bin_annot_occurrences : t -> bool + +(** Whether the compiler supports the -H flag *) +val supports_hidden_includes : t -> bool + +val add_std_cxx_flag : t -> bool diff --git a/test/blackbox-tests/test-cases/cpp-std-ocaml5.t/run.t b/test/blackbox-tests/test-cases/cpp-std-ocaml5.t/run.t new file mode 100644 index 00000000000..29cc0ac0431 --- /dev/null +++ b/test/blackbox-tests/test-cases/cpp-std-ocaml5.t/run.t @@ -0,0 +1,19 @@ +-std=c++11 is given on OCaml 5.0 +================================ + + $ cat >dune-project < (lang dune 3.14) + > EOF + + $ cat >dune < ;; will fail if :standard doesn't have -std=c++11 on OCaml >= 5.0 + > (executable + > (name cpp11) + > (foreign_stubs + > (language cxx) + > (names cpp11) + > (flags -std=c++98 :standard))) + > EOF + + $ (dune build ./cpp11.exe 2>/dev/null) && _build/default/cpp11.exe + Hi from C++11