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

add_library(service STATIC
    acc/acc.cpp
    acc/acc.h
    acc/acc_aa.cpp
    acc/acc_aa.h
    acc/acc_su.cpp
    acc/acc_su.h
    acc/acc_u0.cpp
    acc/acc_u0.h
    acc/acc_u1.cpp
    acc/acc_u1.h
    acc/async_context.cpp
    acc/async_context.h
    acc/errors.h
    acc/profile_manager.cpp
    acc/profile_manager.h
    am/am.cpp
    am/am.h
    am/applet_ae.cpp
    am/applet_ae.h
    am/applet_oe.cpp
    am/applet_oe.h
    am/applets/applet_cabinet.cpp
    am/applets/applet_cabinet.h
    am/applets/applet_controller.cpp
    am/applets/applet_controller.h
    am/applets/applet_error.cpp
    am/applets/applet_error.h
    am/applets/applet_general_backend.cpp
    am/applets/applet_general_backend.h
    am/applets/applet_mii_edit.cpp
    am/applets/applet_mii_edit.h
    am/applets/applet_mii_edit_types.h
    am/applets/applet_profile_select.cpp
    am/applets/applet_profile_select.h
    am/applets/applet_software_keyboard.cpp
    am/applets/applet_software_keyboard.h
    am/applets/applet_software_keyboard_types.h
    am/applets/applet_web_browser.cpp
    am/applets/applet_web_browser.h
    am/applets/applet_web_browser_types.h
    am/applets/applets.cpp
    am/applets/applets.h
    am/idle.cpp
    am/idle.h
    am/omm.cpp
    am/omm.h
    am/spsm.cpp
    am/spsm.h
    aoc/aoc_u.cpp
    aoc/aoc_u.h
    apm/apm.cpp
    apm/apm.h
    apm/apm_controller.cpp
    apm/apm_controller.h
    apm/apm_interface.cpp
    apm/apm_interface.h
    audio/audctl.cpp
    audio/audctl.h
    audio/audin_u.cpp
    audio/audin_u.h
    audio/audio.cpp
    audio/audio.h
    audio/audout_u.cpp
    audio/audout_u.h
    audio/audrec_a.cpp
    audio/audrec_a.h
    audio/audrec_u.cpp
    audio/audrec_u.h
    audio/audren_u.cpp
    audio/audren_u.h
    audio/errors.h
    audio/hwopus.cpp
    audio/hwopus.h
    bcat/backend/backend.cpp
    bcat/backend/backend.h
    bcat/bcat.cpp
    bcat/bcat.h
    bcat/bcat_module.cpp
    bcat/bcat_module.h
    bpc/bpc.cpp
    bpc/bpc.h
    btdrv/btdrv.cpp
    btdrv/btdrv.h
    btm/btm.cpp
    btm/btm.h
    caps/caps.cpp
    caps/caps.h
    caps/caps_a.cpp
    caps/caps_a.h
    caps/caps_c.cpp
    caps/caps_c.h
    caps/caps_manager.cpp
    caps/caps_manager.h
    caps/caps_result.h
    caps/caps_sc.cpp
    caps/caps_sc.h
    caps/caps_ss.cpp
    caps/caps_ss.h
    caps/caps_su.cpp
    caps/caps_su.h
    caps/caps_types.h
    caps/caps_u.cpp
    caps/caps_u.h
    erpt/erpt.cpp
    erpt/erpt.h
    es/es.cpp
    es/es.h
    eupld/eupld.cpp
    eupld/eupld.h
    fatal/fatal.cpp
    fatal/fatal.h
    fatal/fatal_p.cpp
    fatal/fatal_p.h
    fatal/fatal_u.cpp
    fatal/fatal_u.h
    filesystem/filesystem.cpp
    filesystem/filesystem.h
    filesystem/fsp_ldr.cpp
    filesystem/fsp_ldr.h
    filesystem/fsp_pr.cpp
    filesystem/fsp_pr.h
    filesystem/fsp_srv.cpp
    filesystem/fsp_srv.h
    fgm/fgm.cpp
    fgm/fgm.h
    friend/friend.cpp
    friend/friend.h
    friend/friend_interface.cpp
    friend/friend_interface.h
    glue/arp.cpp
    glue/arp.h
    glue/bgtc.cpp
    glue/bgtc.h
    glue/ectx.cpp
    glue/ectx.h
    glue/errors.h
    glue/glue.cpp
    glue/glue.h
    glue/glue_manager.cpp
    glue/glue_manager.h
    glue/notif.cpp
    glue/notif.h
    grc/grc.cpp
    grc/grc.h
    hid/hid.cpp
    hid/hid.h
    hid/hidbus.cpp
    hid/hidbus.h
    hid/irs.cpp
    hid/irs.h
    hid/irs_ring_lifo.h
    hid/ring_lifo.h
    hid/xcd.cpp
    hid/xcd.h
    hid/errors.h
    hid/controllers/console_sixaxis.cpp
    hid/controllers/console_sixaxis.h
    hid/controllers/controller_base.cpp
    hid/controllers/controller_base.h
    hid/controllers/debug_pad.cpp
    hid/controllers/debug_pad.h
    hid/controllers/gesture.cpp
    hid/controllers/gesture.h
    hid/controllers/keyboard.cpp
    hid/controllers/keyboard.h
    hid/controllers/mouse.cpp
    hid/controllers/mouse.h
    hid/controllers/npad.cpp
    hid/controllers/npad.h
    hid/controllers/palma.cpp
    hid/controllers/palma.h
    hid/controllers/stubbed.cpp
    hid/controllers/stubbed.h
    hid/controllers/touchscreen.cpp
    hid/controllers/touchscreen.h
    hid/controllers/xpad.cpp
    hid/controllers/xpad.h
    hid/hidbus/hidbus_base.cpp
    hid/hidbus/hidbus_base.h
    hid/hidbus/ringcon.cpp
    hid/hidbus/ringcon.h
    hid/hidbus/starlink.cpp
    hid/hidbus/starlink.h
    hid/hidbus/stubbed.cpp
    hid/hidbus/stubbed.h
    hid/irsensor/clustering_processor.cpp
    hid/irsensor/clustering_processor.h
    hid/irsensor/image_transfer_processor.cpp
    hid/irsensor/image_transfer_processor.h
    hid/irsensor/ir_led_processor.cpp
    hid/irsensor/ir_led_processor.h
    hid/irsensor/moment_processor.cpp
    hid/irsensor/moment_processor.h
    hid/irsensor/pointing_processor.cpp
    hid/irsensor/pointing_processor.h
    hid/irsensor/processor_base.cpp
    hid/irsensor/processor_base.h
    hid/irsensor/tera_plugin_processor.cpp
    hid/irsensor/tera_plugin_processor.h
    lbl/lbl.cpp
    lbl/lbl.h
    ldn/lan_discovery.cpp
    ldn/lan_discovery.h
    ldn/ldn_results.h
    ldn/ldn.cpp
    ldn/ldn.h
    ldn/ldn_types.h
    ldr/ldr.cpp
    ldr/ldr.h
    lm/lm.cpp
    lm/lm.h
    mig/mig.cpp
    mig/mig.h
    mii/types/char_info.cpp
    mii/types/char_info.h
    mii/types/core_data.cpp
    mii/types/core_data.h
    mii/types/raw_data.cpp
    mii/types/raw_data.h
    mii/types/store_data.cpp
    mii/types/store_data.h
    mii/types/ver3_store_data.cpp
    mii/types/ver3_store_data.h
    mii/mii.cpp
    mii/mii.h
    mii/mii_database.cpp
    mii/mii_database.h
    mii/mii_database_manager.cpp
    mii/mii_database_manager.h
    mii/mii_manager.cpp
    mii/mii_manager.h
    mii/mii_result.h
    mii/mii_types.h
    mii/mii_util.h
    mm/mm_u.cpp
    mm/mm_u.h
    mnpp/mnpp_app.cpp
    mnpp/mnpp_app.h
    ncm/ncm.cpp
    ncm/ncm.h
    nfc/common/amiibo_crypto.cpp
    nfc/common/amiibo_crypto.h
    nfc/common/device.cpp
    nfc/common/device.h
    nfc/common/device_manager.cpp
    nfc/common/device_manager.h
    nfc/mifare_result.h
    nfc/mifare_types.h
    nfc/nfc.cpp
    nfc/nfc.h
    nfc/nfc_interface.cpp
    nfc/nfc_interface.h
    nfc/nfc_result.h
    nfc/nfc_types.h
    nfp/nfp.cpp
    nfp/nfp.h
    nfp/nfp_interface.cpp
    nfp/nfp_interface.h
    nfp/nfp_result.h
    nfp/nfp_types.h
    ngc/ngc.cpp
    ngc/ngc.h
    nifm/nifm.cpp
    nifm/nifm.h
    nim/nim.cpp
    nim/nim.h
    npns/npns.cpp
    npns/npns.h
    ns/errors.h
    ns/iplatform_service_manager.cpp
    ns/iplatform_service_manager.h
    ns/language.cpp
    ns/language.h
    ns/ns.cpp
    ns/ns.h
    ns/pdm_qry.cpp
    ns/pdm_qry.h
    nvdrv/core/container.cpp
    nvdrv/core/container.h
    nvdrv/core/nvmap.cpp
    nvdrv/core/nvmap.h
    nvdrv/core/syncpoint_manager.cpp
    nvdrv/core/syncpoint_manager.h
    nvdrv/devices/nvdevice.h
    nvdrv/devices/nvdisp_disp0.cpp
    nvdrv/devices/nvdisp_disp0.h
    nvdrv/devices/nvhost_as_gpu.cpp
    nvdrv/devices/nvhost_as_gpu.h
    nvdrv/devices/nvhost_ctrl.cpp
    nvdrv/devices/nvhost_ctrl.h
    nvdrv/devices/nvhost_ctrl_gpu.cpp
    nvdrv/devices/nvhost_ctrl_gpu.h
    nvdrv/devices/nvhost_gpu.cpp
    nvdrv/devices/nvhost_gpu.h
    nvdrv/devices/nvhost_nvdec.cpp
    nvdrv/devices/nvhost_nvdec.h
    nvdrv/devices/nvhost_nvdec_common.cpp
    nvdrv/devices/nvhost_nvdec_common.h
    nvdrv/devices/nvhost_nvjpg.cpp
    nvdrv/devices/nvhost_nvjpg.h
    nvdrv/devices/nvhost_vic.cpp
    nvdrv/devices/nvhost_vic.h
    nvdrv/devices/nvmap.cpp
    nvdrv/devices/nvmap.h
    nvdrv/nvdata.h
    nvdrv/nvdrv.cpp
    nvdrv/nvdrv.h
    nvdrv/nvdrv_interface.cpp
    nvdrv/nvdrv_interface.h
    nvdrv/nvmemp.cpp
    nvdrv/nvmemp.h
    nvnflinger/binder.h
    nvnflinger/buffer_item.h
    nvnflinger/buffer_item_consumer.cpp
    nvnflinger/buffer_item_consumer.h
    nvnflinger/buffer_queue_consumer.cpp
    nvnflinger/buffer_queue_consumer.h
    nvnflinger/buffer_queue_core.cpp
    nvnflinger/buffer_queue_core.h
    nvnflinger/buffer_queue_defs.h
    nvnflinger/buffer_queue_producer.cpp
    nvnflinger/buffer_queue_producer.h
    nvnflinger/buffer_slot.h
    nvnflinger/buffer_transform_flags.h
    nvnflinger/consumer_base.cpp
    nvnflinger/consumer_base.h
    nvnflinger/consumer_listener.h
    nvnflinger/fb_share_buffer_manager.cpp
    nvnflinger/fb_share_buffer_manager.h
    nvnflinger/graphic_buffer_producer.cpp
    nvnflinger/graphic_buffer_producer.h
    nvnflinger/hos_binder_driver_server.cpp
    nvnflinger/hos_binder_driver_server.h
    nvnflinger/nvnflinger.cpp
    nvnflinger/nvnflinger.h
    nvnflinger/parcel.h
    nvnflinger/pixel_format.h
    nvnflinger/producer_listener.h
    nvnflinger/status.h
    nvnflinger/ui/fence.h
    nvnflinger/ui/graphic_buffer.h
    nvnflinger/window.h
    olsc/olsc.cpp
    olsc/olsc.h
    pcie/pcie.cpp
    pcie/pcie.h
    pctl/pctl.cpp
    pctl/pctl.h
    pctl/pctl_module.cpp
    pctl/pctl_module.h
    pcv/pcv.cpp
    pcv/pcv.h
    pm/pm.cpp
    pm/pm.h
    prepo/prepo.cpp
    prepo/prepo.h
    psc/psc.cpp
    psc/psc.h
    ptm/psm.cpp
    ptm/psm.h
    ptm/ptm.cpp
    ptm/ptm.h
    ptm/ts.cpp
    ptm/ts.h
    hle_ipc.cpp
    hle_ipc.h
    ipc_helpers.h
    kernel_helpers.cpp
    kernel_helpers.h
    mutex.cpp
    mutex.h
    server_manager.cpp
    server_manager.h
    service.cpp
    service.h
    set/set.cpp
    set/set.h
    set/set_cal.cpp
    set/set_cal.h
    set/set_fd.cpp
    set/set_fd.h
    set/set_sys.cpp
    set/set_sys.h
    set/settings.cpp
    set/settings.h
    sm/sm.cpp
    sm/sm.h
    sm/sm_controller.cpp
    sm/sm_controller.h
    sockets/bsd.cpp
    sockets/bsd.h
    sockets/nsd.cpp
    sockets/nsd.h
    sockets/sfdnsres.cpp
    sockets/sfdnsres.h
    sockets/sockets.cpp
    sockets/sockets.h
    sockets/sockets_translate.cpp
    sockets/sockets_translate.h
    spl/csrng.cpp
    spl/csrng.h
    spl/spl.cpp
    spl/spl.h
    spl/spl_module.cpp
    spl/spl_module.h
    spl/spl_results.h
    spl/spl_types.h
    ssl/ssl.cpp
    ssl/ssl.h
    ssl/ssl_backend.h
    time/clock_types.h
    time/ephemeral_network_system_clock_context_writer.h
    time/ephemeral_network_system_clock_core.h
    time/errors.h
    time/local_system_clock_context_writer.h
    time/network_system_clock_context_writer.h
    time/standard_local_system_clock_core.h
    time/standard_network_system_clock_core.h
    time/standard_steady_clock_core.cpp
    time/standard_steady_clock_core.h
    time/standard_user_system_clock_core.cpp
    time/standard_user_system_clock_core.h
    time/steady_clock_core.h
    time/system_clock_context_update_callback.cpp
    time/system_clock_context_update_callback.h
    time/system_clock_core.cpp
    time/system_clock_core.h
    time/tick_based_steady_clock_core.cpp
    time/tick_based_steady_clock_core.h
    time/time.cpp
    time/time.h
    time/time_interface.cpp
    time/time_interface.h
    time/time_manager.cpp
    time/time_manager.h
    time/time_sharedmemory.cpp
    time/time_sharedmemory.h
    time/time_zone_content_manager.cpp
    time/time_zone_content_manager.h
    time/time_zone_manager.cpp
    time/time_zone_manager.h
    time/time_zone_service.cpp
    time/time_zone_service.h
    time/time_zone_types.h
    usb/usb.cpp
    usb/usb.h
    vi/display/vi_display.cpp
    vi/display/vi_display.h
    vi/layer/vi_layer.cpp
    vi/layer/vi_layer.h
    vi/vi.cpp
    vi/vi.h
    vi/vi_m.cpp
    vi/vi_m.h
    vi/vi_s.cpp
    vi/vi_s.h
    vi/vi_u.cpp
    vi/vi_u.h
)

if (MSVC)
    target_compile_options(service PRIVATE
        /we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
        /we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data
        /we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch
        /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()
    target_compile_options(service PRIVATE
        -Werror=conversion

        -Wno-sign-conversion
        -Wno-cast-function-type

        $<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation>
    )
endif()

create_target_directory_groups(service)

target_link_libraries(service PUBLIC common PRIVATE audio_core network video_core nx_tzdb)
target_link_libraries(service PUBLIC Boost::headers PRIVATE fmt::fmt mbedtls)

if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64)
    target_sources(service PRIVATE
        jit/jit_context.cpp
        jit/jit_context.h
        jit/jit.cpp
        jit/jit.h
    )
    target_link_libraries(service PRIVATE core dynarmic::dynarmic)
endif()

if(ENABLE_OPENSSL)
    target_sources(service PRIVATE
        ssl/ssl_backend_openssl.cpp)
    target_link_libraries(service PRIVATE OpenSSL::SSL)
elseif (APPLE)
    target_sources(service PRIVATE
        ssl/ssl_backend_securetransport.cpp)
    target_link_libraries(service PRIVATE "-framework Security")
elseif (WIN32)
    target_sources(service PRIVATE
        ssl/ssl_backend_schannel.cpp)
    target_link_libraries(service PRIVATE crypt32 secur32)
else()
    target_sources(service PRIVATE
        ssl/ssl_backend_none.cpp)
endif()

if (YUZU_USE_PRECOMPILED_HEADERS)
    target_precompile_headers(service PRIVATE precompiled_headers.h)
endif()

if (YUZU_ENABLE_LTO)
  set_property(TARGET service PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
endif()
