Basic Ocaml: How do I compile this?

2019-04-13 17:44发布

问题:

Just beginning with ocaml and am struggling with the various compilers and tooling. E.g. ocamlopt, ocamlc, ocamlbuild, corebuild and so on. So, how do I compile the following?

open Core.Std

module Regex = Re2.Regex

let ls pattern = 
  let pat = Regex.create_exn pattern in
  let matcher = Regex.matches pat in
  Sys.ls_dir "." 
  |> List.filter ~f:matcher
  |> List.iter ~f:(fun s -> print_string s; print_newline ())

let () =
  match In_channel.input_line stdin with
  | None -> print_string "No Input"
  | Some pat -> ls pat

In utop I can just #require "re2" and go from there.

Without the inclusion of the regular expressions module I would just use corebuild ls.native, assuming that the above code is placed into ls.ml.

[edit]

Have so far tried

ocamlbuild -use-ocamlfind -package core -package re2

which spit out

ocamlfind ocamldep -package core -package re2 -modules ls.ml > ls.ml.depends
ocamlfind ocamlc -c -package core -package re2 -o ls.cmo ls.ml
+ ocamlfind ocamlc -c -package core -package re2 -o ls.cmo ls.ml
ocamlfind: Error from package `threads': Missing -thread or -vmthread switch
Command exited with code 2.

So after some googling I was led to this blog I tried

ocamlbuild -tag thread -use-ocamlfind -package core -package re2

which spits out over 6000 lines of what looks like make output before failing with:

collect2: error: ld returned 1 exit status
File "caml_startup", line 1:
Error: Error during linking
Command exited with code 2.

so I'm not sure what to try next.

回答1:

I am using Ubuntu 14.04 on a 64bit machine. I ditched the apt-get versions of ocaml:

sudo apt-get remove --purge ocaml ocaml-base-nox ocaml-compiler-libs \ 
                            ocaml-interp ocaml-native-compilers \ 
                            ocaml-nox campl4 ocaml-base ocaml-docs opam 

Then I installed opam from source according to the instructions here.

Next I installed core, utop, and re2 with opam install core utop re2

And finally I ran ocamlbuild -use-ocamlfind -package re2 -package core -tag thread ls.native

which built the desired executable.



回答2:

I would suggest you to use oasis tool. It is not as hard, as one may think. But it removes all library burden from you.

Lets create a simple _oasis file for your project:

OASISFormat: 0.4
Name:        ls
Version:     0.1
Synopsis:    Testing oasis
Authors:     Fizz_ed
License:     MIT
Plugins:     META (0.4), DevFiles (0.4)
BuildTools: ocamlbuild, camlp4o
BuildDepends: core, camlp4, threads, 
              sexplib.syntax, 
              bin_prot.syntax, 
              comparelib.syntax, 
              herelib, 
              herelib.syntax

Executable "ls"
  Path: .
  MainIs: ls.ml
  CompiledObject: best
  BuildDepends: re2

After you've created this file, run oasis setup command (if oasis is not installed, then install it using opam, or your package manager).

After that you will have a common configure script and makefiles. So all you need is to type

./configure
make 

and your file will be compiled.

Or you can just use ocamlbuild directly, it will work too, since oasis created all the necessary files

ocamlbuild ls.native

A few explanations about the file. The preamle contains everything you need to build your core-style applications.

Executable section describes your executable file, and also adds a dependency to re2 library.

Update: fixed some issues.



标签: ocaml opam