Scheme 使用automake构建方案项目时的模块依赖关系

Scheme 使用automake构建方案项目时的模块依赖关系,scheme,automake,guile,Scheme,Automake,Guile,我正在尝试使用automake构建并安装一个具有模块依赖关系的scheme项目。但是,我不断得到如下所述的错误 为了用一个简单的示例进行演示,假设我有以下项目结构: +-a.scm | +-libs/ +-b.scm | +-c.scm 而模块a依赖于模块b,后者依赖于模块c。假设这些文件具有以下模块定义 a、 供应链管理 (define-module (a) #:use-module (a b)) b、 供应链管理 c、 供应链管理 (define-module (a

我正在尝试使用
automake
构建并安装一个具有模块依赖关系的scheme项目。但是,我不断得到如下所述的错误

为了用一个简单的示例进行演示,假设我有以下项目结构:

+-a.scm
|
+-libs/
  +-b.scm
  |
  +-c.scm
模块a
依赖于
模块b
,后者依赖于
模块c
。假设这些文件具有以下模块定义

a、 供应链管理

(define-module (a)
    #:use-module (a b))
b、 供应链管理

c、 供应链管理

(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
GOBJECTS=$(来源:%.scm=%.go)
moddir=$(前缀)/share/guile/site/$(guile\u有效版本)
godir=$(libdir)/guile/$(guile\u有效版本)/站点ccache
ccachedir=$(libdir)/guile/$(guile\u有效版本)/站点ccache
nobase_mod_数据=$(来源)$(NOCOMP_来源)
nobase_go_数据=$(GOBJECTS)
#确保先安装源文件,以便
#已安装的编译文件大于已安装的源文件
#档案。看见
# 
#详情请参阅。
guile_install_go_files=install-nobase_goDATA
$(guile\u install\u go\u文件):install-nobase\u modDATA
CLEANFILES=$(GOBJECTS)
GUILE_WARNINGS=-Wunbound变量-Warity不匹配-Wformat
后缀=.scm.go
.scm.go:

$(AM_V_GEN)$(top_builddir)/env$(GUILE_工具)compile$(GUILE_警告)-o“$@”“$GUILE有一个简单的模块搜索模式-它在
GUILE_LOAD_PATH
中定义的每个目录中查找:

  • 文件
    a
    a.scm
    -当
    时:使用模块(a)

  • 文件
    bb/a
    bb/a.scm
    -当
    #:使用模块(bb a)

  • 文件
    ccc/bb/a
    ccc/bb/a.scm
    -当
    时:使用模块(ccc-bb-a)

    等等

如果您将项目保存在
/home/user/proj/
目录中,则应
导出GUILE\u LOAD\u PATH=“/home/user/proj”

从现在起,您可以使用
,m()
轻松加载和切换到模块。因此,如果您正在处理的项目位于
/home/user/proj/proj-a/
目录中,您可以启动guile并键入
,m(proj-a)
自动加载
a.scm
文件,只需将模块定义更改为
(proj-a)

下一步-在您的情况下,
b.scm
c.scm
文件位于
libs/
子目录中,因此您应该
:使用模块(proj-a lib b)
和…
(proj-a lib c)
,并相应地更改
b.scm
c.scm
中的模块名称


与模块相关的Guile手册非常好(阅读前4章就足够了)。

所以
(定义模块(a))
没有任何效果?@xabush_semrie我更新了我的答案,如果有什么不清楚,请告诉我。谢谢。我还有一个问题。假设b.scm导入
(srfi srfi-1)
和a.scm,如已建立,导入模块b。假设模块a也使用
(srfi srfi-1)
中的函数。模块a是否必须重新导入
(srfi srfi-1)
还是将其与模块b一起导入?定义模块时,仅定义此模块的依赖项和导出。模块
b
应导出所有(srfi srfi-1)函数,以使其在
a
中可访问。这不实用,因此应导入(srfi srfi-1)
a
b
中的模块。
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