Home | History | Annotate | Line # | Download | only in libpthread
Makefile revision 1.103
      1 #	$NetBSD: Makefile,v 1.103 2025/11/23 22:11:41 riastradh Exp $
      2 #
      3 
      4 NOSANITIZER=	# defined
      5 WARNS?=	5
      6 LIB=	pthread
      7 
      8 .include <bsd.own.mk>
      9 
     10 USE_SHLIBDIR=	yes
     11 
     12 .if defined(PTHREAD_MACHINE_ARCH) && !empty(PTHREAD_MACHINE_ARCH) && \
     13     exists(${.CURDIR}/arch/${PTHREAD_MACHINE_ARCH})
     14 ARCHSUBDIR=	${PTHREAD_MACHINE_ARCH}
     15 .elif defined(PTHREAD_MACHINE_CPU) && !empty(PTHREAD_MACHINE_CPU) && \
     16     exists(${.CURDIR}/arch/${PTHREAD_MACHINE_CPU})
     17 ARCHSUBDIR=	${PTHREAD_MACHINE_CPU}
     18 .elif exists(${.CURDIR}/arch/${MACHINE_ARCH})
     19 ARCHSUBDIR=	${MACHINE_ARCH}
     20 .elif exists(${.CURDIR}/arch/${MACHINE_CPU})
     21 ARCHSUBDIR=	${MACHINE_CPU}
     22 .else
     23 .BEGIN:
     24 	@echo "WARNING: no ARCHSUBDIR for ${MACHINE_ARCH}/${MACHINE_CPU}; skipping..."
     25 .endif
     26 
     27 INCS=	pthread.h pthread_types.h pthread_queue.h
     28 INCSDIR=/usr/include
     29 
     30 .if defined(ARCHSUBDIR)
     31 
     32 ARCHDIR=	${.CURDIR}/arch/${ARCHSUBDIR}
     33 .PATH:	${ARCHDIR}
     34 
     35 EXPSYM_SRCS+=	pthread_mi.expsym
     36 .  if ${MACHINE_ARCH} == "alpha" || ${MACHINE_ARCH} == "hppa"
     37 # PTHREAD__ASM_RASOPS
     38 EXPSYM_SRCS+=	pthread_md.expsym
     39 .  else
     40 # !PTHREAD__ASM_RASOPS
     41 # XXX These really shouldn't be exported.
     42 EXPSYM_SRCS+=	pthread_ras.expsym
     43 .  endif
     44 
     45 LIB_EXPSYM=	pthread.expsym
     46 pthread.expsym: ${EXPSYM_SRCS}
     47 	${_MKTARGET_CREATE}
     48 	LC_ALL=C sort -m ${.ALLSRC} >${.TARGET}.tmp && \
     49 	${MV} ${.TARGET}.tmp ${.TARGET}
     50 CLEANFILES+=	pthread.expsym pthread.expsym.tmp
     51 
     52 CPPFLAGS+=	-I${ARCHDIR} -I${.CURDIR} -I${.OBJDIR} -D_LIBC -D_REENTRANT
     53 CPPFLAGS+=	-I${.CURDIR}/../libc/include
     54 CPPFLAGS+=	-D__LIBPTHREAD_SOURCE__ -D__LIBC_THREAD_STUBS
     55 
     56 # Since <pthread.h> is not used, allow declaring pthread_create and
     57 # friends locally.
     58 CWARNFLAGS.clang+=	-Wno-builtin-requires-header
     59 
     60 # XXX: This crappy poke at libc's internals needs to be fixed.
     61 CPPFLAGS+=-I${NETBSDSRCDIR}/sys -I${.CURDIR}/../libc
     62 
     63 # providing alternative MI implementations for creating an lwp is
     64 # possible by setting PTHREAD_MAKELWP.  Currently, alternatives are
     65 # set by the rumprun software stacks (see https://github.com/rumpkernel/rumprun )
     66 PTHREAD_MAKELWP?=	pthread_makelwp_netbsd.c
     67 
     68 # Prevent unloading libpthread.
     69 #
     70 # libpthread provides strong definitions of some symbols defined weakly
     71 # by libc, such as pthread_mutex_lock (actually __libc_mutex_lock under
     72 # the hood), which are used in libraries that take locks for
     73 # thread-safety -- this way, in non-threaded applications,
     74 # pthread_mutex_lock is a cheap noop libc stub, while in threaded
     75 # applications, it's a real libpthread operation.  If libpthread is
     76 # dlopened, the symbol might be lazily resolved _after_ it is dlopened
     77 # to point at libpthread; then it cannot be safely unloaded, because
     78 # there's no way to roll back symbol resolution.
     79 #
     80 # PR lib/59784: dlopening and dlclosing libpthread is broken
     81 #
     82 LDADD+=		-Wl,-z,nodelete
     83 
     84 #
     85 # NOTE: When you create a new file for libpthread, make sure that pthread.c
     86 # gets a reference to a symbol in that file.  Otherwise, Unix's stupid static
     87 # library semantics will end up discarding potentially important objects.
     88 #
     89 SRCS=	pthread.c
     90 SRCS+=	pthread_attr.c
     91 SRCS+=	pthread_barrier.c
     92 # used by rumprun-posix to work around symbol collisions
     93 .if ${PTHREAD_CANCELSTUB:Uyes} != "no"
     94 SRCS+=	pthread_cancelstub.c
     95 .endif
     96 SRCS+=	pthread_cond.c
     97 SRCS+=	pthread_getcpuclockid.c
     98 SRCS+=	pthread_lock.c
     99 SRCS+=	${PTHREAD_MAKELWP}
    100 SRCS+=	pthread_misc.c
    101 SRCS+=	pthread_mutex.c
    102 SRCS+=	pthread_once.c
    103 SRCS+=	pthread_rwlock.c
    104 SRCS+=	pthread_specific.c
    105 SRCS+=	pthread_spin.c
    106 SRCS+=	pthread_tsd.c
    107 SRCS+=	res_state.c
    108 .PATH: ${.CURDIR}/../librt
    109 SRCS+=	sem.c
    110 # Architecture-dependent files
    111 .if exists(${ARCHDIR}/pthread_md.S)
    112 SRCS+= pthread_md.S
    113 .endif
    114 .if exists(${ARCHDIR}/Makefile.inc)
    115 .include "${ARCHDIR}/Makefile.inc"
    116 .endif
    117 
    118 # The PTHREAD__COMPAT flag builds a libpthread that can be dropped
    119 # into a NetBSD 2/3/4 chroot with a NetBSD 5 or later kernel.
    120 # This makes threading work in the chroot, no other modifications
    121 # required.
    122 #
    123 .if defined(PTHREAD__COMPAT)
    124 SRCS+=		pthread_compat.c
    125 .PATH.c:	${.CURDIR}/../../common/lib/libc/arch/${ARCHSUBDIR}/atomic
    126 .PATH.S:	${.CURDIR}/../../common/lib/libc/arch/${ARCHSUBDIR}/atomic
    127 .PATH.c:	${.CURDIR}/../../common/lib/libc/atomic
    128 .PATH.c:	${.CURDIR}/../libc/misc
    129 .include "../../common/lib/libc/arch/${ARCHSUBDIR}/atomic/Makefile.inc"
    130 .endif
    131 
    132 ALIGN_FUNCTIONS=	${${ACTIVE_CC} == "gcc":? -falign-functions=32 :}
    133 
    134 # The TSD routines are used in the implementation of profiling, and so
    135 # can't be profiled themselves.
    136 COPTS.pthread_specific.c+=	${ALIGN_FUNCTIONS}
    137 pthread_specific.po: pthread_specific.o
    138 	${_MKTARGET_CREATE}
    139 	cp pthread_specific.o pthread_specific.po
    140 
    141 COPTS.pthread.c += -Wno-stack-protector -Wno-format-nonliteral
    142 COPTS.pthread_attr.c += -Wno-format-nonliteral
    143 
    144 LINTFLAGS+=	-Ac11		# for _Atomic
    145 
    146 MAN+=	affinity.3 pthread.3 \
    147 	pthread_attr.3 \
    148 	pthread_attr_get_np.3 \
    149 	pthread_attr_getdetachstate.3 \
    150 	pthread_attr_getguardsize.3 \
    151 	pthread_attr_getinheritsched.3 \
    152 	pthread_attr_getname_np.3 \
    153 	pthread_attr_getschedparam.3 \
    154 	pthread_attr_getscope.3 \
    155 	pthread_attr_getstack.3 \
    156 	pthread_attr_setcreatesuspend_np.3 \
    157 	pthread_barrier.3 pthread_barrierattr.3 \
    158 	pthread_cancel.3 pthread_cleanup_push.3 \
    159 	pthread_cond.3 pthread_condattr.3 \
    160 	pthread_create.3 pthread_detach.3 pthread_equal.3 \
    161 	pthread_curcpu_np.3 \
    162 	pthread_exit.3 \
    163 	pthread_getcpuclockid.3 \
    164 	pthread_getname_np.3 \
    165 	pthread_getspecific.3 pthread_join.3 \
    166 	pthread_key_create.3 pthread_kill.3 \
    167 	pthread_mutex.3 pthread_mutexattr.3 \
    168 	pthread_once.3 pthread_rwlock.3 pthread_rwlockattr.3 \
    169 	pthread_schedparam.3 pthread_self.3 \
    170 	pthread_sigmask.3 pthread_spin.3 \
    171 	pthread_suspend_np.3 pthread_testcancel.3
    172 
    173 MLINKS+=	pthread_attr_get_np.3 pthread_getattr_np.3
    174 MLINKS+=	affinity.3 pthread_setaffinity_np.3
    175 MLINKS+=	affinity.3 pthread_getaffinity_np.3
    176 
    177 MLINKS+=	pthread_attr.3 pthread_attr_init.3
    178 MLINKS+=	pthread_attr.3 pthread_attr_destroy.3
    179 
    180 MLINKS+=	pthread_attr_getdetachstate.3 pthread_attr_setdetachstate.3
    181 MLINKS+=	pthread_attr_getguardsize.3 pthread_attr_setguardsize.3
    182 MLINKS+=	pthread_attr_getinheritsched.3 pthread_attr_setinheritsched.3
    183 MLINKS+=	pthread_attr_getname_np.3 pthread_attr_setname_np.3
    184 
    185 MLINKS+=	pthread_attr_getschedparam.3 pthread_attr_setschedparam.3 \
    186 		pthread_attr_getschedparam.3 pthread_attr_getschedpolicy.3 \
    187 		pthread_attr_getschedparam.3 pthread_attr_setschedpolicy.3
    188 
    189 MLINKS+=	pthread_attr_getscope.3 pthread_attr_setscope.3
    190 
    191 MLINKS+=	pthread_attr_getstack.3 pthread_attr_setstack.3 \
    192 		pthread_attr_getstack.3 pthread_attr_getstacksize.3 \
    193 		pthread_attr_getstack.3 pthread_attr_setstacksize.3 \
    194 		pthread_attr_getstack.3 pthread_attr_getstackaddr.3 \
    195 		pthread_attr_getstack.3 pthread_attr_setstackaddr.3
    196 
    197 MLINKS+=	pthread_cleanup_push.3 pthread_cleanup_pop.3
    198 
    199 MLINKS+=	pthread_barrier.3 pthread_barrier_init.3
    200 MLINKS+=	pthread_barrier.3 pthread_barrier_destroy.3
    201 MLINKS+=	pthread_barrier.3 pthread_barrier_wait.3
    202 
    203 MLINKS+=	pthread_barrierattr.3 pthread_barrierattr_init.3
    204 MLINKS+=	pthread_barrierattr.3 pthread_barrierattr_destroy.3
    205 MLINKS+=	pthread_barrierattr.3 pthread_barrierattr_getpshared.3
    206 MLINKS+=	pthread_barrierattr.3 pthread_barrierattr_setpshared.3
    207 
    208 MLINKS+=	pthread_cond.3 pthread_cond_init.3
    209 MLINKS+=	pthread_cond.3 pthread_cond_destroy.3
    210 MLINKS+=	pthread_cond.3 pthread_cond_broadcast.3
    211 MLINKS+=	pthread_cond.3 pthread_cond_wait.3
    212 MLINKS+=	pthread_cond.3 pthread_cond_signal.3
    213 MLINKS+=	pthread_cond.3 pthread_cond_timedwait.3
    214 
    215 MLINKS+=	pthread_condattr.3 pthread_condattr_init.3
    216 MLINKS+=	pthread_condattr.3 pthread_condattr_destroy.3
    217 MLINKS+=	pthread_condattr.3 pthread_condattr_setclock.3
    218 MLINKS+=	pthread_condattr.3 pthread_condattr_getclock.3
    219 MLINKS+=	pthread_condattr.3 pthread_condattr_getpshared.3
    220 MLINKS+=	pthread_condattr.3 pthread_condattr_setpshared.3
    221 
    222 MLINKS+=	pthread_getname_np.3 pthread_setname_np.3
    223 MLINKS+=	pthread_getspecific.3 pthread_setspecific.3
    224 MLINKS+=	pthread_key_create.3 pthread_key_delete.3
    225 
    226 MLINKS+=	pthread_mutex.3 pthread_mutex_init.3
    227 MLINKS+=	pthread_mutex.3 pthread_mutex_destroy.3
    228 MLINKS+=	pthread_mutex.3 pthread_mutex_lock.3
    229 MLINKS+=	pthread_mutex.3 pthread_mutex_trylock.3
    230 MLINKS+=	pthread_mutex.3 pthread_mutex_unlock.3
    231 MLINKS+=	pthread_mutex.3 pthread_mutex_timedlock.3
    232 MLINKS+=	pthread_mutex.3	pthread_mutex_getprioceiling.3
    233 MLINKS+=	pthread_mutex.3	pthread_mutex_setprioceiling.3
    234 
    235 MLINKS+=	pthread_mutexattr.3 pthread_mutexattr_init.3
    236 MLINKS+=	pthread_mutexattr.3 pthread_mutexattr_destroy.3
    237 MLINKS+=	pthread_mutexattr.3 pthread_mutexattr_getpshared.3
    238 MLINKS+=	pthread_mutexattr.3 pthread_mutexattr_setpshared.3
    239 MLINKS+=	pthread_mutexattr.3 pthread_mutexattr_settype.3
    240 MLINKS+=	pthread_mutexattr.3 pthread_mutexattr_gettype.3
    241 MLINKS+=	pthread_mutexattr.3 pthread_mutexattr_getprotocol.3
    242 MLINKS+=	pthread_mutexattr.3 pthread_mutexattr_setprotocol.3
    243 MLINKS+=	pthread_mutexattr.3 pthread_mutexattr_getprioceiling.3
    244 MLINKS+=	pthread_mutexattr.3 pthread_mutexattr_setprioceiling.3
    245 
    246 MLINKS+=	pthread_rwlock.3 pthread_rwlock_init.3
    247 MLINKS+=	pthread_rwlock.3 pthread_rwlock_destroy.3
    248 MLINKS+=	pthread_rwlock.3 pthread_rwlock_rdlock.3
    249 MLINKS+=	pthread_rwlock.3 pthread_rwlock_wrlock.3
    250 MLINKS+=	pthread_rwlock.3 pthread_rwlock_unlock.3
    251 
    252 MLINKS+=	pthread_rwlock.3 pthread_rwlock_timedrdlock.3
    253 MLINKS+=	pthread_rwlock.3 pthread_rwlock_timedwrlock.3
    254 MLINKS+=	pthread_rwlock.3 pthread_rwlock_tryrdlock.3
    255 MLINKS+=	pthread_rwlock.3 pthread_rwlock_trywrlock.3
    256 
    257 MLINKS+=	pthread_rwlockattr.3 pthread_rwlockattr_init.3
    258 MLINKS+=	pthread_rwlockattr.3 pthread_rwlockattr_destroy.3
    259 MLINKS+=	pthread_rwlockattr.3 pthread_rwlockattr_getpshared.3
    260 MLINKS+=	pthread_rwlockattr.3 pthread_rwlockattr_setpshared.3
    261 
    262 MLINKS+=	pthread_spin.3 pthread_spin_init.3
    263 MLINKS+=	pthread_spin.3 pthread_spin_destroy.3
    264 MLINKS+=	pthread_spin.3 pthread_spin_lock.3
    265 MLINKS+=	pthread_spin.3 pthread_spin_trylock.3
    266 MLINKS+=	pthread_spin.3 pthread_spin_unlock.3
    267 
    268 MLINKS+=	pthread_schedparam.3 pthread_setschedparam.3
    269 MLINKS+=	pthread_schedparam.3 pthread_getschedparam.3
    270 MLINKS+=	pthread_suspend_np.3 pthread_resume_np.3
    271 MLINKS+=	pthread_testcancel.3 pthread_setcancelstate.3
    272 MLINKS+=	pthread_testcancel.3 pthread_setcanceltype.3
    273 
    274 # ISO C threads (ISO/IEC 9899:2011)
    275 
    276 SRCS+=		call_once.c cnd.c mtx.c thrd.c tss.c
    277 MAN+=		threads.3 call_once.3 cnd.3 mtx.3 thrd.3 tss.3
    278 
    279 MLINKS+=	call_once.3 ONCE_FLAG_INIT.3
    280 MLINKS+=	call_once.3 once_flag.3
    281 
    282 MLINKS+=	cnd.3 cnd_broadcast.3
    283 MLINKS+=	cnd.3 cnd_destroy.3
    284 MLINKS+=	cnd.3 cnd_init.3
    285 MLINKS+=	cnd.3 cnd_signal.3
    286 MLINKS+=	cnd.3 cnd_timedwait.3
    287 MLINKS+=	cnd.3 cnd_wait.3
    288 
    289 MLINKS+=	mtx.3 mtx_destroy.3
    290 MLINKS+=	mtx.3 mtx_init.3
    291 MLINKS+=	mtx.3 mtx_lock.3
    292 MLINKS+=	mtx.3 mtx_timedlock.3
    293 MLINKS+=	mtx.3 mtx_trylock.3
    294 MLINKS+=	mtx.3 mtx_unlock.3
    295 
    296 MLINKS+=	thrd.3 thrd_create.3
    297 MLINKS+=	thrd.3 thrd_current.3
    298 MLINKS+=	thrd.3 thrd_detach.3
    299 MLINKS+=	thrd.3 thrd_equal.3
    300 MLINKS+=	thrd.3 thrd_exit.3
    301 MLINKS+=	thrd.3 thrd_join.3
    302 MLINKS+=	thrd.3 thrd_sleep.3
    303 MLINKS+=	thrd.3 thrd_yield.3
    304 
    305 MLINKS+=	tss.3 TSS_DTOR_ITERATIONS.3
    306 MLINKS+=	tss.3 tss_create.3
    307 MLINKS+=	tss.3 tss_delete.3
    308 MLINKS+=	tss.3 tss_get.3
    309 MLINKS+=	tss.3 tss_set.3
    310 
    311 INCS+=		threads.h
    312 
    313 # PR lib/54001: create libpthread.a as a single large object, with all the
    314 # symbols in one section. ensures that if any libpthread function is used,
    315 # you get all of them from libpthread, and not the libc stubs.
    316 #
    317 # This makes -lpthread equivalent to -Wl,--whole-archive -lpthread
    318 
    319 __archivebuild: .USE
    320 	${_MKTARGET_BUILD}
    321 	@rm -f ${.TARGET}
    322 	${LD} -r -o ${.TARGET}.o `NM=${NM} ${LORDER} ${.ALLSRC:M*o} | ${TSORT}`
    323 	${AR} ${_ARFL} ${.TARGET} ${.TARGET}.o
    324 
    325 CLEANFILES+=	${_LIBS:=.o}
    326 
    327 .include <bsd.lib.mk>
    328 
    329 .else
    330 
    331 .include <bsd.man.mk>
    332 .include <bsd.files.mk>
    333 .include <bsd.inc.mk>
    334 
    335 .endif
    336 
    337 # WARNS=2 sets -Wcast-qual. This causes problems for one of
    338 # pthread_setspecific() and pthread_getspecific(), since the constness
    339 # of the argument to setspecific() has to be discarded *somewhere*
    340 # before returning it from getspecific().
    341 CWARNFLAGS+= -Wno-cast-qual
    342