# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later

# SPDX-FileCopyrightText: 2018 yuzu Emulator Project SPDX-License-Identifier:
# GPL-2.0-or-later

if(DEFINED ENV{AZURECIREPO})
    set(BUILD_REPOSITORY $ENV{AZURECIREPO})
endif()
if(DEFINED ENV{TITLEBARFORMATIDLE})
    set(TITLE_BAR_FORMAT_IDLE $ENV{TITLEBARFORMATIDLE})
endif()
if(DEFINED ENV{TITLEBARFORMATRUNNING})
    set(TITLE_BAR_FORMAT_RUNNING $ENV{TITLEBARFORMATRUNNING})
endif()
if(DEFINED ENV{DISPLAYVERSION})
    set(DISPLAY_VERSION $ENV{DISPLAYVERSION})
endif()

include(GenerateSCMRev)

add_library(
    common STATIC
    address_space.cpp
    address_space.h
    algorithm.h
    alignment.h
    announce_multiplayer_room.h
    assert.cpp
    assert.h
    atomic_ops.h
    bit_field.h
    bit_util.h
    bounded_threadsafe_queue.h
    cityhash.cpp
    cityhash.h
    common_funcs.h
    common_types.h
    concepts.h
    container_hash.h
    demangle.cpp
    demangle.h
    detached_tasks.cpp
    detached_tasks.h
    device_power_state.cpp
    device_power_state.h
    div_ceil.h
    dynamic_library.cpp
    dynamic_library.h
    elf.h
    error.cpp
    error.h
    expected.h
    fiber.cpp
    fiber.h
    fixed_point.h
    free_region_manager.h
    fs/file.cpp
    fs/file.h
    fs/fs.cpp
    fs/fs.h
    fs/fs_paths.h
    fs/fs_types.h
    fs/fs_util.cpp
    fs/fs_util.h
    fs/path_util.cpp
    fs/path_util.h
    hash.h
    heap_tracker.cpp
    heap_tracker.h
    hex_util.cpp
    hex_util.h
    host_memory.cpp
    host_memory.h
    input.h
    intrusive_red_black_tree.h
    literals.h
    logging/backend.cpp
    logging/backend.h
    logging/filter.cpp
    logging/filter.h
    logging/formatter.h
    logging/log.h
    logging/log_entry.h
    logging/text_formatter.cpp
    logging/text_formatter.h
    logging/types.h
    lz4_compression.cpp
    lz4_compression.h
    make_unique_for_overwrite.h
    math_util.h
    memory_detect.cpp
    memory_detect.h
    multi_level_page_table.cpp
    multi_level_page_table.h
    overflow.h
    page_table.cpp
    page_table.h
    param_package.cpp
    param_package.h
    parent_of_member.h
    point.h
    quaternion.h
    range_map.h
    range_mutex.h
    range_sets.h
    range_sets.inc
    ring_buffer.h
    ${CMAKE_CURRENT_BINARY_DIR}/scm_rev.cpp
    scm_rev.h
    scope_exit.h
    scratch_buffer.h
    settings.cpp
    settings.h
    settings_common.cpp
    settings_common.h
    settings_enums.h
    settings_input.cpp
    settings_input.h
    settings_setting.h
    slot_vector.h
    socket_types.h
    spin_lock.h
    stb.cpp
    stb.h
    steady_clock.cpp
    steady_clock.h
    stream.cpp
    stream.h
    string_util.cpp
    string_util.h
    swap.h
    thread.cpp
    thread.h
    thread_queue_list.h
    thread_worker.h
    threadsafe_queue.h
    time_zone.cpp
    time_zone.h
    tiny_mt.h
    tree.h
    typed_address.h
    uint128.h
    unique_function.h
    uuid.cpp
    uuid.h
    vector_math.h
    virtual_buffer.cpp
    virtual_buffer.h
    wall_clock.cpp
    wall_clock.h
    zstd_compression.cpp
    zstd_compression.h
    fs/ryujinx_compat.h fs/ryujinx_compat.cpp
    fs/symlink.h fs/symlink.cpp)

if(WIN32)
    target_sources(common PRIVATE windows/timer_resolution.cpp
        windows/timer_resolution.h)
    target_link_libraries(common PRIVATE ntdll)
endif()

if(NOT WIN32)
    target_sources(common PRIVATE signal_chain.cpp signal_chain.h)
endif()

if(ANDROID)
    target_sources(
        common
        PUBLIC fs/fs_android.cpp
        fs/fs_android.h
        android/android_common.cpp
        android/android_common.h
        android/id_cache.cpp
        android/id_cache.h
        android/multiplayer/multiplayer.cpp
        android/multiplayer/multiplayer.h
        android/applets/software_keyboard.cpp
        android/applets/software_keyboard.h
        android/applets/web_browser.cpp
        android/applets/web_browser.h)
endif()

if(ARCHITECTURE_x86_64)
    target_sources(
        common
        PRIVATE x64/cpu_detect.cpp
        x64/cpu_detect.h
        x64/cpu_wait.cpp
        x64/cpu_wait.h
        x64/native_clock.cpp
        x64/native_clock.h
        x64/rdtsc.cpp
        x64/rdtsc.h
        x64/xbyak_abi.h
        x64/xbyak_util.h)
    target_link_libraries(common PRIVATE xbyak::xbyak)
endif()

if(HAS_NCE)
    target_sources(common PRIVATE arm64/native_clock.cpp arm64/native_clock.h)
endif()

if(MSVC)
    target_compile_definitions(
        common
        PRIVATE # The standard library doesn't provide any replacement for codecvt
        # yet so we can disable this deprecation warning for the time being.
        _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING)
    target_compile_options(
        common
        PRIVATE /we4242 # 'identifier': conversion from 'type1' to 'type2', possible
        # loss of data
        /we4254 # 'operator': conversion from 'type1:field_bits' to
        # 'type2:field_bits', possible loss of data
        /we4800 # Implicit conversion from 'type' to bool. Possible
        # information loss
    )
else()
    set_source_files_properties(
        stb.cpp
        PROPERTIES
        COMPILE_OPTIONS
        "-Wno-implicit-fallthrough;-Wno-missing-declarations;-Wno-missing-field-initializers")

    # Get around GCC failing with intrinsics in Debug
    if(CXX_GCC AND CMAKE_BUILD_TYPE MATCHES "Debug")
        set_property(
            SOURCE stb.cpp
            APPEND
            PROPERTY COMPILE_OPTIONS ";-O2")
    endif()
endif()

if(CXX_CLANG)
    target_compile_options(common PRIVATE -fsized-deallocation
        -Werror=unreachable-code-aggressive)
    target_compile_definitions(
        common
        PRIVATE
        # Clang 14 and earlier have errors when explicitly instantiating
        # Settings::Setting
        $<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,15>:CANNOT_EXPLICITLY_INSTANTIATE>)
endif()

if (BOOST_NO_HEADERS)
    target_link_libraries(common PUBLIC Boost::algorithm Boost::icl Boost::pool)
else()
    target_link_libraries(common PUBLIC Boost::headers)
endif()

target_link_libraries(common PUBLIC Boost::filesystem Boost::context)

if (lz4_ADDED)
    target_include_directories(common PRIVATE ${lz4_SOURCE_DIR}/lib)
endif()

target_link_libraries(common PUBLIC fmt::fmt stb::headers Threads::Threads unordered_dense::unordered_dense)
target_link_libraries(common PRIVATE lz4::lz4 LLVM::Demangle zstd::zstd)

if(ANDROID)
    # For ASharedMemory_create
    target_link_libraries(common PRIVATE android)
endif()

create_target_directory_groups(common)
