2014-10-05 4 views
2

С самого начала с ocaml и я борюсь с различными компиляторами и инструментами. Например. ocamlopt, ocamlc, ocamlbuild, corebuild и так далее. Итак, как мне скомпилировать следующее?Basic Ocaml: Как скомпилировать это?

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 

В utop я могу просто #require "re2" и идти оттуда.

Без включения модуля регулярных выражений я бы просто использовал corebuild ls.native, считая, что приведенный выше код помещается в ls.ml.

[править]

ли до сих пор пытались

ocamlbuild -use-ocamlfind -package core -package re2

который выплюнуть

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. 

Так после того, как некоторые прибегая к помощи я привел к this blog я попытался

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

который выкладывает более 6000 строк, что выглядит как make выход перед отказом с:

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

, так что я не уверен, что попробовать следующий.

+0

Получил его, чтобы скомпилировать с помощью 'ocamlbuild -use-ocamlfind -package re2 -package core ls.byte', но столкнулся с проблемами при компиляции в native. –

+0

для храбрых: https://gist.github.com/anonymous/971d9501385e144855d7 первый файл - это вывод из ocamlbuild, второй - скомпилированный файл. –

ответ

6

Я использую Ubuntu 14.04 на 64-битной машине.Я угробил АПП-получить версии 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 

Затем я установил opam от источника в соответствии с инструкциями here.

Далее я установил ядро, utop и re2 с opam install core utop re2

И, наконец, я побежал ocamlbuild -use-ocamlfind -package re2 -package core -tag thread ls.native

, который построил нужный исполняемый файл.

2

Я предлагаю вам использовать инструмент оазиса. Это не так сложно, как можно подумать. Но он снимает с вас всю нагрузку на библиотеку.

Позволяет создать простой _oasis файл для вашего проекта:

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 

После того как вы создали этот файл, запустите oasis setup команду (если oasis не установлен, а затем установить его с помощью opam, или ваш менеджер пакетов) ,

После этого у вас будет общий скрипт и make-файлы configure. Так что все, что вам нужно, это ввести

./configure 
make 

и ваш файл будет скомпилирован.

Или вы можете просто использовать ocamlbuild напрямую, он тоже будет работать, так как оазисе созданы все необходимые файлы

ocamlbuild ls.native 

несколько объяснений о файле. В преамбуле содержится все, что вам нужно для создания приложений в основном стиле.

Раздел исполняемых файлов описывает исполняемый файл, а также добавляет зависимость от библиотеки re2.

Обновление: исправлены некоторые проблемы.

+0

Вызов 'oasis setup' возвращается с' W: Неизвестная лицензия 'BSD-3-clause' в 'BSD-3-clause'' –

+0

Хорошо, попробуем что-нибудь более простое. Например, MIT. Я обновил сообщение. Возможно, ваш оазис слишком стар ... – ivg

+0

Кстати, это только предупреждение, что означает 'W', поэтому он должен работать – ivg