Вопрос

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

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

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

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

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

scons {something to specify file foobar.h}

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

Это было полезно?

Решение

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

справочная страница, описывающая это.

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top