使用VS工具和Tup构建系统进行编译

时间:2016-08-25 15:44:49

标签: c visual-studio-2015 tup

我正在尝试编译一个名为" unbox"的J编程语言的解释器。可以在https://github.com/iocane/unbox

找到

它使用tup构建系统和github指令指定使用Visual Studio工具提示符中的tup命令。我下载了Visual Studio 2015社区,但它并没有提供说明中提到的确切提示,因此我使用了VS2015 x86 x64交叉工具命令提示符。安装tup并将其添加到我的路径后,我导航到我克隆的目录" unbox"并输入 tup

然而,这是问题的开始,输入tup之后我得到以下内容:

*   1) CC src/libj\a.c
a.c
 *** tup errors ***
tup error: File 'C:\Users\I\AppData\Local\Microsoft\VSCommon\14.0\SQM\VCToolsTelemetry.dat' was written to, but is not in .tup/db. You probably should specify it as an output
 *** Command ID=663 ran successfully, but tup failed to save the dependencies.
*   2) CC src/libj\af.c
af.c
 *** tup errors ***
tup error: File 'C:\Users\I\AppData\Local\Microsoft\VSCommon\14.0\SQM\VCToolsTelemetry.dat' was written to, but is not in .tup/db. You probably should specify it as an output
 *** Command ID=667 ran successfully, but tup failed to save the dependencies.
*   3) CC src/libj\ai.c
ai.c
 *** tup errors ***
tup error: File 'C:\Users\I\AppData\Local\Microsoft\VSCommon\14.0\SQM\VCToolsTelemetry.dat' was written to, but is not in .tup/db. You probably should specify it as an output
 *** Command ID=669 ran successfully, but tup failed to save the dependencies.
*   4) CC src/libj\ab.c
ab.c
 *** tup errors ***
tup error: File 'C:\Users\I\AppData\Local\Microsoft\VSCommon\14.0\SQM\VCToolsTelemetry.dat' was written to, but is not in .tup/db. You probably should specify it as an output
 *** Command ID=665 ran successfully, but tup failed to save the dependencies.
 [                                        ETA~=30s Remaining=130 Active=0                                        ]   2%
 *** tup: 4 jobs failed.

如您所见,在tup的数据库中未指定文件VCToolsTelemetry.dat。

有人知道阻止Visual Studio使用VSToolsTelemetry.dat的方法吗?或者我应该联系unbox开发人员并让他将该文件添加到db?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

解决方案由Christian Fillion在this comment中提供。

This Microsoft page解释了该文件的用途以及如何防止Visual Studio工具写入该文件:

  

默认情况下,Visual Studio安装可以启用客户反馈。您可以通过将以下注册表项的值更改为字符串“0”来配置Visual Studio以禁用单个计算机上的客户反馈。

提到的密钥是OptIn。根据该页面,它位于HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\VisualStudio\SQM,但也可能位于HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VSCommon\14.0\SQM(我的Windows 10笔记本电脑就是这种情况)。

enter image description here

(Microsoft页面也说它应该是一个字符串,但在我的情况下它是一个DWORD,它工作正常。)

  

或者我应该联系unbox开发人员并让他将该文件添加到db?

正在发生的事情是Tup是一个基于文件的构建系统,它要求指定命令的所有输出,但是这个文件不是,因此Tup在检测到它被写入时会抱怨。对于Tup,创建和写入文件没有区别 - 在这两种情况下,它都是“输出”。因此,Tup不处理几个命令写入同一文件的情况。这通常会导致缓存出现问题,缓存旨在逐步编写。如果我没记错的话,Tup实现了一种解决方法,它忽略了输出文件,其路径包含具有前导句点的任何组件。在Linux环境中,名称以前导句点开头的目录被视为“隐藏”,与Windows不同,在Windows中,此功能使用文件系统属性实现。因此,这种解决方法通常会失败,因为Windows本机工具不依赖于此类命名约定。在Tup方面更灵活的解决方案是告诉Tup忽略某些输出,无论是在系统还是用户基础上,还是在Tupfiles内。

将此文件列为输出是不可能的,因为它将成为CL.EXE(以及可能的其他Visual Studio工具)的所有调用的输出,并且根据Tup的设计这没有意义。对于由同一命令读取和写入的文件,绝对没有意图为它腾出空间,因为不可能自动化这种情况。即使这个文件只是写入,我认为没有意图支持增量写入的输出。

由于项目似乎致力于某些平台并为它们提供构建说明,因此指出问题及其解决方案似乎是合理的,以便将它们包含在说明中。