Как заставить SCONS обновлять содержимое файла, используемого в сборке - PullRequest
5 голосов
/ 21 сентября 2011

Какой правильный метод SCONS для обновления содержимого файла, который является частью сборки?

Я использую SCONS для создания довольно большого проекта.Но ради простого вопроса предположим, что это выглядит так:

env.Program("foo", ["foo.c", "version.c"])

При определенных условиях сборки необходимо обновить содержимое одного из файлов CPP в сборке с новой информацией - информацией о версиина самом деле.В приведенном выше примере мне нужно изменить содержимое "version.c".Я подумал, что мог бы сделать это довольно хорошо с помощью следующего примера:

env.Command(target="version.c", source=[], action=PythonFunctionToUpdateContents)
env.Program("foo", ["foo.c", "version.c"])

PythonFunctionToUpdateContents будет использовать target [0] в качестве имени файла, открывать его, искать какой-то конкретный текст, изменять его, писатьизменения обратно в тот же файл.К сожалению, приведенный выше пример не работает.SCONS автоматически удаляет целевой файл перед его сборкой, поэтому мой файл "version.c" был удален до того, как его можно было обновить.

Я попытался установить для цели и источника один и тот же файл в env.Command ()вызов, но это просто создает цикл зависимости.

Я знаю, что я мог бы решить эту проблему, если бы SCONS генерировал файл ENTIRE version.c, но это не подходит, так как version.c содержит много другого кода, который можетизменить как часть нормального развития.

Ответы [ 2 ]

5 голосов
/ 14 ноября 2012

Этот ответ немного опоздал на вечеринку, но в любом случае вот он:

Вы должны использовать env.Precious("version.c").Это предотвращает удаление файла перед сборкой.

Возможно, вы также захотите использовать env.NoClean("version.c"), чтобы он не удалялся во время очистки.

Вы МОЖЕТЕ использовать env.SideEffect, может быть, но, похоже, у негопара странных вещей об этом.В списке рассылки мне сказали, что обычно его не используют.

5 голосов
/ 22 сентября 2011

Обычный способ сделать это - иметь "version.c.in" или "version-in.c" или как угодно, как вы хотите это называть.Измените это и выведите его в version.c.Вы бы добавили файл «in» в свою систему контроля версий, а файла version.c там не было бы.Таким образом, результат всего этого будет выглядеть следующим образом:

env.Command(target="version.c", source="version-in.c",
            action=PythonFunctionToUpdateContents)
env.Program("foo", ["foo.c", "version.c"])

Это относится и к другим системам сборки - как правило, плохая идея, чтобы входной файл был также выходным.Гораздо лучше использовать промежуточный файл для выполнения работы.

...