Я не уверен, является ли это мерзавец вопросом или вопросом make, или, может быть, и тем и другим, но здесь идет ...
Представьте, что у вас есть файл foo.cpp
, сгенерированный программой-генератором gen.py
. Если программа генератора изменена, ее необходимо запустить снова, чтобы сгенерировать свежую версию foo.cpp
.
Правило makefile, которое кодирует это поведение, может выглядеть следующим образом 1 :
foo.cpp: gen.py
gen.py
Для активной разработки на gen.py
, я думаю, это идеально.
Однако рассмотрим случай, когда вы делаете свой проект доступным удаленно через git, скажем, на github или на каком-либо подобном сайте. Пользователи скачают и сделают ваш проект.
Традиционный способ обработки сгенерированных файлов - не проверять их все: не включайте foo.cpp
в git all (добавьте его в ваш `.gitignore), и когда пользователь создаст ваш проект, файл будет генерироваться.
Однако альтернативный подход - это для включения сгенерированного файла foo.cpp
в git. Это повышает вероятность того, что gen.py
и foo.cpp
могут быть "несинхронизированы" 2 , если один из них изменен без обновления другого, но имеет несколько других преимуществ:
- Пользователи, которые просто хотят построить проект, но никогда не обновляют
gen.py
, не нуждаются в предварительных условиях для запуска gen.py
(например, Python).
- Немодифицированная сборка быстрее, потому что шаг генерации не выполняется.
- Вы получаете прямую обратную связь во время подготовки / фиксации о том, какие изменения
foo.cpp
подразумеваются gen.py
, так как файл будет частью diff.
Я не заинтересован в том, чтобы оспаривать достоинства проверки созданных файлов, а не создавать их локально. Вы можете предположить, что для какого-то проекта было принято решение проверить созданные файлы, и это решение не подлежит обсуждению.
В этом контексте мой вопрос:
Для пользователя, который недавно клонирует проект или синхронизирует коммит, включающий оба файла, как я могу убедиться, что make
не пытается сгенерировать foo.cpp
? По умолчанию git будет использовать текущее время при синхронизации файлов, поэтому foo.cpp
и gen.py
будут иметь одинаковые временные метки, а foo.cpp
будет перестроен.
Я не могу попросить пользователей изменить их конфигурацию git.
1 Возможно, для foo.cpp
будут дополнительные зависимости, которые также будут указываться в качестве предварительного условия, но это "базовый случай".
2 Разумный подход состоит в том, чтобы обеспечить их синхронизацию с помощью git hook.