Переместить промежуточные файлы сборки Visual Studio C++ на другую машину
Мы ищем способ ускорить наши локальные сборки 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 ответ
У нас есть что-то похожее. У нас есть только относительные пути для решения VS, а затем мы также храним (пустые / поддельные) файлы.tlog с правильной отметкой времени. Мы храним только библиотеки, а не промежуточные объектные файлы, поэтому, когда кто-то меняет файл на библиотеку, я думаю, что мы перестраиваем полную библиотеку. Но у нас нет ни малейшей проблемы с предварительно скомпилированными заголовками, они правильно обновлены, и у нас одинаковые флаги, поэтому я думаю, что у вас есть разные настройки между вашим сервером сборки и вашими локальными сборками. У нас нет этой проблемы, потому что флаги VS берутся из наших Make-файлов, поэтому все согласованно.
Большим недостатком является то, что когда мы перейдем на CMake, у нас будет тяжелая битва, чтобы воспроизвести иерархию, как мы делаем для наших пользовательских сборок.
Тогда, возможно, вам следует использовать готовый продукт, такой как Incredibuild.