Skip to content

Commit 1909b7f

Browse files
committed
Fix some llvm related items
1 parent d414d09 commit 1909b7f

File tree

140 files changed

+53696
-44340
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

140 files changed

+53696
-44340
lines changed

Makefile

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ MK_META_MODE= no
281281
# exceptions.
282282
.if !defined(TARGET_ARCH) && defined(TARGET)
283283
# T->TA mapping is usually TARGET with arm64 the odd man out
284-
_TARGET_ARCH= ${TARGET:S/arm64/aarch64/:S/riscv/riscv64/}
284+
_TARGET_ARCH= ${TARGET:S/arm64/aarch64/:S/riscv/riscv64/:S/arm/armv7/}
285285
.elif !defined(TARGET) && defined(TARGET_ARCH) && \
286286
${TARGET_ARCH} != ${MACHINE_ARCH}
287287
# TA->T mapping is accidentally CPUARCH with aarch64 the odd man out
@@ -651,7 +651,7 @@ MAKE_PARAMS_${target_arch}+= \
651651
.endfor
652652
.endif # !make(targets)
653653

654-
.if !defined(MAKE_JUST_KERNELS)
654+
.if ${__DO_WORLDS} == "yes"
655655
universe_${target}_done: universe_${target}_worlds .PHONY
656656
.for target_arch in ${TARGET_ARCHES_${target}}
657657
universe_${target}_worlds: universe_${target}_${target_arch} .PHONY
@@ -675,22 +675,15 @@ universe_${target}_${target_arch}: universe_${target}_prologue .MAKE .PHONY
675675
${MAKEFAIL}))
676676
@echo ">> ${target}.${target_arch} ${UNIVERSE_TARGET} completed on `LC_ALL=C date`"
677677
.endfor
678-
.endif # !MAKE_JUST_KERNELS
678+
.endif # ${__DO_WORLDS} == "yes"
679679

680-
.if !defined(MAKE_JUST_WORLDS)
680+
.if ${__DO_KERNELS} == "yes"
681681
universe_${target}_done: universe_${target}_kernels .PHONY
682682
universe_${target}_kernels: universe_${target}_worlds .PHONY
683683
universe_${target}_kernels: universe_${target}_prologue .MAKE .PHONY
684-
@if [ -e "${KERNSRCDIR}/${target}/conf/NOTES" ]; then \
685-
(cd ${KERNSRCDIR}/${target}/conf && env __MAKE_CONF=/dev/null \
686-
${SUB_MAKE} LINT \
687-
> ${.CURDIR}/_.${target}.makeLINT 2>&1 || \
688-
(echo "${target} 'make LINT' failed," \
689-
"check _.${target}.makeLINT for details"| ${MAKEFAIL})); \
690-
fi
691684
@cd ${.CURDIR}; ${SUB_MAKE} ${.MAKEFLAGS} TARGET=${target} \
692685
universe_kernels
693-
.endif # !MAKE_JUST_WORLDS
686+
.endif # ${__DO_KERNELS} == "yes"
694687

695688
# Tell the user the worlds and kernels have completed
696689
universe_${target}: universe_${target}_done
@@ -720,25 +713,30 @@ KERNCONFS!= cd ${KERNSRCDIR}/${TARGET}/conf && \
720713
universe_kernconfs: universe_kernels_prologue .PHONY
721714
.for kernel in ${KERNCONFS}
722715
TARGET_ARCH_${kernel}!= cd ${KERNSRCDIR}/${TARGET}/conf && \
716+
env PATH=${HOST_OBJTOP}/tmp/legacy/bin:${PATH:Q} \
723717
config -m ${KERNSRCDIR}/${TARGET}/conf/${kernel} 2> /dev/null | \
724718
grep -v WARNING: | cut -f 2
725719
.if empty(TARGET_ARCH_${kernel})
726720
.error "Target architecture for ${TARGET}/conf/${kernel} unknown. config(8) likely too old."
727721
.endif
728-
universe_kernconfs: universe_kernconf_${TARGET}_${kernel}
722+
universe_kernconfs_${TARGET_ARCH_${kernel}}: universe_kernconf_${TARGET}_${kernel}
729723
universe_kernconf_${TARGET}_${kernel}: .MAKE
730724
@echo ">> ${TARGET}.${TARGET_ARCH_${kernel}} ${kernel} kernel started on `LC_ALL=C date`"
731725
@(cd ${.CURDIR} && env __MAKE_CONF=/dev/null \
732726
${SUB_MAKE} ${JFLAG} buildkernel \
733727
TARGET=${TARGET} \
734728
TARGET_ARCH=${TARGET_ARCH_${kernel}} \
735-
${MAKE_PARAMS_${TARGET_ARCH}} \
729+
${MAKE_PARAMS_${TARGET_ARCH_${kernel}}} \
736730
KERNCONF=${kernel} \
737731
> _.${TARGET}.${kernel} 2>&1 || \
738732
(echo "${TARGET} ${kernel} kernel failed," \
739733
"check _.${TARGET}.${kernel} for details"| ${MAKEFAIL}))
740734
@echo ">> ${TARGET}.${TARGET_ARCH_${kernel}} ${kernel} kernel completed on `LC_ALL=C date`"
741735
.endfor
736+
.for target_arch in ${TARGET_ARCHES_${TARGET}}
737+
universe_kernconfs: universe_kernconfs_${target_arch} .PHONY
738+
universe_kernconfs_${target_arch}:
739+
.endfor
742740
.endif # make(universe_kernels)
743741
universe: universe_epilogue
744742
universe_epilogue: .PHONY
@@ -755,9 +753,6 @@ universe_epilogue: .PHONY
755753
.endif
756754
.endif
757755

758-
buildLINT: .PHONY
759-
${MAKE} -C ${.CURDIR}/sys/${_TARGET}/conf LINT
760-
761756
.if defined(.PARSEDIR)
762757
# This makefile does not run in meta mode
763758
.MAKE.MODE= normal

Makefile.inc1

Lines changed: 52 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,24 @@
1010
# -DNO_KERNELCONFIG do not run config in ${MAKE} buildkernel
1111
# -DNO_KERNELCLEAN do not run ${MAKE} clean in ${MAKE} buildkernel
1212
# -DNO_KERNELOBJ do not run ${MAKE} obj in ${MAKE} buildkernel
13-
# -DNO_PORTSUPDATE do not update ports in ${MAKE} update
1413
# -DNO_ROOT install without using root privilege
15-
# -DNO_DOCUPDATE do not update doc in ${MAKE} update
1614
# -DWITHOUT_CTF do not run the DTrace CTF conversion tools on built objects
1715
# LOCAL_DIRS="list of dirs" to add additional dirs to the SUBDIR list
1816
# LOCAL_ITOOLS="list of tools" to add additional tools to the ITOOLS list
1917
# LOCAL_LIB_DIRS="list of dirs" to add additional dirs to libraries target
2018
# LOCAL_MTREE="list of mtree files" to process to allow local directories
2119
# to be created before files are installed
20+
# LOCAL_LEGACY_DIRS="list of dirs" to add additional dirs to the legacy
21+
# target
22+
# LOCAL_BSTOOL_DIRS="list of dirs" to add additional dirs to the
23+
# bootstrap-tools target
2224
# LOCAL_TOOL_DIRS="list of dirs" to add additional dirs to the build-tools
23-
# list
25+
# target
2426
# LOCAL_XTOOL_DIRS="list of dirs" to add additional dirs to the
2527
# cross-tools target
2628
# METALOG="path to metadata log" to write permission and ownership
27-
# when NO_ROOT is set. (default: ${DESTDIR}/METALOG)
29+
# when NO_ROOT is set. (default: ${DESTDIR}/${DISTDIR}/METALOG,
30+
# check /etc/make.conf for DISTDIR)
2831
# TARGET="machine" to crossbuild world for a different machine type
2932
# TARGET_ARCH= may be required when a TARGET supports multiple endians
3033
# BUILDENV_SHELL= shell to launch for the buildenv target (def:${SHELL})
@@ -226,15 +229,6 @@ WANT_COMPILER_VERSION_FILE= lib/clang/include/clang/Basic/Version.inc
226229
WANT_COMPILER_VERSION!= \
227230
awk '$$2 == "CLANG_VERSION" {split($$3, a, "."); print a[1] * 10000 + a[2] * 100 + a[3]}' \
228231
${SRCDIR}/${WANT_COMPILER_VERSION_FILE} || echo unknown
229-
.elif ${WANT_COMPILER_TYPE} == "gcc"
230-
WANT_COMPILER_MIDNIGHTBSD_VERSION_FILE= gnu/usr.bin/cc/cc_tools/freebsd-native.h
231-
WANT_COMPILER_MIDNIGHTBSD_VERSION!= \
232-
awk '$$2 == "FBSD_CC_VER" {printf("%d\n", $$3)}' \
233-
${SRCDIR}/${WANT_COMPILER_MIDNIGHTBSD_VERSION_FILE} || echo unknown
234-
WANT_COMPILER_VERSION_FILE= contrib/gcc/BASE-VER
235-
WANT_COMPILER_VERSION!= \
236-
awk -F. '{print $$1 * 10000 + $$2 * 100 + $$3}' \
237-
${SRCDIR}/${WANT_COMPILER_VERSION_FILE} || echo unknown
238232
.endif
239233
.export WANT_COMPILER_MIDNIGHTBSD_VERSION WANT_COMPILER_VERSION
240234
.endif # !defined(WANT_COMPILER_MIDNIGHTBSD_VERSION)
@@ -253,7 +247,6 @@ WANT_COMPILER_VERSION!= \
253247
${X_COMPILER_MIDNIGHTBSD_VERSION} == ${WANT_COMPILER_MIDNIGHTBSD_VERSION}
254248
# Everything matches, disable the bootstrap compiler.
255249
MK_CLANG_BOOTSTRAP= no
256-
MK_GCC_BOOTSTRAP= no
257250
USING_SYSTEM_COMPILER= yes
258251
.endif # ${WANT_COMPILER_TYPE} == ${COMPILER_TYPE}
259252

@@ -349,6 +342,7 @@ _TOOLCHAIN_METADATA_VARS= COMPILER_VERSION \
349342
COMPILER_TYPE \
350343
COMPILER_FEATURES \
351344
COMPILER_MIDNIGHTBSD_VERSION \
345+
COMPILER_RESOURCE_DIR \
352346
LINKER_VERSION \
353347
LINKER_FEATURES \
354348
LINKER_TYPE \
@@ -524,14 +518,12 @@ OSRELDATE= 0
524518
.endif
525519

526520
# Set VERSION for CTFMERGE to use via the default CTFFLAGS=-L VERSION.
527-
.if !defined(_REVISION)
528-
_REVISION!= ${MAKE} -C ${SRCDIR}/release MK_AUTO_OBJ=no -V REVISION
529-
.export _REVISION
530-
.endif
531-
.if !defined(_BRANCH)
532-
_BRANCH!= ${MAKE} -C ${SRCDIR}/release MK_AUTO_OBJ=no -V BRANCH
533-
.export _BRANCH
521+
.for _V in BRANCH REVISION
522+
.if !defined(_${_V})
523+
_${_V}!= eval $$(awk '/^${_V}=/{print}' ${SRCTOP}/sys/conf/newvers.sh); echo $$${_V}
524+
.export _${_V}
534525
.endif
526+
.endfor
535527
.if !defined(SRCRELDATE)
536528
SRCRELDATE!= awk '/^\#define[[:space:]]*__MidnightBSD_version/ { print $$3 }' \
537529
${SRCDIR}/sys/sys/param.h
@@ -749,10 +741,10 @@ HMAKE+= PATH=${TMPPATH} METALOG=${METALOG} -DNO_ROOT
749741

750742
CROSSENV+= CC="${XCC} ${XCFLAGS}" CXX="${XCXX} ${XCXXFLAGS} ${XCFLAGS}" \
751743
CPP="${XCPP} ${XCFLAGS}" \
752-
AS="${XAS}" AR="${XAR}" LD="${XLD}" LLVM_LINK="${XLLVM_LINK}" \
753-
NM=${XNM} OBJCOPY="${XOBJCOPY}" \
744+
AS="${XAS}" AR="${XAR}" ELFCTL="${XELFCTL}" LD="${XLD}" \
745+
LLVM_LINK="${XLLVM_LINK}" NM=${XNM} OBJCOPY="${XOBJCOPY}" \
754746
RANLIB=${XRANLIB} STRINGS=${XSTRINGS} \
755-
SIZE="${XSIZE}"
747+
SIZE="${XSIZE}" STRIPBIN="${XSTRIPBIN}"
756748

757749
.if defined(CROSS_BINUTILS_PREFIX) && exists(${CROSS_BINUTILS_PREFIX})
758750
# In the case of xdev-build tools, CROSS_BINUTILS_PREFIX won't be a
@@ -788,20 +780,19 @@ XCFLAGS+= --sysroot=${WORLDTMP}
788780
XCFLAGS+= ${BFLAGS}
789781
.endif
790782

791-
.if ${MK_LIB32} != "no" && (${TARGET_ARCH} == "amd64" || \
792-
${TARGET_ARCH} == "powerpc64" || ${TARGET_ARCH:Mmips64*} != "")
793-
LIBCOMPAT= 32
783+
.if ${MK_LIB32} == "yes"
784+
_LIBCOMPAT= 32
794785
.include "Makefile.libcompat"
795-
.elif ${MK_LIBSOFT} != "no" && ${TARGET_ARCH:Marmv[67]*} != ""
796-
LIBCOMPAT= SOFT
786+
.elif ${MK_LIBSOFT} == "yes"
787+
_LIBCOMPAT= SOFT
797788
.include "Makefile.libcompat"
798789
.endif
799790

800791
# META_MODE normally ignores host file changes since every build updates
801792
# timestamps (see NO_META_IGNORE_HOST in sys.mk). There are known times
802793
# when the ABI breaks though that we want to force rebuilding WORLDTMP
803794
# to get updated host tools.
804-
.if ${MK_META_MODE} == "yes" && defined(NO_CLEAN) && \
795+
.if ${MK_META_MODE} == "yes" && ${MK_CLEAN} == "no" && \
805796
!defined(NO_META_IGNORE_HOST) && !defined(NO_META_IGNORE_HOST_HEADERS) && \
806797
!defined(_MKSHOWCONFIG)
807798
# r318736 - ino64 major ABI breakage
@@ -863,7 +854,8 @@ IMAKEENV+= PATH=${TMPPATH}:${INSTALLTMP}
863854

864855
# When generating install media, do not allow user and group information from
865856
# the build host to affect the contents of the distribution.
866-
.if make(distributeworld) || make(distrib-dirs) || make(distribution)
857+
.if make(distributeworld) || make(distrib-dirs) || make(distribution) || \
858+
make(stageworld)
867859
DB_FROM_SRC= yes
868860
.endif
869861

@@ -886,14 +878,16 @@ MTREEFLAGS+= -W
886878
INSTALLFLAGS+= -h sha256
887879
.endif
888880
.if defined(DB_FROM_SRC) || defined(NO_ROOT)
889-
IMAKE_INSTALL= INSTALL="install ${INSTALLFLAGS}"
890-
IMAKE_MTREE= MTREE_CMD="mtree ${MTREEFLAGS}"
881+
IMAKE_INSTALL= INSTALL="${INSTALL_CMD} ${INSTALLFLAGS}"
882+
IMAKE_MTREE= MTREE_CMD="${MTREE_CMD} ${MTREEFLAGS}"
891883
.endif
892884
.if make(distributeworld)
893-
CERTCTLDESTDIR= ${DESTDIR}/${DISTDIR}/base
885+
CERTCTLDESTDIR= ${DESTDIR}/${DISTDIR}
886+
CERTCTLFLAGS+= -d /base
894887
.else
895888
CERTCTLDESTDIR= ${DESTDIR}
896889
.endif
890+
CERTCTLFLAGS+= -D "${CERTCTLDESTDIR}"
897891

898892
DESTDIR_MTREEFLAGS= -deU
899893
# When creating worldtmp we don't need to set the directories as owned by root
@@ -904,9 +898,12 @@ WORLDTMP_MTREEFLAGS= -deUW
904898
# that are created by mtree to be owned by root/wheel.
905899
DESTDIR_MTREEFLAGS+= -W
906900
.endif
907-
MTREE?= mtree
908-
WORLDTMP_MTREE= ${MTREE} ${WORLDTMP_MTREEFLAGS}
909-
DESTDIR_MTREE= ${MTREE} ${DESTDIR_MTREEFLAGS}
901+
DISTR_MTREE= ${MTREE_CMD}
902+
.if ${BUILD_WITH_STRICT_TMPPATH} != 0
903+
DISTR_MTREE= ${WORLDTMP}/legacy/usr/sbin/mtree
904+
.endif
905+
WORLDTMP_MTREE= ${DISTR_MTREE} ${WORLDTMP_MTREEFLAGS}
906+
DESTDIR_MTREE= ${DISTR_MTREE} ${DESTDIR_MTREEFLAGS}
910907

911908
# kernel stage
912909
KMAKEENV= ${WMAKEENV:NSYSROOT=*}
@@ -1064,13 +1061,18 @@ _worldtmp: .PHONY
10641061
.if ${USING_SYSTEM_LINKER} == "yes"
10651062
@rm -f ${WORLDTMP}/usr/bin/ld ${WORLDTMP}/usr/bin/ld.lld
10661063
.endif # ${USING_SYSTEM_LINKER} == "yes"
1067-
.endif # !defined(NO_CLEAN)
1064+
.endif # ${MK_CLEAN} == "yes"
10681065
@mkdir -p ${WORLDTMP}
10691066
@touch ${WORLDTMP}/${.TARGET}
10701067
# We can't use mtree to create the worldtmp directories since it may not be
10711068
# available on the target system (this happens e.g. when building on non-MidnightBSD)
10721069
cd ${.CURDIR}/tools/build; \
10731070
${MAKE} DIRPRFX=tools/build/ DESTDIR=${WORLDTMP}/legacy installdirs
1071+
# In order to build without inheriting $PATH we need to add symlinks to the host
1072+
# tools in $WORLDTMP for the tools that we don't build during bootstrap-tools
1073+
cd ${.CURDIR}/tools/build; \
1074+
${MAKE} DIRPRFX=tools/build/ DESTDIR=${WORLDTMP}/legacy host-symlinks
1075+
10741076
_legacy:
10751077
@echo
10761078
@echo "--------------------------------------------------------------"
@@ -1098,24 +1100,26 @@ _bootstrap-tools:
10981100
${WORLDTMP_MTREE} -f ${.CURDIR}/${_mtree} -p ${WORLDTMP} > /dev/null
10991101
.endfor
11001102
_cleanobj:
1101-
.if !defined(NO_CLEAN)
1103+
.if ${MK_CLEAN} == "yes"
11021104
@echo
11031105
@echo "--------------------------------------------------------------"
11041106
@echo ">>> stage 2.1: cleaning up the object tree"
11051107
@echo "--------------------------------------------------------------"
1106-
${_+_}cd ${.CURDIR}; ${WMAKE} ${CLEANDIR}
1107-
.if defined(LIBCOMPAT)
1108-
${_+_}cd ${.CURDIR}; ${LIBCOMPATWMAKE} -f Makefile.inc1 ${CLEANDIR}
1108+
# Avoid including bsd.compiler.mk in clean and obj with _NO_INCLUDE_COMPILERMK
1109+
# since the restricted $PATH might not contain a valid cc binary
1110+
${_+_}cd ${.CURDIR}; ${WMAKE} _NO_INCLUDE_COMPILERMK=t ${CLEANDIR}
1111+
.if defined(_LIBCOMPAT)
1112+
${_+_}cd ${.CURDIR}; ${LIBCOMPATWMAKE} _NO_INCLUDE_COMPILERMK=t -f Makefile.inc1 ${CLEANDIR}
11091113
.endif
11101114
.else
1111-
${_+_}cd ${.CURDIR}; ${WMAKE} _cleanobj_fast_depend_hack
1112-
.endif # !defined(NO_CLEAN)
1115+
${_+_}cd ${.CURDIR}; ${WMAKE} _NO_INCLUDE_COMPILERMK=t _cleanobj_fast_depend_hack
1116+
.endif # ${MK_CLEAN} == "yes"
11131117
_obj:
11141118
@echo
11151119
@echo "--------------------------------------------------------------"
11161120
@echo ">>> stage 2.2: rebuilding the object tree"
11171121
@echo "--------------------------------------------------------------"
1118-
${_+_}cd ${.CURDIR}; ${WMAKE} obj
1122+
${_+_}cd ${.CURDIR}; ${WMAKE} _NO_INCLUDE_COMPILERMK=t obj
11191123
_build-tools:
11201124
@echo
11211125
@echo "--------------------------------------------------------------"
@@ -1156,11 +1160,12 @@ _libraries:
11561160
@echo "--------------------------------------------------------------"
11571161
${_+_}cd ${.CURDIR}; \
11581162
${WMAKE} -DNO_FSCHG MK_HTML=no -DNO_LINT MK_MAN=no \
1159-
MK_PROFILE=no MK_TESTS=no MK_TESTS_SUPPORT=${MK_TESTS} libraries
1163+
MK_PROFILE=no MK_TESTS=no MK_TESTS_SUPPORT=${MK_TESTS_SUPPORT} \
1164+
libraries
11601165
everything: .PHONY
11611166
@echo
11621167
@echo "--------------------------------------------------------------"
1163-
@echo ">>> stage 4.3: building everything"
1168+
@echo ">>> stage 4.4: building everything"
11641169
@echo "--------------------------------------------------------------"
11651170
${_+_}cd ${.CURDIR}; _PARALLEL_SUBDIR_OK=1 ${WMAKE} all
11661171

etc/group

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ dialer:*:68:
2929
network:*:69:
3030
audit:*:77:
3131
www:*:80:
32+
u2f:*:116:
3233
_ntp:*:123:
3334
_ypldap:*:160:
3435
hast:*:845:

etc/mail/Makefile

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
# $MidnightBSD$
2-
# $FreeBSD: src/etc/mail/Makefile,v 1.36 2004/06/06 17:28:31 gshapiro Exp $
3-
#
41
# This Makefile provides an easy way to generate the configuration
52
# file and database maps for the sendmail(8) daemon.
63
#
@@ -60,8 +57,8 @@
6057
# ------------------------------------------------------------------------
6158
#
6259
# The Makefile knows about the following maps:
63-
# access, bitdomain, domaintable, genericstable, mailertable, userdb,
64-
# uucpdomain, virtusertable
60+
# access, authinfo, bitdomain, domaintable, genericstable, mailertable,
61+
# userdb, uucpdomain, virtusertable
6562
#
6663

6764
.ifndef SENDMAIL_MC
@@ -125,7 +122,7 @@ SENDMAIL_MAP_PERMS?= 0640
125122
# type to use when calling makemap.
126123
#
127124
SENDMAIL_MAP_SRC+= mailertable domaintable bitdomain uucpdomain \
128-
genericstable virtusertable access
125+
genericstable virtusertable access authinfo
129126
SENDMAIL_MAP_OBJ=
130127
SENDMAIL_MAP_TYPE?= hash
131128

gnu/lib/Makefile.inc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
1-
# $FreeBSD$
21

32
.include "../Makefile.inc"

gnu/usr.bin/Makefile

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,9 @@
1-
.include <src.opts.mk>
2-
31

4-
.if ${MK_CXX} != "no"
5-
SUBDIR.${MK_GCC}+= gperf
6-
.endif
2+
.include <src.opts.mk>
73

8-
SUBDIR.${MK_BINUTILS}+= binutils
94
SUBDIR.${MK_DIALOG}+= dialog
105
SUBDIR.${MK_GCC}+= cc
116
SUBDIR.${MK_GNU_DIFF}+= diff
12-
SUBDIR.${MK_GNU_GREP}+= grep
13-
SUBDIR.${MK_GDB}+= gdb
14-
SUBDIR_DEPEND_gdb= binutils
15-
SUBDIR.${MK_GPL_DTC}+= dtc
167
SUBDIR.${MK_TESTS}+= tests
178

189
SUBDIR_PARALLEL=

0 commit comments

Comments
 (0)