ASDF输出重定向

时间:2014-08-15 08:27:04

标签: lisp common-lisp clisp asdf

我想设置ASDF存储编译文件的目录。我更喜欢从shell脚本中做到这一点。根据{{​​3}},应该定义环境变量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脚本临时设置输出目录,因此无论源文件在哪里,每个文件都在可预测的位置。

2 个答案:

答案 0 :(得分:1)

我阅读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

答案 1 :(得分:1)

我成功了以下内容:

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

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

注意2 :在此字符串中无法使用***等符号。目录/表示所有可能的目录。

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

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

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