44 lines
1.7 KiB
OCaml
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 -> []
|