O$>Есть в проекте (Visual Studio ) такой файлец:
O$>#include "stdafx.h"
O$>CString sBuildTimeStamp = __TIMESTAMP__;
O$>как бы по-проще сделать так, чтоб он перекомпилировался при каждой сборке, даже если его самого не меняли, чтоб TIMESTAMP обновлялся?
Здравствуйте Vi2, Вы писали:
Vi2>Здравствуйте Odi$$ey, Вы писали:
Vi2>
O$>>Есть в проекте (Visual Studio ) такой файлец:
O$>>#include "stdafx.h"
O$>>CString sBuildTimeStamp = __TIMESTAMP__;
O$>>как бы по-проще сделать так, чтоб он перекомпилировался при каждой сборке, даже если его самого не меняли, чтоб TIMESTAMP обновлялся?
Vi2>Поставить ему дату 2010 года!
А VC не поменяет ее обратно в случае редактирования этого файла?
Да до 2010 г недалеко уже
Имхо подобные штуки со временем лучше не проделывать, т.к. потом они вылазят в самых неожиданных местах.
O$>>Есть в проекте (Visual Studio ) такой файлец:
O$>>#include "stdafx.h"
O$>>CString sBuildTimeStamp = __TIMESTAMP__;
O$>>как бы по-проще сделать так, чтоб он перекомпилировался при каждой сборке, даже если его самого не меняли, чтоб TIMESTAMP обновлялся?
Vi2>Поставить ему дату 2010 года!
попробовал, прикол в том, что VS при перекомпиляции смотрит на дату модификации и __TIMESTAMP__ создает свою строку тоже из времени модификации файла, так что если я ставлю 2010 то перекомпилироваться будет, но и __TIMESTAMP__ будет 2010 года, а мне надо дату последней сборки Похоже надо делать PreBuild Step и каждый раз модифицировать файл.
O$>попробовал, прикол в том, что VS при перекомпиляции смотрит на дату модификации и __TIMESTAMP__ создает свою строку тоже из времени модификации файла, так что если я ставлю 2010 то перекомпилироваться будет, но и __TIMESTAMP__ будет 2010 года, а мне надо дату последней сборки Похоже надо делать PreBuild Step и каждый раз модифицировать файл.
Согласен, перемудрил. Я использовал __DATE__, а так просто идея.
PS
Не PreBuild Step — нужно в PostBuild Step удалять $(TargetDir)\xxx.obj. Иначе ошибка будет.
Здравствуйте Vi2, Вы писали:
Vi2>Здравствуйте Odi$$ey, Вы писали:
Vi2>Не PreBuild Step — нужно в PostBuild Step удалять $(TargetDir)\xxx.obj. Иначе ошибка будет.
А зачем тогда вообще компилировать?
.obj это результат компиляци .срр, линкер не поймет скорее всего такого кощунства.
Ты б еще .exe предложил удалять .
А для данной проблемы похоже нужно в пребилде ставить время модификации==теущее.
Не уверен правда, что это можно сделать стандартными методами, но тут своя прога без проблем пишется.
Здравствуйте Petrovich_, Вы писали:
P>А для данной проблемы похоже нужно в пребилде ставить время модификации==теущее. P>Не уверен правда, что это можно сделать стандартными методами, но тут своя прога без проблем пишется.
да, мне тоже что-то на ночь глядя ничего кроме своей утилитки, которая будет перезаписывать файл на ум не приходит
P>А для данной проблемы похоже нужно в пребилде ставить время модификации==теущее.
P>Не уверен правда, что это можно сделать стандартными методами, но тут своя прога без проблем пишется.
Обращение к ПреБилду вообще лишено смысла — он выполняется, если ИДЕ уже решила перестроить проект по каким-то своим причинам. Если она решит не перестраивать, то и этот шаг не будет выполнен. Следовательно, заставить ИДЕ перестраивать проект таким образом не удастся.
Vi2>Обращение к ПреБилду вообще лишено смысла — он выполняется, если ИДЕ уже решила перестроить проект по каким-то своим причинам. Если она решит не перестраивать, то и этот шаг не будет выполнен. Следовательно, заставить ИДЕ перестраивать проект таким образом не удастся.
Да тут я похоже погорячися.
Наверное оптимальным решением будет изменение времени файла в постбилде(чтоб перебилдился заново в следующий раз),а затем в пребилде (чтоб было правильное время создания на момент компиляции).
Это врдебы похоже на окончательный вариант.
Vi2>Обращение к ПреБилду вообще лишено смысла — он выполняется, если ИДЕ уже решила перестроить проект по каким-то своим причинам. Если она решит не перестраивать, то и этот шаг не будет выполнен. Следовательно, заставить ИДЕ перестраивать проект таким образом не удастся.
Так а может этого и не нужно. Что б проект при каждом запросе на Build начинал собираться.
2 Odi$$ey: Скажи поточнее, какого результаты ты хочешь добиться. Что б при каждом запросе на Build (не зависимо от того, поменялось что-либо в проекте или нет) файл с timestamp'ом компилялся заново. Либо, его компиляция должна происходить только в том случае, если какой-либо проектный файл был изменен и требует Rebuild'а проекта.
Здравствуйте, Sashko, Вы писали:
S>2 Odi$$ey: Скажи поточнее, какого результаты ты хочешь добиться. Что б при каждом запросе на Build (не зависимо от того, поменялось что-либо в проекте или нет) файл с timestamp'ом компилялся заново. Либо, его компиляция должна происходить только в том случае, если какой-либо проектный файл был изменен и требует Rebuild'а проекта.
В идеале конечно только если что-то в проекте изменилось, но пока я остановился на дате модификации из будущего и замене макроса __TIMESTAMP__ на __DATE__ и __TIME__ которые подставляют именно дату компиляции. Проект конечно ребилдится каждый раз, но с другой стороны, я и не давлю на ребилд, если и так уже что-то не поменял. Для воркспейса с несколькими взаимозависимыми проектами это конечно не удобно и надо доводить до ума.
O$>В идеале конечно только если что-то в проекте изменилось, но пока я остановился на дате модификации из будущего и замене макроса __TIMESTAMP__ на __DATE__ и __TIME__ которые подставляют именно дату компиляции. Проект конечно ребилдится каждый раз, но с другой стороны, я и не давлю на ребилд, если и так уже что-то не поменял. Для воркспейса с несколькими взаимозависимыми проектами это конечно не удобно и надо доводить до ума.
Существует много разных вариантов, и оба они ущербные
По существу. Мне видится 3ри способа, два простых, но ущербных, один более сложный, но как мне кажется красивей (хотя может только потому, что я им пользуюсь )
1. Post-Build & Pre-Build: Добавляем touch на нужный файл, и все. Проект находится в постоянно not up to date. И любой Build собирает, как минимум, ProjectTarget + toched файл (и все файлы от него зависящие, к примеру, если это .h файл).
2. Pre-Build: Добавляем touch на нужный файл, и все. Но проблема следующая. По-видимому студия, собирает информацию о not up to date targets до начала Build'а, и если такие есть, то Build выполняется, но если, во время Build, один из source файлов был модифицирован, студия это не учитывает. Отсюда, что б информация (build timestamp) в конечном файле, была корректной, Build нужно выполнить 2а раза подряд.
3. Заключается в следующем. В проект добавляется dummy файл (например BuildTimestamp.x). Для BuildTimestamp.x настраивается Custom Build, так, что результатом Build'а является, скажем, BuildTimestamp.h. А уже этот BuildTimestamp.h #include'ится, в какой-то из src файлов. Но. Что бы теперь все работало, необходимо в Additional Dependences для BuildTimestamp.x, добавить все исходные файлы от которого зависит ProjectTarget. Либо руками, либо (благо в VS.NET это возможно) с помощью Macros. Да, Additional Dependences для BuildTimestamp.x необходимо update'ить, всякий раз, когда в проекте добавляются или удаляются исходники.
<File
RelativePath="BuildTimestamp.x">
<FileConfiguration
Name="Unicode Debug|Win32">
<Tool
Name="VCCustomBuildTool"
Description="Update Build timestamp..."
CommandLine="echo // Forces rebuild source file that include this one > BuildTimestamp.h"
AdditionalDependencies="source1.cpp;source1.h;source2.cpp;source2.h"
Outputs="BuildTimestamp.h"/>
</FileConfiguration>
</File>
__TIMESTAMP__ это время модификации файла, поэтому даже если удалять
и перекомпилировать соответствующий obj файл __TIMESTAMP__ для него
всё равно будет неизменным.
Как один из вариантов могу предложить использовать __TIME__ и __DATE__
и в postbuild-e удалять соответсвующий obj файл.
Здравствуйте, Sprinter, Вы писали:
S>__TIMESTAMP__ это время модификации файла, поэтому даже если удалять S>и перекомпилировать соответствующий obj файл __TIMESTAMP__ для него S>всё равно будет неизменным.
Можно использовать *никсовую утилитку touch.
Например из состава UnxUtils