Зависимость модуля при построении проекта схемы с помощью automake - PullRequest
1 голос
/ 04 июля 2019

Я пытаюсь построить и установить проект схемы с зависимостями модулей, используя automake.Однако я продолжаю получать ошибки, как описано ниже.

Чтобы продемонстрировать на простом примере, представьте, что у меня есть следующая структура проекта:

+-a.scm
|
+-libs/
  +-b.scm
  |
  +-c.scm

И module a зависит от module b, которыйзависит от module c.Предположим, что файлы имеют следующее определение модуля

a.scm

(define-module (a)
    #:use-module (a b))

b.scm

(define-module (a b)
        #:use-module (a c))

c.scm

(define-module (a c))

Вот Makefile.am Я использую

GOBJECTS = $(SOURCES:%.scm=%.go)
moddir=$(prefix)/share/guile/site/$(GUILE_EFFECTIVE_VERSION)
godir=$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache
ccachedir=$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache

nobase_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_modDATA

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

SOURCES = \
            c.scm \
            b.scm \
            a.scm 

EXTRA_DIST = \
    boostrap \
    env.in

Сборка проекта с make дает мне ошибку ниже:

нет модуля для (ac)

Как я могу исправить вышеуказанную ошибку и успешно построить проект со всеми взаимозависимостями между модулями?

1 Ответ

1 голос
/ 04 июля 2019

Guile имеет простой шаблон поиска модулей - он ищет в каждом каталоге, определенном в GUILE_LOAD_PATH, для:

  • file a и a.scm - когда #:use-module (a)
  • файл bb/a и bb/a.scm - когда #:use-module (bb a)
  • файл ccc/bb/a и ccc/bb/a.scm - когда #:use-module (ccc bb a)

    и т. д.

Если вы храните свои проекты в каталоге /home/user/proj/, вы должны export GUILE_LOAD_PATH="/home/user/proj".

С этого момента вы можете легко загружать и переключаться на модули, используя ,m (<module-name>).Поэтому, если проект, над которым вы работаете, находится в каталоге /home/user/proj/proj-a/, вы можете запустить guile и набрать ,m (proj-a a), чтобы автоматически загрузить файл a.scm, просто измените определение модуля на (proj-a a).

Далее -в вашем случае файлы b.scm и c.scm находятся в подкаталоге libs/, поэтому вы должны #:use-module (proj-a lib b) и ... (proj-a lib c), а также изменить имена модулей в b.scm и c.scm соответственно.

Руководство по Guile, относящееся к модулям, очень хорошее https://www.gnu.org/software/guile/manual/html_node/Modules.html#Modules (достаточно прочитать первые 4 главы).

...