Skip to content

Commit

Permalink
Rewrite the gen_link_flags script in OCaml
Browse files Browse the repository at this point in the history
  • Loading branch information
Halbaroth committed Jul 30, 2024
1 parent d9349b1 commit 65874bd
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 58 deletions.
13 changes: 11 additions & 2 deletions src/bin/text/dune
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
(documentation
(package alt-ergo))

(executable
(name gen_link_flags)
(libraries unix fmt stdcompat cmdliner)
(modules gen_link_flags)
(promote (until-clean)))

(rule
(with-stdout-to link_flags.dune
(run ./gen-link-flags.sh %{env:LINK_MODE=dynamic} %{ocaml-config:system})))
(target link_flags.dune)
(deps (:gen gen_link_flags.exe))
(action
(with-stdout-to link_flags.dune
(run %{gen} --link-mode %{env:LINK_MODE=dynamic} --os %{ocaml-config:system}))))

(executable
(name Main_text)
Expand Down
56 changes: 0 additions & 56 deletions src/bin/text/gen-link-flags.sh

This file was deleted.

97 changes: 97 additions & 0 deletions src/bin/text/gen_link_flags.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
type os = Linux | Macos
type link_mode = Dynamic | Static | Mixed

module Cmd = struct
open Cmdliner

let show l = List.map (fun (s, _) -> s) l

let os_term =
let all = [
("linux", Linux);
("macosx", Macos)
]
in
let doc =
Fmt.str "Choose the operating system, $(docv) must be %s."
(Arg.doc_alts @@ show all)
in
Arg.(value & opt (enum all) Linux & info ["os"] ~docv:"OS" ~doc)

let link_mode_term =
let all = [
("dynamic", Dynamic);
("static", Static);
("mixed", Mixed)
]
in
let doc =
Fmt.str "Choose the operating system, $(docv) must be %s."
(Arg.doc_alts @@ show all)
in
Arg.(value & opt (enum all) Dynamic &
info ["link-mode"] ~docv:"MODE" ~doc)

let parse k =
let info = Cmd.info "rewrite-gen-link-flags" in
Cmd.v info Term.(ret (const k $ link_mode_term $ os_term))
|> Cmd.eval
end

let pkgconfig lib archive =
let cmd = Fmt.str "pkg-config %s --variable libdir" lib in
let output =
Unix.open_process_in cmd
|> In_channel.input_line
|> Option.get
in
Fmt.str "%s/%s" output archive

let pp_lib ppf s = Fmt.pf ppf "-cclib %s" s


let () =
let mixed_flags = ["-noautolink"] in
let mixed_cclib = [
"-lstdcompat_stubs";
"-lcamlzip";
"-lzarith";
"-lcamlstr";
"-lunix";
"-lnums";
"-lz"
]
in
let libs = ["gmp"] in
let rc =
Cmd.parse @@ fun link_mode os ->
let flags, cclib =
match link_mode, os with
| Dynamic, _ -> [], []
| Static, Linux -> [], ["-static"; "-no-pie"]
| Mixed, Linux ->
let cclib = mixed_cclib @ List.map (fun s -> "-l" ^ s) libs in
mixed_flags, "-Wl,-Bdynamic" :: "-Wl,-Bstatic" :: cclib
| Mixed, Macos ->
let cclib = mixed_cclib @
List.map
(fun lib ->
let archive =
if Stdcompat.String.starts_with
~prefix:"lib" lib then
Fmt.str "%s.a" lib
else
Fmt.str "lib%s.a" lib
in
pkgconfig lib archive
) libs
in
mixed_flags, cclib
| _ -> Fmt.invalid_arg "unsupported mode and OS"
in
Fmt.pr "@[(-linkall %a %a)@]"
Fmt.(list ~sep:sp string) flags
Fmt.(list ~sep:sp pp_lib) cclib;
`Ok ()
in
exit rc

0 comments on commit 65874bd

Please sign in to comment.