如何将.cma文件链接到我自己的Frama_C插件?

时间:2018-06-06 14:56:03

标签: makefile ocaml frama-c

我按照 Frama-C开发指南https://frama-c.com/download/frama-c-plugin-development-guide.pdf)的说明创建了我自己的Frama-C插件。

但是,我需要在我的.ml文件中使用Ocaml手册(http://caml.inria.fr/pub/docs/manual-ocaml/libref/Mutex.html)提供的 Mutex 模块。要使用此模块,我需要一个特定的命令行:

ocamlc -thread unix.cma threads.cma myfiles.ml

(如下所述:OCaml Mutex module cannot be found)。

要编译我的文件,我使用构建插件的Makefile(插件开发指南第33页)。所以我试图将这些.cma文件和 -thread 选项链接到此Makefile ...但我没有成功。 如何加载此Mutex模块?

我尝试了什么:

  1. 我查看了Frama-C自动生成的文件: .Makefile.plugin.generated 如果在我的Makefile中有一个要调用和修改的变量(与变量相同) PLUGIN_CMO 来调用我的.ml文件)但是我找不到这样的变量。
  2. 我尝试了一些在生成的 .Makefile.plugin.generated 中定义的变量:

    我在Makefile中写了以下几行:

    PLUBIN_EXTRA_BYTE = unix.cma threads.cma

    TARGET_TOP_CMA = unix.cma threads.cma

    线程选项:

    PLUGIN_OFLAGS = -thread
    

    PLUGIN_LINK_BFLAGS= -thread

    PLUGIN_BFLAGS= -thread

    Mutex 模块从未被识别过,我也不确切知道它是否是一个好的解决方案...

    1. 最后,我使用Frama-C(http://arvidj.eu/frama/frama-c-Aluminium-20160501_api/frama-c-api/html/FCDynlink.OldDynlink.html#VALloadfile)提供的 Olddynlink 模块测试了值 loadfile 或使用 Dynlink 模块(http://caml.inria.fr/pub/docs/manual-ocaml/libref/Dynlink.html#VALloadfile)和他的值 loadfile ,但它也不起作用:
    2. 我写道:

      open Dynlink loadfile "unix.cma";; loadfile "threads.cma";;

      在.ml文件中。

      但总是出现同样的错误:Unbound module Mutex

1 个答案:

答案 0 :(得分:4)

插件开发指南的5.2.3节提供了可用于自定义Makefile的变量列表。值得注意的是,如果您想要链接外部库,可以使用PLUGIN_EXTRA_BYTEPLUGIN_EXTRA_OPT,以及PLUGIN_LINK_BFLAGSPLUGIN_LINK_OFLAGS添加-thread选项。这是一个应该有效的Makefile(当然,您需要根据实际的源文件来完成它)。

ifndef FRAMAC_SHARE
FRAMAC_SHARE:=$(shell frama-c-config -print-share-path)
endif

PLUGIN_NAME:=Test_mutex
PLUGIN_BFLAGS:=-thread
PLUGIN_OFLAGS:=-thread
PLUGIN_EXTRA_BYTE:=$(shell ocamlfind query threads)/threads/threads.cma
PLUGIN_EXTRA_OPT:=$(shell ocamlfind query threads)/threads/threads.cmxa
PLUGIN_LINK_BFLAGS:=-thread
PLUGIN_LINK_OFLAGS:=-thread
PLUGIN_CMO:= # list of modules of the plugin
include $(FRAMAC_SHARE)/Makefile.dynamic

请注意,理论上,您只需使用PLUGIN_REQUIRES变量,让ocamlfind处理所有事情,但threads在这方面似乎有点特殊。< / p>