* Producing a C wrapper with ocamlbuild or OMake @ 2007-03-27 23:10 Joel Reymont 2007-03-28 8:53 ` [Caml-list] " Nicolas Pouillard 0 siblings, 1 reply; 14+ messages in thread From: Joel Reymont @ 2007-03-27 23:10 UTC (permalink / raw) To: Caml List Folks, I'm trying to produce a C library from my OCaml code. I found these instructions on the net: ocamlopt -output-obj -o fibcaml.o fib.ml ocamlopt -c fibwrap.c cp /usr/local/lib/ocaml/libasmrun.a libfib.a ar r libfib.a fibcaml.o fibwrap.o How would I accomplish the same with ocamlbuild, which I'm using now, or with OMake? Thanks in advance, Joel -- http://wagerlabs.com/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Caml-list] Producing a C wrapper with ocamlbuild or OMake 2007-03-27 23:10 Producing a C wrapper with ocamlbuild or OMake Joel Reymont @ 2007-03-28 8:53 ` Nicolas Pouillard [not found] ` <cd67f63a0703280158g559eff38pb6cca758682cad4a@mail.gmail.com> 0 siblings, 1 reply; 14+ messages in thread From: Nicolas Pouillard @ 2007-03-28 8:53 UTC (permalink / raw) To: Joel Reymont; +Cc: Caml List On 3/28/07, Joel Reymont <joelr1@gmail.com> wrote: > Folks, > > I'm trying to produce a C library from my OCaml code. I found these > instructions on the net: > > ocamlopt -output-obj -o fibcaml.o fib.ml > ocamlopt -c fibwrap.c > cp /usr/local/lib/ocaml/libasmrun.a libfib.a > ar r libfib.a fibcaml.o fibwrap.o > > How would I accomplish the same with ocamlbuild, which I'm using now, > or with OMake? > Just add some rules... Here is a plugin example that I will add to the example directory. open Ocamlbuild_plugin;; open Command;; let cc = A"cc";; let ar = A"ar";; let libasmrun = !*Ocamlbuild_pack.Ocaml_utils.stdlib_dir/"libasmrun.a";; dispatch begin function | After_rules -> rule "output C obj" ~dep:"%.ml" ~prod:"%caml.o" begin fun env _ -> let caml_o = env "%caml.o" and ml = env "%.ml" in Cmd(S[!Options.ocamlopt; A"-output-obj"; P ml; A"-o"; Px caml_o]) end; rule "build C lib" ~deps:["%wrap.o"; "%caml.o"] ~prod:"lib%.a" begin fun env _ -> let wrap_o = env "%wrap.o" and caml_o = env "%caml.o" and lib_a = env "lib%.a" in Seq[cp libasmrun lib_a; Cmd(S[ar; A"r"; Px lib_a; P caml_o; P wrap_o])] end; rule "build main" ~deps:["libfib.a"; "main.o"] ~prod:"main" begin fun _ _ -> Cmd(S[cc; P"main.o"; P"libfib.a"; A"-o"; Px"main"]) end; | _ -> () end -- Nicolas Pouillard ^ permalink raw reply [flat|nested] 14+ messages in thread
[parent not found: <cd67f63a0703280158g559eff38pb6cca758682cad4a@mail.gmail.com>]
* Re: [Caml-list] Producing a C wrapper with ocamlbuild or OMake [not found] ` <cd67f63a0703280158g559eff38pb6cca758682cad4a@mail.gmail.com> @ 2007-03-28 9:04 ` Joel Reymont 2007-03-28 12:38 ` Nicolas Pouillard 0 siblings, 1 reply; 14+ messages in thread From: Joel Reymont @ 2007-03-28 9:04 UTC (permalink / raw) To: Nicolas Pouillard; +Cc: Caml List On Mar 28, 2007, at 9:58 AM, Nicolas Pouillard wrote: > In fact you better should add the libasmrun definition inside the > After_rules to not force something too soon... This is still foreign science to me. How would I do this and also why? Last but not least, how do I trigger the build? Do I just run ocamlbuild without a target? Thanks, Joel -- http://wagerlabs.com/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Caml-list] Producing a C wrapper with ocamlbuild or OMake 2007-03-28 9:04 ` Joel Reymont @ 2007-03-28 12:38 ` Nicolas Pouillard 2007-03-28 13:25 ` Joel Reymont 0 siblings, 1 reply; 14+ messages in thread From: Nicolas Pouillard @ 2007-03-28 12:38 UTC (permalink / raw) To: Joel Reymont; +Cc: Caml List On 3/28/07, Joel Reymont <joelr1@gmail.com> wrote: > > On Mar 28, 2007, at 9:58 AM, Nicolas Pouillard wrote: > > > In fact you better should add the libasmrun definition inside the > > After_rules to not force something too soon... > > This is still foreign science to me. How would I do this and also why? Yep that's my bad to use that intern variable to the standard library, it will better safer one day. > Last but not least, how do I trigger the build? > > Do I just run ocamlbuild without a target? Nop there is no concept of default target In this example you can run `ocamlbuild main' assuming you have all sources files (fib.ml fibwrap.c main.c myocamlbuild.ml). PS: this example is in the CVS (in release310 branch but not yet propagated to the pubilc server). -- Nicolas Pouillard ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Caml-list] Producing a C wrapper with ocamlbuild or OMake 2007-03-28 12:38 ` Nicolas Pouillard @ 2007-03-28 13:25 ` Joel Reymont 2007-03-28 13:57 ` Nicolas Pouillard 0 siblings, 1 reply; 14+ messages in thread From: Joel Reymont @ 2007-03-28 13:25 UTC (permalink / raw) To: Nicolas Pouillard; +Cc: Caml List Nicolas, I think I'm missing one more bit: ocamlbuild main + ocamlfind ocamlopt -package ounit -output-obj morpher.ml -o morphercaml.o No implementations provided for the following modules: Symtab referenced from morpher.cmx Ninja referenced from morpher.cmx Easy_lexer referenced from morpher.cmx Easy_parser referenced from morpher.cmx Ppninja referenced from morpher.cmx Pretty referenced from morpher.cmx Parser_util referenced from morpher.cmx Ninja_morph referenced from morpher.cmx Command exited with code 2. Compilation unsuccessful after building 2 targets (1 cached) in 00:00:00. My complete plugin file is below. I can build my test program just fine using ocamlbuild test.byte but trying to produce the library gives me the above error. What am I missing? How can I have morpher.ml automatically pull in the other modules? I do open modules at the top of morpher.ml like this open Ninja_morph open Parser_util module PP = Ppninja module N = Ninja Thanks, Joel --- open Ocamlbuild_plugin;; open Command;; let cc = A"cc";; let ar = A"ar";; let packages = "ounit" (* "pkg1,pkg2,..." *);; let ocamlfind cmd = S[A"ocamlfind"; A cmd; A"-package"; A packages];; flag ["ocaml"; "link"] (A"-linkpkg");; dispatch begin function | After_options -> Options.ocamlc := ocamlfind "ocamlc"; Options.ocamlopt := ocamlfind "ocamlopt"; | After_rules -> rule "output C obj" ~dep:"%.ml" ~prod:"%caml.o" begin fun env _ -> let caml_o = env "%caml.o" and ml = env "%.ml" in Cmd(S[!Options.ocamlopt; A"-output-obj"; P ml; A"-o"; Px caml_o]) end; rule "build C lib" ~deps:["%_stubs.o"; "%caml.o"] ~prod:"lib%.a" begin fun env _ -> let wrap_o = env "%wrap.o" and caml_o = env "%caml.o" and libasmrun = ! *Ocamlbuild_pack.Ocaml_utils.stdlib_dir/"libasmrun.a" and lib_a = env "lib%.a" in Seq[cp libasmrun lib_a; Cmd(S[ar; A"r"; Px lib_a; P caml_o; P wrap_o])] end; rule "build morpher" ~deps:["libmorpher.a"; "main.o"] ~prod:"main" begin fun _ _ -> Cmd(S[cc; P"morpher.o"; P"libmorpher.a"; A"-o"; Px"main"]) end; | _ -> () end -- http://wagerlabs.com/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Caml-list] Producing a C wrapper with ocamlbuild or OMake 2007-03-28 13:25 ` Joel Reymont @ 2007-03-28 13:57 ` Nicolas Pouillard 2007-03-28 14:10 ` Joel Reymont 2007-03-28 14:44 ` Joel Reymont 0 siblings, 2 replies; 14+ messages in thread From: Nicolas Pouillard @ 2007-03-28 13:57 UTC (permalink / raw) To: Joel Reymont; +Cc: Caml List Hum, -output-obj is more a link operation.... Using this rule: ... flag ["ocaml"; "link"; "output_obj"] (A"-output-obj"); (* I will make this one part of the standard set of flags *) rule "output C obj" ~deps:["%.cmx"; "%.o"] ~prod:"%caml.o" (Ocamlbuild_pack.Ocaml_compiler.native_link "%.cmx" "%caml.o"); ... Plus having this in your _tags <*caml.o>: output_obj Will works fine. On 3/28/07, Joel Reymont <joelr1@gmail.com> wrote: > Nicolas, > > I think I'm missing one more bit: > > ocamlbuild main > > + ocamlfind ocamlopt -package ounit -output-obj morpher.ml -o > morphercaml.o > No implementations provided for the following modules: > Symtab referenced from morpher.cmx > Ninja referenced from morpher.cmx > Easy_lexer referenced from morpher.cmx > Easy_parser referenced from morpher.cmx > Ppninja referenced from morpher.cmx > Pretty referenced from morpher.cmx > Parser_util referenced from morpher.cmx > Ninja_morph referenced from morpher.cmx > Command exited with code 2. > Compilation unsuccessful after building 2 targets (1 cached) in > 00:00:00. > > My complete plugin file is below. I can build my test program just > fine using > > ocamlbuild test.byte > > but trying to produce the library gives me the above error. > > What am I missing? How can I have morpher.ml automatically pull in > the other modules? > > I do open modules at the top of morpher.ml like this > > open Ninja_morph > open Parser_util > module PP = Ppninja > module N = Ninja > > > Thanks, Joel > > --- > > open Ocamlbuild_plugin;; > open Command;; > > let cc = A"cc";; > let ar = A"ar";; > let packages = "ounit" (* "pkg1,pkg2,..." *);; > > let ocamlfind cmd = > S[A"ocamlfind"; A cmd; A"-package"; A packages];; > > flag ["ocaml"; "link"] (A"-linkpkg");; > > dispatch begin function > | After_options -> > Options.ocamlc := ocamlfind "ocamlc"; > Options.ocamlopt := ocamlfind "ocamlopt"; > | After_rules -> > rule "output C obj" > ~dep:"%.ml" > ~prod:"%caml.o" > begin fun env _ -> > let caml_o = env "%caml.o" and ml = env "%.ml" in > Cmd(S[!Options.ocamlopt; A"-output-obj"; P ml; A"-o"; Px > caml_o]) > end; > rule "build C lib" > ~deps:["%_stubs.o"; "%caml.o"] > ~prod:"lib%.a" > begin fun env _ -> > let wrap_o = env "%wrap.o" > and caml_o = env "%caml.o" > and libasmrun = ! > *Ocamlbuild_pack.Ocaml_utils.stdlib_dir/"libasmrun.a" > and lib_a = env "lib%.a" in > Seq[cp libasmrun lib_a; > Cmd(S[ar; A"r"; Px lib_a; P caml_o; P wrap_o])] > end; > rule "build morpher" > ~deps:["libmorpher.a"; "main.o"] > ~prod:"main" > begin fun _ _ -> > Cmd(S[cc; P"morpher.o"; P"libmorpher.a"; A"-o"; Px"main"]) > end; > | _ -> () > end > > -- > http://wagerlabs.com/ > > > > > > -- Nicolas Pouillard ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Caml-list] Producing a C wrapper with ocamlbuild or OMake 2007-03-28 13:57 ` Nicolas Pouillard @ 2007-03-28 14:10 ` Joel Reymont 2007-03-28 15:46 ` Nicolas Pouillard 2007-03-28 14:44 ` Joel Reymont 1 sibling, 1 reply; 14+ messages in thread From: Joel Reymont @ 2007-03-28 14:10 UTC (permalink / raw) To: Nicolas Pouillard; +Cc: Caml List On Mar 28, 2007, at 2:57 PM, Nicolas Pouillard wrote: > flag ["ocaml"; "link"; "output_obj"] (A"-output-obj"); > (* I will make this one part of the standard set of flags *) Wouldn't this set of flags conflict with my previous flag ["ocaml"; "link"] (A"-linkpkg");; I replaced the flags and now get ocamlbuild test.byte -- + ocamlfind ocamlc -package ounit easy_code.cmo ninja.cmo easy.cmo ninja_morph.cmo parser_util.cmo symtab.cmo easy_parser.cmo easy_lexer.cmo parser_test.cmo pretty.cmo ppninja.cmo ninja_morph_test.cmo test.cmo -o test.byte Error while linking parser_test.cmo: Reference to undefined global `OUnit' Command exited with code 2. What's the flag syntax to add -linkpkg to -output-obj? Thanks, Joel -- http://wagerlabs.com/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Caml-list] Producing a C wrapper with ocamlbuild or OMake 2007-03-28 14:10 ` Joel Reymont @ 2007-03-28 15:46 ` Nicolas Pouillard 2007-03-28 18:58 ` Joel Reymont 0 siblings, 1 reply; 14+ messages in thread From: Nicolas Pouillard @ 2007-03-28 15:46 UTC (permalink / raw) To: Joel Reymont; +Cc: Caml List On 3/28/07, Joel Reymont <joelr1@gmail.com> wrote: > > On Mar 28, 2007, at 2:57 PM, Nicolas Pouillard wrote: > > > flag ["ocaml"; "link"; "output_obj"] (A"-output-obj"); > > (* I will make this one part of the standard set of flags *) > > Wouldn't this set of flags conflict with my previous I don't know why it would. What is your _tags contents? > I replaced the flags and now get replaced ? -- Nicolas Pouillard ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Caml-list] Producing a C wrapper with ocamlbuild or OMake 2007-03-28 15:46 ` Nicolas Pouillard @ 2007-03-28 18:58 ` Joel Reymont 2007-03-28 21:13 ` Nicolas Pouillard 0 siblings, 1 reply; 14+ messages in thread From: Joel Reymont @ 2007-03-28 18:58 UTC (permalink / raw) To: Nicolas Pouillard; +Cc: Caml List On Mar 28, 2007, at 4:46 PM, Nicolas Pouillard wrote: > I don't know why it would. What is your _tags contents? <*caml.o>: output_obj >> I replaced the flags and now get > > replaced ? Well, yes, I have this now: (* flag ["ocaml"; "link"] (A"-linkpkg");; *) flag ["ocaml"; "link"; "output_obj"] (A"-output-obj"); Can I use flag multiple times, i.e. uncomment the first flag and have two of them? Thanks, Joel -- http://wagerlabs.com/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Caml-list] Producing a C wrapper with ocamlbuild or OMake 2007-03-28 18:58 ` Joel Reymont @ 2007-03-28 21:13 ` Nicolas Pouillard 0 siblings, 0 replies; 14+ messages in thread From: Nicolas Pouillard @ 2007-03-28 21:13 UTC (permalink / raw) To: Joel Reymont; +Cc: Caml List On 3/28/07, Joel Reymont <joelr1@gmail.com> wrote: > > On Mar 28, 2007, at 4:46 PM, Nicolas Pouillard wrote: > > > I don't know why it would. What is your _tags contents? > > <*caml.o>: output_obj > > >> I replaced the flags and now get > > > > replaced ? > > Well, yes, I have this now: > > (* > flag ["ocaml"; "link"] (A"-linkpkg");; > *) > > flag ["ocaml"; "link"; "output_obj"] (A"-output-obj"); > > Can I use flag multiple times, i.e. uncomment the first flag and have > two of them? > Yes you need both of them. -- Nicolas Pouillard ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Caml-list] Producing a C wrapper with ocamlbuild or OMake 2007-03-28 13:57 ` Nicolas Pouillard 2007-03-28 14:10 ` Joel Reymont @ 2007-03-28 14:44 ` Joel Reymont 2007-03-28 15:49 ` Nicolas Pouillard 1 sibling, 1 reply; 14+ messages in thread From: Joel Reymont @ 2007-03-28 14:44 UTC (permalink / raw) To: Nicolas Pouillard; +Cc: Caml List One last question... Two, actually. How would I add another C file to the pipeline to produce the final executable? Then, I tried using the library I built but I get an error. I have no iea what's going on, does anyone? I'm on Mac OSX if it matters. gcc foo.c -L_build -lmorpher -o foo /usr/bin/ld: Undefined symbols: _caml_atom_table _caml_code_area_end _caml_code_area_start _caml_static_data_end _caml_static_data_start collect2: ld returned 1 exit status nm _build/libmorpher.a |grep caml_atom_table 00000400 C _caml_atom_table U _caml_atom_table Thanks, Joel -- http://wagerlabs.com/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Caml-list] Producing a C wrapper with ocamlbuild or OMake 2007-03-28 14:44 ` Joel Reymont @ 2007-03-28 15:49 ` Nicolas Pouillard 2007-03-28 22:46 ` Joel Reymont 0 siblings, 1 reply; 14+ messages in thread From: Nicolas Pouillard @ 2007-03-28 15:49 UTC (permalink / raw) To: Joel Reymont; +Cc: Caml List On 3/28/07, Joel Reymont <joelr1@gmail.com> wrote: > One last question... Two, actually. > > How would I add another C file to the pipeline to produce the final > executable? Add it like a link flag. flag ["ocaml"; "link"; "output_obj"(* I think that's where you want it *)] (A"your_file.o"); Then add it to dependencies to force it's creation. dep ["ocaml"; "link"; "output_obj"(* I think that's where you want it *)] ["your_file.o"]; > Then, I tried using the library I built but I get an error. I have no > iea what's going on, does anyone? I'm on Mac OSX if it matters. > > gcc foo.c -L_build -lmorpher -o foo > /usr/bin/ld: Undefined symbols: > _caml_atom_table > _caml_code_area_end > _caml_code_area_start > _caml_static_data_end > _caml_static_data_start > collect2: ld returned 1 exit status > > nm _build/libmorpher.a |grep caml_atom_table > 00000400 C _caml_atom_table > U _caml_atom_table > No idea. -- Nicolas Pouillard ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Caml-list] Producing a C wrapper with ocamlbuild or OMake 2007-03-28 15:49 ` Nicolas Pouillard @ 2007-03-28 22:46 ` Joel Reymont 2007-03-29 11:20 ` Nicolas Pouillard 0 siblings, 1 reply; 14+ messages in thread From: Joel Reymont @ 2007-03-28 22:46 UTC (permalink / raw) To: Nicolas Pouillard; +Cc: Caml List Nicolas, How do you supply arguments to the C compiler when it's invoked implicitly, to build the C wrapper, for example? I would like to add '-g', for example, to be able to use the debugger. Thanks, Joel -- http://wagerlabs.com/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Caml-list] Producing a C wrapper with ocamlbuild or OMake 2007-03-28 22:46 ` Joel Reymont @ 2007-03-29 11:20 ` Nicolas Pouillard 0 siblings, 0 replies; 14+ messages in thread From: Nicolas Pouillard @ 2007-03-29 11:20 UTC (permalink / raw) To: Joel Reymont; +Cc: Caml List On 3/29/07, Joel Reymont <joelr1@gmail.com> wrote: > Nicolas, > > How do you supply arguments to the C compiler when it's invoked > implicitly, to build the C wrapper, for example? flag ["c"; "compile"] (A"-g"); -- Nicolas Pouillard ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2007-03-29 11:20 UTC | newest] Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2007-03-27 23:10 Producing a C wrapper with ocamlbuild or OMake Joel Reymont 2007-03-28 8:53 ` [Caml-list] " Nicolas Pouillard [not found] ` <cd67f63a0703280158g559eff38pb6cca758682cad4a@mail.gmail.com> 2007-03-28 9:04 ` Joel Reymont 2007-03-28 12:38 ` Nicolas Pouillard 2007-03-28 13:25 ` Joel Reymont 2007-03-28 13:57 ` Nicolas Pouillard 2007-03-28 14:10 ` Joel Reymont 2007-03-28 15:46 ` Nicolas Pouillard 2007-03-28 18:58 ` Joel Reymont 2007-03-28 21:13 ` Nicolas Pouillard 2007-03-28 14:44 ` Joel Reymont 2007-03-28 15:49 ` Nicolas Pouillard 2007-03-28 22:46 ` Joel Reymont 2007-03-29 11:20 ` Nicolas Pouillard
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox