Установка сборки С++ для игнорирования изменений в комментариях

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

Когда препроцессор выполняется с удалением комментариев из измененного файла, цепочка сборки может сначала проверить, действительно ли результат был изменен. Если нет, он должен действовать так, как будто сам файл не изменился.

Я использую Visual Studio 2010.

Изменить: @MikeSeymour, VS cl.exe имеет переключатель /Gm для минимальных перестроек. Это плохо документировано, но я думаю, что это делает то, о чем я прошу. Но он несовместим с переключателем /MP для использования нескольких ядер. На моем двойном ядре (с гиперпотоком)/Gm нужно будет пропустить компиляцию ~ 3 из 4 единиц в среднем. Хотя я сомневаюсь, что это так, я даже не уверен, как оценить, стоит ли /Gm или нет.

Ответ 1

Да. У вас должна быть система сборки, которая позволит вам запускать события сборки, если предикат является истинным. Что бы вы хотели - это предикат, который говорит: "этот файл изменился семантически интересным способом".

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

Теперь, как вы получаете систему сборки для сотрудничества? Unix Создает триггеры в предикате, но не в этом роде; то, что он на самом деле делает, это инициировать события сборки для сущностей, основанные на дате повторения дат файла по сравнению с целью. Вы можете подделать это, имея зависимость от файла "changed_signal", создавая такой файл, если SmartDifferencer видит интересную разницу.

Ответ 2

Нет.

Как компилятор знает, что только изменения, внесенные вами в файл, были в комментариях, пока он не скомпилирует этот файл?

Затем последующие файлы должны быть перекомпилированы, потому что зависимый файл изменился, даже если результирующий двоичный файл был таким же.

Ответ 3

Существует множество методов, позволяющих избежать множества взаимозависимостей. Попробуйте использовать форвардную декларацию.

С помощью форвардного объявления вам нужно только скомпилировать код, который действительно использует код. Книга Скотта Майерса может рассказать вам больше. Имеет хорошие страницы на эту тему.