Настройка сборки C ++ для игнорирования изменений в комментариях - PullRequest
10 голосов
/ 28 октября 2011

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

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

Я использую Visual Studio 2010, кстати.

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

Ответы [ 3 ]

2 голосов
/ 29 октября 2011

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

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

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

0 голосов
/ 28 октября 2011

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

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

0 голосов
/ 28 октября 2011

номер

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

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

...