-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
59a4169
commit d660560
Showing
27 changed files
with
3,196 additions
and
122 deletions.
There are no files selected for viewing
207 changes: 207 additions & 0 deletions
207
packages/conf-libclang/conf-libclang.10/files/configure.ml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,207 @@ | ||
open Stdcompat | ||
|
||
let find_system_llvm_config () : string option = | ||
Utils.lookup_command "llvm-config" | ||
|
||
let find_brew_default_llvm_config () : string option = | ||
match Utils.line_of_command "brew --prefix" with | ||
| prefix -> Some (Filename.concat prefix "opt/llvm/bin/llvm_config") | ||
| exception Failure _ -> None | ||
|
||
let list_find_llvm_config_version (version : int) : (unit -> string option) list | ||
= | ||
let f command_format () = | ||
Utils.lookup_command (Printf.sprintf command_format version) | ||
in | ||
List.map f | ||
[ | ||
"llvm-config-%d"; | ||
"llvm-config-%d.0"; | ||
"llvm-config%d0"; | ||
"llvm-config%d"; | ||
"llvm-config-%d-64"; | ||
"llvm-config-%d-32"; | ||
"llvm-config-mp-%d"; | ||
"llvm-config-mp-%d.0"; | ||
] | ||
|
||
let list_find_brew_llvm_config_version (version : int) : | ||
(unit -> string option) list = | ||
let f package () = | ||
match | ||
Utils.line_of_command | ||
(Filename.quote_command "brew" [ "--cellar"; package ]) | ||
with | ||
| exception Failure _ -> None | ||
| prefix -> ( | ||
match | ||
Utils.expand_glob | ||
(Printf.sprintf "%s/%d*/bin/llvm-config" prefix version) | ||
with | ||
| filename :: _ -> Some filename | ||
| [] -> None) | ||
in | ||
List.map f [ Printf.sprintf "llvm@%d" version; "llvm" ] | ||
|
||
let split_command_args cmdline = | ||
List.filter (fun s -> s <> "") (String.split_on_char ' ' cmdline) | ||
|
||
let check_llvm_usability version_major llvm_config = | ||
let llvm_cflags = | ||
Utils.line_of_command (Filename.quote_command llvm_config [ "--cflags" ]) | ||
in | ||
let llvm_ldflags = | ||
Utils.line_of_command (Filename.quote_command llvm_config [ "--ldflags" ]) | ||
in | ||
let llvm_libdir = | ||
Utils.line_of_command (Filename.quote_command llvm_config [ "--libdir" ]) | ||
in | ||
let llvm_cflags_list = split_command_args llvm_cflags in | ||
let llvm_ldflags_list = split_command_args llvm_ldflags in | ||
let predicate cflag = | ||
cflag <> "-Wstring-conversion" | ||
(* Filter -Wstring-conversion for OpenSUSE *) | ||
&& cflag <> "-Werror=unguarded-availability-new" | ||
&& cflag <> "-Wcovered-switch-default" | ||
&& cflag <> "-Wdelete-non-virtual-dtor" | ||
in | ||
let llvm_cflags_list = List.filter predicate llvm_cflags_list in | ||
Utils.with_temp_dir "conf-libclang" "" (fun temp_dir -> | ||
let source_code = Filename.concat temp_dir "test_libclang.c" in | ||
Out_channel.with_open_text source_code (fun oc -> | ||
Out_channel.output_string oc | ||
{| | ||
#include <clang-c/Index.h> | ||
#include <stdlib.h> | ||
|
||
int | ||
main(int argc, char *argv[]) | ||
{ | ||
CXIndex idx = clang_createIndex(1, 1); | ||
clang_disposeIndex(idx); | ||
return EXIT_SUCCESS; | ||
} | ||
|}); | ||
let object_file = Filename.concat temp_dir "test_libclang.o" in | ||
let executable_file = Filename.concat temp_dir "test_libclang" in | ||
Utils.with_open_process_in | ||
(Filename.quote_command "cc" | ||
([ "-o"; object_file; "-c" ] @ llvm_cflags_list @ [ source_code ])) | ||
ignore; | ||
(try | ||
Utils.with_open_process_in | ||
(Filename.quote_command "cc" | ||
([ "-o"; executable_file ] @ llvm_ldflags_list | ||
@ [ object_file; "-lclang"; "-Wl,-rpath," ^ llvm_libdir ])) | ||
ignore | ||
with Failure _ -> | ||
(* On Ubuntu 23.04, libclang.so is a dead symbolic link, | ||
but we can link to libclang-16.so.1 *) | ||
Utils.with_open_process_in | ||
(Filename.quote_command "cc" | ||
([ "-o"; executable_file ] @ llvm_ldflags_list | ||
@ [ | ||
object_file; | ||
Printf.sprintf "-l:libclang-%d.so.1" version_major; | ||
"-Wl,-rpath," ^ llvm_libdir; | ||
])) | ||
ignore); | ||
Utils.with_open_process_in executable_file ignore) | ||
|
||
type variable = { name : string; value : string } | ||
|
||
type config = { | ||
llvm_config : string; | ||
llvm_version : string; | ||
variables : variable list; | ||
} | ||
|
||
let write_config_file config = | ||
let checksum = Utils.hash_file config.llvm_config in | ||
Out_channel.with_open_text "conf-libclang.config" (fun oc -> | ||
Out_channel.output_string oc | ||
(Printf.sprintf | ||
{|opam-version: "2.0" | ||
file-depends: [ "%s" "%s" ] | ||
variables { | ||
|} | ||
config.llvm_config checksum); | ||
let variables = | ||
[ | ||
{ name = "config"; value = config.llvm_config }; | ||
{ name = "version"; value = config.llvm_version }; | ||
] | ||
@ config.variables | ||
in | ||
variables | ||
|> List.iter (fun { name; value } -> | ||
Out_channel.output_string oc | ||
(Printf.sprintf {| %s: "%s" | ||
|} name value)); | ||
Out_channel.output_string oc {|} | ||
|}) | ||
|
||
let check_version maximum_version find_llvm_config = | ||
match find_llvm_config () with | ||
| Some llvm_config -> ( | ||
match | ||
Utils.line_of_command | ||
(Filename.quote_command llvm_config [ "--version" ]) | ||
with | ||
| exception Failure _ -> None | ||
| llvm_version -> | ||
let version_major = Scanf.sscanf llvm_version "%d." Fun.id in | ||
if version_major <= maximum_version then | ||
match check_llvm_usability version_major llvm_config with | ||
| () -> | ||
let variables = | ||
match version_major with | ||
| 14 -> | ||
[ | ||
{ | ||
name = "clangml460_configure_options"; | ||
value = "--with-llvm-version=14.0.0"; | ||
}; | ||
] | ||
| _ -> [] | ||
in | ||
Some { llvm_config; llvm_version; variables } | ||
| exception Failure _ -> None | ||
else None) | ||
| _ -> None | ||
|
||
let find_llvm_config maximum_version = | ||
match | ||
List.find_map | ||
(check_version maximum_version) | ||
[ find_system_llvm_config; find_brew_default_llvm_config ] | ||
with | ||
| Some config -> Some config | ||
| None -> | ||
let rec loop version = | ||
if version < 3 then None | ||
else | ||
match | ||
List.find_map | ||
(check_version maximum_version) | ||
(list_find_llvm_config_version version | ||
@ list_find_brew_llvm_config_version version) | ||
with | ||
| Some config -> Some config | ||
| None -> loop (version - 1) | ||
in | ||
loop maximum_version | ||
|
||
let find_and_write_llvm_config maximum_version = | ||
match find_llvm_config maximum_version with | ||
| Some config -> write_config_file config | ||
| None -> | ||
failwith | ||
(Printf.sprintf "No usable version of LLVM <=%d.0.x found" | ||
maximum_version) | ||
|
||
let () = | ||
match Sys.argv with | ||
| [| _; maximum_version |] -> | ||
find_and_write_llvm_config (int_of_string maximum_version) | ||
| _ -> failwith "Usage: configure.ml version" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
open Stdcompat | ||
|
||
let format_process_status fmt (ps : Unix.process_status) : unit = | ||
match ps with | ||
| WEXITED code -> Format.fprintf fmt "return code %d" code | ||
| WSIGNALED signal -> Format.fprintf fmt "signal number %d" signal | ||
| WSTOPPED signal -> Format.fprintf fmt "stopped by signal %d" signal | ||
|
||
let with_open_process_in command f = | ||
Printf.eprintf "%s: %!" command; | ||
let channel = Unix.open_process_in command in | ||
let result = | ||
try f channel | ||
with exc -> | ||
ignore (Unix.close_process_in channel); | ||
raise exc | ||
in | ||
match Unix.close_process_in channel with | ||
| WEXITED 0 -> | ||
Printf.eprintf "OK\n%!"; | ||
result | ||
| ps -> | ||
Printf.eprintf "%s\n%!" (Format.asprintf "%a" format_process_status ps); | ||
failwith (Format.asprintf "%s: %a" command format_process_status ps) | ||
|
||
(* temp_dir is missing in stdcompat.19 *) | ||
let temp_dir prefix suffix = | ||
let path = Filename.temp_file prefix suffix in | ||
Sys.remove path; | ||
Sys.mkdir path 0o700; | ||
path | ||
|
||
let with_temp_dir prefix suffix f = | ||
let temp_dir = temp_dir prefix suffix in | ||
Fun.protect | ||
(fun () -> f temp_dir) | ||
~finally:(fun () -> | ||
let remove_file filename = | ||
Sys.remove (Filename.concat temp_dir filename) | ||
in | ||
Array.iter remove_file (Sys.readdir temp_dir); | ||
Sys.rmdir temp_dir) | ||
|
||
(* input_lines is missing in stdcompat.19 *) | ||
let input_lines ic = | ||
let rec aux accu = | ||
match Stdlib.input_line ic with | ||
| line -> aux (line :: accu) | ||
| exception End_of_file -> List.rev accu | ||
in | ||
aux [] | ||
|
||
let lines_of_command (command : string) : string list = | ||
with_open_process_in command input_lines | ||
|
||
let line_of_command (command : string) : string = | ||
match lines_of_command command with | ||
| [ result ] -> result | ||
| [] -> failwith (Printf.sprintf "%s: unexpected empty output" command) | ||
| _ :: _ :: _ -> | ||
failwith | ||
(Printf.sprintf "%s: unexpected output with multiple lines" command) | ||
|
||
let lookup_command (command : string) : string option = | ||
match | ||
line_of_command (Filename.quote_command "command" [ "-v"; command ]) | ||
with | ||
| result -> Some result | ||
| exception Failure _ -> None | ||
|
||
let expand_glob (pattern : string) : string list = | ||
(* pattern should not be quoted *) | ||
match lines_of_command ("ls -1 " ^ pattern) with | ||
| lines -> lines | ||
| exception Failure _ -> [] | ||
|
||
type hasher = { prefix : string; command : string; arguments : string list } | ||
|
||
let opam_hash_string hasher hash = Printf.sprintf "%s=%s" hasher hash | ||
|
||
let hash_file (filename : string) : string = | ||
let try_hasher (hasher : hasher) = | ||
match | ||
line_of_command | ||
(Filename.quote_command hasher.command | ||
(hasher.arguments @ [ filename ])) | ||
with | ||
| exception Failure _ -> None | ||
| result -> | ||
let first_space_index = String.index result ' ' in | ||
let hash = String.sub result 0 first_space_index in | ||
Some (opam_hash_string hasher.prefix hash) | ||
in | ||
match | ||
List.find_map try_hasher | ||
[ | ||
{ prefix = "sha512"; command = "sha512sum"; arguments = [] }; | ||
{ prefix = "sha512"; command = "shasum"; arguments = [ "-a"; "512" ] }; | ||
{ prefix = "md5"; command = "md5sum"; arguments = [] }; | ||
{ prefix = "md5"; command = "md5"; arguments = [ "-q" ] }; | ||
] | ||
with | ||
| None -> opam_hash_string "md5" (Digest.file filename) | ||
| Some hash -> hash |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,35 +2,51 @@ opam-version: "2.0" | |
maintainer: "Thierry Martinez <[email protected]>" | ||
authors: "The LLVM team" | ||
homepage: "http://llvm.org" | ||
bug-reports: "https://llvm.org/bugs/" | ||
bug-reports: "https://github.com/thierry-martinez/conf-libclang" | ||
license: "MIT" | ||
build-env: [ | ||
[HOMEBREW_NO_AUTO_UPDATE = "1"] | ||
] | ||
build: [ | ||
["bash" "-ex" "configure.sh" version] | ||
["ocamlfind" "ocamlopt" "-package" "unix,stdcompat" "-linkpkg" "-o" "configure" "utils.ml" "configure.ml"] | ||
["./configure" "10"] | ||
] | ||
depends: [ | ||
"conf-bash" {build} | ||
"ocamlfind" {build} | ||
"stdcompat" {build & >= "19"} | ||
] | ||
depexts: [ | ||
["llvm"] {os-distribution = "homebrew" & os = "macos"} | ||
["llvm"] {os-distribution = "macports" & os = "macos"} | ||
["libclang-dev" "llvm-dev"] {os-family = "debian"} | ||
["llvm10" "clang10"] {os-distribution = "arch"} | ||
["libclang-10-dev" "libclang-cpp10-dev" "llvm-10-dev"] | ||
{os-distribution = "ubuntu" & os-version >= "20.04"} | ||
["libclang-7-dev" "llvm-7-dev"] { os-distribution = "debian" & os-version = "10" } | ||
["clang-devel-10.0.1" "llvm-devel-10.0.1" "llvm-static-10.0.1" "zlib-devel"] | ||
{os-distribution = "ol" & os-version >= 8 & os-version < 9} | ||
["clang-dev" "llvm-dev" "clang-static"] {os-distribution = "alpine"} | ||
["clang-devel" "llvm-devel" "llvm-static" "zlib-devel"] | ||
{os-distribution = "centos"} | ||
["clang-devel" "llvm-devel" "zlib-devel" "redhat-rpm-config"] | ||
{os-distribution = "fedora"} | ||
["llvm-clang-devel"] {os-family = "suse" | os-family = "opensuse"} | ||
["devel/llvm10"] {os = "freebsd"} | ||
["sys-devel/clang"] {os-distribution = "gentoo"} | ||
] | ||
synopsis: "Virtual package relying on the installation of llvm and clang libraries (any version)" | ||
x-ci-accept-failures: [ | ||
"oraclelinux-7" # clang-devel is not available | ||
"alpine-3.13" # unavailable system package 'llvm-dev' | ||
"alpine-3.14" # unavailable system package 'llvm-dev' | ||
"alpine-3.15" # unavailable system package 'llvm-dev' | ||
"alpine-3.16" # unavailable system package 'llvm-dev' | ||
"opensuse-15.3" # unavailable system package 'llvm-clang-devel' | ||
"freebsd" # no devel/llvm10 | ||
"macos-homebrew" # llvm@n is not available | ||
"ubuntu-22.04" "ubuntu-22.10" "ubuntu-23.04" "ubuntu-23.10" "ubuntu-24.04" # libclang-n-dev is not available | ||
"debian-11" # libclang-n-dev is not available | ||
"debian-12" "debian-unstable" # libclang-n-dev is not available | ||
"debian-13" "debian-testing" # libclang-n-dev is not available | ||
"fedora-38" "fedora-39" "fedora-40" # clang-devel is not available | ||
"oraclelinux-9" # clang-devel is not available | ||
] | ||
extra-files: [ | ||
["utils.ml" "sha512=7c6fc56abc8ee9b85b787aaee8b28b54087c4af748b15c3c03de5dbcd253ade2e52930e0b180b883364c7302de000b2f37f9171b687868c7c52b77ced1cb00eb"] | ||
["configure.ml" "sha512=094741c35cb509803bf76307335b86ebb11a01563b3d3cb1a88091856381a553eadbd5dffa272a1fe9ad9c62eefc45cce97d598e575e877f0d5fe1c164b30b91"] | ||
] | ||
synopsis: "Virtual package relying on the installation of llvm and clang libraries (<= 10.0.x)" | ||
flags: conf | ||
extra-source "configure.sh" { | ||
src: | ||
"https://raw.githubusercontent.com/ocaml/opam-source-archives/main/patches/conf-libclang/configure.sh.10" | ||
checksum: | ||
"sha512=8c95b2f06ce5bc161fd68ff8f8ddc0b9b7ea1a318732b79e4131d0adf9222662dd95a60becf28ef5db83fecf1081266a6ccf128864c019571948a232ba18fe82" | ||
} |
Oops, something went wrong.