Компиляция с использованием инструментов VS и Tup build-system
Я пытаюсь скомпилировать интерпретатор для языка программирования J под названием "unbox", который можно найти по адресу: https://github.com/iocane/unbox
Он использует систему сборки tup, и инструкции github указывают на использование команды tup из приглашения инструментов Visual Studio. Я скачал Visual Studio 2015 Community, но в нем нет точного приглашения, упомянутого в инструкциях, поэтому я использовал командную строку VS2015 x86 x64 Cross Tools. После установки 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.
Как видите, файл VCToolsTelemetry.dat не был указан в базе данных tup.
Кто-нибудь знает, как вообще запретить Visual Studio использовать VSToolsTelemetry.dat? Или я должен связаться с разработчиком unbox и попросить его добавить этот файл в БД?
Буду признателен за любую оказанную помощь.
1 ответ
Решение было дано Кристианом Филлионом в этом комментарии.
На этой странице Microsoft объясняется, для чего этот файл и как предотвратить запись в него инструментов Visual Studio:
По умолчанию установка Visual Studio обеспечивает обратную связь с клиентами. Вы можете настроить Visual Studio на отключение обратной связи с клиентами на отдельных компьютерах, изменив значение следующего раздела реестра на строку "0".
Упомянутый ключ OptIn
, Согласно этой странице, он находится в HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\VisualStudio\SQM
хотя это также может быть в HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VSCommon\14.0\SQM
(это было в моем ноутбуке с Windows 10).
(На странице Microsoft также написано, что это должна быть строка, но в моем случае это DWORD, и она отлично работает.)
Или я должен связаться с разработчиком unbox и попросить его добавить этот файл в БД?
Происходит то, что Tup, файловая система сборки, требует, чтобы были указаны все выходные данные команды, а этот файл - нет, и поэтому Tup жалуется, когда обнаруживает, что он записан. Для Tup нет разницы между созданием и записью в файл - в обоих случаях это "вывод". Таким образом, Tup не обрабатывает ситуации, когда несколько команд записывают в один файл. Это часто вызывает проблемы с кешами, которые предназначены для поэтапной записи. Если я правильно помню, в Tup реализован обходной путь, при котором он игнорирует выходные файлы, путь которых содержит любой компонент с начальным периодом. В средах Linux каталог, имя которого начинается с начального периода, считается "скрытым", в отличие от Windows, где эта функция реализована с атрибутом файловой системы. Таким образом, этот обходной путь, как правило, не работает с собственными инструментами Windows, которые не полагаются на такое соглашение об именах. Более гибким решением на стороне Tup было бы указание Tup игнорировать определенные выходные данные, как в системе, так и на уровне пользователя или из Tupfiles.
Невозможно перечислить этот файл в качестве выходного, потому что он станет выходом всех вызовов CL.EXE (и, возможно, других инструментов Visual Studio), и это не имеет смысла для дизайна Tup. В нем определенно нет намерения выделять место для файлов, которые считываются и записываются одной и той же командой, поскольку автоматизировать такой сценарий невозможно. Даже если этот файл был только записан, я думаю, что нет намерений поддерживать инкрементно записанные результаты.
Поскольку проект, похоже, предназначен для некоторых платформ и предоставляет для них инструкции по сборке, представляется разумным указать на проблему и решение для них, чтобы они могли включить ее в инструкции.