From fd694e86720000d7908640cad7c00ae7be8619fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filiph=20Siitam=20Sandstr=C3=B6m?= Date: Tue, 27 Feb 2024 14:32:29 +0100 Subject: [PATCH] AK+Lagom: Make it possible to build for iOS This commit makes it possible to build AK and most of Lagom for iOS, based on the work for the Ladybird build demoed on discord: https://discord.com/channels/830522505605283862/830525031720943627/1211987732646068314 --- AK/Platform.h | 7 ++++++- AK/StackInfo.cpp | 6 +++--- Ladybird/CMakeLists.txt | 2 +- Ladybird/WebContent/CMakeLists.txt | 2 +- Meta/CMake/accelerated_graphics.cmake | 2 +- Meta/Lagom/CMakeLists.txt | 2 +- Userland/Libraries/LibAudio/CMakeLists.txt | 2 +- .../Libraries/LibCompress/BrotliDictionary.cpp | 2 +- Userland/Libraries/LibCore/CMakeLists.txt | 2 +- Userland/Libraries/LibCore/Environment.cpp | 4 ++-- Userland/Libraries/LibCore/LocalServer.cpp | 6 +++--- Userland/Libraries/LibCore/Socket.cpp | 4 ++-- Userland/Libraries/LibCore/System.cpp | 18 ++++++++++-------- Userland/Libraries/LibCore/System.h | 4 ++++ Userland/Libraries/LibCore/TCPServer.cpp | 4 ++-- .../Libraries/LibFileSystem/FileSystem.cpp | 6 +++--- .../Libraries/LibWeb/Loader/ResourceLoader.h | 2 ++ 17 files changed, 44 insertions(+), 31 deletions(-) diff --git a/AK/Platform.h b/AK/Platform.h index c2fe8deee3..7125ab9689 100644 --- a/AK/Platform.h +++ b/AK/Platform.h @@ -68,11 +68,16 @@ # define AK_OS_LINUX #endif -#if defined(__APPLE__) && defined(__MACH__) +#if defined(__APPLE__) && defined(__MACH__) && !defined(__IOS__) # define AK_OS_MACOS # define AK_OS_BSD_GENERIC #endif +#if defined(__IOS__) +# define AK_OS_IOS +# define AK_OS_BSD_GENERIC +#endif + #if defined(__FreeBSD__) # define AK_OS_BSD_GENERIC # define AK_OS_FREEBSD diff --git a/AK/StackInfo.cpp b/AK/StackInfo.cpp index fa5833aa95..944e7b7a7e 100644 --- a/AK/StackInfo.cpp +++ b/AK/StackInfo.cpp @@ -12,9 +12,9 @@ #ifdef AK_OS_SERENITY # include -#elif defined(AK_OS_LINUX) or defined(AK_LIBC_GLIBC) or defined(AK_OS_MACOS) or defined(AK_OS_NETBSD) or defined(AK_OS_SOLARIS) or defined(AK_OS_HAIKU) +#elif defined(AK_OS_LINUX) || defined(AK_LIBC_GLIBC) || defined(AK_OS_MACOS) || defined(AK_OS_IOS) || defined(AK_OS_NETBSD) || defined(AK_OS_SOLARIS) || defined(AK_OS_HAIKU) # include -#elif defined(AK_OS_FREEBSD) or defined(AK_OS_OPENBSD) +#elif defined(AK_OS_FREEBSD) || defined(AK_OS_OPENBSD) # include # include #elif defined(AK_OS_WINDOWS) @@ -54,7 +54,7 @@ StackInfo::StackInfo() VERIFY_NOT_REACHED(); } pthread_attr_destroy(&attr); -#elif defined(AK_OS_MACOS) +#elif defined(AK_OS_MACOS) || defined(AK_OS_IOS) // NOTE: !! On MacOS, pthread_get_stackaddr_np gives the TOP of the stack, not the bottom! FlatPtr top_of_stack = (FlatPtr)pthread_get_stackaddr_np(pthread_self()); m_size = (size_t)pthread_get_stacksize_np(pthread_self()); diff --git a/Ladybird/CMakeLists.txt b/Ladybird/CMakeLists.txt index d8df3f2331..55409dcce6 100644 --- a/Ladybird/CMakeLists.txt +++ b/Ladybird/CMakeLists.txt @@ -8,7 +8,7 @@ project(ladybird include(GNUInstallDirs) -if (ANDROID) +if (ANDROID OR IOS) set(BUILD_SHARED_LIBS OFF) endif() diff --git a/Ladybird/WebContent/CMakeLists.txt b/Ladybird/WebContent/CMakeLists.txt index 7fa8701ae7..fadd13dfa1 100644 --- a/Ladybird/WebContent/CMakeLists.txt +++ b/Ladybird/WebContent/CMakeLists.txt @@ -42,7 +42,7 @@ if (ENABLE_QT) endif() else() set(LIB_TYPE STATIC) - if (ANDROID) + if (ANDROID OR IOS) set(LIB_TYPE SHARED) endif() add_library(webcontent ${LIB_TYPE} ${WEBCONTENT_SOURCES}) diff --git a/Meta/CMake/accelerated_graphics.cmake b/Meta/CMake/accelerated_graphics.cmake index 07e9270df8..30f15c7d63 100644 --- a/Meta/CMake/accelerated_graphics.cmake +++ b/Meta/CMake/accelerated_graphics.cmake @@ -4,7 +4,7 @@ if (NOT ENABLE_ACCELERATED_GRAPHICS OR EMSCRIPTEN) return() endif() -if (APPLE) +if (APPLE AND NOT IOS) set(HAS_ACCELERATED_GRAPHICS ON CACHE BOOL "" FORCE) set(ACCEL_GFX_LIBS "-framework OpenGL" CACHE STRING "" FORCE) else() diff --git a/Meta/Lagom/CMakeLists.txt b/Meta/Lagom/CMakeLists.txt index 6eb16f294a..2ae913e3ce 100644 --- a/Meta/Lagom/CMakeLists.txt +++ b/Meta/Lagom/CMakeLists.txt @@ -539,7 +539,7 @@ if (BUILD_LAGOM) add_serenity_subdirectory(Userland/Shell) - if (NOT ENABLE_FUZZERS AND NOT ENABLE_COMPILER_EXPLORER_BUILD AND NOT ANDROID) + if (NOT ENABLE_FUZZERS AND NOT ENABLE_COMPILER_EXPLORER_BUILD AND NOT ANDROID AND NOT IOS) # Lagom Services add_serenity_subdirectory(Userland/Services) diff --git a/Userland/Libraries/LibAudio/CMakeLists.txt b/Userland/Libraries/LibAudio/CMakeLists.txt index 6f50e24dd5..f19100d2fc 100644 --- a/Userland/Libraries/LibAudio/CMakeLists.txt +++ b/Userland/Libraries/LibAudio/CMakeLists.txt @@ -42,7 +42,7 @@ if (HAVE_PULSEAUDIO) target_compile_definitions(LibAudio PRIVATE HAVE_PULSEAUDIO=1) endif() -if (APPLE) +if (APPLE AND NOT IOS) target_sources(LibAudio PRIVATE PlaybackStreamAudioUnit.cpp) find_library(AUDIO_UNIT AudioUnit REQUIRED) diff --git a/Userland/Libraries/LibCompress/BrotliDictionary.cpp b/Userland/Libraries/LibCompress/BrotliDictionary.cpp index 75423fd4b9..93f245dde6 100644 --- a/Userland/Libraries/LibCompress/BrotliDictionary.cpp +++ b/Userland/Libraries/LibCompress/BrotliDictionary.cpp @@ -9,7 +9,7 @@ // Include the 119.9 KiB of dictionary data from a binary file extern u8 const brotli_dictionary_data[]; -#if defined(AK_OS_MACOS) +#if defined(AK_OS_MACOS) || defined(AK_OS_IOS) asm(".const_data\n" ".globl _brotli_dictionary_data\n" "_brotli_dictionary_data:\n"); diff --git a/Userland/Libraries/LibCore/CMakeLists.txt b/Userland/Libraries/LibCore/CMakeLists.txt index 095f4da62e..e4c248d6a6 100644 --- a/Userland/Libraries/LibCore/CMakeLists.txt +++ b/Userland/Libraries/LibCore/CMakeLists.txt @@ -55,7 +55,7 @@ if (SERENITYOS) list(APPEND SOURCES FileWatcherSerenity.cpp) elseif (LINUX AND NOT EMSCRIPTEN) list(APPEND SOURCES FileWatcherLinux.cpp) -elseif (APPLE) +elseif (APPLE AND NOT IOS) list(APPEND SOURCES FileWatcherMacOS.mm) else() list(APPEND SOURCES FileWatcherUnimplemented.cpp) diff --git a/Userland/Libraries/LibCore/Environment.cpp b/Userland/Libraries/LibCore/Environment.cpp index b23b054ee9..c96ab1deb2 100644 --- a/Userland/Libraries/LibCore/Environment.cpp +++ b/Userland/Libraries/LibCore/Environment.cpp @@ -10,7 +10,7 @@ #include "Environment.h" #include -#if defined(AK_OS_MACOS) +#if defined(AK_OS_MACOS) || defined(AK_OS_IOS) # include #else extern char** environ; @@ -20,7 +20,7 @@ namespace Core::Environment { char** raw_environ() { -#if defined(AK_OS_MACOS) +#if defined(AK_OS_MACOS) || defined(AK_OS_IOS) return *_NSGetEnviron(); #else return environ; diff --git a/Userland/Libraries/LibCore/LocalServer.cpp b/Userland/Libraries/LibCore/LocalServer.cpp index a96c6043db..db9acfcdc3 100644 --- a/Userland/Libraries/LibCore/LocalServer.cpp +++ b/Userland/Libraries/LibCore/LocalServer.cpp @@ -81,7 +81,7 @@ bool LocalServer::listen(ByteString const& address) fcntl(m_fd, F_SETFD, FD_CLOEXEC); #endif VERIFY(m_fd >= 0); -#ifndef AK_OS_MACOS +#if !defined(AK_OS_MACOS) && !defined(AK_OS_IOS) rc = fchmod(m_fd, 0600); if (rc < 0) { perror("fchmod"); @@ -118,7 +118,7 @@ ErrorOr> LocalServer::accept() VERIFY(m_listening); sockaddr_un un; socklen_t un_size = sizeof(un); -#if !defined(AK_OS_MACOS) && !defined(AK_OS_HAIKU) +#if !defined(AK_OS_MACOS) && !defined(AK_OS_IOS) && !defined(AK_OS_HAIKU) int accepted_fd = ::accept4(m_fd, (sockaddr*)&un, &un_size, SOCK_NONBLOCK | SOCK_CLOEXEC); #else int accepted_fd = ::accept(m_fd, (sockaddr*)&un, &un_size); @@ -127,7 +127,7 @@ ErrorOr> LocalServer::accept() return Error::from_syscall("accept"sv, -errno); } -#if defined(AK_OS_MACOS) || defined(AK_OS_HAIKU) +#if defined(AK_OS_MACOS) || defined(AK_OS_IOS) || defined(AK_OS_HAIKU) int option = 1; ioctl(m_fd, FIONBIO, &option); (void)fcntl(accepted_fd, F_SETFD, FD_CLOEXEC); diff --git a/Userland/Libraries/LibCore/Socket.cpp b/Userland/Libraries/LibCore/Socket.cpp index 395c0ac008..85e99f2c2a 100644 --- a/Userland/Libraries/LibCore/Socket.cpp +++ b/Userland/Libraries/LibCore/Socket.cpp @@ -358,7 +358,7 @@ ErrorOr LocalSocket::send_fd(int fd) ErrorOr LocalSocket::peer_pid() const { -#ifdef AK_OS_MACOS +#if defined(AK_OS_MACOS) || defined(AK_OS_IOS) pid_t pid; socklen_t pid_size = sizeof(pid); #elif defined(AK_OS_FREEBSD) @@ -380,7 +380,7 @@ ErrorOr LocalSocket::peer_pid() const socklen_t creds_size = sizeof(creds); #endif -#ifdef AK_OS_MACOS +#if defined(AK_OS_MACOS) || defined(AK_OS_IOS) TRY(System::getsockopt(m_helper.fd(), SOL_LOCAL, LOCAL_PEERPID, &pid, &pid_size)); return pid; #elif defined(AK_OS_FREEBSD) diff --git a/Userland/Libraries/LibCore/System.cpp b/Userland/Libraries/LibCore/System.cpp index 2eef1f1261..923281510b 100644 --- a/Userland/Libraries/LibCore/System.cpp +++ b/Userland/Libraries/LibCore/System.cpp @@ -47,7 +47,7 @@ static int memfd_create(char const* name, unsigned int flags) } #endif -#if defined(AK_OS_MACOS) +#if defined(AK_OS_MACOS) || defined(AK_OS_IOS) # include # include #else @@ -140,7 +140,7 @@ static ErrorOr> getgrent_impl(Span buffer) namespace Core::System { #ifndef HOST_NAME_MAX -# ifdef AK_OS_MACOS +# if defined(AK_OS_MACOS) || defined(AK_OS_IOS) # define HOST_NAME_MAX 255 # else # define HOST_NAME_MAX 64 @@ -399,7 +399,7 @@ ErrorOr> getspnam(StringView name) } #endif -#if !defined(AK_OS_MACOS) && !defined(AK_OS_HAIKU) +#if !defined(AK_OS_MACOS) && !defined(AK_OS_IOS) && !defined(AK_OS_HAIKU) ErrorOr accept4(int sockfd, sockaddr* address, socklen_t* address_length, int flags) { auto fd = ::accept4(sockfd, address, address_length, flags); @@ -898,17 +898,19 @@ ErrorOr> getgrnam(StringView name) return Optional {}; } +#if !defined(AK_OS_IOS) ErrorOr clock_settime(clockid_t clock_id, struct timespec* ts) { -#ifdef AK_OS_SERENITY +# ifdef AK_OS_SERENITY int rc = syscall(SC_clock_settime, clock_id, ts); HANDLE_SYSCALL_RETURN_VALUE("clocksettime", rc, {}); -#else +# else if (::clock_settime(clock_id, ts) < 0) return Error::from_syscall("clocksettime"sv, -errno); return {}; -#endif +# endif } +#endif static ALWAYS_INLINE ErrorOr posix_spawn_wrapper(StringView path, posix_spawn_file_actions_t const* file_actions, posix_spawnattr_t const* attr, char* const arguments[], char* const envp[], StringView function_name, decltype(::posix_spawn) spawn_function) { @@ -1379,7 +1381,7 @@ ErrorOr exec(StringView filename, ReadonlySpan arguments, Sear envp[environment->size()] = nullptr; if (search_in_path == SearchInPath::Yes && !filename.contains('/')) { -# if defined(AK_OS_MACOS) || defined(AK_OS_FREEBSD) || defined(AK_OS_SOLARIS) +# if defined(AK_OS_MACOS) || defined(AK_OS_IOS) || defined(AK_OS_FREEBSD) || defined(AK_OS_SOLARIS) // These BSDs don't support execvpe(), so we'll have to manually search the PATH. ScopedValueRollback errno_rollback(errno); @@ -1782,7 +1784,7 @@ ErrorOr current_executable_path() size_t len = sizeof(path); if (sysctl(mib, 4, path, &len, nullptr, 0) < 0) return Error::from_syscall("sysctl"sv, -errno); -#elif defined(AK_OS_MACOS) +#elif defined(AK_OS_MACOS) || defined(AK_OS_IOS) u32 size = sizeof(path); auto ret = _NSGetExecutablePath(path, &size); if (ret != 0) diff --git a/Userland/Libraries/LibCore/System.h b/Userland/Libraries/LibCore/System.h index 48e75707e0..f37f699f67 100644 --- a/Userland/Libraries/LibCore/System.h +++ b/Userland/Libraries/LibCore/System.h @@ -152,7 +152,11 @@ ErrorOr> getgrnam(StringView name); ErrorOr> getpwuid(uid_t); ErrorOr> getgrent(Span buffer); ErrorOr> getgrgid(gid_t); + +#if !defined(AK_OS_IOS) ErrorOr clock_settime(clockid_t clock_id, struct timespec* ts); +#endif + ErrorOr posix_spawn(StringView path, posix_spawn_file_actions_t const* file_actions, posix_spawnattr_t const* attr, char* const arguments[], char* const envp[]); ErrorOr posix_spawnp(StringView path, posix_spawn_file_actions_t* const file_actions, posix_spawnattr_t* const attr, char* const arguments[], char* const envp[]); ErrorOr lseek(int fd, off_t, int whence); diff --git a/Userland/Libraries/LibCore/TCPServer.cpp b/Userland/Libraries/LibCore/TCPServer.cpp index 4835a61fa7..cb4ffe4d9d 100644 --- a/Userland/Libraries/LibCore/TCPServer.cpp +++ b/Userland/Libraries/LibCore/TCPServer.cpp @@ -80,7 +80,7 @@ ErrorOr> TCPServer::accept() VERIFY(m_listening); sockaddr_in in; socklen_t in_size = sizeof(in); -#if !defined(AK_OS_MACOS) && !defined(AK_OS_HAIKU) +#if !defined(AK_OS_MACOS) && !defined(AK_OS_IOS) && !defined(AK_OS_HAIKU) int accepted_fd = TRY(Core::System::accept4(m_fd, (sockaddr*)&in, &in_size, SOCK_NONBLOCK | SOCK_CLOEXEC)); #else int accepted_fd = TRY(Core::System::accept(m_fd, (sockaddr*)&in, &in_size)); @@ -88,7 +88,7 @@ ErrorOr> TCPServer::accept() auto socket = TRY(TCPSocket::adopt_fd(accepted_fd)); -#if defined(AK_OS_MACOS) || defined(AK_OS_HAIKU) +#if defined(AK_OS_MACOS) || defined(AK_OS_IOS) || defined(AK_OS_HAIKU) // FIXME: Ideally, we should let the caller decide whether it wants the // socket to be nonblocking or not, but there are currently places // which depend on this. diff --git a/Userland/Libraries/LibFileSystem/FileSystem.cpp b/Userland/Libraries/LibFileSystem/FileSystem.cpp index 8adb2246ff..43a96586e0 100644 --- a/Userland/Libraries/LibFileSystem/FileSystem.cpp +++ b/Userland/Libraries/LibFileSystem/FileSystem.cpp @@ -14,7 +14,7 @@ #if defined(AK_OS_SERENITY) # include -#elif defined(AK_OS_BSD_GENERIC) +#elif !defined(AK_OS_IOS) && defined(AK_OS_BSD_GENERIC) # include #elif defined(AK_OS_LINUX) # include @@ -230,7 +230,7 @@ ErrorOr copy_file(StringView destination_path, StringView source_path, str if (has_flag(preserve_mode, PreserveMode::Timestamps)) { struct timespec times[2] = { -#ifdef AK_OS_MACOS +#if defined(AK_OS_MACOS) || defined(AK_OS_IOS) source_stat.st_atimespec, source_stat.st_mtimespec, #else @@ -278,7 +278,7 @@ ErrorOr copy_directory(StringView destination_path, StringView source_path if (has_flag(preserve_mode, PreserveMode::Timestamps)) { struct timespec times[2] = { -#ifdef AK_OS_MACOS +#if defined(AK_OS_MACOS) || defined(AK_OS_IOS) source_stat.st_atimespec, source_stat.st_mtimespec, #else diff --git a/Userland/Libraries/LibWeb/Loader/ResourceLoader.h b/Userland/Libraries/LibWeb/Loader/ResourceLoader.h index ddeb021e87..ec4aa74f38 100644 --- a/Userland/Libraries/LibWeb/Loader/ResourceLoader.h +++ b/Userland/Libraries/LibWeb/Loader/ResourceLoader.h @@ -38,6 +38,8 @@ namespace Web { # define OS_STRING "Linux" #elif defined(AK_OS_MACOS) # define OS_STRING "macOS" +#elif defined(AK_OS_IOS) +# define OS_STRING "iOS" #elif defined(AK_OS_WINDOWS) # define OS_STRING "Windows" #elif defined(AK_OS_FREEBSD)