package ctypes-foreign

  1. Overview
  2. Docs
Dynamic access to foreign C libraries using Ctypes

Install

Dune Dependency

Authors

Maintainers

Sources

0.22.0.tar.gz
sha256=aa797c5d6bcaee8883aece2d1d9a524fc1f63c78c1538b0fe69969c0e989419f
md5=8a301a3e3b79156448a6659859ad506c

Description

This installs the ctypes-foreign interface which uses libffi to provide dynamic access to foreign libraries.

Tags

org:mirage

Published: 19 Feb 2024

README

README.md

ctypes is a library for binding to C libraries using pure OCaml. The primary aim is to make writing C extensions as straightforward as possible.

The core of ctypes is a set of combinators for describing the structure of C types -- numeric types, arrays, pointers, structs, unions and functions. You can use these combinators to describe the types of the functions that you want to call, then bind directly to those functions -- all without writing or generating any C!

Usage

Suppose you want to bind to the following C functions:

   int sigemptyset(sigset_t *set);
   int sigfillset(sigset_t *set);
   int sigaddset(sigset_t *set, int signum);
   int sigdelset(sigset_t *set, int signum);
   int sigismember(const sigset_t *set, int signum);

Using ctypes you can describe the interfaces to these functions as follows:

   let sigemptyset = foreign "sigemptyset" (ptr sigset_t @-> returning int)
   let sigfillset = foreign "sigfillset" (ptr sigset_t @-> returning int)
   let sigaddset = foreign "sigaddset" (ptr sigset_t @-> int @-> returning int)
   let sigdelset = foreign "sigdelset" (ptr sigset_t @-> int @-> returning int)
   let sigismember = foreign "sigismember" (ptr sigset_t @-> int @-> returning int)

The names bound by this code have the types you might expect:

   val sigemptyset : sigset_t ptr -> int
   val sigfillset : sigset_t ptr -> int
   val sigaddset : sigset_t ptr -> int -> int
   val sigdelset : sigset_t ptr -> int -> int
   val sigismember : sigset_t ptr -> int -> int

That's all there is to it. Unlike the usual way of writing C extensions, there are no C "stub" functions to write, so there's much less opportunity for error.

The documentation and source distribution contain more complex examples, involving structs, unions, arrays, callback functions, and so on, and show how to create and use C values (like instances of sigset_t ptr) in OCaml.

Links

Dependencies (6)

  1. conf-libffi >= "2.0.0"
  2. conf-pkg-config
  3. dune-configurator
  4. ctypes = version
  5. ocaml >= "4.03.0"
  6. dune >= "2.9"

Dev Dependencies (7)

  1. odoc with-doc
  2. conf-fts with-test & os != "win32"
  3. stdlib-shims with-test
  4. conf-ncurses with-test
  5. ounit2 with-test
  6. lwt with-test & >= "2.4.7"
  7. integers with-test & >= "0.2.2"

Used by (95)

  1. arakoon >= "1.8.6" & < "1.8.12"
  2. argon2
  3. arrayjit
  4. async_ssl != "112.24.02" & < "113.33.05" | >= "v0.10.0"
  5. avroc
  6. bimage-unix
  7. bls12-381 = "0.3.15"
  8. bls12-381-legacy < "0.4.4"
  9. bls12-381-unix < "1.0.2"
  10. camlkit-base
  11. cf
  12. checked_oint
  13. cmark
  14. cmarker
  15. ctypes >= "0.7.0" & < "0.21.1"
  16. ctypes-zarith
  17. directories < "0.3"
  18. extism
  19. flock
  20. gccjit
  21. gdal >= "0.3.0"
  22. gobject-introspection
  23. gpiod
  24. gr
  25. gsasl
  26. guile
  27. hacl-star-raw < "0.4.4"
  28. hardcaml-llvmsim
  29. hardcaml-vpi
  30. hardcaml_c
  31. hardcaml_verilator
  32. hdr_histogram
  33. imguiml
  34. iocaml >= "0.4.3"
  35. iocaml-kernel >= "0.4.4"
  36. libbpf_maps
  37. libdash
  38. libirmin
  39. libudev
  40. lilv
  41. llama-cpp-ocaml
  42. lmdb < "1.0"
  43. lp-glpk < "0.4.0"
  44. lp-gurobi
  45. mariadb < "1.1.4"
  46. memtrace_viewer < "v0.15.0"
  47. mmdb
  48. mpg123
  49. nanomsg
  50. nebula
  51. netlink >= "0.2.1"
  52. ocephes >= "0.8.1"
  53. octez-l2-libs
  54. opasswd >= "0.9.3"
  55. opencc < "transition"
  56. opencc0
  57. opencc1
  58. opencc1_1
  59. orocksdb
  60. osbx < "1.1.1"
  61. osx-cf
  62. osx-secure-transport
  63. pari
  64. pari-bindings
  65. pg_query
  66. pkcs11 < "0.9.0"
  67. pkcs11-driver
  68. pkcs11-rev
  69. portaudio_c_bindings
  70. portmidi
  71. posix-getopt < "2.0.0"
  72. py
  73. qcstm >= "0.1.1"
  74. reed-solomon-erasure
  75. sarek >= "20210823"
  76. sattools
  77. sodium >= "0.2.0" & < "0.3.0"
  78. spoc >= "20170724"
  79. srt >= "0.2.2"
  80. stk_iconv
  81. swipl
  82. tensorflow
  83. tezos-sapling >= "10.2" & < "13.0"
  84. tezos-wasmer
  85. tgls >= "0.8.3"
  86. torch
  87. tsdl >= "0.8.1"
  88. tsdl-image
  89. tsdl-mixer
  90. tsdl-ttf
  91. unix-type-representations < "0.1.1"
  92. wasmer
  93. wasmtime
  94. yara
  95. yices2_bindings

Conflicts

None

OCaml

Innovation. Community. Security.