Files
meowc/lib/binfmt.ml
T

44 lines
1.7 KiB
OCaml

(* Output naming and linker flags follow the object file format, not the
operating system: the same triple can name a platform whose format decides
whether a shared library carries a lib prefix, needs an import library, or
has any notion of a soname at all. *)
type t = Elf | Macho | Coff | Wasm
let of_platform = function
| "darwin" -> Macho
| "windows" -> Coff
| "wasm" -> Wasm
| _ -> Elf
let name = function Elf -> "elf" | Macho -> "macho" | Coff -> "coff" | Wasm -> "wasm"
let exe_ext = function Coff -> ".exe" | Wasm -> ".wasm" | Elf | Macho -> ""
(* Archives are written by ar and read back through -l, so they are named the
same way everywhere, including for the gnu ABI on Windows. *)
let static_name n = "lib" ^ n ^ ".a"
(* COFF keeps the plain name and links through a separate import library, while
the other formats carry the prefix in the shared object name itself. *)
let shared_name fmt n =
match fmt with
| Elf -> "lib" ^ n ^ ".so"
| Macho -> "lib" ^ n ^ ".dylib"
| Coff -> n ^ ".dll"
| Wasm -> "lib" ^ n ^ ".wasm"
let import_name fmt n = match fmt with Coff -> Some ("lib" ^ n ^ ".dll.a") | _ -> None
(* COFF and wasm are position independent by construction, and their drivers
warn about a flag that cannot mean anything to them. *)
let pic_flags = function Elf | Macho -> [ "-fPIC" ] | Coff | Wasm -> []
let shared_flags = function Macho -> [ "-dynamiclib" ] | Elf | Coff | Wasm -> [ "-shared" ]
let soname_flags fmt s =
match fmt with
| Elf -> [ "-Wl,-soname," ^ s ]
| Macho -> [ "-Wl,-install_name," ^ s ]
| Coff | Wasm -> []
let implib_flags fmt path =
match fmt with Coff -> [ "-Wl,--out-implib," ^ path ] | Elf | Macho | Wasm -> []