1# This makefile is compatible with MS nmake and can be used as a 2# replacement for buildlib.bat. I've changed the target from an ordinary dll 3# (/LD) to a debugging dll (/LDd). 4# 5# The variables $DLLDEST and $LIBDEST hold the destination directories for the 6# dll and the lib, respectively. Probably all that needs to change is $DEVROOT. 7 8 9# DLL_VER: 10# See pthread.h and README - This number is computed as 'current - age' 11DLL_VER = 2 12DLL_VERD= $(DLL_VER)d 13 14DEVROOT = C:\pthreads 15 16DLLDEST = $(DEVROOT)\DLL 17LIBDEST = $(DEVROOT)\LIB 18HDRDEST = $(DEVROOT)\INCLUDE 19 20DLLS = pthreadVCE$(DLL_VER).dll pthreadVSE$(DLL_VER).dll pthreadVC$(DLL_VER).dll \ 21 pthreadVCE$(DLL_VERD).dll pthreadVSE$(DLL_VERD).dll pthreadVC$(DLL_VERD).dll 22INLINED_STAMPS = pthreadVCE$(DLL_VER).stamp pthreadVSE$(DLL_VER).stamp pthreadVC$(DLL_VER).stamp \ 23 pthreadVCE$(DLL_VERD).stamp pthreadVSE$(DLL_VERD).stamp pthreadVC$(DLL_VERD).stamp 24STATIC_STAMPS = pthreadVCE$(DLL_VER).static pthreadVSE$(DLL_VER).static pthreadVC$(DLL_VER).static \ 25 pthreadVCE$(DLL_VERD).static pthreadVSE$(DLL_VERD).static pthreadVC$(DLL_VERD).static 26 27OPTIM = /O2 /Ob2 28OPTIMD = 29 30CFLAGS = /W3 /MD /nologo /Yd /I. /D_WIN32_WINNT=0x400 /DHAVE_CONFIG_H 31CFLAGSD = /Zi $(CFLAGS) 32 33 34# Default cleanup style 35CLEANUP = __CLEANUP_C 36 37# C++ Exceptions 38VCEFLAGS = /GX /TP $(CFLAGS) 39VCEFLAGSD = /GX /TP $(CFLAGSD) 40#Structured Exceptions 41VSEFLAGS = $(CFLAGS) 42VSEFLAGSD = $(CFLAGSD) 43#C cleanup code 44VCFLAGS = $(CFLAGS) 45VCFLAGSD= $(CFLAGSD) 46 47DLL_INLINED_OBJS = \ 48 pthread.obj \ 49 version.res 50 51# Aggregate modules for inlinability 52DLL_OBJS = \ 53 attr.obj \ 54 barrier.obj \ 55 cancel.obj \ 56 cleanup.obj \ 57 condvar.obj \ 58 create.obj \ 59 dll.obj \ 60 errno.obj \ 61 exit.obj \ 62 fork.obj \ 63 global.obj \ 64 misc.obj \ 65 mutex.obj \ 66 nonportable.obj \ 67 private.obj \ 68 rwlock.obj \ 69 sched.obj \ 70 semaphore.obj \ 71 signal.obj \ 72 spin.obj \ 73 sync.obj \ 74 tsd.obj \ 75 version.res 76 77# Separate modules for minimising the size of statically linked images 78SMALL_STATIC_OBJS = \ 79 pthread_attr_init.obj \ 80 pthread_attr_destroy.obj \ 81 pthread_attr_getdetachstate.obj \ 82 pthread_attr_setdetachstate.obj \ 83 pthread_attr_getstackaddr.obj \ 84 pthread_attr_setstackaddr.obj \ 85 pthread_attr_getstacksize.obj \ 86 pthread_attr_setstacksize.obj \ 87 pthread_attr_getscope.obj \ 88 pthread_attr_setscope.obj \ 89 pthread_attr_setschedpolicy.obj \ 90 pthread_attr_getschedpolicy.obj \ 91 pthread_attr_setschedparam.obj \ 92 pthread_attr_getschedparam.obj \ 93 pthread_attr_setinheritsched.obj \ 94 pthread_attr_getinheritsched.obj \ 95 pthread_barrier_init.obj \ 96 pthread_barrier_destroy.obj \ 97 pthread_barrier_wait.obj \ 98 pthread_barrierattr_init.obj \ 99 pthread_barrierattr_destroy.obj \ 100 pthread_barrierattr_setpshared.obj \ 101 pthread_barrierattr_getpshared.obj \ 102 pthread_setcancelstate.obj \ 103 pthread_setcanceltype.obj \ 104 pthread_testcancel.obj \ 105 pthread_cancel.obj \ 106 cleanup.obj \ 107 pthread_condattr_destroy.obj \ 108 pthread_condattr_getpshared.obj \ 109 pthread_condattr_init.obj \ 110 pthread_condattr_setpshared.obj \ 111 pthread_cond_destroy.obj \ 112 pthread_cond_init.obj \ 113 pthread_cond_signal.obj \ 114 pthread_cond_wait.obj \ 115 create.obj \ 116 dll.obj \ 117 errno.obj \ 118 pthread_exit.obj \ 119 fork.obj \ 120 global.obj \ 121 pthread_mutex_init.obj \ 122 pthread_mutex_destroy.obj \ 123 pthread_mutexattr_init.obj \ 124 pthread_mutexattr_destroy.obj \ 125 pthread_mutexattr_getpshared.obj \ 126 pthread_mutexattr_setpshared.obj \ 127 pthread_mutexattr_settype.obj \ 128 pthread_mutexattr_gettype.obj \ 129 pthread_mutex_lock.obj \ 130 pthread_mutex_timedlock.obj \ 131 pthread_mutex_unlock.obj \ 132 pthread_mutex_trylock.obj \ 133 pthread_mutexattr_setkind_np.obj \ 134 pthread_mutexattr_getkind_np.obj \ 135 pthread_getw32threadhandle_np.obj \ 136 pthread_delay_np.obj \ 137 pthread_num_processors_np.obj \ 138 pthread_win32_attach_detach_np.obj \ 139 pthread_equal.obj \ 140 pthread_getconcurrency.obj \ 141 pthread_once.obj \ 142 pthread_self.obj \ 143 pthread_setconcurrency.obj \ 144 pthread_rwlock_init.obj \ 145 pthread_rwlock_destroy.obj \ 146 pthread_rwlockattr_init.obj \ 147 pthread_rwlockattr_destroy.obj \ 148 pthread_rwlockattr_getpshared.obj \ 149 pthread_rwlockattr_setpshared.obj \ 150 pthread_rwlock_rdlock.obj \ 151 pthread_rwlock_wrlock.obj \ 152 pthread_rwlock_unlock.obj \ 153 pthread_rwlock_tryrdlock.obj \ 154 pthread_rwlock_trywrlock.obj \ 155 pthread_setschedparam.obj \ 156 pthread_getschedparam.obj \ 157 pthread_timechange_handler_np.obj \ 158 ptw32_is_attr.obj \ 159 ptw32_processInitialize.obj \ 160 ptw32_processTerminate.obj \ 161 ptw32_threadStart.obj \ 162 ptw32_threadDestroy.obj \ 163 ptw32_tkAssocCreate.obj \ 164 ptw32_tkAssocDestroy.obj \ 165 ptw32_callUserDestroyRoutines.obj \ 166 ptw32_timespec.obj \ 167 ptw32_throw.obj \ 168 ptw32_InterlockedCompareExchange.obj \ 169 ptw32_getprocessors.obj \ 170 ptw32_calloc.obj \ 171 ptw32_new.obj \ 172 ptw32_reuse.obj \ 173 ptw32_rwlock_check_need_init.obj \ 174 ptw32_cond_check_need_init.obj \ 175 ptw32_mutex_check_need_init.obj \ 176 ptw32_semwait.obj \ 177 ptw32_relmillisecs.obj \ 178 ptw32_MCS_lock.obj \ 179 sched_get_priority_max.obj \ 180 sched_get_priority_min.obj \ 181 sched_setscheduler.obj \ 182 sched_getscheduler.obj \ 183 sched_yield.obj \ 184 sem_init.obj \ 185 sem_destroy.obj \ 186 sem_trywait.obj \ 187 sem_timedwait.obj \ 188 sem_wait.obj \ 189 sem_post.obj \ 190 sem_post_multiple.obj \ 191 sem_getvalue.obj \ 192 sem_open.obj \ 193 sem_close.obj \ 194 sem_unlink.obj \ 195 signal.obj \ 196 pthread_kill.obj \ 197 ptw32_spinlock_check_need_init.obj \ 198 pthread_spin_init.obj \ 199 pthread_spin_destroy.obj \ 200 pthread_spin_lock.obj \ 201 pthread_spin_unlock.obj \ 202 pthread_spin_trylock.obj \ 203 pthread_detach.obj \ 204 pthread_join.obj \ 205 pthread_key_create.obj \ 206 pthread_key_delete.obj \ 207 pthread_setspecific.obj \ 208 pthread_getspecific.obj \ 209 w32_CancelableWait.obj \ 210 version.res 211 212INCL = config.h implement.h semaphore.h pthread.h need_errno.h 213 214ATTR_SRCS = \ 215 pthread_attr_init.c \ 216 pthread_attr_destroy.c \ 217 pthread_attr_getdetachstate.c \ 218 pthread_attr_setdetachstate.c \ 219 pthread_attr_getstackaddr.c \ 220 pthread_attr_setstackaddr.c \ 221 pthread_attr_getstacksize.c \ 222 pthread_attr_setstacksize.c \ 223 pthread_attr_getscope.c \ 224 pthread_attr_setscope.c 225 226BARRIER_SRCS = \ 227 pthread_barrier_init.c \ 228 pthread_barrier_destroy.c \ 229 pthread_barrier_wait.c \ 230 pthread_barrierattr_init.c \ 231 pthread_barrierattr_destroy.c \ 232 pthread_barrierattr_setpshared.c \ 233 pthread_barrierattr_getpshared.c 234 235CANCEL_SRCS = \ 236 pthread_setcancelstate.c \ 237 pthread_setcanceltype.c \ 238 pthread_testcancel.c \ 239 pthread_cancel.c 240 241CONDVAR_SRCS = \ 242 ptw32_cond_check_need_init.c \ 243 pthread_condattr_destroy.c \ 244 pthread_condattr_getpshared.c \ 245 pthread_condattr_init.c \ 246 pthread_condattr_setpshared.c \ 247 pthread_cond_destroy.c \ 248 pthread_cond_init.c \ 249 pthread_cond_signal.c \ 250 pthread_cond_wait.c 251 252EXIT_SRCS = \ 253 pthread_exit.c 254 255MISC_SRCS = \ 256 pthread_equal.c \ 257 pthread_getconcurrency.c \ 258 pthread_kill.c \ 259 pthread_once.c \ 260 pthread_self.c \ 261 pthread_setconcurrency.c \ 262 ptw32_calloc.c \ 263 ptw32_MCS_lock.c \ 264 ptw32_new.c \ 265 ptw32_reuse.c \ 266 ptw32_relmillisecs.c \ 267 w32_CancelableWait.c 268 269MUTEX_SRCS = \ 270 ptw32_mutex_check_need_init.c \ 271 pthread_mutex_init.c \ 272 pthread_mutex_destroy.c \ 273 pthread_mutexattr_init.c \ 274 pthread_mutexattr_destroy.c \ 275 pthread_mutexattr_getpshared.c \ 276 pthread_mutexattr_setpshared.c \ 277 pthread_mutexattr_settype.c \ 278 pthread_mutexattr_gettype.c \ 279 pthread_mutex_lock.c \ 280 pthread_mutex_timedlock.c \ 281 pthread_mutex_unlock.c \ 282 pthread_mutex_trylock.c 283 284NONPORTABLE_SRCS = \ 285 pthread_mutexattr_setkind_np.c \ 286 pthread_mutexattr_getkind_np.c \ 287 pthread_getw32threadhandle_np.c \ 288 pthread_delay_np.c \ 289 pthread_num_processors_np.c \ 290 pthread_win32_attach_detach_np.c \ 291 pthread_timechange_handler_np.c 292 293PRIVATE_SRCS = \ 294 ptw32_is_attr.c \ 295 ptw32_processInitialize.c \ 296 ptw32_processTerminate.c \ 297 ptw32_threadStart.c \ 298 ptw32_threadDestroy.c \ 299 ptw32_tkAssocCreate.c \ 300 ptw32_tkAssocDestroy.c \ 301 ptw32_callUserDestroyRoutines.c \ 302 ptw32_semwait.c \ 303 ptw32_timespec.c \ 304 ptw32_throw.c \ 305 ptw32_InterlockedCompareExchange.c \ 306 ptw32_getprocessors.c 307 308RWLOCK_SRCS = \ 309 ptw32_rwlock_check_need_init.c \ 310 ptw32_rwlock_cancelwrwait.c \ 311 pthread_rwlock_init.c \ 312 pthread_rwlock_destroy.c \ 313 pthread_rwlockattr_init.c \ 314 pthread_rwlockattr_destroy.c \ 315 pthread_rwlockattr_getpshared.c \ 316 pthread_rwlockattr_setpshared.c \ 317 pthread_rwlock_rdlock.c \ 318 pthread_rwlock_timedrdlock.c \ 319 pthread_rwlock_wrlock.c \ 320 pthread_rwlock_timedwrlock.c \ 321 pthread_rwlock_unlock.c \ 322 pthread_rwlock_tryrdlock.c \ 323 pthread_rwlock_trywrlock.c 324 325SCHED_SRCS = \ 326 pthread_attr_setschedpolicy.c \ 327 pthread_attr_getschedpolicy.c \ 328 pthread_attr_setschedparam.c \ 329 pthread_attr_getschedparam.c \ 330 pthread_attr_setinheritsched.c \ 331 pthread_attr_getinheritsched.c \ 332 pthread_setschedparam.c \ 333 pthread_getschedparam.c \ 334 sched_get_priority_max.c \ 335 sched_get_priority_min.c \ 336 sched_setscheduler.c \ 337 sched_getscheduler.c \ 338 sched_yield.c 339 340SEMAPHORE_SRCS = \ 341 sem_init.c \ 342 sem_destroy.c \ 343 sem_trywait.c \ 344 sem_timedwait.c \ 345 sem_wait.c \ 346 sem_post.c \ 347 sem_post_multiple.c \ 348 sem_getvalue.c \ 349 sem_open.c \ 350 sem_close.c \ 351 sem_unlink.c 352 353SPIN_SRCS = \ 354 ptw32_spinlock_check_need_init.c \ 355 pthread_spin_init.c \ 356 pthread_spin_destroy.c \ 357 pthread_spin_lock.c \ 358 pthread_spin_unlock.c \ 359 pthread_spin_trylock.c 360 361SYNC_SRCS = \ 362 pthread_detach.c \ 363 pthread_join.c 364 365TSD_SRCS = \ 366 pthread_key_create.c \ 367 pthread_key_delete.c \ 368 pthread_setspecific.c \ 369 pthread_getspecific.c 370 371 372help: 373 @ echo Run one of the following command lines: 374 @ echo nmake clean VCE (to build the MSVC dll with C++ exception handling) 375 @ echo nmake clean VSE (to build the MSVC dll with structured exception handling) 376 @ echo nmake clean VC (to build the MSVC dll with C cleanup code) 377 @ echo nmake clean VCE-inlined (to build the MSVC inlined dll with C++ exception handling) 378 @ echo nmake clean VSE-inlined (to build the MSVC inlined dll with structured exception handling) 379 @ echo nmake clean VC-inlined (to build the MSVC inlined dll with C cleanup code) 380 @ echo nmake clean VC-static (to build the MSVC static lib with C cleanup code) 381 @ echo nmake clean VCE-debug (to build the debug MSVC dll with C++ exception handling) 382 @ echo nmake clean VSE-debug (to build the debug MSVC dll with structured exception handling) 383 @ echo nmake clean VC-debug (to build the debug MSVC dll with C cleanup code) 384 @ echo nmake clean VCE-inlined-debug (to build the debug MSVC inlined dll with C++ exception handling) 385 @ echo nmake clean VSE-inlined-debug (to build the debug MSVC inlined dll with structured exception handling) 386 @ echo nmake clean VC-inlined-debug (to build the debug MSVC inlined dll with C cleanup code) 387 @ echo nmake clean VC-static-debug (to build the debug MSVC static lib with C cleanup code) 388 389all: 390 @ nmake clean VCE-inlined 391 @ nmake clean VSE-inlined 392 @ nmake clean VC-inlined 393 @ nmake clean VCE-inlined-debug 394 @ nmake clean VSE-inlined-debug 395 @ nmake clean VC-inlined-debug 396 397VCE: 398 @ nmake /nologo EHFLAGS="$(OPTIM) $(VCEFLAGS)" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VER).dll 399 400VCE-debug: 401 @ nmake /nologo EHFLAGS="$(OPTIMD) $(VCEFLAGSD)" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VERD).dll 402 403VSE: 404 @ nmake /nologo EHFLAGS="$(OPTIM) $(VSEFLAGS)" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VER).dll 405 406VSE-debug: 407 @ nmake /nologo EHFLAGS="$(OPTIMD) $(VSEFLAGSD)" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VERD).dll 408 409VC: 410 @ nmake /nologo EHFLAGS="$(OPTIM) $(VCFLAGS)" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VER).dll 411 412VC-debug: 413 @ nmake /nologo EHFLAGS="$(OPTIMD) $(VCFLAGSD)" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VERD).dll 414 415# 416# The so-called inlined DLL is just a single translation unit with 417# inlining optimisation turned on. 418# 419VCE-inlined: 420 @ nmake /nologo EHFLAGS="$(OPTIM) $(VCEFLAGS) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VER).stamp 421 422VCE-inlined-debug: 423 @ nmake /nologo EHFLAGS="$(OPTIMD) $(VCEFLAGSD) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VERD).stamp 424 425VSE-inlined: 426 @ nmake /nologo EHFLAGS="$(OPTIM) $(VSEFLAGS) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VER).stamp 427 428VSE-inlined-debug: 429 @ nmake /nologo EHFLAGS="$(OPTIMD) $(VSEFLAGSD) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VERD).stamp 430 431VC-inlined: 432 @ nmake /nologo EHFLAGS="$(OPTIM) $(VCFLAGS) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VER).stamp 433 434VC-inlined-debug: 435 nmake /nologo EHFLAGS="$(OPTIMD) $(VCFLAGSD) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VERD).stamp 436 437VC-static: 438 @ nmake /nologo EHFLAGS="$(OPTIM) $(VCFLAGS) /DPTW32_BUILD_INLINED /DPTW32_STATIC_LIB" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VER).static 439 440VC-static-debug: 441 @ nmake /nologo EHFLAGS="$(OPTIMD) $(VCFLAGSD) /DPTW32_BUILD_INLINED /DPTW32_STATIC_LIB" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VERD).static 442 443realclean: clean 444 if exist pthread*.dll del pthread*.dll 445 if exist pthread*.lib del pthread*.lib 446 if exist *.stamp del *.stamp 447 448clean: 449 if exist *.obj del *.obj 450 if exist *.ilk del *.ilk 451 if exist *.pdb del *.pdb 452 if exist *.exp del *.exp 453 if exist *.map del *.map 454 if exist *.o del *.o 455 if exist *.i del *.i 456 if exist *.res del *.res 457 458 459install: $(DLLS) 460 copy pthread*.dll $(DLLDEST) 461 copy pthread*.lib $(LIBDEST) 462 copy pthread.h $(HDRDEST) 463 copy sched.h $(HDRDEST) 464 copy semaphore.h $(HDRDEST) 465 466$(DLLS): $(DLL_OBJS) 467 cl /LDd /Zi /nologo $(DLL_OBJS) \ 468 /link /nodefaultlib:libcmt /implib:$*.lib \ 469 msvcrt.lib wsock32.lib /out:$@ 470 471$(INLINED_STAMPS): $(DLL_INLINED_OBJS) 472 cl /LDd /Zi /nologo $(DLL_INLINED_OBJS) \ 473 /link /nodefaultlib:libcmt /implib:$*.lib \ 474 msvcrt.lib wsock32.lib /out:$*.dll 475 476$(STATIC_STAMPS): $(DLL_INLINED_OBJS) 477 if exist $*.lib del $*.lib 478 lib $(DLL_INLINED_OBJS) /out:$*.lib 479 480.c.obj: 481 cl $(EHFLAGS) /D$(CLEANUP) -c $< 482 483.rc.res: 484 rc /dPTW32_RC_MSC /d$(CLEANUP) $< 485 486.c.i: 487 cl /P /O2 /Ob1 $(VCFLAGS) $< 488 489attr.obj: attr.c $(ATTR_SRCS) $(INCL) 490barrier.obj: barrier.c $(BARRIER_SRCS) $(INCL) 491cancel.obj: cancel.c $(CANCEL_SRCS) $(INCL) 492condvar.obj: condvar.c $(CONDVAR_SRCS) $(INCL) 493exit.obj: exit.c $(EXIT_SRCS) $(INCL) 494misc.obj: misc.c $(MISC_SRCS) $(INCL) 495mutex.obj: mutex.c $(MUTEX_SRCS) $(INCL) 496nonportable.obj: nonportable.c $(NONPORTABLE_SRCS) $(INCL) 497private.obj: private.c $(PRIVATE_SRCS) $(INCL) 498rwlock.obj: rwlock.c $(RWLOCK_SRCS) $(INCL) 499sched.obj: sched.c $(SCHED_SRCS) $(INCL) 500semaphore.obj: semaphore.c $(SEMAPHORE_SRCS) $(INCL) 501spin.obj: spin.c $(SPIN_SRCS) $(INCL) 502sync.obj: sync.c $(SYNC_SRCS) $(INCL) 503tsd.obj: tsd.c $(TSD_SRCS) $(INCL) 504version.res: version.rc $(INCL) 505