我想设置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脚本临时设置输出目录,因此无论源文件在哪里,每个文件都在可预测的位置。
答案 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脚本所在目录的子目录中来检测源文件所在的位置,所以这不是一个关键问题。