Любой способ проанализировать предварительно обработанный источник с помощью внешнего инструмента, прежде чем он компилируется? - PullRequest
3 голосов
/ 23 мая 2011

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

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

Если такой опции нет, можно ли вообще это сделать? Я имею в виду, компилятор даже использует эти файлы .i, или они просто как-то выводятся для пользователя?

В принципе, есть ли способ автоматически подменить исходный код перед его компиляцией, но без изменения реальных файлов?

Только для ссылок: я пытаюсь придумать умный способ запутать все строки с минимальной модификацией источника.

Ответы [ 5 ]

4 голосов
/ 23 мая 2011

Да, вы просто обновили бы свою систему сборки, чтобы иметь шаг предварительной обработки, шаг запутывания, а затем шаг компиляции в объект. По умолчанию большинство систем сборки просто объединяют все эти действия в один шаг (и пропускают этап запутывания). Не должно быть ничего страшного с любой "реальной" системой сборки, такой как Scons, waf или даже Make.

Если вы используете Visual Studio, тогда это немного больше работы. Microsoft хочет, чтобы вы написали свои операции сборки в MSBuild, и это немало работы, ИМХО. Это непросто, потому что MSVS является преимущественно IDE для итеративной разработки и НЕ предназначен для сборки. Он не является и никогда не будет инструментом сборки (даже если он «строит вещи», а только стандартные и очень простые «строит вещи»). Но вы все равно можете использовать IDE с другим инструментом сборки. Например, мы используем Scons для нашей сборки, и она генерирует файлы MSVS *.sln и *.vcproj, и эти файлы просто создаются с помощью Scons (но все файлы редактируются в MSVS IDE).

Простой ответ: Ваш вопрос очень просто проблема с операциями сборки. Это должно быть очень просто с любой не "игрушечной" системой сборки.

distcc (инструмент распределенной сборки) эффективно предварительно обрабатывает все файлы локально, затем отправляет *.i удаленным компиляторам (которым даже не требуются установленные заголовки), а затем отправляет обратно *.obj. Итак, то, о чем вы говорите, довольно просто.

3 голосов
/ 23 мая 2011

Пусть x.cpp будет вашим файлом, который вы хотите обработать.

  1. Установите опцию компилятора для генерации предварительно обработанного вывода для x.cpp, пусть это будет xi
  2. Добавьте xi в проект и задайте «настраиваемый инструмент сборки» в свойствах.Установите для «выходных файлов» значение x.preprocessed.cpp.
  3. Добавьте в проект файл x.preprocessed.cpp.

Подробнее см. msdn .

1 голос
/ 23 мая 2011

Вы должны быть в состоянии выполнить «Pre-Build Event» и подключить туда любые внешние инструменты. В VS200x он находится в Свойствах конфигурации -> События сборки -> События предварительной сборки.

0 голосов
/ 23 мая 2011

Вы можете использовать make-файл, чтобы сначала сгенерировать файлы .i, запустить их обработку, а затем скомпилировать.

0 голосов
/ 23 мая 2011

Просто используйте приличную систему сборки. SCons , waf или что-то еще, если вам не нравятся эти два.

...