2

我想设置 ASDF 存储编译文件的目录。我更喜欢从 shell 脚本中执行此操作。根据这个页面,应该定义环境变量ASDF_OUTPUT_TRANSLATIONS

好的,这里是:

$ export ASDF_OUTPUT_TRANSLATIONS="$HOME/.cache/common-lisp/my-dir/"

但是当我尝试测试配置时,它不起作用:

$ clisp -x "(asdf:compile-system :my-system)"

输出:

;; Loading file /home/mark/.clisprc.lisp ...
;;  Loading file /home/mark/quicklisp/setup.lisp ...
*** - Uneven number of components in source to destination mapping:
      "/home/mark/.cache/common-lisp/my-dir/"
Bye.

再见。嗯,这是可能的输出之一。我试图将很多值分配给ASDF_OUTPUT_TRANSLATIONS. 偶数和奇数。小而大。没有成功。如果有这样的配置示例,这将更容易,但我找不到。

另一个问题是,当 ASDF 将所有内容放入一个目录时,我不知道将要编译的系统是否不会覆盖彼此同名的文件。我真正想要的是从 shell 脚本临时设置输出目录,因此无论源文件在哪里,每个文件都将位于可预测的位置。

4

2 回答 2

2

我成功地完成了以下操作:

$ export ASDF_OUTPUT_TRANSLATIONS="/:$HOME/.cache/common-lisp/my-dir/"

注意 1:目标目录可能不存在:在这种情况下,ASDF 将创建它。

注意 2:不能在此字符串中使用类似*or的符号。**目录/表示所有可能的目录。

注意 3:ASDF 将在内部创建子目录,my-dir如下所示:

/home/mark/.cache/common-lisp/my-dir/home/mark/path/to/source/files/

这不完全是我想要的,但由于我可以通过将源文件放在我的 shell 脚本所在目录的子目录中来检测源文件所在的位置,因此这不是一个关键问题。

于 2014-08-16T06:49:08.037 回答
0

我阅读http://common-lisp.net/project/asdf/asdf/Controlling-where-ASDF-saves-compiled-files.html的方式,您需要在此处放置一个指定匹配和翻译的映射。在 sexp 语法中,您可以将其指定为(t "/home.../...dir/"),其中t表示匹配所有。

您还可以使用函数来翻译目录:

(t (:function (lambda (dir) #|translate dir as you like|#)))

另请阅读有关在何处放置此类指令的信息。环境变量似乎被一些我没有完全理解的特殊语法处理。如果它不起作用,您可以使用配置文件。

编辑:对不起,只是阅读文档(确实有改进的余地)http://common-lisp.net/project/asdf/asdf/Output-Configuration-DSL.html。您可能需要更明确一点:

(:output-translations (t "/foo/bar"))

相应的“shell 友好”语法可能是这样的:

**/:/foo/bar
于 2014-08-15T11:48:13.533 回答