Подтвердить что ты не робот

Командная строка CMake для С++ #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 не требуется.

4b9b3361

Ответ 1

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

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

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

(Нет, на самом деле это не называется "MYDEFINE", а < default value > просто является заполнителем, я просто заменил все это для этого примера)

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

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

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

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

Ответ 2

Контейнер 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>