Как понять этот make-файл SWI-Prolog - как создается исполняемый файл Linux?

Я пытаюсь скомпилировать анализатор грамматики https://github.com/RichardMoot/Grail в программу Linux в соответствии с инструкциями https://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. Все в порядке. Но я не могу найти в Makefile https://github.com/RichardMoot/Grail/blob/master/Makefile какую-либо команду компиляции. SWI-Prolo использует команду swipl для компиляции, но этот Makefile swipl вызывает только один раз - для отображения версии swipl.

Я испытываю некоторые трудности в установке и компиляции, это нормально, я могу построчно выполнять / отлаживать Makefile и получать результат. Но в моем случае есть проблема - я не вижу конечной цели в моем make-файле: какие строки отвечают за создание объектных файлов (при необходимости) и какие строки отвечают за создание окончательного исполняемого файла Linux.

Это оконная программа. Исходный код и документация содержат предупреждения о несовместимости с SWI-Prolog 7, но это нормально, я могу разрешить их самостоятельно, но, как я уже сказал, я не вижу строк Makefile для создания exe.

Исходный код создан выдающимся ученым, и я, конечно, не хочу беспокоить его столь техническим вопросом низкого уровня. Я был бы счастлив, если бы он продолжил работу над теорией и не тратил время на вопросы программирования низкого уровня. Надеюсь, что есть эксперты SWI-Prolog.

Я использую последний (7.x) SWI-Prolog в Ubuntu 16.x, и я уже установил все упомянутые предварительные требования.

1 ответ

Решение

Если вы внимательно посмотрите на предоставленную Makefileвы обнаружите, что правила all а также install определяются следующим образом (комментарии, добавленные мной):

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 будут установлены две папки: bin а также share, Внутри бинарного каталога вы будете иметь g3 файл, который, независимо от того, является ли он источником SWI-Prolog, имеет следующую начальную строку:

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

Этот заголовок должен позволить вашему консольному терминалу определить, какой интерпретатор использовать для этого сценария (в этом случае swipl). В моем случае выполнение Грааля с ./g3 вернул сообщение 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
Другие вопросы по тегам