Skip to content

Commit

Permalink
Merge pull request ocaml#8784 from frejsoya/ctypes-add-stubs-link-flags
Browse files Browse the repository at this point in the history
Add link flags ocamlmklib when using ctypes stubs.
  • Loading branch information
rgrinberg authored Mar 14, 2024
2 parents 1af193f + 2ad6ac9 commit 6848420
Show file tree
Hide file tree
Showing 10 changed files with 67 additions and 1 deletion.
1 change: 1 addition & 0 deletions doc/changes/8784.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Add link flags to to ocamlmklib for ctypes stubs (#8784, @frejsoya)
9 changes: 8 additions & 1 deletion src/dune_rules/lib_rules.ml
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,14 @@ let build_stubs lib ~cctx ~dir ~expander ~requires ~dir_contents ~vlib_stubs_o_f
| _ -> Action_builder.return []
in
let c_library_flags =
Expander.expand_and_eval_set expander lib.c_library_flags ~standard
let open Action_builder.O in
let+ c_lib = Expander.expand_and_eval_set expander lib.c_library_flags ~standard
and+ ctypes_lib =
(* CR rgrinberg: Should we add these flags to :standard? to make
it possible for users to remove these *)
Ctypes_rules.ctypes_cclib_flags sctx ~expander ~buildable:lib.buildable
in
c_lib @ ctypes_lib
in
let lib_o_files_for_all_modes = Mode.Map.Multi.for_all_modes o_files in
let for_all_modes = List.rev_append vlib_stubs_o_files lib_o_files_for_all_modes in
Expand Down
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,23 @@
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
4

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
4
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 6848420

Please sign in to comment.