cmake_minimum_required(VERSION 3.9.0)

project(pthreads)

set(PTHREAD_PUBLIC_HEADERS pthread.h sched.h semaphore.h)

set(PTHREAD_SHARED_SOURCES
  autostatic.c
  barrier.c
  cancel.c
  cleanup.c
  condvar.c
  create.c
  dll.c
  errno.c
  exit.c
  fork.c
  global.c
  misc.c
  mutex.c
  nonportable.c
  private.c
  rwlock.c
  sched.c
  semaphore.c
  signal.c
  spin.c
  sync.c
  tsd.c
  attr.C
  version.rc
)
set(PTHREAD_STATIC_SOURCES
  autostatic.c
  cleanup.c
  create.c
  dll.c
  errno.c
  fork.c
  global.c
  pthread_attr_destroy.c
  pthread_attr_getdetachstate.c
  pthread_attr_getinheritsched.c
  pthread_attr_getschedparam.c
  pthread_attr_getschedpolicy.c
  pthread_attr_getscope.c
  pthread_attr_getstackaddr.c
  pthread_attr_getstacksize.c
  pthread_attr_init.c
  pthread_attr_setdetachstate.c
  pthread_attr_setinheritsched.c
  pthread_attr_setschedparam.c
  pthread_attr_setschedpolicy.c
  pthread_attr_setscope.c
  pthread_attr_setstackaddr.c
  pthread_attr_setstacksize.c
  pthread_barrier_destroy.c
  pthread_barrier_init.c
  pthread_barrier_wait.c
  pthread_barrierattr_destroy.c
  pthread_barrierattr_getpshared.c
  pthread_barrierattr_init.c
  pthread_barrierattr_setpshared.c
  pthread_cancel.c
  pthread_cond_destroy.c
  pthread_cond_init.c
  pthread_cond_signal.c
  pthread_cond_wait.c
  pthread_condattr_destroy.c
  pthread_condattr_getpshared.c
  pthread_condattr_init.c
  pthread_condattr_setpshared.c
  pthread_delay_np.c
  pthread_detach.c
  pthread_equal.c
  pthread_exit.c
  pthread_getconcurrency.c
  pthread_getschedparam.c
  pthread_getspecific.c
  pthread_getunique_np.c
  pthread_getw32threadhandle_np.c
  pthread_join.c
  pthread_key_create.c
  pthread_key_delete.c
  pthread_kill.c
  pthread_mutex_consistent.c
  pthread_mutex_destroy.c
  pthread_mutex_init.c
  pthread_mutex_lock.c
  pthread_mutex_timedlock.c
  pthread_mutex_trylock.c
  pthread_mutex_unlock.c
  pthread_mutexattr_destroy.c
  pthread_mutexattr_getkind_np.c
  pthread_mutexattr_getpshared.c
  pthread_mutexattr_getrobust.c
  pthread_mutexattr_gettype.c
  pthread_mutexattr_init.c
  pthread_mutexattr_setkind_np.c
  pthread_mutexattr_setpshared.c
  pthread_mutexattr_setrobust.c
  pthread_mutexattr_settype.c
  pthread_num_processors_np.c
  pthread_once.c
  pthread_rwlock_destroy.c
  pthread_rwlock_init.c
  pthread_rwlock_rdlock.c
  pthread_rwlock_tryrdlock.c
  pthread_rwlock_trywrlock.c
  pthread_rwlock_unlock.c
  pthread_rwlock_wrlock.c
  pthread_rwlockattr_destroy.c
  pthread_rwlockattr_getpshared.c
  pthread_rwlockattr_init.c
  pthread_rwlockattr_setpshared.c
  pthread_self.c
  pthread_setcancelstate.c
  pthread_setcanceltype.c
  pthread_setconcurrency.c
  pthread_setschedparam.c
  pthread_setspecific.c
  pthread_spin_destroy.c
  pthread_spin_init.c
  pthread_spin_lock.c
  pthread_spin_trylock.c
  pthread_spin_unlock.c
  pthread_testcancel.c
  pthread_timechange_handler_np.c
  pthread_win32_attach_detach_np.c
  ptw32_calloc.c
  ptw32_callUserDestroyRoutines.c
  ptw32_cond_check_need_init.c
  ptw32_getprocessors.c
  ptw32_is_attr.c
  ptw32_MCS_lock.c
  ptw32_mutex_check_need_init.c
  ptw32_new.c
  ptw32_processInitialize.c
  ptw32_processTerminate.c
  ptw32_relmillisecs.c
  ptw32_reuse.c
  ptw32_rwlock_check_need_init.c
  ptw32_semwait.c
  ptw32_spinlock_check_need_init.c
  ptw32_threadDestroy.c
  ptw32_threadStart.c
  ptw32_throw.c
  ptw32_timespec.c
  ptw32_tkAssocCreate.c
  ptw32_tkAssocDestroy.c
  sched_get_priority_max.c
  sched_get_priority_min.c
  sched_getscheduler.c
  sched_setscheduler.c
  sched_yield.c
  sem_close.c
  sem_destroy.c
  sem_getvalue.c
  sem_init.c
  sem_open.c
  sem_post_multiple.c
  sem_post.c
  sem_timedwait.c
  sem_trywait.c
  sem_unlink.c
  sem_wait.c
  signal.c
  w32_CancelableWait.c
)



add_definitions(-DPTW32_ARCH="${PTW32_ARCH}" -DPTW32_RC_MSC -DHAVE_PTW32_CONFIG_H -D_TIMESPEC_DEFINED)

if(BUILD_SHARED_LIBS)
  set(PTHREAD_SOURCES  ${PTHREAD_SHARED_SOURCES})
  add_definitions(-DPTW32_BUILD)
else()
  set(PTHREAD_SOURCES  ${PTHREAD_STATIC_SOURCES})
  add_definitions(-DPTW32_STATIC_LIB)
endif()


if(PTHREADS_BUILD_CPP)
  set(PTHREADS_EXCEPTION_SCHEME CE)
  add_definitions(/__CLEANUP_CXX)
elseif(PTHREADS_BUILD_SEH)
  set(PTHREADS_EXCEPTION_SCHEME SE)
  add_definitions(/__CLEANUP_SEH)
else()
  set(PTHREADS_EXCEPTION_SCHEME C)
endif()

set(PTHREADS_COMPATIBILITY_VERSION 2)
set(CMAKE_DEBUG_POSTFIX d)
set(PTHREADS_COMPILER V)

set(PTHREADS_LIBRARY "pthread${PTHREADS_COMPILER}${PTHREADS_EXCEPTION_SCHEME}${PTHREADS_COMPATIBILITY_VERSION}")

include_directories(.)

add_library(${PTHREADS_LIBRARY} ${PTHREAD_SOURCES})

install(
  TARGETS  ${PTHREADS_LIBRARY}
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
)

if(NOT DISABLE_INSTALL_HEADERS)
  install(FILES ${PTHREAD_PUBLIC_HEADERS} DESTINATION include)
endif()
