From 113d3298398eb8648a939e912510d5750294848a Mon Sep 17 00:00:00 2001 From: Joel Winarske Date: Mon, 8 Oct 2018 16:40:39 -0700 Subject: [PATCH] cmake first pass --- .gitignore | 3 + CMakeLists.txt | 149 ++++++++++++++ appveyor.yml | 93 +++++++++ cmake/common.cmake | 150 ++++++++++++++ cmake/get_version.cmake | 21 ++ cmake/target_arch.cmake | 36 ++++ cmake/version.rc.in | 418 ++++++++++++++++++++++++++++++++++++++++ tests/CMakeLists.txt | 77 ++++++++ 8 files changed, 947 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 appveyor.yml create mode 100644 cmake/common.cmake create mode 100644 cmake/get_version.cmake create mode 100644 cmake/target_arch.cmake create mode 100644 cmake/version.rc.in create mode 100644 tests/CMakeLists.txt diff --git a/.gitignore b/.gitignore index 0fa70b6..7d7555e 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,6 @@ tests/benchlib.o tests/SIZES.* tests/*.log /.project +build +PTHREADS-BUILT +.vscode \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..73af7de --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,149 @@ +cmake_minimum_required(VERSION 3.11) + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "MinSizeRel" CACHE STRING "Choose the type of build, options are: Debug, Release, or MinSizeRel." FORCE) + message(STATUS "No build type specified, defaulting to MinSizeRel.") +endif() + +set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${CMAKE_SOURCE_DIR}/cmake") + +include (get_version) + +message(STATUS "Generator ......... ${CMAKE_GENERATOR}") +message(STATUS "Build Type ........ ${CMAKE_BUILD_TYPE}") +message(STATUS "Version ........... ${PTHREADS4W_VERSION}") + +project(pthreads4w VERSION ${PTHREADS4W_VERSION} LANGUAGES C) + +set(PTW32_VER ${PROJECT_VERSION_MAJOR}${EXTRAVERSION}) +set(CMAKE_DEBUG_POSTFIX d) + +# Uncomment this if config.h defines RETAIN_WSALASTERROR +#set(XLIBS wsock32.lib) + +include (common) + +include_directories(.) + +################################# +# Target Arch # +################################# +include (target_arch) + +get_target_arch(TARGET_ARCH) + +if(${TARGET_ARCH} STREQUAL "ARM") + add_definitions(-D__PTW32_ARCHARM) +elseif(${TARGET_ARCH} STREQUAL "x86_64") + add_definitions(-D__PTW32_ARCHAMD64) +elseif(${TARGET_ARCH} STREQUAL "x86") + add_definitions(-D__PTW32_ARCHX86) +elseif(${TARGET_ARCH} STREQUAL "x64") + add_definitions(-D__PTW32_ARCHX64) +else() + MESSAGE(ERROR "\"${TARGET_ARCH}\" not supported in version.rc") +endif() + +################################# +# Install Path # +################################# +if(DIST_ROOT) + set(CMAKE_INSTALL_PREFIX "${DIST_ROOT}") +else() + set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/PTHREADS-BUILT") +endif() +message(STATUS "Install Path ${CMAKE_INSTALL_PREFIX}") + + +set(DLLDEST ${CMAKE_INSTALL_PREFIX}/${TARGET_ARCH}/${CMAKE_BUILD_TYPE}/bin) +set(LIBDEST ${CMAKE_INSTALL_PREFIX}/${TARGET_ARCH}/${CMAKE_BUILD_TYPE}/lib) +set(HDRDEST ${CMAKE_INSTALL_PREFIX}/${TARGET_ARCH}/${CMAKE_BUILD_TYPE}/include) +set(TESTDEST ${CMAKE_INSTALL_PREFIX}/${TARGET_ARCH}/${CMAKE_BUILD_TYPE}/test) + +################################# +# Defs # +################################# +add_definitions(-D__PTW32_BUILD_INLINED) + +if(MSVC) + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /errorReport:none /nologo ") + + # C++ Exceptions + # (Note: If you are using Microsoft VC++6.0, the library needs to be built + # with /EHa instead of /EHs or else cancellation won't work properly.) + if(MSVC_VERSION EQUAL 1200) + set(VCEFLAGS "/EHa /TP ") + else() + set(VCEFLAGS "/EHs /TP ") + endif() + + add_definitions(-DHAVE_CONFIG_H -D__PTW32_RC_MSC) + +endif() + +# Update filename with proper version info +configure_file(${CMAKE_SOURCE_DIR}/cmake/version.rc.in ${CMAKE_BINARY_DIR}/version.rc @ONLY) + +################################# +# Libraries # +################################# +set(targ_suffix "") +if(${CMAKE_BUILD_TYPE} STREQUAL "Debug") + set(targ_suffix ${CMAKE_DEBUG_POSTFIX}) +endif() + +macro(shared_lib type def) + set(targ pthread${type}${PTW32_VER}) + add_library(${targ} SHARED pthread.c ${CMAKE_BINARY_DIR}/version.rc) + message(STATUS ${targ}) + target_compile_definitions(${targ} PUBLIC "-D${def}") + if(${type} STREQUAL "VCE") + set_target_properties(${targ} PROPERTIES COMPILE_FLAGS ${VCEFLAGS}) + endif() + if(${CMAKE_GENERATOR} MATCHES "Visual Studio") + install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${targ}${targ_suffix}.dll DESTINATION ${DLLDEST}) + install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${targ}${targ_suffix}.lib DESTINATION ${LIBDEST}) + else() + install(FILES ${CMAKE_BINARY_DIR}/${targ}${targ_suffix}.dll DESTINATION ${DLLDEST}) + install(FILES ${CMAKE_BINARY_DIR}/${targ}${targ_suffix}.lib DESTINATION ${LIBDEST}) + endif() +endmacro() + +macro(static_lib type def) + set(targ libpthread${type}${PTW32_VER}) + add_library(${targ} STATIC pthread.c) + message(STATUS ${targ}) + target_compile_definitions(${targ} PUBLIC "-D${def}" -D__PTW32_STATIC_LIB) + if(${type} STREQUAL "VCE") + set_target_properties(${targ} PROPERTIES COMPILE_FLAGS ${VCEFLAGS}) + endif() + if(${CMAKE_GENERATOR} MATCHES "Visual Studio") + install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${targ}${targ_suffix}.lib DESTINATION ${LIBDEST}) + else() + install(FILES ${CMAKE_BINARY_DIR}/${targ}${targ_suffix}.lib DESTINATION ${LIBDEST}) + endif() +endmacro() + +shared_lib ( VCE __PTW32_CLEANUP_CXX ) +shared_lib ( VSE __PTW32_CLEANUP_SEH ) +shared_lib ( VC __PTW32_CLEANUP_C ) + +static_lib ( VCE __PTW32_CLEANUP_CXX ) +static_lib ( VSE __PTW32_CLEANUP_SEH ) +static_lib ( VC __PTW32_CLEANUP_C ) + +################################# +# Install # +################################# +install(FILES _ptw32.h pthread.h sched.h semaphore.h DESTINATION ${HDRDEST}) + +################################# +# Test # +################################# +option(ENABLE_TESTS "Enable Test code build" FALSE) + +#TODO determine if cross compile... +if(ENABLE_TESTS) + add_subdirectory(tests) +endif() diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..1f5700f --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,93 @@ +version: 3.0.1.{build} + +cache: + - C:\Tools\ninja\ninja.exe + +shallow_clone: true +clone_depth: 1 + +branches: + only: + - cmake + +configuration: +- MinSizeRel +- Release +- Debug + +environment: + DIST_DIR: '%APPVEYOR_BUILD_FOLDER%\dist' + CMAKE_DIST_DIR: C:/projects/pthreads4w/dist + NINJA_DIR: C:\Tools\ninja + matrix: + - APPVEYOR_BUILD_WORKER_IMAGE: 'Visual Studio 2015' + PLATFORM: x64 + VCVARSALL: '%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat' + ARCHITECTURE: x86_amd64 + ARCHIVE: VS2015_%CONFIGURATION%_%PLATFORM%_%APPVEYOR_BUILD_NUMBER% + GENERATOR: Ninja + - APPVEYOR_BUILD_WORKER_IMAGE: 'Visual Studio 2015' + PLATFORM: x86 + VCVARSALL: '%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat' + ARCHITECTURE: x86 + ARCHIVE: VS2015_%CONFIGURATION%_%PLATFORM%_%APPVEYOR_BUILD_NUMBER% + GENERATOR: Ninja + - APPVEYOR_BUILD_WORKER_IMAGE: 'Visual Studio 2017' + PLATFORM: x64 + VCVARSALL: '%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat"' + ARCHITECTURE: + ARCHIVE: VS2017_%CONFIGURATION%_%PLATFORM%_%APPVEYOR_BUILD_NUMBER% + GENERATOR: Ninja + - APPVEYOR_BUILD_WORKER_IMAGE: 'Visual Studio 2017' + PLATFORM: x86 + VCVARSALL: '%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"' + ARCHITECTURE: + ARCHIVE: VS2017_%CONFIGURATION%_%PLATFORM%_%APPVEYOR_BUILD_NUMBER% + GENERATOR: Ninja + +init: + - echo BUILD_NUMBER=%APPVEYOR_BUILD_NUMBER% + +install: + # Ninja + - if not exist %NINJA_DIR%\ mkdir %NINJA_DIR% + - cd %NINJA_DIR% + - if not exist ninja.exe appveyor DownloadFile https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-win.zip + - if not exist ninja.exe 7z x ninja-win.zip + - set PATH=%NINJA_DIR%;%PATH% + # CMake + - cmake --version + +build: + parallel: true + +build_script: + - call "%VCVARSALL%" %ARCHITECTURE% + - cd %APPVEYOR_BUILD_FOLDER% + - mkdir build + - cd build + - cmake -G"%GENERATOR%" + -DCMAKE_BUILD_TYPE=%CONFIGURATION% + -DBUILD_NUMBER=%APPVEYOR_BUILD_NUMBER% + -DDIST_ROOT="%CMAKE_DIST_DIR%/%APPVEYOR_BUILD_WORKER_IMAGE%" + -DENABLE_TESTS=ON + .. + - cmake --build . --config %CONFIGURATION% --target install + +after_build: + - cd %DIST_DIR% + - 7z a -tzip %ARCHIVE%.zip "%APPVEYOR_BUILD_WORKER_IMAGE%" + - certutil -hashfile %ARCHIVE%.zip MD5 > %ARCHIVE%.md5 + +artifacts: + - path: dist\$(ARCHIVE).zip + - path: dist\$(ARCHIVE).md5 + +test: +before_test: + - set PATH=%APPVEYOR_BUILD_FOLDER%\build;%PATH% +test_script: + - if exist %APPVEYOR_BUILD_FOLDER%\build\tests\ cd %APPVEYOR_BUILD_FOLDER%\build\tests + - if exist %APPVEYOR_BUILD_FOLDER%\build\tests\ ctest -C %CONFIGURATION% +after_test: + # TODO process CTest output \ No newline at end of file diff --git a/cmake/common.cmake b/cmake/common.cmake new file mode 100644 index 0000000..70ead8a --- /dev/null +++ b/cmake/common.cmake @@ -0,0 +1,150 @@ + +set(PTHREAD_SRCS + ptw32_MCS_lock.c + ptw32_is_attr.c + ptw32_processInitialize.c + ptw32_processTerminate.c + ptw32_threadStart.c + ptw32_threadDestroy.c + ptw32_tkAssocCreate.c + ptw32_tkAssocDestroy.c + ptw32_callUserDestroyRoutines.c + ptw32_semwait.c + ptw32_timespec.c + ptw32_throw.c + ptw32_getprocessors.c + ptw32_calloc.c + ptw32_new.c + ptw32_reuse.c + ptw32_relmillisecs.c + ptw32_cond_check_need_init.c + ptw32_mutex_check_need_init.c + ptw32_rwlock_check_need_init.c + ptw32_rwlock_cancelwrwait.c + ptw32_spinlock_check_need_init.c + pthread_attr_init.c + pthread_attr_destroy.c + pthread_attr_getaffinity_np.c + pthread_attr_setaffinity_np.c + pthread_attr_getdetachstate.c + pthread_attr_setdetachstate.c + pthread_attr_getname_np.c + pthread_attr_setname_np.c + pthread_attr_getscope.c + pthread_attr_setscope.c + pthread_attr_getstackaddr.c + pthread_attr_setstackaddr.c + pthread_attr_getstacksize.c + pthread_attr_setstacksize.c + pthread_barrier_init.c + pthread_barrier_destroy.c + pthread_barrier_wait.c + pthread_barrierattr_init.c + pthread_barrierattr_destroy.c + pthread_barrierattr_setpshared.c + pthread_barrierattr_getpshared.c + pthread_setcancelstate.c + pthread_setcanceltype.c + pthread_testcancel.c + pthread_cancel.c + pthread_condattr_destroy.c + pthread_condattr_getpshared.c + pthread_condattr_init.c + pthread_condattr_setpshared.c + pthread_cond_destroy.c + pthread_cond_init.c + pthread_cond_signal.c + pthread_cond_wait.c + create.c + cleanup.c + dll.c + errno.c + pthread_exit.c + global.c + pthread_equal.c + pthread_getconcurrency.c + pthread_kill.c + pthread_once.c + pthread_self.c + pthread_setconcurrency.c + w32_CancelableWait.c + pthread_mutex_init.c + pthread_mutex_destroy.c + pthread_mutexattr_init.c + pthread_mutexattr_destroy.c + pthread_mutexattr_getpshared.c + pthread_mutexattr_setpshared.c + pthread_mutexattr_settype.c + pthread_mutexattr_gettype.c + pthread_mutexattr_setrobust.c + pthread_mutexattr_getrobust.c + pthread_mutex_lock.c + pthread_mutex_timedlock.c + pthread_mutex_unlock.c + pthread_mutex_trylock.c + pthread_mutex_consistent.c + pthread_mutexattr_setkind_np.c + pthread_mutexattr_getkind_np.c + pthread_getw32threadhandle_np.c + pthread_getunique_np.c + pthread_timedjoin_np.c + pthread_tryjoin_np.c + pthread_setaffinity.c + pthread_delay_np.c + pthread_num_processors_np.c + pthread_win32_attach_detach_np.c + pthread_timechange_handler_np.c + pthread_rwlock_init.c + pthread_rwlock_destroy.c + pthread_rwlockattr_init.c + pthread_rwlockattr_destroy.c + pthread_rwlockattr_getpshared.c + pthread_rwlockattr_setpshared.c + pthread_rwlock_rdlock.c + pthread_rwlock_timedrdlock.c + pthread_rwlock_wrlock.c + pthread_rwlock_timedwrlock.c + pthread_rwlock_unlock.c + pthread_rwlock_tryrdlock.c + pthread_rwlock_trywrlock.c + pthread_attr_setschedpolicy.c + pthread_attr_getschedpolicy.c + pthread_attr_setschedparam.c + pthread_attr_getschedparam.c + pthread_attr_setinheritsched.c + pthread_attr_getinheritsched.c + pthread_setschedparam.c + pthread_getschedparam.c + sched_get_priority_max.c + sched_get_priority_min.c + sched_setscheduler.c + sched_getscheduler.c + sched_yield.c + sched_setaffinity.c + sem_init.c + sem_destroy.c + sem_trywait.c + sem_timedwait.c + sem_wait.c + sem_post.c + sem_post_multiple.c + sem_getvalue.c + sem_open.c + sem_close.c + sem_unlink.c + pthread_spin_init.c + pthread_spin_destroy.c + pthread_spin_lock.c + pthread_spin_unlock.c + pthread_spin_trylock.c + pthread_detach.c + pthread_join.c + pthread_timedjoin_np.c + pthread_tryjoin_np.c + pthread_key_create.c + pthread_key_delete.c + pthread_getname_np.c + pthread_setname_np.c + pthread_setspecific.c + pthread_getspecific.c +) diff --git a/cmake/get_version.cmake b/cmake/get_version.cmake new file mode 100644 index 0000000..82e92c7 --- /dev/null +++ b/cmake/get_version.cmake @@ -0,0 +1,21 @@ + +file(READ ${CMAKE_SOURCE_DIR}/_ptw32.h _PTW32_H_CONTENTS) + +string(REGEX MATCH "#define __PTW32_VERSION_MAJOR ([a-zA-Z0-9_]+)" PTW32_VERSION_MAJOR "${_PTW32_H_CONTENTS}") +string(REPLACE "#define __PTW32_VERSION_MAJOR " "" PTW32_VERSION_MAJOR "${PTW32_VERSION_MAJOR}") + +string(REGEX MATCH "#define __PTW32_VERSION_MINOR ([a-zA-Z0-9_]+)" PTW32_VERSION_MINOR "${_PTW32_H_CONTENTS}") +string(REPLACE "#define __PTW32_VERSION_MINOR " "" PTW32_VERSION_MINOR "${PTW32_VERSION_MINOR}") + +string(REGEX MATCH "#define __PTW32_VERSION_MICRO ([a-zA-Z0-9_]+)" PTW32_VERSION_MICRO "${_PTW32_H_CONTENTS}") +string(REPLACE "#define __PTW32_VERSION_MICRO " "" PTW32_VERSION_MICRO "${PTW32_VERSION_MICRO}") + +string(REGEX MATCH "#define __PTW32_VERION_BUILD ([a-zA-Z0-9_]+)" PTW32_VERSION_BUILD "${_PTW32_H_CONTENTS}") +string(REPLACE "#define __PTW32_VERION_BUILD " "" PTW32_VERSION_BUILD "${PTW32_VERSION_BUILD}") + +if(BUILD_NUMBER) + set(PTW32_VERSION_BUILD ${BUILD_NUMBER}) +endif() + +set(PTHREADS4W_VERSION ${PTW32_VERSION_MAJOR}.${PTW32_VERSION_MINOR}.${PTW32_VERSION_MICRO}.${PTW32_VERSION_BUILD}) + diff --git a/cmake/target_arch.cmake b/cmake/target_arch.cmake new file mode 100644 index 0000000..0545044 --- /dev/null +++ b/cmake/target_arch.cmake @@ -0,0 +1,36 @@ + +set(TARGET_ARCH_DETECT_CODE " + + #if defined(_M_ARM) + #error cmake_arch ARM + #elif defined(_M_ARM64) + #error cmake_arch ARM64 + #elif defined(_M_AMD64) + #error cmake_arch x86_64 + #elif defined(_M_X64) + #error cmake_arch x64 + #elif defined(_M_IX86) + #error cmake_arch x86 + #else + #error cmake_arch unknown + #endif +") + +function(get_target_arch out) + + file(WRITE + "${CMAKE_BINARY_DIR}/target_arch_detect.c" + "${TARGET_ARCH_DETECT_CODE}") + + try_run( + run_result_unused compile_result_unused + "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/target_arch_detect.c" + COMPILE_OUTPUT_VARIABLE TARGET_ARCH) + + # parse compiler output + string(REGEX MATCH "cmake_arch ([a-zA-Z0-9_]+)" TARGET_ARCH "${TARGET_ARCH}") + string(REPLACE "cmake_arch " "" TARGET_ARCH "${TARGET_ARCH}") + + set(${out} "${TARGET_ARCH}" PARENT_SCOPE) + +endfunction() diff --git a/cmake/version.rc.in b/cmake/version.rc.in new file mode 100644 index 0000000..0afaa8d --- /dev/null +++ b/cmake/version.rc.in @@ -0,0 +1,418 @@ +/* This is an implementation of the threads API of POSIX 1003.1-2001. + * + * -------------------------------------------------------------------------- + * + * Pthreads4w - POSIX Threads for Windows + * Copyright 1998 John E. Bossom + * Copyright 1999-2018, Pthreads4w contributors + * + * Homepage: https://sourceforge.net/projects/pthreads4w/ + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * + * https://sourceforge.net/p/pthreads4w/wiki/Contributors/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "pthread.h" + +/* + * Note: the correct __PTW32_CLEANUP_* macro must be defined corresponding to + * the definition used for the object file builds. This is done in the + * relevent makefiles for the command line builds, but users should ensure + * that their resource compiler knows what it is too. + * If using the default (no __PTW32_CLEANUP_* defined), pthread.h will define it + * as __PTW32_CLEANUP_C. + */ + +#if defined (__PTW32_RC_MSC) +# if defined (__PTW32_ARCHx64) || defined (__PTW32_ARCHX64) || defined (__PTW32_ARCHAMD64) +# if defined(__PTW32_CLEANUP_C) +# define __PTW32_VERSIONINFO_NAME "pthreadVC@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "MS C x64\0" +# elif defined(__PTW32_CLEANUP_CXX) +# define __PTW32_VERSIONINFO_NAME "pthreadVCE@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "MS C++ x64\0" +# elif defined(__PTW32_CLEANUP_SEH) +# define __PTW32_VERSIONINFO_NAME "pthreadVSE@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "MS C SEH x64\0" +# endif +# elif defined (__PTW32_ARCHx86) || defined (__PTW32_ARCHX86) +# if defined(__PTW32_CLEANUP_C) +# define __PTW32_VERSIONINFO_NAME "pthreadVC@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "MS C x86\0" +# elif defined(__PTW32_CLEANUP_CXX) +# define __PTW32_VERSIONINFO_NAME "pthreadVCE@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "MS C++ x86\0" +# elif defined(__PTW32_CLEANUP_SEH) +# define __PTW32_VERSIONINFO_NAME "pthreadVSE@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "MS C SEH x86\0" +# endif +# elif defined (__PTW32_ARCHARM) || defined (__PTW32_ARCHARM) +# if defined(__PTW32_CLEANUP_C) +# define __PTW32_VERSIONINFO_NAME "pthreadVC@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "MS C ARM\0" +# elif defined(__PTW32_CLEANUP_CXX) +# define __PTW32_VERSIONINFO_NAME "pthreadVCE@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "MS C++ ARM\0" +# elif defined(__PTW32_CLEANUP_SEH) +# define __PTW32_VERSIONINFO_NAME "pthreadVSE@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "MS C SEH ARM\0" +# endif +# endif +#elif defined(__GNUC__) +# if defined(_M_X64) +# define __PTW32_ARCH "x64 (mingw64)" +# else +# define __PTW32_ARCH "x86 (mingw32)" +# endif +# if defined(__PTW32_CLEANUP_C) +# define __PTW32_VERSIONINFO_NAME "pthreadGC@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "GNU C " __PTW32_ARCH "\0" +# elif defined(__PTW32_CLEANUP_CXX) +# define __PTW32_VERSIONINFO_NAME "pthreadGCE@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "GNU C++ " __PTW32_ARCH "\0" +# else +# error Resource compiler doesn't know which cleanup style you're using - see version.rc +# endif +#elif defined(__BORLANDC__) +# if defined(_M_X64) +# define __PTW32_ARCH "x64 (Borland)" +# else +# define __PTW32_ARCH "x86 (Borland)" +# endif +# if defined(__PTW32_CLEANUP_C) +# define __PTW32_VERSIONINFO_NAME "pthreadBC@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "BORLAND C " __PTW32_ARCH "\0" +# elif defined(__PTW32_CLEANUP_CXX) +# define __PTW32_VERSIONINFO_NAME "pthreadBCE@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "BORLAND C++ " __PTW32_ARCH "\0" +# else +# error Resource compiler doesn't know which cleanup style you're using - see version.rc +# endif +#elif defined(__WATCOMC__) +# if defined(_M_X64) +# define __PTW32_ARCH "x64 (Watcom)" +# else +# define __PTW32_ARCH "x86 (Watcom)" +# endif +# if defined(__PTW32_CLEANUP_C) +# define __PTW32_VERSIONINFO_NAME "pthreadWC@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "WATCOM C " __PTW32_ARCH "\0" +# elif defined(__PTW32_CLEANUP_CXX) +# define __PTW32_VERSIONINFO_NAME "pthreadWCE@PTW32_VER@.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "WATCOM C++ " __PTW32_ARCH "\0" +# else +# error Resource compiler doesn't know which cleanup style you're using - see version.rc +# endif +#else +# error Resource compiler doesn't know which compiler you're using - see version.rc +#endif + + +VS_VERSION_INFO VERSIONINFO + FILEVERSION __PTW32_VERSION + PRODUCTVERSION __PTW32_VERSION + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "ProductName", "POSIX Threads for Windows\0" + VALUE "ProductVersion", __PTW32_VERSION_STRING + VALUE "FileVersion", __PTW32_VERSION_STRING + VALUE "FileDescription", __PTW32_VERSIONINFO_DESCRIPTION + VALUE "InternalName", __PTW32_VERSIONINFO_NAME + VALUE "OriginalFilename", __PTW32_VERSIONINFO_NAME + VALUE "CompanyName", "Open Source Software community\0" + VALUE "LegalCopyright", "Copyright - Project contributors 1999-2018\0" + VALUE "Comments", "https://sourceforge.net/p/pthreads4w/wiki/Contributors/\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +/* +VERSIONINFO Resource + +The VERSIONINFO resource-definition statement creates a version-information +resource. The resource contains such information about the file as its +version number, its intended operating system, and its original filename. +The resource is intended to be used with the Version Information functions. + +versionID VERSIONINFO fixed-info { block-statement...} + +versionID + Version-information resource identifier. This value must be 1. + +fixed-info + Version information, such as the file version and the intended operating + system. This parameter consists of the following statements. + + + Statement Description + -------------------------------------------------------------------------- + FILEVERSION + version Binary version number for the file. The version + consists of two 32-bit integers, defined by four + 16-bit integers. For example, "FILEVERSION 3,10,0,61" + is translated into two doublewords: 0x0003000a and + 0x0000003d, in that order. Therefore, if version is + defined by the DWORD values dw1 and dw2, they need + to appear in the FILEVERSION statement as follows: + HIWORD(dw1), LOWORD(dw1), HIWORD(dw2), LOWORD(dw2). + PRODUCTVERSION + version Binary version number for the product with which the + file is distributed. The version parameter is two + 32-bit integers, defined by four 16-bit integers. + For more information about version, see the + FILEVERSION description. + FILEFLAGSMASK + fileflagsmask Bits in the FILEFLAGS statement are valid. If a bit + is set, the corresponding bit in FILEFLAGS is valid. + FILEFLAGSfileflags Attributes of the file. The fileflags parameter must + be the combination of all the file flags that are + valid at compile time. For 16-bit Windows, this + value is 0x3f. + FILEOSfileos Operating system for which this file was designed. + The fileos parameter can be one of the operating + system values given in the Remarks section. + FILETYPEfiletype General type of file. The filetype parameter can be + one of the file type values listed in the Remarks + section. + FILESUBTYPE + subtype Function of the file. The subtype parameter is zero + unless the type parameter in the FILETYPE statement + is VFT_DRV, VFT_FONT, or VFT_VXD. For a list of file + subtype values, see the Remarks section. + +block-statement + Specifies one or more version-information blocks. A block can contain + string information or variable information. For more information, see + StringFileInfo Block or VarFileInfo Block. + +Remarks + +To use the constants specified with the VERSIONINFO statement, you must +include the Winver.h or Windows.h header file in the resource-definition file. + +The following list describes the parameters used in the VERSIONINFO statement: + +fileflags + A combination of the following values. + + Value Description + + VS_FF_DEBUG File contains debugging information or is compiled + with debugging features enabled. + VS_FF_PATCHED File has been modified and is not identical to the + original shipping file of the same version number. + VS_FF_PRERELEASE File is a development version, not a commercially + released product. + VS_FF_PRIVATEBUILD File was not built using standard release procedures. + If this value is given, the StringFileInfo block must + contain a PrivateBuild string. + VS_FF_SPECIALBUILD File was built by the original company using standard + release procedures but is a variation of the standard + file of the same version number. If this value is + given, the StringFileInfo block must contain a + SpecialBuild string. + +fileos + One of the following values. + + Value Description + + VOS_UNKNOWN The operating system for which the file was designed + is unknown. + VOS_DOS File was designed for MS-DOS. + VOS_NT File was designed for Windows Server 2003 family, + Windows XP, Windows 2000, or Windows NT. + VOS__WINDOWS16 File was designed for 16-bit Windows. + VOS__WINDOWS32 File was designed for 32-bit Windows. + VOS_DOS_WINDOWS16 File was designed for 16-bit Windows running with + MS-DOS. + VOS_DOS_WINDOWS32 File was designed for 32-bit Windows running with + MS-DOS. + VOS_NT_WINDOWS32 File was designed for Windows Server 2003 family, + Windows XP, Windows 2000, or Windows NT. + + The values 0x00002L, 0x00003L, 0x20000L and 0x30000L are reserved. + +filetype + One of the following values. + + Value Description + + VFT_UNKNOWN File type is unknown. + VFT_APP File contains an application. + VFT_DLL File contains a dynamic-link library (DLL). + VFT_DRV File contains a device driver. If filetype is + VFT_DRV, subtype contains a more specific + description of the driver. + VFT_FONT File contains a font. If filetype is VFT_FONT, + subtype contains a more specific description of the + font. + VFT_VXD File contains a virtual device. + VFT_STATIC_LIB File contains a static-link library. + + All other values are reserved for use by Microsoft. + +subtype + Additional information about the file type. + + If filetype specifies VFT_DRV, this parameter can be one of the + following values. + + Value Description + + VFT2_UNKNOWN Driver type is unknown. + VFT2_DRV_COMM File contains a communications driver. + VFT2_DRV_PRINTER File contains a printer driver. + VFT2_DRV_KEYBOARD File contains a keyboard driver. + VFT2_DRV_LANGUAGE File contains a language driver. + VFT2_DRV_DISPLAY File contains a display driver. + VFT2_DRV_MOUSE File contains a mouse driver. + VFT2_DRV_NETWORK File contains a network driver. + VFT2_DRV_SYSTEM File contains a system driver. + VFT2_DRV_INSTALLABLE File contains an installable driver. + VFT2_DRV_SOUND File contains a sound driver. + VFT2_DRV_VERSIONED_PRINTER File contains a versioned printer driver. + + If filetype specifies VFT_FONT, this parameter can be one of the + following values. + + Value Description + + VFT2_UNKNOWN Font type is unknown. + VFT2_FONT_RASTER File contains a raster font. + VFT2_FONT_VECTOR File contains a vector font. + VFT2_FONT_TRUETYPE File contains a TrueType font. + + If filetype specifies VFT_VXD, this parameter must be the virtual-device + identifier included in the virtual-device control block. + + All subtype values not listed here are reserved for use by Microsoft. + +langID + One of the following language codes. + + Code Language Code Language + + 0x0401 Arabic 0x0415 Polish + 0x0402 Bulgarian 0x0416 Portuguese (Brazil) + 0x0403 Catalan 0x0417 Rhaeto-Romanic + 0x0404 Traditional Chinese 0x0418 Romanian + 0x0405 Czech 0x0419 Russian + 0x0406 Danish 0x041A Croato-Serbian (Latin) + 0x0407 German 0x041B Slovak + 0x0408 Greek 0x041C Albanian + 0x0409 U.S. English 0x041D Swedish + 0x040A Castilian Spanish 0x041E Thai + 0x040B Finnish 0x041F Turkish + 0x040C French 0x0420 Urdu + 0x040D Hebrew 0x0421 Bahasa + 0x040E Hungarian 0x0804 Simplified Chinese + 0x040F Icelandic 0x0807 Swiss German + 0x0410 Italian 0x0809 U.K. English + 0x0411 Japanese 0x080A Mexican Spanish + 0x0412 Korean 0x080C Belgian French + 0x0413 Dutch 0x0C0C Canadian French + 0x0414 Norwegian ā€“ Bokmal 0x100C Swiss French + 0x0810 Swiss Italian 0x0816 Portuguese (Portugal) + 0x0813 Belgian Dutch 0x081A Serbo-Croatian (Cyrillic) + 0x0814 Norwegian ā€“ Nynorsk + +charsetID + One of the following character-set identifiers. + + Identifier Character Set + + 0 7-bit ASCII + 932 Japan (Shift %Gā€“%@ JIS X-0208) + 949 Korea (Shift %Gā€“%@ KSC 5601) + 950 Taiwan (Big5) + 1200 Unicode + 1250 Latin-2 (Eastern European) + 1251 Cyrillic + 1252 Multilingual + 1253 Greek + 1254 Turkish + 1255 Hebrew + 1256 Arabic + +string-name + One of the following predefined names. + + Name Description + + Comments Additional information that should be displayed for + diagnostic purposes. + CompanyName Company that produced the file%Gā€”%@for example, + "Microsoft Corporation" or "Standard Microsystems + Corporation, Inc." This string is required. + FileDescription File description to be presented to users. This + string may be displayed in a list box when the user + is choosing files to install%Gā€”%@for example, + "Keyboard Driver for AT-Style Keyboards". This + string is required. + FileVersion Version number of the file%Gā€”%@for example, + "3.10" or "5.00.RC2". This string is required. + InternalName Internal name of the file, if one exists ā€” for + example, a module name if the file is a dynamic-link + library. If the file has no internal name, this + string should be the original filename, without + extension. This string is required. + LegalCopyright Copyright notices that apply to the file. This + should include the full text of all notices, legal + symbols, copyright dates, and so on ā€” for example, + "Copyright (C) Microsoft Corporation 1990ā€“1999". + This string is optional. + LegalTrademarks Trademarks and registered trademarks that apply to + the file. This should include the full text of all + notices, legal symbols, trademark numbers, and so on. + This string is optional. + OriginalFilename Original name of the file, not including a path. + This information enables an application to determine + whether a file has been renamed by a user. The + format of the name depends on the file system for + which the file was created. This string is required. + PrivateBuild Information about a private version of the file ā€” for + example, "Built by TESTER1 on \TESTBED". This string + should be present only if VS_FF_PRIVATEBUILD is + specified in the fileflags parameter of the root + block. + ProductName Name of the product with which the file is + distributed. This string is required. + ProductVersion Version of the product with which the file is + distributed ā€” for example, "3.10" or "5.00.RC2". + This string is required. + SpecialBuild Text that indicates how this version of the file + differs from the standard version ā€” for example, + "Private build for TESTER1 solving mouse problems + on M250 and M250E computers". This string should be + present only if VS_FF_SPECIALBUILD is specified in + the fileflags parameter of the root block. + */ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..7d39d60 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,77 @@ + +include (CTest) + +include_directories(..) + +set(XXLIBS ws2_32.lib) + +set(VCEFLAGS "${VCEFLAGS} -D__PtW32NoCatchWarn") + +macro(add_testcase test type def) + + set(lib_test test-${test}${type}${PTW32_VER}) + set(dll_test test-dll-${test}${type}${PTW32_VER}) + + set(lib_lib libpthread${type}${PTW32_VER}) + set(dll_lib pthread${type}${PTW32_VER}) + + set(extra "") + if(${test} MATCHES "benchtest") + set(c_dep "benchlib.c") + elseif(${test} MATCHES "openmp1") + if(MSVC) + set(extra "/openmp -D_OPENMP") + endif() + endif() + + add_executable(${lib_test} ${test}.c ${c_dep}) + target_link_libraries(${lib_test} ${lib_lib}${targ_suffix}.lib ${XXLIBS}) + target_compile_definitions(${lib_test} PUBLIC "/nologo -D_CONSOLE -D_MBCS -D${def} ${extra}") + add_dependencies(${lib_test} ${lib_lib}) + + add_executable(${dll_test} ${test}.c ${c_dep}) + target_link_libraries(${dll_test} ${dll_lib}${targ_suffix}.lib ${XXLIBS}) + target_compile_definitions(${dll_test} PUBLIC "/nologo -D_CONSOLE -D_MBCS -D${def} ${extra}") + add_dependencies(${dll_test} ${dll_lib}) + + if(${CMAKE_GENERATOR} MATCHES "Visual Studio") + install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/tests/${lib_test}.exe DESTINATION ${TESTDEST}) + install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/tests/${dll_test}.exe DESTINATION ${TESTDEST}) + else() + install(FILES ${CMAKE_BINARY_DIR}/tests/${lib_test}.exe DESTINATION ${TESTDEST}) + install(FILES ${CMAKE_BINARY_DIR}/tests/${dll_test}.exe DESTINATION ${TESTDEST}) + endif() + + if(${type} MATCHES "VCE") + set_target_properties(${lib_test} PROPERTIES COMPILE_FLAGS ${VCEFLAGS}) + set_target_properties(${dll_test} PROPERTIES COMPILE_FLAGS ${VCEFLAGS}) + endif() + + add_test(NAME ${lib_test} COMMAND ${lib_test}) + add_test(NAME ${dll_test} COMMAND ${dll_test}) + +endmacro() + + +file(GLOB TESTS *.c) + +foreach(t ${TESTS}) + + get_filename_component(test ${t} NAME) + string(REPLACE ".c" "" test "${test}") + + # exclusions + if(${test} STREQUAL "benchlib") + list(REMOVE_ITEM TESTS ${t}) + continue() + elseif(${test} STREQUAL "context2") # SEGFAULT + continue() + elseif(${test} STREQUAL "tryentercs2") # SEGFAULT + continue() + endif() + + add_testcase(${test} VCE __PTW32_CLEANUP_CXX ) + add_testcase(${test} VSE __PTW32_CLEANUP_SEH ) + add_testcase(${test} VC __PTW32_CLEANUP_C ) + +endforeach(t)