Added CMake configuration for building on iOS

This commit is contained in:
Leon Styhre 2025-01-14 18:10:48 +01:00
parent 0ea6384e52
commit cd78e2645a
6 changed files with 104 additions and 42 deletions

View file

@ -9,7 +9,10 @@
#
cmake_minimum_required(VERSION 3.13)
if(APPLE)
if(CMAKE_SYSTEM_NAME MATCHES iOS)
set(CMAKE_OSX_DEPLOYMENT_TARGET 14.0 CACHE STRING "iOS deployment target")
elseif(APPLE)
# Set this to the minimum supported macOS version, and also update
# es-app/assets/ES-DE_Info.plist accordingly.
set(CMAKE_OSX_DEPLOYMENT_TARGET 11.0 CACHE STRING "macOS deployment target")
@ -91,6 +94,15 @@ if(EXISTS /usr/include/bcm_host.h)
message("-- Building on a Raspberry Pi (64-bit OS)")
endif()
# iOS.
if(IOS)
message("-- Building for iOS (arm64)")
set(GLES ON)
set(BUNDLED_CERTS ON)
add_compile_definitions(__IOS__)
include(${CMAKE_SOURCE_DIR}/ios/cmake/variables.cmake)
endif()
#---------------------------------------------------------------------------------------------------
# Emscripten WebAssembly build.
@ -118,12 +130,12 @@ if(GLSYSTEM MATCHES "Desktop OpenGL")
find_package(OpenGL REQUIRED)
elseif(ANDROID)
find_package(OpenGLES3 REQUIRED)
elseif(GLES AND NOT EMSCRIPTEN)
elseif(GLES AND NOT IOS AND NOT EMSCRIPTEN)
find_package(OpenGLES2 REQUIRED)
endif()
# On macOS and Windows all dependencies are kept in-tree in the "external" directory.
if(APPLE)
# On macOS, iOS and Windows all dependencies are kept in-tree in the "external" directory.
if(APPLE AND NOT IOS)
if(NOT EXISTS ${PROJECT_SOURCE_DIR}/external/FFmpeg)
message(FATAL_ERROR "-- You need to build the dependencies in ./external first")
endif()
@ -132,7 +144,7 @@ elseif(WIN32)
if(NOT EXISTS ${PROJECT_SOURCE_DIR}/external/pugixml/pugixml.dll)
message(FATAL_ERROR "-- You need to build the dependencies in ./external first")
endif()
elseif(NOT EMSCRIPTEN AND NOT ANDROID)
elseif(NOT EMSCRIPTEN AND NOT ANDROID AND NOT IOS)
find_package(CURL REQUIRED)
find_package(FFmpeg REQUIRED)
find_package(FreeImage REQUIRED)
@ -279,8 +291,8 @@ if(ASAN OR UBSAN)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_ASSERTIONS -D_FORTIFY_SOURCE=3")
endif()
# The following removes half of the ranlib warnings on macOS regarding no symbols for files
# that are #ifdef'ed away. There must be a way to remove the other half as well?
# The following removes the ranlib warnings on macOS regarding missing symbols for files that have
# been #ifdef'ed away.
if(APPLE)
SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
@ -378,7 +390,7 @@ if(DEINIT_ON_LAUNCH)
endif()
endif()
if(AUR_BUILD OR FLATPAK_BUILD OR RETRODECK OR RPI OR HAIKU OR CMAKE_SYSTEM_NAME MATCHES FreeBSD)
if(AUR_BUILD OR FLATPAK_BUILD OR RETRODECK OR RPI OR HAIKU OR IOS OR CMAKE_SYSTEM_NAME MATCHES FreeBSD)
set(APPLICATION_UPDATER OFF)
endif()
@ -462,8 +474,19 @@ set(COMMON_INCLUDE_DIRS ${CURL_INCLUDE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/external/utfcpp/source
${CMAKE_CURRENT_SOURCE_DIR}/es-core/src
${CMAKE_CURRENT_SOURCE_DIR}/es-pdf-converter/src)
if(APPLE)
if(IOS)
set(COMMON_INCLUDE_DIRS ${COMMON_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/external/curl/include
${CMAKE_CURRENT_SOURCE_DIR}/external/ffmpeg-kit/src/ffmpeg
${CMAKE_CURRENT_SOURCE_DIR}/external/FreeImage/Source
${CMAKE_CURRENT_SOURCE_DIR}/external/freetype/include
${CMAKE_CURRENT_SOURCE_DIR}/external/gettext/gettext-runtime/intl
${CMAKE_CURRENT_SOURCE_DIR}/external/libgit2/include
${CMAKE_CURRENT_SOURCE_DIR}/external/harfbuzz/src
${CMAKE_CURRENT_SOURCE_DIR}/external/icu/icu4c/source/common
${CMAKE_CURRENT_SOURCE_DIR}/external/pugixml/src
${CMAKE_CURRENT_SOURCE_DIR}/external/SDL)
elseif(APPLE)
set(COMMON_INCLUDE_DIRS ${COMMON_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/external/FFmpeg
${CMAKE_CURRENT_SOURCE_DIR}/external/freeimage/FreeImage/Source
@ -538,7 +561,30 @@ endif()
#---------------------------------------------------------------------------------------------------
# Dependency libraries.
if(APPLE)
if(IOS)
set(COMMON_LIBRARIES ${COMMON_LIBRARIES}
${PROJECT_SOURCE_DIR}/Frameworks/libavcodec.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libavfilter.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libavformat.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libavutil.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libswresample.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libswscale.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libcurl.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libfontconfig.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libfreeimage.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libfreetype.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libgit.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libharfbuzz.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libicudata.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libicui18n.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libicuuc.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libintl.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libopenjpeg.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libpoppler.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libpoppler-cpp.xcframework
${PROJECT_SOURCE_DIR}/Frameworks/libSDL.xcframework
${PROJECT_SOURCE_DIR}/libpugixml.a)
elseif(APPLE)
set(COMMON_LIBRARIES ${COMMON_LIBRARIES}
${CURL_LIBRARIES}
${PROJECT_SOURCE_DIR}/libavcodec.60.dylib
@ -660,13 +706,16 @@ if(NOT WIN32)
if(ANDROID)
set(COMMON_LIBRARIES ${COMMON_LIBRARIES} ${PROJECT_SOURCE_DIR}/android_${ANDROID_ABI}/liblunasvg.a)
set(COMMON_LIBRARIES ${COMMON_LIBRARIES} ${PROJECT_SOURCE_DIR}/android_${ANDROID_ABI}/librlottie.a)
elseif(IOS)
set(COMMON_LIBRARIES ${COMMON_LIBRARIES} ${PROJECT_SOURCE_DIR}/${CMAKE_BUILD_TYPE}/liblunasvg.a)
set(COMMON_LIBRARIES ${COMMON_LIBRARIES} ${PROJECT_SOURCE_DIR}/${CMAKE_BUILD_TYPE}/librlottie.a)
else()
set(COMMON_LIBRARIES ${COMMON_LIBRARIES} ${PROJECT_SOURCE_DIR}/liblunasvg.a)
set(COMMON_LIBRARIES ${COMMON_LIBRARIES} ${PROJECT_SOURCE_DIR}/librlottie.a)
endif()
endif()
if(APPLE)
if(APPLE AND NOT IOS)
# See es-app/CMakeLists.txt for an explation for why an extra "Resources" directory
# has been added to the install prefix.
set(CMAKE_INSTALL_PREFIX "/Applications/ES-DE.app/Contents/Resources")

View file

@ -111,14 +111,16 @@ set(ES_SOURCES
)
if(WIN32)
LIST(APPEND ES_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/assets/ES-DE.rc)
list(APPEND ES_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/assets/ES-DE.rc)
endif()
#---------------------------------------------------------------------------------------------------
# OS-specific installation and package generation setup.
# Define target.
if(APPLE)
if(IOS)
include(${CMAKE_SOURCE_DIR}/ios/cmake/ios.cmake)
elseif(APPLE)
include_directories(${COMMON_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/src)
add_executable(ES-DE ${ES_SOURCES} ${ES_HEADERS})
target_link_libraries(ES-DE ${COMMON_LIBRARIES} es-core)
@ -202,7 +204,7 @@ if(WIN32)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/themes/modern-es-de DESTINATION themes)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/themes/slate-es-de DESTINATION themes)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/resources DESTINATION .)
elseif(APPLE)
elseif(APPLE AND NOT IOS)
# For completely unknown reasons, when generating a Bundle using cpack, an extra 'Resources'
# directory is added to the target path. Simply adding the two dots as a prefix fixes the
# problem, but doing so would break 'make install' which was actually behaving correctly.
@ -288,7 +290,7 @@ elseif(HAIKU)
DESTINATION data/es-de/themes)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/resources
DESTINATION data/es-de)
elseif(NOT ANDROID)
elseif(NOT ANDROID AND NOT IOS)
install(TARGETS es-de RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
install(TARGETS es-pdf-convert RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
if(CMAKE_SYSTEM_NAME MATCHES Linux OR CMAKE_SYSTEM_NAME MATCHES FreeBSD)

View file

@ -179,6 +179,13 @@ if(ANDROID)
set(CORE_SOURCES ${CORE_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src/utils/PlatformUtilAndroid.cpp)
endif()
if(IOS)
set(CORE_HEADERS ${CORE_HEADERS} ${CMAKE_CURRENT_SOURCE_DIR}/src/InputOverlay.h)
set(CORE_HEADERS ${CORE_HEADERS} ${CMAKE_CURRENT_SOURCE_DIR}/src/utils/PlatformUtilIOS.h)
set(CORE_HEADERS ${CORE_HEADERS} ${CMAKE_CURRENT_SOURCE_DIR}/src/InputOverlay.cpp)
set(CORE_SOURCES ${CORE_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src/utils/PlatformUtilIOS.cpp)
endif()
#---------------------------------------------------------------------------------------------------
# Miscellaneous configuration.

View file

@ -13,23 +13,31 @@ if(WIN32)
set(POPPLER_CPP_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/poppler-cpp.lib)
# Disable DLL interface warnings.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4251")
elseif(APPLE)
set(POPPLER_CPP_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../external/poppler/cpp ${CMAKE_CURRENT_SOURCE_DIR}/../external/poppler/build/cpp)
set(POPPLER_CPP_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/../libpoppler-cpp.0.dylib)
elseif(ANDROID)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -llog")
set(POPPLER_CPP_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../external/poppler/cpp ${CMAKE_CURRENT_SOURCE_DIR}/../external/poppler/build/cpp)
set(POPPLER_CPP_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/../android/libs/${ANDROID_CPU_ARCH}/libpoppler-cpp.so)
elseif(IOS)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -llog")
set(POPPLER_CPP_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../external/poppler/cpp ${CMAKE_CURRENT_SOURCE_DIR}/../external/poppler/build/cpp)
elseif(APPLE)
set(POPPLER_CPP_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../external/poppler/cpp ${CMAKE_CURRENT_SOURCE_DIR}/../external/poppler/build/cpp)
set(POPPLER_CPP_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/../libpoppler-cpp.0.dylib)
else()
find_package(Poppler REQUIRED COMPONENTS cpp)
endif()
include_directories(${POPPLER_CPP_INCLUDE_DIR})
if (ANDROID)
if(ANDROID)
set(CONVERTER_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/ConvertPDF.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ConvertPDF.h)
add_library(es-pdf-convert SHARED ${CONVERTER_SOURCE_FILES})
elseif(IOS)
set(CONVERTER_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/ConvertPDF.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ConvertPDF.h)
add_library(es-pdf-convert STATIC ${CONVERTER_SOURCE_FILES})
else()
set(CONVERTER_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ConvertPDF.cpp
@ -40,6 +48,9 @@ target_link_libraries(es-pdf-convert PRIVATE ${POPPLER_CPP_LIBRARY})
if(WIN32)
set_target_properties(es-pdf-convert PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/es-pdf-converter" INSTALL_RPATH_USE_LINK_PATH TRUE)
elseif(IOS)
set_target_properties(es-pdf-convert PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE
XCODE_ATTRIBUTE_DEVELOPMENT_TEAM ${IOS_DEVELOPMENT_TEAM})
else()
set_target_properties(es-pdf-convert PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)
endif()

View file

@ -7,27 +7,27 @@
#
# This makes it possible to set options in subprojects.
set (CMAKE_POLICY_DEFAULT_CMP0077 NEW)
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
# Suppress warnings about cmake_minimum_required() defining deprecated versions.
set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL "" FORCE)
if (WIN32)
if(WIN32)
# On Windows the build type needs to match the main binary.
if (CMAKE_BUILD_TYPE MATCHES Profiling)
set (CMAKE_BUILD_TYPE Release)
if(CMAKE_BUILD_TYPE MATCHES Profiling)
set(CMAKE_BUILD_TYPE Release)
elseif(NOT CMAKE_BUILD_TYPE MATCHES Debug)
set (CMAKE_BUILD_TYPE Release)
set(CMAKE_BUILD_TYPE Release)
endif()
else()
# Always build with optimizations enabled and without debug info.
set (CMAKE_BUILD_TYPE Release)
set(CMAKE_BUILD_TYPE Release)
endif()
unset(CMAKE_CXX_FLAGS)
unset(CMAKE_EXE_LINKER_FLAGS)
if (WIN32)
if(WIN32)
set(BUILD_SHARED_LIBS ON)
else()
set(BUILD_SHARED_LIBS OFF)
@ -41,15 +41,11 @@ if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
endif()
if(ANDROID)
if(ANDROID_LITE_RELEASE)
set_target_properties(lunasvg PROPERTIES ARCHIVE_OUTPUT_DIRECTORY
${PROJECT_SOURCE_DIR}/android_lite_${ANDROID_ABI})
else()
set_target_properties(lunasvg PROPERTIES ARCHIVE_OUTPUT_DIRECTORY
${PROJECT_SOURCE_DIR}/android_${ANDROID_ABI})
endif()
set_target_properties(lunasvg PROPERTIES ARCHIVE_OUTPUT_DIRECTORY
${PROJECT_SOURCE_DIR}/android_${ANDROID_ABI})
endif()
# Disable threading support for rlottie as this functionality actually leads to far worse
# performance. As well there is a bug on Windows that makes rlottie hang forever on application
# shutdown if compiled using MinGW with threading support enabled.
@ -71,13 +67,8 @@ else()
endif()
if(ANDROID)
if(ANDROID_LITE_RELEASE)
set_target_properties(rlottie PROPERTIES ARCHIVE_OUTPUT_DIRECTORY
${PROJECT_SOURCE_DIR}/android_lite_${ANDROID_ABI})
else()
set_target_properties(rlottie PROPERTIES ARCHIVE_OUTPUT_DIRECTORY
${PROJECT_SOURCE_DIR}/android_${ANDROID_ABI})
endif()
set_target_properties(rlottie PROPERTIES ARCHIVE_OUTPUT_DIRECTORY
${PROJECT_SOURCE_DIR}/android_${ANDROID_ABI})
endif()
# Build LunaSVG before rlottie.

View file

@ -8,7 +8,9 @@
add_custom_target(localization ALL COMMENT Compiling localization message catalogs)
if(APPLE)
if(IOS)
set(MSGFMT_BINARY ${PROJECT_SOURCE_DIR}/external/macos/local_install/bin/msgfmt)
elseif(APPLE)
set(MSGFMT_BINARY ${PROJECT_SOURCE_DIR}/external/local_install/bin/msgfmt)
elseif(WIN32)
set(MSGFMT_BINARY ${PROJECT_SOURCE_DIR}/external/gettext/bin/msgfmt.exe)