Skip to content

Commit

Permalink
Fix oraclelinux and fedora again
Browse files Browse the repository at this point in the history
  • Loading branch information
thierry-martinez committed May 29, 2024
1 parent 59a4169 commit d660560
Show file tree
Hide file tree
Showing 27 changed files with 3,196 additions and 122 deletions.
207 changes: 207 additions & 0 deletions packages/conf-libclang/conf-libclang.10/files/configure.ml
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"
104 changes: 104 additions & 0 deletions packages/conf-libclang/conf-libclang.10/files/utils.ml
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
48 changes: 32 additions & 16 deletions packages/conf-libclang/conf-libclang.10/opam
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
Loading

0 comments on commit d660560

Please sign in to comment.