CMake командная строка для C++ #define

Мне нужно скомпилировать разные версии определенного проекта, добавив ключи компилятора. Обычно я хотел бы сделать это с помощью add_definitions или что-то вроде

set_property( TARGET mylib PROPERTY COMPILE_DEFINITIONS _MYDEFINE=1 )

в файле CMakeLists.txt.

Однако в этом конкретном проекте мне не разрешено изменять какие-либо источники, в том числе файл CMakeLists.txt.

Я надеялся, что что-то вроде

cmake -D_MYDEFINE=1 <path to sources>

будет генерировать файл проекта (Visual Studio 2008 в моем случае, но это не имеет значения), который включает _MYDEFINE=1 в определения препроцессора, но на самом деле это не так.

Какие у меня варианты здесь? Есть ли другая опция командной строки cmake для достижения этой цели? Не стесняйтесь предлагать решения, не включающие в себя командную строку, если изменение CMakeLists.txt проекта не требуется.

3 ответа

Решение

Мне удалось сделать это сейчас:

Я смог убедить всех добавить следующие строки в общий CMakeLists.txt:

IF (NOT DEFINED _MYDEFINE)
    SET(_MYDEFINE <default value>)
ENDIF()
ADD_DEFINITIONS(-D_MYDEFINE=${_MYDEFINE})

(Нет, это на самом деле не называется "MYDEFINE", а <значение по умолчанию> просто заполнитель, я просто заменил все это в этом примере)

Это не меняет текущее поведение компиляции без дополнительных флагов компилятора и, таким образом, является действительным изменением.

И это позволяет делать

cmake -D_MYDEFINE=<my value> <path to sources>

где это определение cmake будет отображено на определение прекомпилятора C++, когда cmake создаст файл проекта.

Контейнер CMakeLists.txt решение

Хитрое решение:

Только для чтения CMakeList.txt дорожка: ${path}/ReadOnlyProject/CMakeLists.txt

Создать новый CMakeList.txt в верхнюю часть только для чтения библиотеки (${path}/CMakeLists.txt):

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0)
PROJECT (FAKE_PROJECT)

ADD_DEFINITIONS(-D_MYDEFINE=1)

ADD_SUBDIRECTORY(ReadOnlyProject)

Теперь используйте ваш новый проект (FAKE_PROJECT) Скомпилировать. Если ReadOnlyProject не устанавливает определения компилятора напрямую, это может работать.


В Visual Studio 2010:

Попробуйте изменить c:\Users\${username}\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props добавить пользовательские настройки компилятора.

Вы должны добавить следующее:

<Project>
  ...
  <ItemDefinitionGroup>
    <ClCompile>
      <PreprocessorDefinitions>__MYDEFINE=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
  </ItemDefinitionGroup>
</Project>

Чтобы передать определение препроцессора C++ или C без изменения каких-либо исходных файлов CMake, используйте переменные среды CFLAGS для C или CXXFLAGS для C++ соответственно, например:

$ export CXXFLAGS="-D_MY_DEFINE=1 -D_MY_OTHER_DEFINE=1"
$ mkdir build
$ cd build
$ cmake ..
Другие вопросы по тегам