CMAKE_OSX_DEPLOYMENT_TARGET не действует на iOS

Согласно этому посту я указал CMAKE_OSX_DEPLOYMENT_TARGET в своем CMake следующим образом:

cmake_minimum_required(VERSION 3.21.3)

if (APPLE)
    #The variable CMAKE_OSX_DEPLOYMENT_TARGET must initialized as a cache variable prior to the first project() command
    if (IOS)
        set(CMAKE_OSX_DEPLOYMENT_TARGET "14.0" CACHE STRING "Minimum iOS deployment version")
    else()
        set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0" CACHE STRING "Minimum MacOS deployment version")
    endif ()
endif ()

project(MyApp LANGUAGES CXX)

и запустите CMake с генератором XCode.

В MacOS это генерирует правильный MACOSX_DEPLOYMENT_TARGET в проекте XCode, но в iOS это не имеет никакого эффекта и IPHONEOS_DEPLOYMENT_TARGET = 11.0 генерируется в проекте XCode, хотя согласно документации это также должно применяться к iOS.

Моя версия CMake — 3.29.2, версия XCode — 15.3.

РЕДАКТИРОВАТЬ1

Пытался установить CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET как обналиченный и необналиченный:

set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "14.0" CACHE STRING "Workaround for minimum iOS deployment version")
set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "14.0")

но это не помогло, единственный рабочий вариант:

    set_target_properties(${PROJECT_NAME} PROPERTIES
        XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "14.0")

РЕДАКТИРОВАТЬ2

Попробовал код из ответа:

if (APPLE)
    # The variable CMAKE_OSX_DEPLOYMENT_TARGET must initialized as a cache variable prior to the first project() command
    # Your code won't work the variable IOS cannot be used before the project call. It will always be false.
    # You must use the CMAKE_SYSTEM_NAME instead
    message("CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
    if (CMAKE_SYSTEM_NAME STREQUAL "iOS")
        #Does not take an effect, the workaround is setting XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET.
        set(CMAKE_OSX_DEPLOYMENT_TARGET "14.0" CACHE STRING "Minimum iOS deployment version")
    else()
        set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0" CACHE STRING "Minimum MacOS deployment version")
    endif ()
    message("CMAKE_OSX_DEPLOYMENT_TARGET has been set to ${CMAKE_OSX_DEPLOYMENT_TARGET}")
endif ()

но получил следующий вывод:

Я перезапустил QT Creator, запустил CMake и получил следующее:

но когда я удалил файлы сборки и запустил чистый CMake, я получил это снова:

QT Creator определяет следующие атрибуты OSX:

но нет CMAKE_SYSTEM_NAME.

Я думаю, что установка переменных окружения MACOSX_DEPLOYMENT_TARGET или IPHONEOS_DEPLOYMENT_TARGET, вероятно, сработает.

trojanfoe 02.05.2024 12:58

Установка записи кэша по умолчанию НЕ перезаписывает существующее значение. Вы уверены, что переменная кэша еще не определена? Или добавление FORCE к утверждениям set будет иметь какое-то значение?

gordan.sikic 02.05.2024 14:02

Независимо от моего комментария выше, вы уверены, что не существует нормальной переменной с тем же именем, которая затеняет переменную кэша?

gordan.sikic 02.05.2024 14:24

@gordan.sikic Я пытался установить CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET как кэшируемый и необналичиваемый отдельно (комментируя одну строку и раскомментируя другую)

Alexey Starinsky 02.05.2024 14:58

Не используйте скриншоты. Все это можно скопировать в виде текста: Meta.stackoverflow.com/questions/285551/…

Marek R 07.05.2024 16:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код не будет работать, переменную IOS нельзя использовать до вызова проекта. Оно всегда будет ложным.

Вызов проекта отвечает за очень многое. Стоит понять, что он делает, чтобы вы могли рассуждать об этих сценариях. При вызове проекта CMake окончательно определяет целевую платформу, компиляторы и т. д.

Вам нужно будет создать файл цепочки инструментов, в котором будут указаны CMAKE_SYSTEM_NAME и CMAKE_OSX_DEPLOYMENT_TARGET.

Пример:

# Name this file iOS.cmake
set(CMAKE_SYSTEM_NAME "iOS")
set(CMAKE_OSX_DEPLOYMENT_TARGET "14.0" CACHE STRING "Minimum iOS deployment version" FORCE)

Затем вы можете использовать этот файл следующим образом:

cmake -S . -B build/ -D CMAKE_TOOLCHAIN_FILE=iOS.cmake

CMAKE_SYSTEM_NAME по какой-то причине пуст в моей среде, в обновленном сообщении я предоставил свой код CMake.
Alexey Starinsky 03.05.2024 13:50

Из документации CMake cmake .. -GXcode -DCMAKE_SYSTEM_NAME=iOS. cmake.org/cmake/help/latest/manual/…. Вам необходимо установить CMAKE_SYSTEM_NAME.

jpr42 03.05.2024 17:55

Я перезапустил QT Creator и получил CMAKE_SYSTEM_NAME=iOS

Alexey Starinsky 03.05.2024 20:41

Я сделал MR для CMake, чтобы помочь уточнить документацию для IOS, чтобы помочь пользователям в будущем: gitlab.kitware.com/cmake/cmake/-/merge_requests/9491

jpr42 04.05.2024 01:21

@AlexeyStarinsky, пожалуйста, проигнорируйте мой предыдущий совет. Я по-прежнему прав в том, что ваше предыдущее использование переменной IOS было неправильным. Посмотрите это обсуждение gitlab.kitware.com/cmake/cmake/-/merge_requests/…

jpr42 07.05.2024 17:10

Я обновил ответ после разговора с различными сопровождающими CMake.

jpr42 09.05.2024 02:24

Другие вопросы по теме