эквивалент touch в scons?

scons использует хэши MD5, а не время модификации файла, чтобы определить, нужно ли создавать зависимость.

Я хочу, чтобы это было поведением по умолчанию. Но есть ли способ заставить его считать, что конкретный файл устарел (эквивалент «касания»), помимо редактирования файла, чтобы сделать его другим?

изменить: вариант использования:

двоичный файл F используется для создания другого файла G с помощью инструмента X. По какой-то причине файл G изменился (он был поврежден или я его редактировал) или инструмент X изменился, и я хочу воссоздать файл G и все, что после него .

изменить: это только для периодического использования. Я не хочу, чтобы это происходило всегда, только те несколько раз, когда я попрошу об этом. Также я могу не знать конкретный файл заранее. По этой причине я не хочу изменять файлы SConscript/SConstruct для создания определенного файла. Я хотел бы сделать это в командной строке:

scons {something to specify file foobar.h}

и это заставит scons создавать все файлы в зависимости от foobar.h, тогда как простое нажатие scons приведет к обычной сборке с использованием хэшей MD5 для проверки зависимостей. Я не против отредактировать файлы SConscript/SConstruct заранее, чтобы разрешить это (я думаю, пользовательский Decider), если есть способ сделать это, который не значительно увеличивает время сборки.


person Jason S    schedule 30.09.2009    source источник


Ответы (4)


Вы видели параметр --interactive Scons, там вы можете очищать и создавать определенные цели.

справочная страница с описанием этого.

person daramarak    schedule 11.11.2009
comment
да, я никогда не знал о --interactive, это сэкономит мне время при повторных сборках. Спасибо! Я думаю, что я могу использовать его для того, что я хотел тоже. - person Jason S; 11.11.2009
comment
Обратите внимание, что если вы действительно хотите инициировать новые вызовы компиляции, вам нужно выполнить scons --interactive --no-cache, иначе интерактивная команда build будет выбирать только из кеша, а не запускать ваш компилятор. - person Nordlöw; 09.04.2014

Я не думаю, что есть способ сделать это напрямую. Если рассматриваемый исходный файл имеет один очевидный вывод, например test.o, созданный из test.c, то удаление test.o приведет к повторной компиляции исходного файла.

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

Сказав это, вы можете прочитать о Decider() функция, которая позволяет вам выбрать, как будут обрабатываться зависимости файлов. Вы даже можете выбрать пользовательскую решающую функцию для определенных файлов в вашем проекте, поэтому, если у вас есть какой-то глобальный заголовочный файл, который вы хотите touch и пересобрать, вы можете это сделать.

Обновление: чтобы ответить на ваш последний вопрос, просто удалите файл G. Scons воссоздаст его из F, запустив X при следующей сборке.

person Greg Hewgill    schedule 01.10.2009

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

Лично я нахожу это очень полезным, потому что я не могу предсказать все результаты каждого отдельного шага в моем потоке сборки EDA. Я также не хочу пытаться предсказать все результаты каждого шага сборки из-за стоимости обслуживания.

Я уверен, что функция Decider(), как упомянул Грег, больше похожа на scons, но лично мне нравится иметь файлы временных меток.

person Ross Rogers    schedule 01.10.2009

В вашем файле SConstruct извлеките узел, представляющий ваш файл. После этого вы сможете использовать Node.always_build(true), чтобы убедиться, что он построен, я думаю, что это также заставит его иждивенцев перестроиться.

person daramarak    schedule 11.11.2009
comment
спасибо, но я не хочу делать это всегда (это редкая, но крайне необходимая задача), и я не хочу изменять файлы SConstruct/SConscript, мне просто нужен способ выполнить одноразовую перестройку, чтобы заставить конкретный файл или файлы и его иждивенцы, которые необходимо перестроить. - person Jason S; 11.11.2009