Добавить листы свойств Visual С++ с помощью CMake
В настоящее время я переношу gcc-проект на Visual С++. Он определен в файле CMake, и я создал лист свойств Visual С++, чтобы помочь в совместимости (GccCompat.props). Каждый раз, когда файлы проекта Visual С++ восстанавливаются CMake, лист свойств должен быть добавлен вручную, так как я не знаю, как его автоматически добавить. Итак, вопрос:
Как я могу сообщить CMake, чтобы добавить лист свойств в созданное решение Visual С++?
Ответы
Ответ 1
Этот вопрос немного стар, но я недавно наткнулся на ту же проблему, интегрируя GStreamer в свой проект. GStreamer поставляется с набором очень хорошо подготовленных и высококачественных Property Sheets, и я хотел использовать их вместо того, чтобы взламывать вещи в CMake.
К счастью, эта проблема ограничивается только Windows и Visual Studio. Итак, вот мое решение:
Идея заключается в использовании функции Visual Studio.user. CMake не создает этот файл, поэтому довольно безопасно его генерировать при настройке. Во время настройки вы можете создать файл с именем EXACT в качестве файла проекта, но заканчивающимся расширением .user.
Частичное решение:
Если ваш файл проекта имеет имя my_project.vcxproj
, вам нужно создать другой файл рядом с ним под названием my_project.vcxproj.user
. Согласно MSDN:
Пользовательский файл (.vcxproj.user) сохраняет пользовательские свойства, для например, параметры отладки и развертывания. Файл vcxproj.user применяется ко всем проектам для конкретного пользователя.
Содержимое этого файла для импорта листов свойств выглядит примерно так:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="/path/to/sheet1.props" />
<Import Project="/path/to/sheet2.props" />
</Project>
Не безупречен, но работает до тех пор, пока CMake не начнет поддерживать листы свойств. Файл может быть создан с помощью команды CMake file
при настройке времени.
Потенциальная оговорка:
Я заметил, что когда я добавляю листы свойств таким образом, иногда они не отображаются в окне Property Manager (может быть, ошибка в Visual Studio Community 2013), но они всегда импортируются должным образом, и зависимости разрешены правильно.
Ответ 2
Эта функциональность превратила ее в ночную сборку CMake (https://gitlab.kitware.com/cmake/cmake/commit/e390991846825799e619e072a28f1da58b7c89ba), хотя пока не в стабильном выпуске. Теоретически это будет в следующем выпуске, а выпуски CMake будут сделаны относительно часто.
Чтобы использовать, вы должны установить свойство VS_USER_PROPS
в цель. Например. set_target_properties(foo PROPERTIES VS_USER_PROPS "${props_file}")
.
Однако, похоже, вы не можете использовать несколько свойств с этой опцией, и он заменяет файл свойств пользователя по умолчанию ($(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props
). Чтобы обойти это, листы свойств могут включать в себя другие листы свойств, поэтому вы можете создать лист свойств "мастер", который включает любые другие листы свойств, которые вы хотели бы использовать (включая панель свойств пользователя по умолчанию).
Ответ 3
Не знаете, какие свойства вам нужны. Некоторые могут быть установлены непосредственно в CMake, как в этом примере для нескольких конфигураций:
set (CMAKE_CONFIGURATION_TYPES "A;B;C;D" CACHE STRING "Configurations" FORCE)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
set (CMAKE_CXX_FLAGS_${OUTPUTCONFIG} "/ZI /Od")
set (CMAKE_EXE_LINKER_FLAGS_${OUTPUTCONFIG} "/debug")
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
Помимо переменных перечисленных здесь, я думаю, что у CMake нет возможности прикреплять листы свойств.