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 c8dac44
Show file tree
Hide file tree
Showing 3 changed files with 72 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} %{env:LINK_MODE=dynamic} %{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.

61 changes: 61 additions & 0 deletions src/bin/text/gen_link_flags.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
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 starts_with ~prefix s =
let open String in
let len_s = length s
and len_pre = length prefix in
let rec aux i =
if i = len_pre then true
else if unsafe_get s i <> unsafe_get prefix i then false
else aux (i + 1)
in len_s >= len_pre && aux 0

let () =
let mixed_flags = ["-noautolink"] in
let mixed_cclib = [
"-lstdcompat_stubs";
"-lcamlzip";
"-lzarith";
"-lcamlstr";
"-lunix";
"-lnums";
"-lz"
]
in
let libs = ["gmp"] in
let link_mode = Sys.argv.(1) and os = Sys.argv.(2) in
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", "macosx" ->
let cclib = mixed_cclib @
List.map
(fun lib ->
let archive =
if 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

0 comments on commit c8dac44

Please sign in to comment.