| # This makefile is compatible with MS nmake and can be used as a |
| # replacement for buildlib.bat. I've changed the target from an ordinary dll |
| # (/LD) to a debugging dll (/LDd). |
| # |
| # The variables $DLLDEST and $LIBDEST hold the destination directories for the |
| # dll and the lib, respectively. Probably all that needs to change is $DEVROOT. |
| |
| |
| # DLL_VER: |
| # See pthread.h and README - This number is computed as 'current - age' |
| DLL_VER = 2 |
| DLL_VERD= $(DLL_VER)d |
| |
| DEVROOT = C:\pthreads |
| |
| DLLDEST = $(DEVROOT)\DLL |
| LIBDEST = $(DEVROOT)\LIB |
| HDRDEST = $(DEVROOT)\INCLUDE |
| |
| DLLS = pthreadVCE$(DLL_VER).dll pthreadVSE$(DLL_VER).dll pthreadVC$(DLL_VER).dll \ |
| pthreadVCE$(DLL_VERD).dll pthreadVSE$(DLL_VERD).dll pthreadVC$(DLL_VERD).dll |
| INLINED_STAMPS = pthreadVCE$(DLL_VER).stamp pthreadVSE$(DLL_VER).stamp pthreadVC$(DLL_VER).stamp \ |
| pthreadVCE$(DLL_VERD).stamp pthreadVSE$(DLL_VERD).stamp pthreadVC$(DLL_VERD).stamp |
| STATIC_STAMPS = pthreadVCE$(DLL_VER).static pthreadVSE$(DLL_VER).static pthreadVC$(DLL_VER).static \ |
| pthreadVCE$(DLL_VERD).static pthreadVSE$(DLL_VERD).static pthreadVC$(DLL_VERD).static |
| |
| OPTIM = /O2 /Ob2 |
| OPTIMD = |
| |
| CFLAGS = /W3 /MD /nologo /Yd /I. /D_WIN32_WINNT=0x400 /DHAVE_CONFIG_H |
| CFLAGSD = /Zi $(CFLAGS) |
| |
| |
| # Default cleanup style |
| CLEANUP = __CLEANUP_C |
| |
| # C++ Exceptions |
| VCEFLAGS = /GX /TP $(CFLAGS) |
| VCEFLAGSD = /GX /TP $(CFLAGSD) |
| #Structured Exceptions |
| VSEFLAGS = $(CFLAGS) |
| VSEFLAGSD = $(CFLAGSD) |
| #C cleanup code |
| VCFLAGS = $(CFLAGS) |
| VCFLAGSD= $(CFLAGSD) |
| |
| DLL_INLINED_OBJS = \ |
| pthread.obj \ |
| version.res |
| |
| # Aggregate modules for inlinability |
| DLL_OBJS = \ |
| attr.obj \ |
| barrier.obj \ |
| cancel.obj \ |
| cleanup.obj \ |
| condvar.obj \ |
| create.obj \ |
| dll.obj \ |
| errno.obj \ |
| exit.obj \ |
| fork.obj \ |
| global.obj \ |
| misc.obj \ |
| mutex.obj \ |
| nonportable.obj \ |
| private.obj \ |
| rwlock.obj \ |
| sched.obj \ |
| semaphore.obj \ |
| signal.obj \ |
| spin.obj \ |
| sync.obj \ |
| tsd.obj \ |
| version.res |
| |
| # Separate modules for minimising the size of statically linked images |
| SMALL_STATIC_OBJS = \ |
| pthread_attr_init.obj \ |
| pthread_attr_destroy.obj \ |
| pthread_attr_getdetachstate.obj \ |
| pthread_attr_setdetachstate.obj \ |
| pthread_attr_getstackaddr.obj \ |
| pthread_attr_setstackaddr.obj \ |
| pthread_attr_getstacksize.obj \ |
| pthread_attr_setstacksize.obj \ |
| pthread_attr_getscope.obj \ |
| pthread_attr_setscope.obj \ |
| pthread_attr_setschedpolicy.obj \ |
| pthread_attr_getschedpolicy.obj \ |
| pthread_attr_setschedparam.obj \ |
| pthread_attr_getschedparam.obj \ |
| pthread_attr_setinheritsched.obj \ |
| pthread_attr_getinheritsched.obj \ |
| pthread_barrier_init.obj \ |
| pthread_barrier_destroy.obj \ |
| pthread_barrier_wait.obj \ |
| pthread_barrierattr_init.obj \ |
| pthread_barrierattr_destroy.obj \ |
| pthread_barrierattr_setpshared.obj \ |
| pthread_barrierattr_getpshared.obj \ |
| pthread_setcancelstate.obj \ |
| pthread_setcanceltype.obj \ |
| pthread_testcancel.obj \ |
| pthread_cancel.obj \ |
| cleanup.obj \ |
| pthread_condattr_destroy.obj \ |
| pthread_condattr_getpshared.obj \ |
| pthread_condattr_init.obj \ |
| pthread_condattr_setpshared.obj \ |
| pthread_cond_destroy.obj \ |
| pthread_cond_init.obj \ |
| pthread_cond_signal.obj \ |
| pthread_cond_wait.obj \ |
| create.obj \ |
| dll.obj \ |
| errno.obj \ |
| pthread_exit.obj \ |
| fork.obj \ |
| global.obj \ |
| pthread_mutex_init.obj \ |
| pthread_mutex_destroy.obj \ |
| pthread_mutexattr_init.obj \ |
| pthread_mutexattr_destroy.obj \ |
| pthread_mutexattr_getpshared.obj \ |
| pthread_mutexattr_setpshared.obj \ |
| pthread_mutexattr_settype.obj \ |
| pthread_mutexattr_gettype.obj \ |
| pthread_mutex_lock.obj \ |
| pthread_mutex_timedlock.obj \ |
| pthread_mutex_unlock.obj \ |
| pthread_mutex_trylock.obj \ |
| pthread_mutexattr_setkind_np.obj \ |
| pthread_mutexattr_getkind_np.obj \ |
| pthread_getw32threadhandle_np.obj \ |
| pthread_delay_np.obj \ |
| pthread_num_processors_np.obj \ |
| pthread_win32_attach_detach_np.obj \ |
| pthread_equal.obj \ |
| pthread_getconcurrency.obj \ |
| pthread_once.obj \ |
| pthread_self.obj \ |
| pthread_setconcurrency.obj \ |
| pthread_rwlock_init.obj \ |
| pthread_rwlock_destroy.obj \ |
| pthread_rwlockattr_init.obj \ |
| pthread_rwlockattr_destroy.obj \ |
| pthread_rwlockattr_getpshared.obj \ |
| pthread_rwlockattr_setpshared.obj \ |
| pthread_rwlock_rdlock.obj \ |
| pthread_rwlock_wrlock.obj \ |
| pthread_rwlock_unlock.obj \ |
| pthread_rwlock_tryrdlock.obj \ |
| pthread_rwlock_trywrlock.obj \ |
| pthread_setschedparam.obj \ |
| pthread_getschedparam.obj \ |
| pthread_timechange_handler_np.obj \ |
| ptw32_is_attr.obj \ |
| ptw32_processInitialize.obj \ |
| ptw32_processTerminate.obj \ |
| ptw32_threadStart.obj \ |
| ptw32_threadDestroy.obj \ |
| ptw32_tkAssocCreate.obj \ |
| ptw32_tkAssocDestroy.obj \ |
| ptw32_callUserDestroyRoutines.obj \ |
| ptw32_timespec.obj \ |
| ptw32_throw.obj \ |
| ptw32_InterlockedCompareExchange.obj \ |
| ptw32_getprocessors.obj \ |
| ptw32_calloc.obj \ |
| ptw32_new.obj \ |
| ptw32_reuse.obj \ |
| ptw32_rwlock_check_need_init.obj \ |
| ptw32_cond_check_need_init.obj \ |
| ptw32_mutex_check_need_init.obj \ |
| ptw32_semwait.obj \ |
| ptw32_relmillisecs.obj \ |
| ptw32_MCS_lock.obj \ |
| sched_get_priority_max.obj \ |
| sched_get_priority_min.obj \ |
| sched_setscheduler.obj \ |
| sched_getscheduler.obj \ |
| sched_yield.obj \ |
| sem_init.obj \ |
| sem_destroy.obj \ |
| sem_trywait.obj \ |
| sem_timedwait.obj \ |
| sem_wait.obj \ |
| sem_post.obj \ |
| sem_post_multiple.obj \ |
| sem_getvalue.obj \ |
| sem_open.obj \ |
| sem_close.obj \ |
| sem_unlink.obj \ |
| signal.obj \ |
| pthread_kill.obj \ |
| ptw32_spinlock_check_need_init.obj \ |
| pthread_spin_init.obj \ |
| pthread_spin_destroy.obj \ |
| pthread_spin_lock.obj \ |
| pthread_spin_unlock.obj \ |
| pthread_spin_trylock.obj \ |
| pthread_detach.obj \ |
| pthread_join.obj \ |
| pthread_key_create.obj \ |
| pthread_key_delete.obj \ |
| pthread_setspecific.obj \ |
| pthread_getspecific.obj \ |
| w32_CancelableWait.obj \ |
| version.res |
| |
| INCL = config.h implement.h semaphore.h pthread.h need_errno.h |
| |
| ATTR_SRCS = \ |
| pthread_attr_init.c \ |
| pthread_attr_destroy.c \ |
| pthread_attr_getdetachstate.c \ |
| pthread_attr_setdetachstate.c \ |
| pthread_attr_getstackaddr.c \ |
| pthread_attr_setstackaddr.c \ |
| pthread_attr_getstacksize.c \ |
| pthread_attr_setstacksize.c \ |
| pthread_attr_getscope.c \ |
| pthread_attr_setscope.c |
| |
| BARRIER_SRCS = \ |
| 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 |
| |
| CANCEL_SRCS = \ |
| pthread_setcancelstate.c \ |
| pthread_setcanceltype.c \ |
| pthread_testcancel.c \ |
| pthread_cancel.c |
| |
| CONDVAR_SRCS = \ |
| ptw32_cond_check_need_init.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 |
| |
| EXIT_SRCS = \ |
| pthread_exit.c |
| |
| MISC_SRCS = \ |
| pthread_equal.c \ |
| pthread_getconcurrency.c \ |
| pthread_kill.c \ |
| pthread_once.c \ |
| pthread_self.c \ |
| pthread_setconcurrency.c \ |
| ptw32_calloc.c \ |
| ptw32_MCS_lock.c \ |
| ptw32_new.c \ |
| ptw32_reuse.c \ |
| ptw32_relmillisecs.c \ |
| w32_CancelableWait.c |
| |
| MUTEX_SRCS = \ |
| ptw32_mutex_check_need_init.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_mutex_lock.c \ |
| pthread_mutex_timedlock.c \ |
| pthread_mutex_unlock.c \ |
| pthread_mutex_trylock.c |
| |
| NONPORTABLE_SRCS = \ |
| pthread_mutexattr_setkind_np.c \ |
| pthread_mutexattr_getkind_np.c \ |
| pthread_getw32threadhandle_np.c \ |
| pthread_delay_np.c \ |
| pthread_num_processors_np.c \ |
| pthread_win32_attach_detach_np.c \ |
| pthread_timechange_handler_np.c |
| |
| PRIVATE_SRCS = \ |
| 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_InterlockedCompareExchange.c \ |
| ptw32_getprocessors.c |
| |
| RWLOCK_SRCS = \ |
| ptw32_rwlock_check_need_init.c \ |
| ptw32_rwlock_cancelwrwait.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 |
| |
| SCHED_SRCS = \ |
| 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 |
| |
| SEMAPHORE_SRCS = \ |
| 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 |
| |
| SPIN_SRCS = \ |
| ptw32_spinlock_check_need_init.c \ |
| pthread_spin_init.c \ |
| pthread_spin_destroy.c \ |
| pthread_spin_lock.c \ |
| pthread_spin_unlock.c \ |
| pthread_spin_trylock.c |
| |
| SYNC_SRCS = \ |
| pthread_detach.c \ |
| pthread_join.c |
| |
| TSD_SRCS = \ |
| pthread_key_create.c \ |
| pthread_key_delete.c \ |
| pthread_setspecific.c \ |
| pthread_getspecific.c |
| |
| |
| help: |
| @ echo Run one of the following command lines: |
| @ echo nmake clean VCE (to build the MSVC dll with C++ exception handling) |
| @ echo nmake clean VSE (to build the MSVC dll with structured exception handling) |
| @ echo nmake clean VC (to build the MSVC dll with C cleanup code) |
| @ echo nmake clean VCE-inlined (to build the MSVC inlined dll with C++ exception handling) |
| @ echo nmake clean VSE-inlined (to build the MSVC inlined dll with structured exception handling) |
| @ echo nmake clean VC-inlined (to build the MSVC inlined dll with C cleanup code) |
| @ echo nmake clean VC-static (to build the MSVC static lib with C cleanup code) |
| @ echo nmake clean VCE-debug (to build the debug MSVC dll with C++ exception handling) |
| @ echo nmake clean VSE-debug (to build the debug MSVC dll with structured exception handling) |
| @ echo nmake clean VC-debug (to build the debug MSVC dll with C cleanup code) |
| @ echo nmake clean VCE-inlined-debug (to build the debug MSVC inlined dll with C++ exception handling) |
| @ echo nmake clean VSE-inlined-debug (to build the debug MSVC inlined dll with structured exception handling) |
| @ echo nmake clean VC-inlined-debug (to build the debug MSVC inlined dll with C cleanup code) |
| @ echo nmake clean VC-static-debug (to build the debug MSVC static lib with C cleanup code) |
| |
| all: |
| @ nmake clean VCE-inlined |
| @ nmake clean VSE-inlined |
| @ nmake clean VC-inlined |
| @ nmake clean VCE-inlined-debug |
| @ nmake clean VSE-inlined-debug |
| @ nmake clean VC-inlined-debug |
| |
| VCE: |
| @ nmake /nologo EHFLAGS="$(OPTIM) $(VCEFLAGS)" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VER).dll |
| |
| VCE-debug: |
| @ nmake /nologo EHFLAGS="$(OPTIMD) $(VCEFLAGSD)" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VERD).dll |
| |
| VSE: |
| @ nmake /nologo EHFLAGS="$(OPTIM) $(VSEFLAGS)" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VER).dll |
| |
| VSE-debug: |
| @ nmake /nologo EHFLAGS="$(OPTIMD) $(VSEFLAGSD)" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VERD).dll |
| |
| VC: |
| @ nmake /nologo EHFLAGS="$(OPTIM) $(VCFLAGS)" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VER).dll |
| |
| VC-debug: |
| @ nmake /nologo EHFLAGS="$(OPTIMD) $(VCFLAGSD)" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VERD).dll |
| |
| # |
| # The so-called inlined DLL is just a single translation unit with |
| # inlining optimisation turned on. |
| # |
| VCE-inlined: |
| @ nmake /nologo EHFLAGS="$(OPTIM) $(VCEFLAGS) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VER).stamp |
| |
| VCE-inlined-debug: |
| @ nmake /nologo EHFLAGS="$(OPTIMD) $(VCEFLAGSD) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VERD).stamp |
| |
| VSE-inlined: |
| @ nmake /nologo EHFLAGS="$(OPTIM) $(VSEFLAGS) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VER).stamp |
| |
| VSE-inlined-debug: |
| @ nmake /nologo EHFLAGS="$(OPTIMD) $(VSEFLAGSD) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VERD).stamp |
| |
| VC-inlined: |
| @ nmake /nologo EHFLAGS="$(OPTIM) $(VCFLAGS) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VER).stamp |
| |
| VC-inlined-debug: |
| nmake /nologo EHFLAGS="$(OPTIMD) $(VCFLAGSD) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VERD).stamp |
| |
| VC-static: |
| @ nmake /nologo EHFLAGS="$(OPTIM) $(VCFLAGS) /DPTW32_BUILD_INLINED /DPTW32_STATIC_LIB" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VER).static |
| |
| VC-static-debug: |
| @ nmake /nologo EHFLAGS="$(OPTIMD) $(VCFLAGSD) /DPTW32_BUILD_INLINED /DPTW32_STATIC_LIB" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VERD).static |
| |
| realclean: clean |
| if exist pthread*.dll del pthread*.dll |
| if exist pthread*.lib del pthread*.lib |
| if exist *.stamp del *.stamp |
| |
| clean: |
| if exist *.obj del *.obj |
| if exist *.ilk del *.ilk |
| if exist *.pdb del *.pdb |
| if exist *.exp del *.exp |
| if exist *.map del *.map |
| if exist *.o del *.o |
| if exist *.i del *.i |
| if exist *.res del *.res |
| |
| |
| install: $(DLLS) |
| copy pthread*.dll $(DLLDEST) |
| copy pthread*.lib $(LIBDEST) |
| copy pthread.h $(HDRDEST) |
| copy sched.h $(HDRDEST) |
| copy semaphore.h $(HDRDEST) |
| |
| $(DLLS): $(DLL_OBJS) |
| cl /LDd /Zi /nologo $(DLL_OBJS) \ |
| /link /nodefaultlib:libcmt /implib:$*.lib \ |
| msvcrt.lib wsock32.lib /out:$@ |
| |
| $(INLINED_STAMPS): $(DLL_INLINED_OBJS) |
| cl /LDd /Zi /nologo $(DLL_INLINED_OBJS) \ |
| /link /nodefaultlib:libcmt /implib:$*.lib \ |
| msvcrt.lib wsock32.lib /out:$*.dll |
| |
| $(STATIC_STAMPS): $(DLL_INLINED_OBJS) |
| if exist $*.lib del $*.lib |
| lib $(DLL_INLINED_OBJS) /out:$*.lib |
| |
| .c.obj: |
| cl $(EHFLAGS) /D$(CLEANUP) -c $< |
| |
| .rc.res: |
| rc /dPTW32_RC_MSC /d$(CLEANUP) $< |
| |
| .c.i: |
| cl /P /O2 /Ob1 $(VCFLAGS) $< |
| |
| attr.obj: attr.c $(ATTR_SRCS) $(INCL) |
| barrier.obj: barrier.c $(BARRIER_SRCS) $(INCL) |
| cancel.obj: cancel.c $(CANCEL_SRCS) $(INCL) |
| condvar.obj: condvar.c $(CONDVAR_SRCS) $(INCL) |
| exit.obj: exit.c $(EXIT_SRCS) $(INCL) |
| misc.obj: misc.c $(MISC_SRCS) $(INCL) |
| mutex.obj: mutex.c $(MUTEX_SRCS) $(INCL) |
| nonportable.obj: nonportable.c $(NONPORTABLE_SRCS) $(INCL) |
| private.obj: private.c $(PRIVATE_SRCS) $(INCL) |
| rwlock.obj: rwlock.c $(RWLOCK_SRCS) $(INCL) |
| sched.obj: sched.c $(SCHED_SRCS) $(INCL) |
| semaphore.obj: semaphore.c $(SEMAPHORE_SRCS) $(INCL) |
| spin.obj: spin.c $(SPIN_SRCS) $(INCL) |
| sync.obj: sync.c $(SYNC_SRCS) $(INCL) |
| tsd.obj: tsd.c $(TSD_SRCS) $(INCL) |
| version.res: version.rc $(INCL) |