Добавление таблиц свойств Visual C++ с помощью CMake

В настоящее время я переношу проект gcc на Visual C++. Он определен в файле CMake, и я создал лист свойств Visual C++ для обеспечения совместимости (GccCompat.props). Каждый раз, когда файлы проекта Visual C++ регенерируются CMake, лист свойств необходимо добавлять вручную, так как я не знаю, как добавить его автоматически. Итак, вопрос:

Как я могу указать CMake добавить лист свойств в созданное решение Visual C++?


person OregonGhost    schedule 04.06.2010    source источник
comment
Это один из моих немногих аргументов в пользу CMake: часто кажется, что он ограничивает вас наименьшим общим знаменателем между инструментами или же эзотеричен в поддержке специальных функций. Я не эксперт, но я предполагаю, что вам придется выполнить какую-то постобработку ваших сгенерированных файлов.   -  person Cheezmeister    schedule 24.06.2011
comment
Любая идея о том, как выполнить постобработку сгенерированных файлов? У меня был бы свой собственный сценарий для их последующей обработки, но кажется, что CMake будет повторно генерироваться как часть процесса сборки VS, перезаписывая мои изменения. В CMake также, похоже, нет хука для пост-генерации...   -  person Allen Pestaluky    schedule 18.04.2013


Ответы (3)


Эта функциональность включена в ночную сборку 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). Чтобы обойти это, листы свойств могут включать другие листы свойств, поэтому вы можете создать «главный» лист свойств, который включает любые другие листы свойств, которые вы хотели бы использовать (включая лист свойств пользователя по умолчанию).

person MuertoExcobito    schedule 26.01.2017
comment
Свойство было переименовано в VS_USER_PROPS. - person wally; 21.02.2017
comment
Обновление за февраль 2018 г.: эта функция теперь является частью CMake, начиная с версии 3.8 (если мои данные верны). Это работает довольно хорошо. - person kralyk; 23.02.2018
comment
Дальнейшее обновление: я обнаружил, что мой MSVC не будет загружать файл реквизита, если он не скопирован рядом с файлом .proj, и поэтому мне пришлось добавить команду копирования (через configure_file( ... COPYONLY)), чтобы это произошло в CMake. Также очевидно, что порядок элементов в файле реквизита имеет значение. - person kralyk; 23.02.2018
comment
Так что же происходит, когда вы пытаетесь использовать эту настройку CMake для любой системы сборки, отличной, кроме msbuild? - person Omnifarious; 03.07.2018

Этот вопрос немного устарел, но недавно я столкнулся с той же проблемой при интеграции GStreamer в свой проект. GStreamer поставляется с набором очень хорошо подготовленных и высококачественных таблиц свойств, и я хотел использовать их вместо того, чтобы ковыряться в CMake.

К счастью, эта проблема ограничивается только Windows и Visual Studio. Итак, вот мое решение:

Идея состоит в том, чтобы использовать функцию файла .user в Visual Studio. 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 в файле configure- время.

Возможные предостережения:

Я заметил, что когда я добавляю листы свойств таким образом, иногда они не отображаются в окне диспетчера свойств (возможно, это ошибка в Visual Studio Community 2013), но они всегда импортируются правильно, а зависимости разрешаются правильно.

person Sepehr    schedule 10.10.2015

Не уверен, какие свойства вам нужны. Некоторые из них могут быть установлены непосредственно в 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 не имеет возможности прикреплять листы свойств.

person Olha Puzhay    schedule 12.03.2013
comment
@kfsone Ваш пункт 1 не имеет значения, так как это ответ 5-летней давности. Да и ссылки на неофициальные страницы не возбраняются. - person Mark Rotteveel; 09.06.2018
comment
@MarkRotteveel Я не предполагал, что это какая-то форма морального нарушения, но значительная часть ответа защищена брандмауэром за ссылкой, которая больше не указывает на официальный сайт, стирая ценность ответа , и кое-что, что не рекомендуется - в ответах рекомендуется цитировать соответствующий фрагмент связанной страницы, чтобы защитить именно от этого. - person kfsone; 25.07.2018
comment
@MarkRotteveel В частности, единственная правильная и полезная часть этого ответа - это ссылка, и это устаревшая ссылка. Если бы остальная часть ответа не была неточной и бесполезной, я бы отредактировал ответ, чтобы обновить ссылку и указать переменные. - person kfsone; 25.07.2018