Запускать только препроцессор C в cmake? - PullRequest
14 голосов
/ 25 августа 2010

Я пытаюсь использовать cmake для упрощения распространения моей программы OpenCL. У меня есть файл ядра, который включает в себя несколько заголовков и других исходных файлов, и я хочу иметь один автономный исполняемый файл.

Мой план состоит в том, чтобы cmake запустил препроцессор C в исходном коде ядра, превратив файл cl и его включения в единый модуль, с которым легче работать.

Я могу использовать add_custom_command, чтобы сделать это, вызвав gcc / clang с -E, но тогда я не получаю флаги для включения правильных каталогов, чтобы найти различные заголовочные файлы в команде, и я не вижу простой способ найти все текущие каталоги include для использования в пользовательском вызове компилятора.

Есть ли способ запустить только препроцессор C в файле с текущей средой cmake?

Ответы [ 3 ]

14 голосов
/ 14 мая 2012

CMake автоматически генерирует целевые объекты make для предварительной обработки файлов. Для каждого foo.c в вашем проекте есть цель foo.i make, которая будет запускать только препроцессор (со всеми соответствующими флагами -D и -I и т. Д.). Запустите make help, чтобы увидеть все другие потенциально полезные цели, которые CMake генерирует в ваших make-файлах.

Кстати, я не понимаю, как с этим "единым блоком" вам будет легче работать.

1 голос
/ 02 мая 2012

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

В качестве альтернативы вы могли быпросто установите для свойства COMPILE_FLAGS цели значение «-E», что приведет к тому же эффекту, но будет локальным для этой цели.

0 голосов
/ 28 августа 2010

Я бы предложил другой подход.

  1. Соберите ядро ​​в двоичный файл (пример для ATI Stream: http://developer.amd.com/support/KnowledgeBase/Lists/KnowledgeBase/DispForm.aspx?ID=115)

  2. Скомпилируйте эти двоичные данные в вашу программу(как blob char []) и загрузите его при запуске вашей программы.

С помощью cmake и пользовательских целей это должно быть довольно просто.

...