project(pthreads)

cmake_minimum_required(VERSION 2.8)

option(BUILD_STATIC "build pthreads as a static library" OFF)
option(BUILD_INLINED "build pthreads as with inlined functions" ON)
option(BUILD_TESTS "build test executables for pthreads" ON)

if(BUILD_TESTS)
    enable_testing()
endif(BUILD_TESTS)

if(MSVC)
    add_definitions(-D_CRT_SECURE_NO_WARNINGS)
endif(MSVC)

include(ConfigureChecks.cmake)

set(pthreads_SRCS
    attr.c
    barrier.c
    cancel.c
    cleanup.c
    condvar.c
    create.c
    dll.c
    exit.c
    global.c
    misc.c
    mutex.c
    nonportable.c
    private.c
    rwlock.c
    sched.c
    semaphore.c
    spin.c
    sync.c
    tsd.c
)

if(MSVC)
    add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/version.rc COMMAND cl /EP ${CMAKE_SOURCE_DIR}/version.rc > ${CMAKE_BINARY_DIR}/version.rc)
    list(APPEND ${pthreads_SRCS} ${CMAKE_BINARY_DIR}/version.rc)
endif(MSVC)
set(pthreads_HDRS
    sched.h
    pthread.h
    semaphore.h
)
include_directories(${CMAKE_SOURCE_DIR})

if(BUILD_STATIC)
    set(_SHARED STATIC)
    add_definitions(-DPTW32_STATIC_LIB)
else(BUILD_STATIC)
    set(_SHARED SHARED)
endif(BUILD_STATIC)

add_library(pthreads ${_SHARED} ${pthreads_SRCS})
if(BUILD_INLINED)
    set_target_properties(pthreads PROPERTIES COMPILE_FLAGS -DPTW32_BUILD_INLINED)
endif(BUILD_INLINED)
target_link_libraries(pthreads ws2_32)

###############################################################################
if(BUILD_TESTS)
set(pthreads_TESTS
    loadfree
    self1
    mutex5
    mutex1
    mutex1n
    mutex1e
    mutex1r
    semaphore1
    semaphore2
    semaphore3
    mutex2
    mutex3
    mutex2r
    mutex2e
    mutex3r
    mutex3e
    condvar1
    condvar1_1
    condvar1_2
    condvar2
    condvar2_1
    exit1
    create1
    create2
    reuse1
    reuse2
    equal1
    kill1
    valid1
    valid2
    exit2
    exit3
    exit4
    exit5
    join0
    join1
    detach1
    join2
    join3
    mutex4
    mutex6
    mutex6n
    mutex6e
    mutex6r
    mutex6s
    mutex6es
    mutex6rs
    mutex7
    mutex7n
    mutex7e
    mutex7r
    mutex8
    mutex8n
    mutex8e
    mutex8r
    count1
    once1
    once2
    once3
    once4
    self2
    cancel1
    cancel2
    semaphore4
    semaphore4t
#    semaphore5
    barrier1
    barrier2
    barrier3
    barrier4
    barrier5
    tsd1
    tsd2
    delay1
    delay2
    eyal1
    condvar3
    condvar3_1
    condvar3_2
    condvar3_3
    condvar4
    condvar5
    condvar6
    condvar7
    condvar8
    condvar9
    errno1
    rwlock1
    rwlock2
    rwlock3
    rwlock4
    rwlock5
    rwlock6
    rwlock7
    rwlock8
    rwlock2_t
    rwlock3_t
    rwlock4_t
    rwlock5_t
    rwlock6_t
    rwlock6_t2
    context1
    cancel3
    cancel4
    cancel5
    cancel6a
    cancel6d
    cancel7
    cancel8
    cleanup0
    cleanup1
    cleanup2
    cleanup3
    priority1
    priority2
    inherit1
    spin1
    spin2
    spin3
    spin4
    exception1
    exception2
    exception3
    cancel9
    create3
    stress1
)

foreach(_test ${pthreads_TESTS})
    add_executable(${_test} tests/${_test}.c)
    target_link_libraries(${_test} pthreads)
    add_test(${_test} ${_test})
endforeach(_test ${pthreads_TESTS})

set(pthreads_ADD_TESTS
    benchtest1
    benchtest2
    benchtest3
    benchtest4
    benchtest5
)

add_library(bench STATIC tests/benchlib.c)
foreach(_test ${pthreads_ADD_TESTS})
    add_executable(${_test} tests/${_test}.c)
    target_link_libraries(${_test} pthreads bench)
    add_test(${_test} ${_test})
endforeach(_test ${pthreads_ADD_TESTS})

endif(BUILD_TESTS)

###############################################################################
install(TARGETS pthreads RUNTIME DESTINATION bin
                         LIBRARY DESTINATION lib
                         ARCHIVE DESTINATION lib)

install(FILES ${pthreads_HDRS} DESTINATION include)