ocamlbuild; строительство верхнего уровня - PullRequest
2 голосов
/ 03 марта 2010

Успешно реорганизовав мой проект для ocamlbuild с подкаталогами и используя ocamlfind, я обнаружил, что трудно создать верхний уровень.

Я создал файл .mltop, содержащий все модули, которые будут включены, и добавил пакеты в _tags, но сборка не работает. Он не может найти функции C, скомпилированные с одним из модулей. При включенном -classic-display я вижу, что этот файл libcside.a не включен и даже не компилируется вообще! Файл c добавляется как зависимость в myocamlbuild.ml by,

flag ["link"; "ocaml"; "use_cutil"] (S [A"-cclib"; A"-L."; ]);
dep  ["link"; "ocaml"; "use_cutil"] ["libcside.a"];

и _tags,

<utilities.*> : use_cutil
<**/*.top> : use_str, use_unix, use_cutil, use_curl, use_mysql

и, наконец, в libcside.clib,

cutil.o

Я что-то упускаю при настройке сборки для верхнего уровня, но я не могу найти надежный ресурс в Интернете. Спасибо.

1 Ответ

3 голосов
/ 04 марта 2010
  • Я предполагаю, что cutil.ml описывает ocaml сторону libcside.a - правильно?
  • Вы положили Cutil в mltop?
  • С вашим текущим плагином cutil библиотека ocaml не будет связывать libcside.a в (dep только инструктирует ocamlbuild, чтобы создать его, а не связывать)
  • Вот простой (и работающий) способ создания локальной библиотеки ocaml для проекта с заглушками на Си. В myocamlbuild.ml:

    ocaml_lib "linuxnet";
    let liblinuxnet_stubs = "liblinuxnet_stubs." ^ !Options.ext_lib in
    flag ["link"; "ocaml"; "use_linuxnet"] (S[A"-cclib"; A liblinuxnet_stubs;]);
    dep  ["link"; "ocaml"; "use_linuxnet"] [liblinuxnet_stubs];
    

    В liblinuxnet_stubs.clib:

    linuxnet_c.o
    

    Обратите внимание, что источник C называется linuxnet_c.c, чтобы результирующий объектный файл не перекрывал файл из linuxnet.ml (или наоборот). И наконец в _tags:

    true: use_linuxnet
    

    При такой настройке он будет доступен на верхнем уровне (обратите внимание, что нет необходимости помещать Linuxnet в .mltop, потому что linuxnet.cma будет добавлен к ссылке с помощью флага use_linuxnet (генерируется с использованием ocaml_lib)) .

...