1 # from: @(#)bsd.lib.mk 5.26 (Berkeley) 5/2/91
7 .if defined(LIB_CXX) || defined(SHLIB_CXX)
15 .if defined(SHLIB_CXX)
19 LIB_PRIVATE= ${PRIVATELIB:Dprivate}
20 # Set up the variables controlling shared libraries. After this section,
21 # SHLIB_NAME will be defined only if we are to create a shared library.
22 # SHLIB_LINK will be defined only if we are to create a link to it.
23 # INSTALL_PIC_ARCHIVE will be defined only if we are to create a PIC archive.
24 # BUILD_NOSSP_PIC_ARCHIVE will be defined only if we are to create a PIC archive.
27 .undef INSTALL_PIC_ARCHIVE
28 .undef BUILD_NOSSP_PIC_ARCHIVE
30 .if !defined(SHLIB) && defined(LIB)
33 .if !defined(SHLIB_NAME) && defined(SHLIB) && defined(SHLIB_MAJOR)
34 SHLIB_NAME= lib${LIB_PRIVATE}${SHLIB}.so.${SHLIB_MAJOR}
36 .if defined(SHLIB_NAME) && !empty(SHLIB_NAME:M*.so.*)
37 SHLIB_LINK?= ${SHLIB_NAME:R}
39 SONAME?= ${SHLIB_NAME}
42 .if defined(CRUNCH_CFLAGS)
43 CFLAGS+= ${CRUNCH_CFLAGS}
46 .if ${MK_ASSERT_DEBUG} == "no"
51 .if defined(DEBUG_FLAGS)
52 CFLAGS+= ${DEBUG_FLAGS}
54 .if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != ""
61 .if ${SHLIBDIR:M*lib32*}
66 .if !defined(TAGS) || ! ${TAGS:Mpackage=*}
67 TAGS+= package=${PACKAGE:Uruntime}
69 TAG_ARGS= -T ${TAGS:[*]:S/ /,/g}
73 .if ${MK_BIND_NOW} != "no"
76 .if ${MK_RETPOLINE} != "no"
78 CXXFLAGS+= -mretpoline
79 LDFLAGS+= -Wl,-zretpolineplt
82 .if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \
83 empty(DEBUG_FLAGS:M-gdwarf*)
84 CFLAGS+= ${DEBUG_FILES_CFLAGS}
85 CXXFLAGS+= ${DEBUG_FILES_CFLAGS}
89 .if ${MACHINE_CPUARCH} == "riscv" && ${LINKER_FEATURES:Mriscv-relaxations} == ""
93 .include <bsd.libnames.mk>
95 # prefer .s to a .c, add .po, remove stuff not used in the BSD libraries
96 # .pico used for PIC object files
97 # .nossppico used for NOSSP PIC object files
98 # .pieo used for PIE object files
99 .SUFFIXES: .out .o .bc .ll .po .pico .nossppico .pieo .S .asm .s .c .cc .cpp .cxx .C .f .y .l .ln
101 .if !defined(PICFLAG)
102 .if ${MACHINE_CPUARCH} == "sparc64"
114 ${CC} ${PO_FLAG} ${STATIC_CFLAGS} ${PO_CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
118 ${CC} ${PICFLAG} -DPIC ${SHARED_CFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
122 ${CC} ${PICFLAG} -DPIC ${SHARED_CFLAGS:C/^-fstack-protector.*$//} ${CFLAGS:C/^-fstack-protector.*$//} -c ${.IMPSRC} -o ${.TARGET}
126 ${CC} ${PIEFLAG} -DPIC ${SHARED_CFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
129 .cc.po .C.po .cpp.po .cxx.po:
130 ${CXX} ${PO_FLAG} ${STATIC_CXXFLAGS} ${PO_CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
132 .cc.pico .C.pico .cpp.pico .cxx.pico:
133 ${CXX} ${PICFLAG} -DPIC ${SHARED_CXXFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
135 .cc.nossppico .C.nossppico .cpp.nossppico .cxx.nossppico:
136 ${CXX} ${PICFLAG} -DPIC ${SHARED_CXXFLAGS:C/^-fstack-protector.*$//} ${CXXFLAGS:C/^-fstack-protector.*$//} -c ${.IMPSRC} -o ${.TARGET}
138 .cc.pieo .C.pieo .cpp.pieo .cxx.pieo:
139 ${CXX} ${PIEFLAG} ${SHARED_CXXFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
142 ${FC} -pg ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC}
146 ${FC} ${PICFLAG} -DPIC ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC}
150 ${FC} ${PICFLAG} -DPIC ${FFLAGS:C/^-fstack-protector.*$//} -o ${.TARGET} -c ${.IMPSRC}
153 .s.po .s.pico .s.nossppico .s.pieo:
154 ${AS} ${AFLAGS} -o ${.TARGET} ${.IMPSRC}
158 ${CC:N${CCACHE_BIN}} -x assembler-with-cpp -DPROF ${PO_CFLAGS} \
159 ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET}
163 ${CC:N${CCACHE_BIN}} -x assembler-with-cpp ${PICFLAG} -DPIC \
164 ${CFLAGS} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET}
168 ${CC:N${CCACHE_BIN}} -x assembler-with-cpp ${PICFLAG} -DPIC \
169 ${CFLAGS:C/^-fstack-protector.*$//} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET}
173 ${CC:N${CCACHE_BIN}} -x assembler-with-cpp ${PIEFLAG} -DPIC \
174 ${CFLAGS} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET}
178 ${CC:N${CCACHE_BIN}} -DPROF ${PO_CFLAGS} ${ACFLAGS} -c ${.IMPSRC} \
183 ${CC:N${CCACHE_BIN}} ${PICFLAG} -DPIC ${CFLAGS} ${ACFLAGS} \
184 -c ${.IMPSRC} -o ${.TARGET}
188 ${CC:N${CCACHE_BIN}} ${PICFLAG} -DPIC ${CFLAGS:C/^-fstack-protector.*$//} ${ACFLAGS} \
189 -c ${.IMPSRC} -o ${.TARGET}
193 ${CC:N${CCACHE_BIN}} ${PIEFLAG} -DPIC ${CFLAGS} ${ACFLAGS} \
194 -c ${.IMPSRC} -o ${.TARGET}
198 _SHLIBDIR:=${SHLIBDIR}
200 .if defined(SHLIB_NAME)
201 .if ${MK_DEBUG_FILES} != "no"
202 SHLIB_NAME_FULL=${SHLIB_NAME}.full
203 # Use ${DEBUGDIR} for base system debug files, else .debug subdirectory
204 .if ${_SHLIBDIR} == "/boot" ||\
205 ${SHLIBDIR:C%/lib(/.*)?$%/lib%} == "/lib" ||\
206 ${SHLIBDIR:C%/usr/(tests/)?lib(32|exec)?(/.*)?%/usr/lib%} == "/usr/lib"
207 DEBUGFILEDIR=${DEBUGDIR}${_SHLIBDIR}
209 DEBUGFILEDIR=${_SHLIBDIR}/.debug
211 .if !exists(${DESTDIR}${DEBUGFILEDIR})
215 SHLIB_NAME_FULL=${SHLIB_NAME}
219 .include <bsd.symver.mk>
221 # Allow libraries to specify their own version map or have it
222 # automatically generated (see bsd.symver.mk above).
223 .if ${MK_SYMVER} == "yes" && !empty(VERSION_MAP)
224 ${SHLIB_NAME_FULL}: ${VERSION_MAP}
225 LDFLAGS+= -Wl,--version-script=${VERSION_MAP}
228 .if defined(LIB) && !empty(LIB) || defined(SHLIB_NAME)
229 OBJS+= ${SRCS:N*.h:${OBJS_SRCS_FILTER:ts:}:S/$/.o/}
230 BCOBJS+= ${SRCS:N*.[hsS]:N*.asm:${OBJS_SRCS_FILTER:ts:}:S/$/.bco/g}
231 LLOBJS+= ${SRCS:N*.[hsS]:N*.asm:${OBJS_SRCS_FILTER:ts:}:S/$/.llo/g}
232 CLEANFILES+= ${OBJS} ${BCOBJS} ${LLOBJS} ${STATICOBJS}
235 .if defined(LIB) && !empty(LIB)
236 _LIBS= lib${LIB_PRIVATE}${LIB}.a
238 lib${LIB_PRIVATE}${LIB}.a: ${OBJS} ${STATICOBJS}
239 @${ECHO} building static ${LIB} library
241 ${AR} ${ARFLAGS} ${.TARGET} `NM='${NM}' NMFLAGS='${NMFLAGS}' \
242 ${LORDER} ${OBJS} ${STATICOBJS} | ${TSORT} ${TSORTFLAGS}` ${ARADD}
243 ${RANLIB} ${RANLIBFLAGS} ${.TARGET}
246 .if !defined(INTERNALLIB)
248 .if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB)
249 _LIBS+= lib${LIB_PRIVATE}${LIB}_p.a
250 POBJS+= ${OBJS:.o=.po} ${STATICOBJS:.o=.po}
251 DEPENDOBJS+= ${POBJS}
252 CLEANFILES+= ${POBJS}
254 lib${LIB_PRIVATE}${LIB}_p.a: ${POBJS}
255 @${ECHO} building profiled ${LIB} library
257 ${AR} ${ARFLAGS} ${.TARGET} `NM='${NM}' NMFLAGS='${NMFLAGS}' \
258 ${LORDER} ${POBJS} | ${TSORT} ${TSORTFLAGS}` ${ARADD}
259 ${RANLIB} ${RANLIBFLAGS} ${.TARGET}
262 .if defined(LLVM_LINK)
263 lib${LIB_PRIVATE}${LIB}.bc: ${BCOBJS}
264 ${LLVM_LINK} -o ${.TARGET} ${BCOBJS}
266 lib${LIB_PRIVATE}${LIB}.ll: ${LLOBJS}
267 ${LLVM_LINK} -S -o ${.TARGET} ${LLOBJS}
269 CLEANFILES+= lib${LIB_PRIVATE}${LIB}.bc lib${LIB_PRIVATE}${LIB}.ll
272 .if defined(SHLIB_NAME) || \
273 defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
274 SOBJS+= ${OBJS:.o=.pico}
275 DEPENDOBJS+= ${SOBJS}
276 CLEANFILES+= ${SOBJS}
279 .if defined(SHLIB_NAME)
280 _LIBS+= ${SHLIB_NAME}
282 SOLINKOPTS+= -shared -Wl,-x
283 .if defined(LD_FATAL_WARNINGS) && ${LD_FATAL_WARNINGS} == "no"
284 SOLINKOPTS+= -Wl,--no-fatal-warnings
286 SOLINKOPTS+= -Wl,--fatal-warnings
288 SOLINKOPTS+= -Wl,--warn-shared-textrel
290 .if target(beforelinking)
291 beforelinking: ${SOBJS}
292 ${SHLIB_NAME_FULL}: beforelinking
295 .if defined(SHLIB_LINK)
296 .if defined(SHLIB_LDSCRIPT) && !empty(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT})
297 ${SHLIB_LINK:R}.ld: ${.CURDIR}/${SHLIB_LDSCRIPT}
298 sed -e 's,@@SHLIB@@,${_SHLIBDIR}/${SHLIB_NAME},g' \
299 -e 's,@@LIBDIR@@,${_LIBDIR},g' \
300 ${.ALLSRC} > ${.TARGET}
302 ${SHLIB_NAME_FULL}: ${SHLIB_LINK:R}.ld
303 CLEANFILES+= ${SHLIB_LINK:R}.ld
305 CLEANFILES+= ${SHLIB_LINK}
308 ${SHLIB_NAME_FULL}: ${SOBJS}
309 @${ECHO} building shared library ${SHLIB_NAME}
310 @rm -f ${SHLIB_NAME} ${SHLIB_LINK}
311 .if defined(SHLIB_LINK) && !commands(${SHLIB_LINK:R}.ld) && ${MK_DEBUG_FILES} == "no"
312 @${INSTALL_LIBSYMLINK} ${TAG_ARGS:D${TAG_ARGS},development} ${SHLIB_NAME} ${SHLIB_LINK}
314 ${_LD:N${CCACHE_BIN}} ${LDFLAGS} ${SSP_CFLAGS} ${SOLINKOPTS} \
315 -o ${.TARGET} -Wl,-soname,${SONAME} \
316 `NM='${NM}' NMFLAGS='${NMFLAGS}' ${LORDER} ${SOBJS} | \
317 ${TSORT} ${TSORTFLAGS}` ${LDADD}
318 .if ${MK_CTF} != "no"
319 ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${SOBJS}
322 .if ${MK_DEBUG_FILES} != "no"
323 CLEANFILES+= ${SHLIB_NAME_FULL} ${SHLIB_NAME}.debug
324 ${SHLIB_NAME}: ${SHLIB_NAME_FULL} ${SHLIB_NAME}.debug
325 ${OBJCOPY} --strip-debug --add-gnu-debuglink=${SHLIB_NAME}.debug \
326 ${SHLIB_NAME_FULL} ${.TARGET}
327 .if defined(SHLIB_LINK) && !commands(${SHLIB_LINK:R}.ld)
328 @${INSTALL_LIBSYMLINK} ${TAG_ARGS:D${TAG_ARGS},development} ${SHLIB_NAME} ${SHLIB_LINK}
331 ${SHLIB_NAME}.debug: ${SHLIB_NAME_FULL}
332 ${OBJCOPY} --only-keep-debug ${SHLIB_NAME_FULL} ${.TARGET}
334 .endif #defined(SHLIB_NAME)
336 .if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no"
337 _LIBS+= lib${LIB_PRIVATE}${LIB}_pic.a
339 lib${LIB_PRIVATE}${LIB}_pic.a: ${SOBJS}
340 @${ECHO} building special pic ${LIB} library
342 ${AR} ${ARFLAGS} ${.TARGET} ${SOBJS} ${ARADD}
343 ${RANLIB} ${RANLIBFLAGS} ${.TARGET}
346 .if defined(BUILD_NOSSP_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
347 NOSSPSOBJS+= ${OBJS:.o=.nossppico}
348 DEPENDOBJS+= ${NOSSPSOBJS}
349 CLEANFILES+= ${NOSSPSOBJS}
350 _LIBS+= lib${LIB_PRIVATE}${LIB}_nossp_pic.a
352 lib${LIB_PRIVATE}${LIB}_nossp_pic.a: ${NOSSPSOBJS}
353 @${ECHO} building special nossp pic ${LIB} library
355 ${AR} ${ARFLAGS} ${.TARGET} ${NOSSPSOBJS} ${ARADD}
356 ${RANLIB} ${RANLIBFLAGS} ${.TARGET}
359 .endif # !defined(INTERNALLIB)
361 .if defined(INTERNALLIB) && ${MK_PIE} != "no" && defined(LIB) && !empty(LIB)
362 PIEOBJS+= ${OBJS:.o=.pieo}
363 DEPENDOBJS+= ${PIEOBJS}
364 CLEANFILES+= ${PIEOBJS}
366 _LIBS+= lib${LIB_PRIVATE}${LIB}_pie.a
368 lib${LIB_PRIVATE}${LIB}_pie.a: ${PIEOBJS}
369 @${ECHO} building pie ${LIB} library
371 ${AR} ${ARFLAGS} ${.TARGET} ${PIEOBJS} ${ARADD}
372 ${RANLIB} ${RANLIBFLAGS} ${.TARGET}
375 .if defined(_SKIP_BUILD)
378 .if defined(_LIBS) && !empty(_LIBS)
382 .if ${MK_MAN} != "no" && !defined(LIBRARIES_ONLY)
387 CLEANFILES+= ${_LIBS}
390 .if !defined(NO_EXTRADEPEND) && defined(SHLIB_NAME)
391 .if defined(DPADD) && !empty(DPADD)
392 echo ${SHLIB_NAME_FULL}: ${DPADD} >> ${DEPENDFILE}
398 .if defined(PRECIOUSLIB)
399 .if !defined(NO_FSCHG)
400 SHLINSTALLFLAGS+= -fschg
403 # Install libraries with -S to avoid risk of modifying in-use libraries when
404 # installing to a running system. It is safe to avoid this for NO_ROOT builds
405 # that are only creating an image.
406 .if !defined(NO_SAFE_LIBINSTALL) && !defined(NO_ROOT)
408 SHLINSTALLSYMLINKFLAGS+= -S
411 _INSTALLFLAGS:= ${INSTALLFLAGS}
412 .for ie in ${INSTALLFLAGS_EDIT}
413 _INSTALLFLAGS:= ${_INSTALLFLAGS${ie}}
415 _SHLINSTALLFLAGS:= ${SHLINSTALLFLAGS}
416 _SHLINSTALLSYMLINKFLAGS:= ${SHLINSTALLSYMLINKFLAGS}
417 .for ie in ${INSTALLFLAGS_EDIT}
418 _SHLINSTALLFLAGS:= ${_SHLINSTALLFLAGS${ie}}
421 .if !defined(INTERNALLIB)
422 realinstall: _libinstall
423 .ORDER: beforeinstall _libinstall
425 .if defined(LIB) && !empty(LIB) && ${MK_INSTALLLIB} != "no"
426 ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},development} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
427 ${_INSTALLFLAGS} lib${LIB_PRIVATE}${LIB}.a ${DESTDIR}${_LIBDIR}/
429 .if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB)
430 ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},profile} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
431 ${_INSTALLFLAGS} lib${LIB_PRIVATE}${LIB}_p.a ${DESTDIR}${_LIBDIR}/
433 .if defined(SHLIB_NAME)
434 ${INSTALL} ${TAG_ARGS} ${STRIP} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
435 ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \
436 ${SHLIB_NAME} ${DESTDIR}${_SHLIBDIR}/
437 .if ${MK_DEBUG_FILES} != "no"
438 .if defined(DEBUGMKDIR)
439 ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},debug} -d ${DESTDIR}${DEBUGFILEDIR}/
441 ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},debug} -o ${LIBOWN} -g ${LIBGRP} -m ${DEBUGMODE} \
443 ${SHLIB_NAME}.debug ${DESTDIR}${DEBUGFILEDIR}/
445 .if defined(SHLIB_LINK)
446 .if commands(${SHLIB_LINK:R}.ld)
447 ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},development} -S -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
448 ${_INSTALLFLAGS} ${SHLIB_LINK:R}.ld \
449 ${DESTDIR}${_LIBDIR}/${SHLIB_LINK}
450 .for _SHLIB_LINK_LINK in ${SHLIB_LDSCRIPT_LINKS}
451 ${INSTALL_LIBSYMLINK} ${_SHLINSTALLSYMLINKFLAGS} ${SHLIB_LINK} \
452 ${DESTDIR}${_LIBDIR}/${_SHLIB_LINK_LINK}
455 .if ${_SHLIBDIR} == ${_LIBDIR}
456 .if ${SHLIB_LINK:Mlib*}
457 ${INSTALL_RSYMLINK} ${_SHLINSTALLSYMLINKFLAGS} ${TAG_ARGS:D${TAG_ARGS},development} \
458 ${SHLIB_NAME} ${DESTDIR}${_LIBDIR}/${SHLIB_LINK}
460 ${INSTALL_RSYMLINK} ${_SHLINSTALLSYMLINKFLAGS} ${TAG_ARGS} ${DESTDIR}${_SHLIBDIR}/${SHLIB_NAME} \
461 ${DESTDIR}${_LIBDIR}/${SHLIB_LINK}
464 .if ${SHLIB_LINK:Mlib*}
465 ${INSTALL_RSYMLINK} ${_SHLINSTALLSYMLINKFLAGS} ${TAG_ARGS:D${TAG_ARGS},development} \
466 ${DESTDIR}${_SHLIBDIR}/${SHLIB_NAME} ${DESTDIR}${_LIBDIR}/${SHLIB_LINK}
468 ${INSTALL_RSYMLINK} ${_SHLINSTALLSYMLINKFLAGS} ${TAG_ARGS} \
469 ${DESTDIR}${_SHLIBDIR}/${SHLIB_NAME} ${DESTDIR}${_LIBDIR}/${SHLIB_LINK}
471 .if exists(${DESTDIR}${_LIBDIR}/${SHLIB_NAME})
472 -chflags noschg ${DESTDIR}${_LIBDIR}/${SHLIB_NAME}
473 rm -f ${DESTDIR}${_LIBDIR}/${SHLIB_NAME}
475 .endif # _SHLIBDIR == _LIBDIR
476 .endif # SHLIB_LDSCRIPT
479 .if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no"
480 ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},development} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
481 ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${_LIBDIR}/
483 .endif # !defined(INTERNALLIB)
485 .if !defined(LIBRARIES_ONLY)
486 .include <bsd.nls.mk>
487 .include <bsd.confs.mk>
488 .include <bsd.files.mk>
489 .include <bsd.incs.mk>
494 LINKMODE?= ${LIBMODE}
495 SYMLINKOWN?= ${LIBOWN}
496 SYMLINKGRP?= ${LIBGRP}
497 .include <bsd.links.mk>
499 .if ${MK_MAN} != "no" && !defined(LIBRARIES_ONLY)
500 realinstall: maninstall
501 .ORDER: beforeinstall maninstall
506 .if ${MK_MAN} != "no" && !defined(LIBRARIES_ONLY)
507 .include <bsd.man.mk>
510 .if defined(LIB) && !empty(LIB)
511 OBJS_DEPEND_GUESS+= ${SRCS:M*.h}
512 .for _S in ${SRCS:N*.[hly]}
513 OBJS_DEPEND_GUESS.${_S:${OBJS_SRCS_FILTER:ts:}}.po+= ${_S}
516 .if defined(SHLIB_NAME) || \
517 defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
518 .for _S in ${SRCS:N*.[hly]}
519 OBJS_DEPEND_GUESS.${_S:${OBJS_SRCS_FILTER:ts:}}.pico+= ${_S}
522 .if defined(BUILD_NOSSP_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
523 .for _S in ${SRCS:N*.[hly]}
524 OBJS_DEPEND_GUESS.${_S:${OBJS_SRCS_FILTER:ts:}}.nossppico+= ${_S}
528 .if defined(HAS_TESTS)
529 MAKE+= MK_MAKE_CHECK_USE_SANDBOX=yes
530 SUBDIR_TARGETS+= check
531 TESTS_LD_LIBRARY_PATH+= ${.OBJDIR}
534 .include <bsd.dep.mk>
535 .include <bsd.clang-analyze.mk>
536 .include <bsd.obj.mk>
537 .include <bsd.sys.mk>