diff --git a/CMakeLists.txt b/CMakeLists.txt index bdffd0707..0a4d5fa09 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 " -no_warning_for_no_symbols -c ") SET(CMAKE_CXX_ARCHIVE_FINISH " -no_warning_for_no_symbols -c ") @@ -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") diff --git a/es-app/CMakeLists.txt b/es-app/CMakeLists.txt index 0f7d10c99..159e3ff10 100644 --- a/es-app/CMakeLists.txt +++ b/es-app/CMakeLists.txt @@ -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) diff --git a/es-core/CMakeLists.txt b/es-core/CMakeLists.txt index 848c3a785..c46e98931 100644 --- a/es-core/CMakeLists.txt +++ b/es-core/CMakeLists.txt @@ -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. diff --git a/es-pdf-converter/CMakeLists.txt b/es-pdf-converter/CMakeLists.txt index 7aaa1b49f..85d004b6a 100644 --- a/es-pdf-converter/CMakeLists.txt +++ b/es-pdf-converter/CMakeLists.txt @@ -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() diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index be7268087..f1ab02541 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -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. diff --git a/locale/CMakeLists.txt b/locale/CMakeLists.txt index bec3e01d5..0116bab07 100644 --- a/locale/CMakeLists.txt +++ b/locale/CMakeLists.txt @@ -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)