#
# Copyright (C) 2016+     AzerothCore <www.azerothcore.org>, released under GNU AGPL v3 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-AGPL3
#

if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
  add_library(ace SHARED IMPORTED GLOBAL)

  set_target_properties(ace
    PROPERTIES
      IMPORTED_LOCATION
        "${ACE_LIBRARY}"
      INTERFACE_INCLUDE_DIRECTORIES
        "${ACE_INCLUDE_DIR}")
else()

  # NOTE: Do not use glob here, it would include files we don't want
  set(ACE_SOURCES
    ace/ACE.cpp
    ace/ACE_crc32.cpp
    ace/ACE_crc_ccitt.cpp
    ace/ATM_Acceptor.cpp
    ace/ATM_Addr.cpp
    ace/ATM_Connector.cpp
    ace/ATM_Params.cpp
    ace/ATM_QoS.cpp
    ace/ATM_Stream.cpp
    ace/Activation_Queue.cpp
    ace/Active_Map_Manager.cpp
    ace/Addr.cpp
    ace/Argv_Type_Converter.cpp
    ace/Assert.cpp
    ace/Asynch_IO.cpp
    ace/Asynch_IO_Impl.cpp
    ace/Asynch_Pseudo_Task.cpp
    ace/Atomic_Op.cpp
    ace/Barrier.cpp
    ace/Base_Thread_Adapter.cpp
    ace/Based_Pointer_Repository.cpp
    ace/Basic_Stats.cpp
    ace/Basic_Types.cpp
    ace/CDR_Base.cpp
    ace/CDR_Size.cpp
    ace/CDR_Stream.cpp
    ace/Capabilities.cpp
    ace/Cleanup.cpp
    ace/Codecs.cpp
    ace/Codeset_IBM1047.cpp
    ace/Codeset_Registry.cpp
    ace/Codeset_Registry_db.cpp
    ace/Condition_Attributes.cpp
    ace/Condition_Recursive_Thread_Mutex.cpp
    ace/Condition_Thread_Mutex.cpp
    ace/Configuration.cpp
    ace/Configuration_Import_Export.cpp
    ace/Connection_Recycling_Strategy.cpp
    ace/Containers.cpp
    ace/Copy_Disabled.cpp
    ace/DEV.cpp
    ace/DEV_Addr.cpp
    ace/DEV_Connector.cpp
    ace/DEV_IO.cpp
    ace/DLL.cpp
    ace/DLL_Manager.cpp
    ace/Date_Time.cpp
    ace/Dev_Poll_Reactor.cpp
    ace/Dirent.cpp
    ace/Dirent_Selector.cpp
    ace/Dump.cpp
    ace/Dynamic.cpp
    ace/Dynamic_Message_Strategy.cpp
    ace/Dynamic_Service_Base.cpp
    ace/Dynamic_Service_Dependency.cpp
    ace/Encoding_Converter.cpp
    ace/Encoding_Converter_Factory.cpp
    ace/Event_Base.cpp
    ace/Event_Handler.cpp
    ace/Event_Handler_Handle_Timeout_Upcall.cpp
    ace/FIFO.cpp
    ace/FIFO_Recv.cpp
    ace/FIFO_Recv_Msg.cpp
    ace/FIFO_Send.cpp
    ace/FIFO_Send_Msg.cpp
    ace/FILE.cpp
    ace/FILE_Addr.cpp
    ace/FILE_Connector.cpp
    ace/FILE_IO.cpp
    ace/File_Lock.cpp
    ace/Filecache.cpp
    ace/Flag_Manip.cpp
    ace/Framework_Component.cpp
    ace/Functor.cpp
    ace/Functor_String.cpp
    ace/Get_Opt.cpp
    ace/Handle_Ops.cpp
    ace/Handle_Set.cpp
    ace/Hashable.cpp
    ace/High_Res_Timer.cpp
    ace/ICMP_Socket.cpp
    ace/INET_Addr.cpp
    ace/IOStream.cpp
    ace/IO_Cntl_Msg.cpp
    ace/IO_SAP.cpp
    ace/IPC_SAP.cpp
    ace/Init_ACE.cpp
    ace/LSOCK.cpp
    ace/LSOCK_Acceptor.cpp
    ace/LSOCK_CODgram.cpp
    ace/LSOCK_Connector.cpp
    ace/LSOCK_Dgram.cpp
    ace/LSOCK_Stream.cpp
    ace/Lib_Find.cpp
    ace/Local_Memory_Pool.cpp
    ace/Local_Name_Space.cpp
    ace/Local_Tokens.cpp
    ace/Lock.cpp
    ace/Log_Category.cpp
    ace/Log_Msg.cpp
    ace/Log_Msg_Android_Logcat.cpp
    ace/Log_Msg_Backend.cpp
    ace/Log_Msg_Callback.cpp
    ace/Log_Msg_IPC.cpp
    ace/Log_Msg_NT_Event_Log.cpp
    ace/Log_Msg_UNIX_Syslog.cpp
    ace/Log_Record.cpp
    ace/Logging_Strategy.cpp
    ace/MEM_Acceptor.cpp
    ace/MEM_Addr.cpp
    ace/MEM_Connector.cpp
    ace/MEM_IO.cpp
    ace/MEM_SAP.cpp
    ace/MEM_Stream.cpp
    ace/MMAP_Memory_Pool.cpp
    ace/Malloc.cpp
    ace/Malloc_Allocator.cpp
    ace/Mem_Map.cpp
    ace/Message_Block.cpp
    ace/Message_Queue.cpp
    ace/Message_Queue_NT.cpp
    ace/Message_Queue_Vx.cpp
    ace/Method_Request.cpp
    ace/Monitor_Admin.cpp
    ace/Monitor_Admin_Manager.cpp
    ace/Monitor_Base.cpp
    ace/Monitor_Control_Action.cpp
    ace/Monitor_Control_Types.cpp
    ace/Monitor_Point_Registry.cpp
    ace/Monitor_Size.cpp
    ace/Monotonic_Time_Policy.cpp
    ace/Msg_WFMO_Reactor.cpp
    ace/Multihomed_INET_Addr.cpp
    ace/Mutex.cpp
    ace/NT_Service.cpp
    ace/Name_Proxy.cpp
    ace/Name_Request_Reply.cpp
    ace/Name_Space.cpp
    ace/Naming_Context.cpp
    ace/Netlink_Addr.cpp
    ace/Notification_Queue.cpp
    ace/Notification_Strategy.cpp
    ace/Null_Mutex.cpp
    ace/OS_Errno.cpp
    ace/OS_Log_Msg_Attributes.cpp
    ace/OS_NS_Thread.cpp
    ace/OS_NS_arpa_inet.cpp
    ace/OS_NS_ctype.cpp
    ace/OS_NS_devctl.cpp
    ace/OS_NS_dirent.cpp
    ace/OS_NS_dlfcn.cpp
    ace/OS_NS_errno.cpp
    ace/OS_NS_fcntl.cpp
    ace/OS_NS_math.cpp
    ace/OS_NS_netdb.cpp
    ace/OS_NS_poll.cpp
    ace/OS_NS_pwd.cpp
    ace/OS_NS_regex.cpp
    ace/OS_NS_signal.cpp
    ace/OS_NS_stdio.cpp
    ace/OS_NS_stdlib.cpp
    ace/OS_NS_string.cpp
    ace/OS_NS_strings.cpp
    ace/OS_NS_stropts.cpp
    ace/OS_NS_sys_mman.cpp
    ace/OS_NS_sys_msg.cpp
    ace/OS_NS_sys_resource.cpp
    ace/OS_NS_sys_select.cpp
    ace/OS_NS_sys_sendfile.cpp
    ace/OS_NS_sys_shm.cpp
    ace/OS_NS_sys_socket.cpp
    ace/OS_NS_sys_stat.cpp
    ace/OS_NS_sys_time.cpp
    ace/OS_NS_sys_uio.cpp
    ace/OS_NS_sys_utsname.cpp
    ace/OS_NS_sys_wait.cpp
    ace/OS_NS_time.cpp
    ace/OS_NS_unistd.cpp
    ace/OS_NS_wchar.cpp
    ace/OS_NS_wctype.cpp
    ace/OS_QoS.cpp
    ace/OS_TLI.cpp
    ace/OS_Thread_Adapter.cpp
    ace/OS_main.cpp
    ace/Obchunk.cpp
    ace/Object_Manager.cpp
    ace/Object_Manager_Base.cpp
    ace/Obstack.cpp
    ace/PI_Malloc.cpp
    ace/POSIX_Asynch_IO.cpp
    ace/POSIX_CB_Proactor.cpp
    ace/POSIX_Proactor.cpp
    ace/Pagefile_Memory_Pool.cpp
    ace/Parse_Node.cpp
    ace/Ping_Socket.cpp
    ace/Pipe.cpp
    ace/Priority_Reactor.cpp
    ace/Proactor.cpp
    ace/Proactor_Impl.cpp
    ace/Process.cpp
    ace/Process_Manager.cpp
    ace/Process_Mutex.cpp
    ace/Process_Semaphore.cpp
    ace/Profile_Timer.cpp
    ace/RW_Mutex.cpp
    ace/RW_Process_Mutex.cpp
    ace/RW_Thread_Mutex.cpp
    ace/Reactor.cpp
    ace/Reactor_Impl.cpp
    ace/Reactor_Notification_Strategy.cpp
    ace/Reactor_Timer_Interface.cpp
    ace/Read_Buffer.cpp
    ace/Recursive_Thread_Mutex.cpp
    ace/Recyclable.cpp
    ace/Registry.cpp
    ace/Registry_Name_Space.cpp
    ace/Remote_Name_Space.cpp
    ace/Remote_Tokens.cpp
    ace/SOCK.cpp
    ace/SOCK_Acceptor.cpp
    ace/SOCK_CODgram.cpp
    ace/SOCK_Connector.cpp
    ace/SOCK_Dgram.cpp
    ace/SOCK_Dgram_Bcast.cpp
    ace/SOCK_Dgram_Mcast.cpp
    ace/SOCK_IO.cpp
    ace/SOCK_Netlink.cpp
    ace/SOCK_SEQPACK_Acceptor.cpp
    ace/SOCK_SEQPACK_Association.cpp
    ace/SOCK_SEQPACK_Connector.cpp
    ace/SOCK_Stream.cpp
    ace/SPIPE.cpp
    ace/SPIPE_Acceptor.cpp
    ace/SPIPE_Addr.cpp
    ace/SPIPE_Connector.cpp
    ace/SPIPE_Stream.cpp
    ace/SString.cpp
    ace/SUN_Proactor.cpp
    ace/SV_Message.cpp
    ace/SV_Message_Queue.cpp
    ace/SV_Semaphore_Complex.cpp
    ace/SV_Semaphore_Simple.cpp
    ace/SV_Shared_Memory.cpp
    ace/Sample_History.cpp
    ace/Sbrk_Memory_Pool.cpp
    ace/Sched_Params.cpp
    ace/Select_Reactor_Base.cpp
    ace/Semaphore.cpp
    ace/Service_Config.cpp
    ace/Service_Gestalt.cpp
    ace/Service_Manager.cpp
    ace/Service_Object.cpp
    ace/Service_Repository.cpp
    ace/Service_Types.cpp
    ace/Shared_Memory.cpp
    ace/Shared_Memory_MM.cpp
    ace/Shared_Memory_Pool.cpp
    ace/Shared_Memory_SV.cpp
    ace/Shared_Object.cpp
    ace/Sig_Adapter.cpp
    ace/Sig_Handler.cpp
    ace/Signal.cpp
    ace/Sock_Connect.cpp
    ace/Stack_Trace.cpp
    ace/Stats.cpp
    ace/String_Base_Const.cpp
    ace/Svc_Conf_Lexer.cpp
    ace/Svc_Conf_y.cpp
    ace/Synch_Options.cpp
    ace/System_Time.cpp
    ace/TLI.cpp
    ace/TLI_Acceptor.cpp
    ace/TLI_Connector.cpp
    ace/TLI_Stream.cpp
    ace/TP_Reactor.cpp
    ace/TSS_Adapter.cpp
    ace/TTY_IO.cpp
    ace/Task.cpp
    ace/Thread.cpp
    ace/Thread_Adapter.cpp
    ace/Thread_Control.cpp
    ace/Thread_Exit.cpp
    ace/Thread_Hook.cpp
    ace/Thread_Manager.cpp
    ace/Thread_Mutex.cpp
    ace/Thread_Semaphore.cpp
    ace/Throughput_Stats.cpp
    ace/Time_Policy.cpp
    ace/Time_Value.cpp
    ace/Timeprobe.cpp
    ace/Token.cpp
    ace/Token_Collection.cpp
    ace/Token_Invariants.cpp
    ace/Token_Manager.cpp
    ace/Token_Request_Reply.cpp
    ace/Trace.cpp
    ace/UNIX_Addr.cpp
    ace/UPIPE_Acceptor.cpp
    ace/UPIPE_Connector.cpp
    ace/UPIPE_Stream.cpp
    ace/UTF16_Encoding_Converter.cpp
    ace/UTF32_Encoding_Converter.cpp
    ace/UTF8_Encoding_Converter.cpp
    ace/UUID.cpp
    ace/WFMO_Reactor.cpp
    ace/WIN32_Asynch_IO.cpp
    ace/WIN32_Proactor.cpp
    ace/XML_Svc_Conf.cpp
    ace/XTI_ATM_Mcast.cpp
    ace/ace_wchar.cpp)

  if (USE_COREPCH)
    set(PRIVATE_PCH_HEADER ace/PrecompiledHeaders/WinAcePCH.h)
  endif()

  # Group sources
  GroupSources(${CMAKE_CURRENT_SOURCE_DIR})

  add_library(ace STATIC
    ${ACE_SOURCES})

  target_include_directories(ace
    PUBLIC
      ${CMAKE_CURRENT_SOURCE_DIR})

  target_compile_definitions(ace
    PUBLIC
      ACE_AS_STATIC_LIBS
      $<$<PLATFORM_ID:FreeBSD>:_WANT_SEMUN>)

  target_link_libraries(ace
    PRIVATE
      acore-dependency-interface Iphlpapi)
      
  set_target_properties(ace
    PROPERTIES
      FOLDER
        "deps")

  # Generate precompiled header
  if(USE_COREPCH)
    add_cxx_pch(ace ${PRIVATE_PCH_HEADER})
  endif()
  
endif()
