Перекомпилировать всегда
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 14.11.02 13:47
Оценка:
Есть в проекте (Visual Studio ) такой файлец:

#include "stdafx.h"

CString sBuildTimeStamp = __TIMESTAMP__;


как бы по-проще сделать так, чтоб он перекомпилировался при каждой сборке, даже если его самого не меняли, чтоб TIMESTAMP обновлялся?
Re: Перекомпилировать всегда
От: Vi2 Удмуртия http://www.adem.ru
Дата: 14.11.02 13:52
Оценка: 7 (1)
Здравствуйте Odi$$ey, Вы писали:

O$>Есть в проекте (Visual Studio ) такой файлец:
O$>#include "stdafx.h"
O$>CString sBuildTimeStamp = __TIMESTAMP__;
O$>как бы по-проще сделать так, чтоб он перекомпилировался при каждой сборке, даже если его самого не меняли, чтоб TIMESTAMP обновлялся?

Поставить ему дату 2010 года!
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: Перекомпилировать всегда
От: Petrovich_  
Дата: 14.11.02 13:58
Оценка: 7 (1)
Здравствуйте Odi$$ey, Вы писали:

O$>Есть в проекте (Visual Studio ) такой файлец:

O$>
O$>#include "stdafx.h"

O$>CString sBuildTimeStamp = __TIMESTAMP__;
O$>


O$>как бы по-проще сделать так, чтоб он перекомпилировался при каждой сборке, даже если его самого не меняли, чтоб TIMESTAMP обновлялся?

Можно попробовать в пребилд прописать команду удаления соотв. .obj файла.
Re[2]: Перекомпилировать всегда
От: Petrovich_  
Дата: 14.11.02 14:03
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Здравствуйте Odi$$ey, Вы писали:


Vi2>

O$>>Есть в проекте (Visual Studio ) такой файлец:
O$>>#include "stdafx.h"
O$>>CString sBuildTimeStamp = __TIMESTAMP__;
O$>>как бы по-проще сделать так, чтоб он перекомпилировался при каждой сборке, даже если его самого не меняли, чтоб TIMESTAMP обновлялся?

Vi2>Поставить ему дату 2010 года!
А VC не поменяет ее обратно в случае редактирования этого файла?
Да до 2010 г недалеко уже
Имхо подобные штуки со временем лучше не проделывать, т.к. потом они вылазят в самых неожиданных местах.
Re[3]: Перекомпилировать всегда
От: Vi2 Удмуртия http://www.adem.ru
Дата: 14.11.02 14:17
Оценка:
Здравствуйте Petrovich_, Вы писали:

P>А VC не поменяет ее обратно в случае редактирования этого файла?

Конечно, поменяет.

P>Имхо подобные штуки со временем лучше не проделывать, т.к. потом они вылазят в самых неожиданных местах.

В любом случае, это и твое решение (правда, нужно Post-build) — обход механизма контроля дат => неудобно при отладке. Но это можно пережить.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Перекомпилировать всегда
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 14.11.02 14:29
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>

O$>>Есть в проекте (Visual Studio ) такой файлец:
O$>>#include "stdafx.h"
O$>>CString sBuildTimeStamp = __TIMESTAMP__;
O$>>как бы по-проще сделать так, чтоб он перекомпилировался при каждой сборке, даже если его самого не меняли, чтоб TIMESTAMP обновлялся?


Vi2>Поставить ему дату 2010 года!


попробовал, прикол в том, что VS при перекомпиляции смотрит на дату модификации и __TIMESTAMP__ создает свою строку тоже из времени модификации файла, так что если я ставлю 2010 то перекомпилироваться будет, но и __TIMESTAMP__ будет 2010 года, а мне надо дату последней сборки Похоже надо делать PreBuild Step и каждый раз модифицировать файл.
Re[3]: Только для __DATE__
От: Vi2 Удмуртия http://www.adem.ru
Дата: 14.11.02 14:35
Оценка: 7 (1)
Здравствуйте Odi$$ey, Вы писали:

O$>попробовал, прикол в том, что VS при перекомпиляции смотрит на дату модификации и __TIMESTAMP__ создает свою строку тоже из времени модификации файла, так что если я ставлю 2010 то перекомпилироваться будет, но и __TIMESTAMP__ будет 2010 года, а мне надо дату последней сборки Похоже надо делать PreBuild Step и каждый раз модифицировать файл.

Согласен, перемудрил. Я использовал __DATE__, а так просто идея.
PS
Не PreBuild Step — нужно в PostBuild Step удалять $(TargetDir)\xxx.obj. Иначе ошибка будет.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: Только для __DATE__
От: Petrovich_  
Дата: 14.11.02 14:44
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Здравствуйте Odi$$ey, Вы писали:



Vi2>Не PreBuild Step — нужно в PostBuild Step удалять $(TargetDir)\xxx.obj. Иначе ошибка будет.

А зачем тогда вообще компилировать?
.obj это результат компиляци .срр, линкер не поймет скорее всего такого кощунства.
Ты б еще .exe предложил удалять .
А для данной проблемы похоже нужно в пребилде ставить время модификации==теущее.
Не уверен правда, что это можно сделать стандартными методами, но тут своя прога без проблем пишется.
Re[5]: Только для __DATE__
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 14.11.02 14:47
Оценка:
Здравствуйте Petrovich_, Вы писали:

P>А для данной проблемы похоже нужно в пребилде ставить время модификации==теущее.

P>Не уверен правда, что это можно сделать стандартными методами, но тут своя прога без проблем пишется.

да, мне тоже что-то на ночь глядя ничего кроме своей утилитки, которая будет перезаписывать файл на ум не приходит
Re[5]: ПреБилд шаг
От: Vi2 Удмуртия http://www.adem.ru
Дата: 14.11.02 14:52
Оценка: 7 (1)
Здравствуйте Petrovich_, Вы писали:

P>А для данной проблемы похоже нужно в пребилде ставить время модификации==теущее.
P>Не уверен правда, что это можно сделать стандартными методами, но тут своя прога без проблем пишется.

Обращение к ПреБилду вообще лишено смысла — он выполняется, если ИДЕ уже решила перестроить проект по каким-то своим причинам. Если она решит не перестраивать, то и этот шаг не будет выполнен. Следовательно, заставить ИДЕ перестраивать проект таким образом не удастся.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: ПреБилд шаг
От: Petrovich_  
Дата: 14.11.02 15:47
Оценка: 7 (1)
Здравствуйте Vi2, Вы писали:

Vi2>Обращение к ПреБилду вообще лишено смысла — он выполняется, если ИДЕ уже решила перестроить проект по каким-то своим причинам. Если она решит не перестраивать, то и этот шаг не будет выполнен. Следовательно, заставить ИДЕ перестраивать проект таким образом не удастся.

Да тут я похоже погорячися.
Наверное оптимальным решением будет изменение времени файла в постбилде(чтоб перебилдился заново в следующий раз),а затем в пребилде (чтоб было правильное время создания на момент компиляции).
Это врдебы похоже на окончательный вариант.
Re[6]: ПреБилд шаг
От: Sashko Россия http://www.dc.baika.ru/
Дата: 15.11.02 04:40
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Обращение к ПреБилду вообще лишено смысла — он выполняется, если ИДЕ уже решила перестроить проект по каким-то своим причинам. Если она решит не перестраивать, то и этот шаг не будет выполнен. Следовательно, заставить ИДЕ перестраивать проект таким образом не удастся.


Так а может этого и не нужно. Что б проект при каждом запросе на Build начинал собираться.

2 Odi$$ey: Скажи поточнее, какого результаты ты хочешь добиться. Что б при каждом запросе на Build (не зависимо от того, поменялось что-либо в проекте или нет) файл с timestamp'ом компилялся заново. Либо, его компиляция должна происходить только в том случае, если какой-либо проектный файл был изменен и требует Rebuild'а проекта.
Re[7]: ПреБилд шаг
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 15.11.02 04:59
Оценка:
Здравствуйте, Sashko, Вы писали:

S>2 Odi$$ey: Скажи поточнее, какого результаты ты хочешь добиться. Что б при каждом запросе на Build (не зависимо от того, поменялось что-либо в проекте или нет) файл с timestamp'ом компилялся заново. Либо, его компиляция должна происходить только в том случае, если какой-либо проектный файл был изменен и требует Rebuild'а проекта.


В идеале конечно только если что-то в проекте изменилось, но пока я остановился на дате модификации из будущего и замене макроса __TIMESTAMP__ на __DATE__ и __TIME__ которые подставляют именно дату компиляции. Проект конечно ребилдится каждый раз, но с другой стороны, я и не давлю на ребилд, если и так уже что-то не поменял. Для воркспейса с несколькими взаимозависимыми проектами это конечно не удобно и надо доводить до ума.
Re[8]: ПреБилд шаг
От: Sashko Россия http://www.dc.baika.ru/
Дата: 15.11.02 06:56
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

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>
Re: Перекомпилировать всегда
От: Sprinter  
Дата: 12.11.04 12:46
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Есть в проекте (Visual Studio ) такой файлец:


OE>
OE>#include "stdafx.h"

OE>CString sBuildTimeStamp = __TIMESTAMP__;
OE>

__TIMESTAMP__ это время модификации файла, поэтому даже если удалять
и перекомпилировать соответствующий obj файл __TIMESTAMP__ для него
всё равно будет неизменным.

Как один из вариантов могу предложить использовать __TIME__ и __DATE__
и в postbuild-e удалять соответсвующий obj файл.
Re[2]: Перекомпилировать всегда
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 12.11.04 13:24
Оценка:
Здравствуйте, Sprinter, Вы писали:

S>__TIMESTAMP__ это время модификации файла, поэтому даже если удалять

S>и перекомпилировать соответствующий obj файл __TIMESTAMP__ для него
S>всё равно будет неизменным.

Можно использовать *никсовую утилитку touch.
Например из состава UnxUtils

С уважением,
Михаил.
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.