使用 automake 构建方案项目时的模块依赖性
Module dependency while building scheme project using automake
我正在尝试使用 automake
构建和安装具有模块依赖性的方案项目。但是,我不断收到如下所述的错误。
为了用一个简单的例子来演示,假设我有以下项目结构:
+-a.scm
|
+-libs/
+-b.scm
|
+-c.scm
而module a
依赖于module b
,而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
构建项目时出现以下错误:
no module for (a c)
如何修复上述错误并成功构建具有模块之间所有相互依赖性的项目?
Guile 有一个简单的模块搜索模式 - 它在 GUILE_LOAD_PATH
中定义的每个目录中查找:
文件 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章就够了)
我正在尝试使用 automake
构建和安装具有模块依赖性的方案项目。但是,我不断收到如下所述的错误。
为了用一个简单的例子来演示,假设我有以下项目结构:
+-a.scm
|
+-libs/
+-b.scm
|
+-c.scm
而module a
依赖于module b
,而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
构建项目时出现以下错误:
no module for (a c)
如何修复上述错误并成功构建具有模块之间所有相互依赖性的项目?
Guile 有一个简单的模块搜索模式 - 它在 GUILE_LOAD_PATH
中定义的每个目录中查找:
文件
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章就够了)