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