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 ..