Skip to content

Commit

Permalink
test(ctypes): missing link flags to ocamlmklib
Browse files Browse the repository at this point in the history
Signed-off-by: Frej Soya <frej.soya@gmail.com>
  • Loading branch information
frejsoya authored and rgrinberg committed Mar 13, 2024
1 parent a262a63 commit 6e0b25e
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
(executable
(name example)
(modes byte)
(libraries examplelib))
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
(lang dune 3.10)

(using ctypes 0.3)
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
let () =
Printf.printf "%d\n" (Examplelib.C.Functions.add2 2)
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
Build an example library as a DLL and set up the environment so that it looks
like a system/distro library that can be probed with pkg-config and dynamically
loaded.

$ LIBEX=$(realpath "$PWD/../libexample")

ocamlrun + requires CAML_LD_LIBRARY_PATH such that dlopen system call can find
dllexamplelib_stub.so

Explictly set {DYLD,LD}_LIBRARY_PATH at runtime for this testcase, otherwise
dlopen cannot find libexample, after loading dllexamplelib_stub.so

$ PKG_CONFIG_PATH="$LIBEX/pkgconfig" PKG_CONFIG_ARGN="--define-prefix" DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:$LIBEX" LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIBEX" CAML_LD_LIBRARY_PATH="$CAML_LD_LIBRARY_PATH:$PWD/_build/default/stubgen" dune exec ./example.bc
Fatal error: cannot load shared library dllexamplelib_stubs
Reason: $TESTCASE_ROOT/_build/default/stubgen/dllexamplelib_stubs.so: undefined symbol: example_add2
Aborted
[134]

Utop works with ctypes pkg-config external library.

$ DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:$LIBEX" LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIBEX" PKG_CONFIG_PATH="$LIBEX/pkgconfig" PKG_CONFIG_ARGN="--define-prefix" dune utop --display=short ./ -- example.ml
pkg-config stubgen/.pkg-config/libexample.cflags
pkg-config stubgen/.pkg-config/libexample.libs
ocamlc .utop/.utop.eobjs/byte/dune__exe__Utop.{cmi,cmo,cmt}
ocamlc .utop/utop.bc
Fatal error: cannot load shared library dllexamplelib_stubs
Reason: $TESTCASE_ROOT/_build/default/stubgen/dllexamplelib_stubs.so: undefined symbol: example_add2
Aborted
[134]
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
(library
(name examplelib)
(flags (:standard -w -9-27))
(ctypes
(external_library_name libexample)
(build_flags_resolver pkg_config)
(headers (include "example.h"))
(type_description
(instance Types)
(functor Type_description))
(function_description
(instance Functions)
(functor Function_description))
(generated_entry_point C)))
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
open Ctypes

module Types = Types_generated

module Functions (F : Ctypes.FOREIGN) = struct
open F
let add2 = foreign "example_add2" (int @-> returning int)
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module Types (F : Ctypes.TYPE) = struct

end
1 change: 1 addition & 0 deletions test/blackbox-tests/test-cases/ctypes/dune
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

(cram
(applies_to
bytecode-stubs-external-lib
lib-pkg_config
lib-pkg_config-multiple-fd
lib-external-name-need-mangling
Expand Down

0 comments on commit 6e0b25e

Please sign in to comment.