Как связать Info.plist в приложении MacOSX с CMake? - PullRequest
0 голосов
/ 03 ноября 2018

Я разрабатываю приложение для доступа к камере. Проект написан на C ++, и я использую CMake для его упаковки.

Чтобы развернуть проект на Mac, я использую команду ниже, а затем открываю проект в Xcode:

cmake -G Xcode ../src

Он работал до последнего обновления, когда начал жаловаться на:

[access] This app has crashed because it attempted to access 
privacy-sensitive data without a usage description.  The app's 
Info.plist must contain an NSCameraUsageDescription key with 
a string value explaining to the user how the app uses this data.
Program ended with exit code: 9

Итак, я создал новый файл Info.plist со следующим содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
    <dict>
        <key>CFBundleIconFile</key>
        <string></string>
        <key>NSCameraUsageDescription</key>
        <string>This app requires to access your camera 
            to retrieve images and perform the demo</string>
    </dict>
</plist>

Мой вопрос: что я должен добавить в CMakeLists.txt, чтобы взять этот файл и поместить его в нужное место? И ... возможно ли, что cmake -G Xcode правильно включит его в проект Xcode?

РЕДАКТИРОВАТЬ Следуя рекомендациям, я попробовал это:

  # Compile files:
  add_executable(fpv 
    main.cpp

    files.cpp
    files.hpp

    more-files.cpp
    more-files.hpp
 )

# Link files:
target_link_libraries(fpv
   fpv-lib
   ${GTKMM_LIBRARIES}  
   ${OpenCV_LIBS} )

# Lets bundle it:
set_target_properties(fpv PROPERTIES
  FRAMEWORK TRUE
  FRAMEWORK_VERSION C
  MACOSX_FRAMEWORK_IDENTIFIER com.cmake.dynamicFramework
  MACOSX_FRAMEWORK_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist
  # "current version" in semantic format in Mach-O binary file
  VERSION 16.4.0
  # "compatibility version" in semantic format in Mach-O binary file
  SOVERSION 1.0.0
  # XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Jean-Michel Gonet"
)

РЕДАКТИРОВАТЬ Чтобы быть уверенным в правильности Info.plist, я вручную добавил его в проект Xcode:

  • Добавлен Info.plist в качестве источника в проекте.
  • Выделено в навигаторе проекта.
  • Переименовал его (!) В Info.cpp, чтобы я мог включить его в цель.
  • Переименовал его обратно в Info.plist.
  • Запустил приложение, которое спрашивало моего разрешения на доступ к камере.

А потом все заработало.

Но мне все равно хотелось бы иметь конфигурацию проекта в CMake.

1 Ответ

0 голосов
/ 03 ноября 2018

Официальная документация Cmake (см. cmake-properties-7 ) упоминает 2 семейства MACOSX целевых свойств:

  • FRAMEWORK, FRAMEWORK_VERSION и MACOSX_FRAMEWORK_INFO_PLIST
  • MACOSX_BUNDLE_INFO_PLIST и MACOSX_BUNDLE

Теперь включением Info.plist управляет последнее семейство Bundle .

Чтобы получить полный пример, предположим, что ваше приложение называется fpv , а ваша структура каталогов:

/src   <-- Root folder
 /lib  <-- There you may add sources for your application's library
      CMakeLists.txt <-- Library has its own configuration
      more-files.cpp
      lots-of-files.cpp
      etc.cpp
      ...
 /app  <-- This is where executable resides
      CMakeLists.txt <-- This is where you need to configure the bundle
      Info.plist    <-- I've placed the plist file just besides.
      main.cpp
      second.cpp
      more.cpp

Вот как может выглядеть CMakeLists.txt вашего приложения:

# src/app
project( fpv )

# GTKMM has to be linked/included via pkg_config:
find_package(PkgConfig)
pkg_check_modules(GTKMM gtkmm-3.0) # Defines variables GTKMM_INCLUDE_DIRS, GTKMM_LIBRARY_DIRS and GTKMM_LIBRARIES.
link_directories( ${GTKMM_LIBRARY_DIRS} )
include_directories( ${GTKMM_INCLUDE_DIRS} )

# OpenCV can be linked as usual:
find_package( OpenCV REQUIRED )

# Compile files:
add_executable(fpv 
    main.cpp

    main-window.cpp
    main-window.hpp

    auto-viseur.cpp
    auto-viseur.hpp
 )

# Link files:
target_link_libraries(fpv
   fpv-lib
   ${GTKMM_LIBRARIES}  
   ${OpenCV_LIBS} )

# Lets bundle it:
set_target_properties(fpv PROPERTIES
  MACOSX_BUNDLE TRUE
  MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist
)

Чтобы построить проект XCode, создайте папку xcode помимо основной папки src:

mkdir xcode
cd xcode
cmake -G Xcode ../src

Теперь вы можете открыть его как проект из Xcode . Для выполнения в режиме отладки:

  • Выберите цель вашего приложения (верхняя левая сторона, по умолчанию она установлена ​​в ALL_BUILD). Вы заметите, что значок изменился на стилизованный A.
  • Запустите его.
  • Если все прошло хорошо, вас попросят разрешить вашему приложению доступ к камере.
  • Также вы должны увидеть файл Info.plist в качестве ресурса
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...