
if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin)
  add_subdirectory(BlocksRuntime)
endif()

add_library(dispatch
  allocator.c
  apply.c
  benchmark.c
  data.c
  init.c
  introspection.c
  io.c
  mach.c
  object.c
  once.c
  queue.c
  semaphore.c
  source.c
  time.c
  transform.c
  voucher.c
  shims.c
  protocol.defs
  provider.d
  allocator_internal.h
  data_internal.h
  inline_internal.h
  internal.h
  introspection_internal.h
  io_internal.h
  mach_internal.h
  object_internal.h
  queue_internal.h
  semaphore_internal.h
  shims.h
  source_internal.h
  trace.h
  voucher_internal.h
  event/event.c
  event/event_config.h
  event/event_epoll.c
  event/event_internal.h
  event/event_kevent.c
  event/event_windows.c
  firehose/firehose_internal.h
  shims/android_stubs.h
  shims/atomic.h
  shims/atomic_sfb.h
  shims/getprogname.h
  shims/hw_config.h
  shims/lock.c
  shims/lock.h
  shims/perfmon.h
  shims/time.h
  shims/tsd.h
  shims/yield.c
  shims/yield.h)

if(CMAKE_SYSTEM_NAME STREQUAL Windows)
  target_sources(dispatch PRIVATE
    shims/generic_sys_queue.h
    shims/generic_win_stubs.c
    shims/generic_win_stubs.h
    shims/getprogname.c)
endif()

if(DISPATCH_USE_INTERNAL_WORKQUEUE)
  target_sources(dispatch PRIVATE
    event/workqueue.c
    event/workqueue_internal.h)
endif()

target_sources(dispatch PRIVATE
  block.cpp)

if(ENABLE_DTRACE)
  dtrace_usdt_probe(${CMAKE_CURRENT_SOURCE_DIR}/provider.d OUTPUT_SOURCES
    dispatch_dtrace_provider_headers)
  target_sources(dispatch PRIVATE
    ${dispatch_dtrace_provider_headers})
endif()

if(HAVE_OBJC)
  # TODO(compnerd) split DispatchStubs.cc into a separate component for the ObjC
  # registration and a separate component for the swift compiler's emission of a
  # call to the ObjC autorelease elision entry point.
  target_sources(dispatch PRIVATE
    data.m
    object.m
    swift/DispatchStubs.cc)
endif()


set_target_properties(dispatch PROPERTIES
  POSITION_INDEPENDENT_CODE YES)

target_include_directories(dispatch PRIVATE
  ${PROJECT_BINARY_DIR}
  ${PROJECT_SOURCE_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMAKE_CURRENT_BINARY_DIR}
  ${PROJECT_SOURCE_DIR}/private)
target_include_directories(dispatch SYSTEM BEFORE PRIVATE
  "${BlocksRuntime_INCLUDE_DIR}")

if(CMAKE_SYSTEM_NAME STREQUAL Windows)
  target_compile_definitions(dispatch PRIVATE
    _CRT_NONSTDC_NO_WARNINGS
    _CRT_SECURE_NO_WARNINGS)
elseif(CMAKE_SYSTEM_NAME STREQUAL Android)
  target_compile_options(dispatch PRIVATE
    -U_GNU_SOURCE)
endif()
if(DISPATCH_ENABLE_ASSERTS)
  target_compile_definitions(dispatch PRIVATE
    DISPATCH_DEBUG=1)
endif()

if("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC")
  target_compile_options(dispatch PRIVATE /EHs-c-)
  target_compile_options(dispatch PRIVATE /W3)
else()
  target_compile_options(dispatch PRIVATE -fno-exceptions)
  target_compile_options(dispatch PRIVATE -Wall)
endif()

# FIXME(compnerd) add check for -fblocks?
target_compile_options(dispatch PRIVATE -fblocks)

check_c_compiler_flag("-momit-leaf-frame-pointer -Werror -Wall -O3" C_SUPPORTS_OMIT_LEAF_FRAME_POINTER)
if (C_SUPPORTS_OMIT_LEAF_FRAME_POINTER)
  target_compile_options(dispatch PRIVATE -momit-leaf-frame-pointer)
endif()

if(LibRT_FOUND)
  target_link_libraries(dispatch PRIVATE RT::rt)
endif()
target_link_libraries(dispatch PRIVATE
  Threads::Threads
  BlocksRuntime::BlocksRuntime)
if(CMAKE_SYSTEM_NAME STREQUAL Windows)
  target_link_libraries(dispatch PRIVATE
    ShLwApi
    WS2_32
    WinMM
    synchronization)
endif()

if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
  set_property(TARGET dispatch APPEND_STRING PROPERTY LINK_FLAGS
    "-Xlinker -compatibility_version -Xlinker 1"
    "-Xlinker -current_version -Xlinker ${VERSION}"
    "-Xlinker -dead_strip"
    "-Xlinker -alias_list -Xlinker ${PROJECT_SOURCE_DIR}/xcodeconfig/libdispatch.aliases")
endif()

if(ENABLE_SWIFT)
  add_subdirectory(swift)
endif()

install(TARGETS dispatch
        ARCHIVE DESTINATION ${INSTALL_TARGET_DIR}
        LIBRARY DESTINATION ${INSTALL_TARGET_DIR}
        RUNTIME DESTINATION bin)
