Сделать исполняемую программу Guile с помощью автоинструментов?

Недавно начал учиться использовать автоинструменты и пытался сделать с их помощью простую программу Guile. Следуя этому руководству, я успешно скомпилировал программу, с файлом .go, помещенным в %site-ccache-dir, и файлом .scm, помещенным в %site-dir. Но учебник нацелен на создание модулей, а не на создание исполняемого файла. Достаточно ли будет просто создать ссылку на файл .scm в %site-dir и поместить ее в /usr/bin? Как лучше всего это сделать с помощью автоинструментов? Ниже то, что у меня сейчас установлено...

guile.am:

moddir=$(datadir)/guile/site/$(GUILE_EFFECTIVE_VERSION)
godir=$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache

GOBJECTS = $(SOURCES:%.scm=%.go)

nobase_dist_mod_DATA = $(SOURCES) $(NOCOMP_SOURCES)
nobase_go_DATA = $(GOBJECTS)

# Make sure source files are installed first, so that the mtime of
# installed compiled files is greater than that of installed source
# files.  See
# <http://lists.gnu.org/archive/html/guile-devel/2010-07/msg00125.html>
# for details.
guile_install_go_files = install-nobase_goDATA
$(guile_install_go_files): install-nobase_dist_modDATA

CLEANFILES = $(GOBJECTS)
GUILE_WARNINGS = -Wunbound-variable -Warity-mismatch -Wformat
SUFFIXES = .scm .go
.scm.go:
    $(AM_V_GEN)$(top_builddir)/pre-inst-env $(GUILD) compile $(GUILE_WARNINGS) -o "$@" "$<"

загрузка:

#!/usr/bin/env sh

autoreconf --verbose --install --force

Makefile.am:

include guile.am

SOURCES =               \
  example-program.scm

EXTRA_DIST =            \
  bootstrap             \
  pre-inst-env.in

configure.ac:

AC_INIT([example-program], [0.1])
AC_CONFIG_SRCDIR([example-program.scm])
AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])

GUILE_PKG([2.2])
GUILE_PROGS
if test "x$GUILD" = "x"; then
   AC_MSG_ERROR(['guild' binary not found; please check your guile-2.x installation.])
fi

AC_CONFIG_FILES([Makefile])
AC_CONFIG_FILES([pre-inst-env], [chmod +x pre-inst-env])

AC_OUTPUT

pre-inst-env.in:

#!/bin/sh

abs_top_srcdir="`cd "@abs_top_srcdir@" > /dev/null; pwd`"
abs_top_builddir="`cd "@abs_top_builddir@" > /dev/null; pwd`"

GUILE_LOAD_COMPILED_PATH="$abs_top_builddir${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_LOAD_COMPILED_PATH"
GUILE_LOAD_PATH="$abs_top_builddir:$abs_top_srcdir${GUILE_LOAD_PATH:+:}:$GUILE_LOAD_PATH"
export GUILE_LOAD_COMPILED_PATH GUILE_LOAD_PATH

PATH="$abs_top_builddir:$PATH"
export PATH

exec "$@"

пример-program.scm:

#!/usr/bin/guile \
-e main -s
!#

;;; Functions.
(define count-to-100
  (lambda ()
    (define my-num 1)
    (while (<= my-num 100)
       (display my-num)
       (newline)
       (set! my-num (+ my-num 1)))))

;;; Main.
(define (main args)
  (count-to-100))

person Gareth Anthony Hulse    schedule 01.12.2018    source источник
comment
Я не уверен в деталях, связанных с Guile, но способ создания исполняемого файла с помощью Autotools начинается с именования цели в переменной *_PROGRAMS в вашем Makefile.am. Например, переменная bin_PROGRAMS = example'. You then name that target's corresponding source file in a matching *_SOURCES`. Я не знаю, сколько всего этого остального вам нужно, если оно вообще есть. С Autotools вам обычно не нужно указывать детали для создания промежуточных файлов.   -  person John Bollinger    schedule 02.12.2018
comment
Ой, это требовало более внимательного взгляда. Исправление: вы называете все целевого исходного файлаs в соответствующей переменной *_SOURCES.   -  person John Bollinger    schedule 02.12.2018
comment
@JohnBollinger, я добавил bin_PROGRAMS = example и изменил SOURCES на example_SOURCES. Я запустил autoreconf --verbose --install --force, ./configure, затем, наконец, make, что привело к ошибке, жалующейся на отсутствие входных файлов.   -  person Gareth Anthony Hulse    schedule 08.12.2018
comment
Боюсь, я не знаю, что еще вам сказать, поскольку, как я уже сказал, я не знаком со специфическими деталями Guile и могу говорить только об общих принципах Autotools.   -  person John Bollinger    schedule 09.12.2018


Ответы (1)


Это действительно старый вопрос, но все еще открытый, поэтому, если он может кому-то помочь...

Чтобы воспользоваться функциями автоинструментов для своих проектов Guile, вы можете использовать Hall. Чтобы в конечном итоге иметь возможность вызывать такие вещи, как make, make check, make distcheck, make clean и т. д., нужно позаботиться о многих вещах.

Вы можете найти демонстрацию здесь

Надеюсь кому-нибудь эта информация будет полезна...

Ваше здоровье !

person Jeko    schedule 22.06.2020
comment
Пожалуйста, размещайте контент здесь, а не ссылки в других местах, которые могут устареть. - person AlBlue; 23.06.2020