Skip to content

Commit

Permalink
Call the C++ compiler with -std=c++11 when using OCaml >= 5.0 (ocaml#…
Browse files Browse the repository at this point in the history
…10962)

* Call the C++ compiler with -std=c++11 when using OCaml >= 5.0
  • Loading branch information
kit-ty-kate authored and maiste committed Oct 29, 2024
1 parent e4380ff commit 0261c00
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 16 deletions.
2 changes: 2 additions & 0 deletions doc/changes/10962.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Call the C++ compiler with `-std=c++11` when using OCaml >= 5.0
(#10962, @kit-ty-kate)
36 changes: 22 additions & 14 deletions src/dune_rules/cxx_flags.ml
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
;;
2 changes: 1 addition & 1 deletion src/dune_rules/cxx_flags.mli
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
open Import

type phase =
| Compile
| Compile of Ocaml.Version.t
| Link

(** The detected compiler *)
Expand Down
6 changes: 5 additions & 1 deletion src/dune_rules/foreign_rules.ml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/ocaml/version.ml
Original file line number Diff line number Diff line change
Expand Up @@ -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)
5 changes: 5 additions & 0 deletions src/ocaml/version.mli
Original file line number Diff line number Diff line change
Expand Up @@ -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
19 changes: 19 additions & 0 deletions test/blackbox-tests/test-cases/cpp-std-ocaml5.t/run.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
-std=c++11 is given on OCaml 5.0
================================

$ cat >dune-project <<EOF
> (lang dune 3.14)
> EOF

$ cat >dune <<EOF
> ;; 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

0 comments on commit 0261c00

Please sign in to comment.