如何理解这个SWI-Prolog makefile - 如何创建Linux可执行文件?

时间:2018-01-10 21:48:55

标签: linux makefile prolog swi-prolog

我正在尝试根据说明https://github.com/RichardMoot/Grailhttps://github.com/RichardMoot/Grail/blob/master/README将语法分析器http://www.labri.fr/perso/moot/tutorial/install.html编译到Linux程序中。有手册如何从SWI-Prolog代码http://www.swi-prolog.org/FAQ/UnixExe.html创建Linux可执行文件。一切都很好。但我无法在Makefile https://github.com/RichardMoot/Grail/blob/master/Makefile中找到任何编译命令。 SWI-Prolo使用swipl命令进行编译,但是这个Makefile swipl只调用一次 - 用于显示swipl的版本。

我在安装和编译方面遇到了一些困难,没关系,我可以逐行执行/调试Makefile并得到结果。但是在我的情况下存在问题 - 我无法在makefile中看到最终目标:哪些行负责生成目标文件(如果需要)以及哪些行负责创建最终的Linux可执行文件。

这是窗口程序。源代码和文档包含有关与SWI-Prolog 7不兼容的警告,但没关系,我可以自己解决它们,但正如我所说 - 我无法看到用于创建exe的Makefile行。

源代码由杰出的科学家创建,我当然不想用如此低级别的技术问题打扰他。如果他继续从事理论研究并且不会在低级编程问题上浪费时间,我会很高兴。希望,有SWI-Prolog专家。

我在Ubuntu 16.x上使用最新的(7.x)SWI-Prolog,我已经安装了所有提到的先决条件。

1 个答案:

答案 0 :(得分:4)

如果仔细查看提供的Makefile,您会发现规则allinstall定义如下(我添加的评论):

all:
    -cd source ; $(edit) g3 > g3.tmp   # Replaces placeholders for your 
                                       # ... GRAIL_ROOT install directory.
    -cd source ; mv -f g3.tmp g3       # Overwrites `g3` with the filled file.
    cd source ; chmod a+x g3           # Makes it executable.

install:                               # Essentially copies all files to 
    -mkdir $(datarootdir)              # ... your install directory.
    -mkdir $(datadir)
    cp -f $(images) $(datadir)
    -mkdir $(bindir)
    cp -f source/insertdot $(bindir)
    chmod a+x $(bindir)/insertdot
    cp -f $(resources) $(datadir)
    cp -f source/*.pl $(bindir)
    cp -f source/g3 $(bindir)

如果您执行常见的make && make install,您最终会在Grail目录中安装两个文件夹:binshare。在二进制目录中,您将拥有g3文件,无论是SWI-Prolog源,都有这个初始行:

#!/usr/bin/swipl -q -g start -f
% [... prolog code.]

此标头应允许您的控制台终端确定要为此脚本使用的解释器(在本例中为swipl)。在我的例子中,使用./g3执行Grail会返回一条SWI-Prolog消息,指示使用了错误的选项/命令参数。

根据man,Unix系统必须在标题的末尾使用选项-s(但在我的情况下这不起作用):

  

来自手册:

-s file
              Load file as a script.  This option may be used from the shell to 
              make Prolog load a file before entering the toplevel.
              It is also used to turn a file into an executable Prolog script
              on Unix systems using the following first line

              #!/usr/bin/swipl option ... -s

如果要运行此程序,只需从终端调用相同的命令:

swipl -q -g start -s g3