Переместить промежуточные файлы сборки Visual Studio C ++ на другую машину - PullRequest
0 голосов
/ 19 февраля 2019

Мы ищем способ ускорить наши локальные сборки C ++.Мы имеем в виду простую идею.Мы регулярно строим наше решение на сервере сборки.Эта сборка является инкрементной: когда мы вносим новые изменения, перестраивается только необходимая часть решения.Быстро, удобно.

Что если мы скопируем все промежуточные файлы, созданные VS, с сервера сборки на наш локальный компьютер?В идеале VS должен производить инкрементную сборку поверх этих промежуточных файлов.Быстро, удобно.

Проблема в том, что наш сервер сборки и локальные машины используют разные пути решения.Это не очень хорошо работает с инкрементными сборками.

То, что я пробовал для тестового проекта: 1. Скопируйте все промежуточные файлы с сервера сборки на локальный компьютер 2. Обновите метки времени всех промежуточных файлов до текущего времени 3. Изменитевсе пути во всех * .tlog-файлах от серверного к локальному

И первое впечатление хорошее: VS сообщает, что проект обновлен, ничего не нужно строить, да!Однако, если я изменяю один файл, VS пытается восстановить его, используя предварительно скомпилированный заголовок, который у него уже есть.И у меня есть тонны ошибок, подобных этой:

1>e:\dev\prod3\shared\sdk\src\common\tblockalloc.h(18): error C2995: 'BlockManagerSPtr GetBlockManager(void)': function template has already been defined (compiling source file Requests.cpp)
1>d:\agent-home\xml-data\build-dir\ama-actd-job1\shared\sdk\src\common\tblockalloc.h(15): note: see declaration of 'GetBlockManager' (compiling source file Requests.cpp)

Похоже, что смущается, что один и тот же символ появляется в заголовках с разными путями.

Хорошо, я попытался просто заменить пути вФайл PCH так же, как я делал для файлов .tlog.Но тогда, даже когда я не изменяю никаких файлов, VS немедленно думает, что проект устарел.Что удивительно, потому что я думал, что он не смотрит на сами файлы, а только наблюдает их метки времени.Во всяком случае, тогда он выдал тонны ошибок, подобных этой:

1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'StdCall(/Gz)' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'CDecl(/Gd)' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'general PM representation(/vm[smv])' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'support for new floating-point model (/FP)' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'vtordisp(/vd[012])' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'DLL library (/MD)' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'Debug static MT library (/MTd)' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4653: compiler option 'Optimizations (one or more of /Oawstgp[y]) or debug checks (one or more of /GZ, /RTCcsu)' inconsistent with precompiled header; current command-line option ignored
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4653: compiler option 'For loop scope conformance (/Zc:forScope)' inconsistent with precompiled header; current command-line option ignored
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): error C2855: command-line option '/Zc:threadSafeInit' inconsistent with precompiled header

Кажется, что мне не нравится, когда я связываюсь с PCH.

Так что в этот момент я немного застрял.Я ожидал найти некоторую информацию о том, как повторно использовать артефакты сборки Visual Studio для достижения простых пошаговых сборок, но на самом деле я не нашел ничего .

Возможно ли это вообще?Кто-нибудь пробовал это?

1 Ответ

0 голосов
/ 19 февраля 2019

У нас что-то похожее.У нас есть только относительные пути для решения VS, а затем мы также храним (пустые / поддельные) файлы .tlog с правильной отметкой времени.Мы храним только библиотеки, а не промежуточные объектные файлы, поэтому, когда кто-то меняет файл на библиотеку, я думаю, что мы перестраиваем полную библиотеку.Но у нас нет ни малейшей проблемы с предварительно скомпилированными заголовками, они должным образом обновлены, и у нас одинаковые флаги, поэтому я думаю, что у вас есть разные настройки между вашим сервером сборки и вашими локальными сборками.У нас нет этой проблемы, потому что флаги VS берутся из наших Make-файлов, поэтому все согласованно.

Большой недостаток заключается в том, что, когда мы перейдем к CMake, у нас будет тяжелая битва за воспроизведение иерархии наподобиемы делаем для наших пользовательских сборок.

Тогда, возможно, вам следует использовать готовый продукт, такой как Incredibuild.

...