эквивалент "прикосновения" в scons?


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

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

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

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

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

scons {something to specify file foobar.h}

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

4 7

4 ответа:

Вы посмотрели на -- интерактивную опцию Scons, там вы можете очистить и построить конкретные цели.

Человек-страница, описывающая это.

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

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

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

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

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

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

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

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