# 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 CC = cl CPPFLAGS = /I. /DHAVE_PTW32_CONFIG_H XCFLAGS = /W3 /MD /nologo CFLAGS = /O2 /Ob2 $(XCFLAGS) CFLAGSD = /Z7 $(XCFLAGS) # Uncomment this if config.h defines RETAIN_WSALASTERROR #XLIBS = wsock32.lib # Default cleanup style CLEANUP = __CLEANUP_C # C++ Exceptions VCEFLAGS = /EHsc /TP $(CPPFLAGS) $(CFLAGS) VCEFLAGSD = /EHsc /TP $(CPPFLAGS) $(CFLAGSD) #Structured Exceptions VSEFLAGS = $(CPPFLAGS) $(CFLAGS) VSEFLAGSD = $(CPPFLAGS) $(CFLAGSD) #C cleanup code VCFLAGS = $(CPPFLAGS) $(CFLAGS) VCFLAGSD = $(CPPFLAGS) $(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 \ autostatic.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 \ autostatic.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_mutexattr_setrobust.obj \ pthread_mutexattr_getrobust.obj \ pthread_mutex_lock.obj \ pthread_mutex_timedlock.obj \ pthread_mutex_unlock.obj \ pthread_mutex_trylock.obj \ pthread_mutex_consistent.obj \ pthread_mutexattr_setkind_np.obj \ pthread_mutexattr_getkind_np.obj \ pthread_getw32threadhandle_np.obj \ pthread_getunique_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_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_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 NONPORTABLE_SRCS = \ pthread_mutexattr_setkind_np.c \ pthread_mutexattr_getkind_np.c \ pthread_getw32threadhandle_np.c \ pthread_getunique_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_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: @ $(MAKE) /E clean VCE-inlined @ $(MAKE) /E clean VSE-inlined @ $(MAKE) /E clean VC-inlined @ $(MAKE) /E clean VCE-inlined-debug @ $(MAKE) /E clean VSE-inlined-debug @ $(MAKE) /E clean VC-inlined-debug VCE: @ $(MAKE) /E /nologo EHFLAGS="$(VCEFLAGS)" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VER).dll VCE-debug: @ $(MAKE) /E /nologo EHFLAGS="$(VCEFLAGSD)" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VERD).dll VSE: @ $(MAKE) /E /nologo EHFLAGS="$(VSEFLAGS)" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VER).dll VSE-debug: @ $(MAKE) /E /nologo EHFLAGS="$(VSEFLAGSD)" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VERD).dll VC: @ $(MAKE) /E /nologo EHFLAGS="$(VCFLAGS)" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VER).dll VC-debug: @ $(MAKE) /E /nologo EHFLAGS="$(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: @ $(MAKE) /E /nologo EHFLAGS="$(VCEFLAGS) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VER).stamp VCE-inlined-debug: @ $(MAKE) /E /nologo EHFLAGS="$(VCEFLAGSD) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VERD).stamp VSE-inlined: @ $(MAKE) /E /nologo EHFLAGS="$(VSEFLAGS) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VER).stamp VSE-inlined-debug: @ $(MAKE) /E /nologo EHFLAGS="$(VSEFLAGSD) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VERD).stamp VC-inlined: @ $(MAKE) /E /nologo EHFLAGS="$(VCFLAGS) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VER).stamp VC-inlined-debug: @ $(MAKE) /E /nologo EHFLAGS="$(VCFLAGSD) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VERD).stamp VC-static: @ $(MAKE) /E /nologo EHFLAGS="$(VCFLAGS) /DPTW32_BUILD_INLINED /DPTW32_STATIC_LIB" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VER).static VC-static-debug: @ $(MAKE) /E /nologo EHFLAGS="$(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 *.manifest del *.manifest if exist *.stamp del *.stamp clean: if exist *.obj del *.obj if exist *.def del *.def 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: copy pthread*.dll $(DLLDEST) copy pthread*.lib $(LIBDEST) copy pthread.h $(HDRDEST) copy sched.h $(HDRDEST) copy semaphore.h $(HDRDEST) $(DLLS): $(DLL_OBJS) $(CC) /LDd /Zi /nologo $(DLL_OBJS) /link /implib:$*.lib $(XLIBS) /out:$@ $(INLINED_STAMPS): $(DLL_INLINED_OBJS) $(CC) /LDd /Zi /nologo $(DLL_INLINED_OBJS) /link /implib:$*.lib $(XLIBS) /out:$*.dll $(STATIC_STAMPS): $(DLL_INLINED_OBJS) if exist $*.lib del $*.lib lib $(DLL_INLINED_OBJS) /out:$*.lib .c.obj: $(CC) $(EHFLAGS) /D$(CLEANUP) -c $< # TARGET_CPU is an environment variable set by Visual Studio Command Prompt # as provided by the SDK .rc.res: rc /dPTW32_ARCH$(TARGET_CPU) /dPTW32_RC_MSC /d$(CLEANUP) $< .c.i: $(CC) /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)