使用automake构建方案项目时的模块依赖性

时间:2019-07-04 19:13:42

标签: scheme automake guile

我正在尝试使用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构建项目会给我以下错误:

  

(a c)没有模块

如何解决上述错误并在模块之间具有所有相互依赖性的情况下成功构建项目?

1 个答案:

答案 0 :(得分:1)

Guile有一个简单的模块搜索模式-它在GUILE_LOAD_PATH中定义的每个目录中查找:

  • 文件aa.scm-当#:use-module (a)
  • 文件bb/abb/a.scm-当#:use-module (bb a)
  • 文件ccc/bb/accc/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.scmc.scm文件位于libs/子目录中,因此您应该#:use-module (proj-a lib b)和... (proj-a lib c)并进行更改b.scmc.scm中的模块名称。

与模块相关的指南手册非常好https://www.gnu.org/software/guile/manual/html_node/Modules.html#Modules(足以阅读前4章)。