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