# These are the minimal set of sources needed to build the code generators. We separate them to allow
# LibCore to depend on generated sources.
set(SOURCES
    ArgsParser.cpp
    Directory.cpp
    DirectoryEntry.cpp
    DirIterator.cpp
    Environment.cpp
    File.cpp
    StandardPaths.cpp
    Version.cpp
)

if (WIN32)
    list(APPEND SOURCES
        ProcessWindows.cpp
        SocketpairWindows.cpp
        SystemWindows.cpp)
else()
    list(APPEND SOURCES
        Process.cpp
        System.cpp)
endif()

serenity_lib(LibCoreMinimal coreminimal)

if (WIN32)
    find_path(DIRENT_INCLUDE_DIR dirent.h REQUIRED)
    target_include_directories(LibCoreMinimal PRIVATE ${DIRENT_INCLUDE_DIR})
endif()

if (LAGOM_TOOLS_ONLY)
    return()
endif()

set(SOURCES
    ConfigFile.cpp
    DateTime.cpp
    ElapsedTimer.cpp
    Event.cpp
    EventLoop.cpp
    EventLoopImplementation.cpp
    EventReceiver.cpp
    MappedFile.cpp
    MimeData.cpp
    Notifier.cpp
    Resource.cpp
    ResourceImplementation.cpp
    ResourceImplementationFile.cpp
    SystemServerTakeover.cpp
    ThreadEventQueue.cpp
    Timer.cpp
)

if (WIN32)
    # FIXME: Support UDPServer and TCPServer on Windows
    list(APPEND SOURCES
        SocketWindows.cpp
        AnonymousBufferWindows.cpp
        EventLoopImplementationWindows.cpp)
else()
    list(APPEND SOURCES
        Command.cpp
        Socket.cpp
        AnonymousBuffer.cpp
        EventLoopImplementationUnix.cpp
        UDPServer.cpp
        TCPServer.cpp)
endif()

if (NOT WIN32 AND NOT EMSCRIPTEN)
    list(APPEND SOURCES LocalServer.cpp)
endif()

# FIXME: Implement these for other systems.
if (LINUX AND NOT EMSCRIPTEN)
    list(APPEND SOURCES
        FileWatcherLinux.cpp
        Platform/ProcessStatisticsLinux.cpp
        TimeZoneWatcherLinux.cpp
    )
elseif (APPLE AND NOT IOS)
    list(APPEND SOURCES
        FileWatcherMacOS.mm
        Platform/ProcessStatisticsMach.cpp
        TimeZoneWatcherMacOS.mm
    )
else()
    list(APPEND SOURCES
        FileWatcherUnimplemented.cpp
        Platform/ProcessStatisticsUnimplemented.cpp
        TimeZoneWatcherUnimplemented.cpp
    )
endif()

if (APPLE OR CMAKE_SYSTEM_NAME STREQUAL "GNU")
    list(APPEND SOURCES MachPort.cpp)
endif()

if (APPLE)
    list(APPEND SOURCES IOSurface.cpp)
endif()

serenity_lib(LibCore core)
target_link_libraries(LibCore PRIVATE LibUnicode LibURL)
target_link_libraries(LibCore PUBLIC LibCoreMinimal)

if (APPLE)
    target_link_libraries(LibCore PUBLIC "-framework CoreFoundation")
    target_link_libraries(LibCore PUBLIC "-framework CoreServices")
    target_link_libraries(LibCore PUBLIC "-framework Foundation")
    target_link_libraries(LibCore PUBLIC "-framework IOSurface")
endif()

if (ANDROID)
    target_link_libraries(LibCore PRIVATE log)
endif()

if (ENABLE_SWIFT)
    set(SWIFT_EXCLUDE_HEADERS "SocketAddressWindows.h")
    if(WIN32)
        list(APPEND SWIFT_EXCLUDE_HEADERS "EventLoopImplementationUnix.h")
    else()
        list(APPEND SWIFT_EXCLUDE_HEADERS "EventLoopImplementationWindows.h")
    endif()
    if (NOT APPLE)
        list(APPEND SWIFT_EXCLUDE_HEADERS
            IOSurface.h
            MachPort.h
            MachMessageTypes.h
            ProcessStatisticsMach.h
        )
    endif()

    generate_clang_module_map(LibCore EXCLUDE_FILES ${SWIFT_EXCLUDE_HEADERS})
    target_sources(LibCore PRIVATE
        EventSwift.mm
        EventLoopExecutor.swift)
    set_source_files_properties(EventSwift.mm PRIVATE PROPERTIES COMPILE_FLAGS -fblocks)
    target_link_libraries(LibCore PRIVATE AK)
    add_swift_target_properties(LibCore LAGOM_LIBRARIES AK)
endif()
