mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-23 19:03:59 +08:00
c8dafbef1a
This patch bumps the libgm2 version to 19.0.0 reflecting time related fixes, changes to builtins.def and the commencement of gcc stage3. libgm2/ChangeLog: * configure: Regenerate. * configure.ac:(libtool_VERSION): Bump to 19:0:0. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
473 lines
14 KiB
Plaintext
473 lines
14 KiB
Plaintext
# Configure script for libgm2.
|
|
# Copyright (C) 2013-2023 Free Software Foundation, Inc.
|
|
|
|
# This file is part of GCC.
|
|
|
|
# GCC is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3, or (at your option)
|
|
# any later version.
|
|
|
|
# GCC is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with GCC; see the file COPYING3. If not see
|
|
# <http://www.gnu.org/licenses/>.
|
|
|
|
# Configure looks for the existence of this file to auto-config each language.
|
|
# We define several parameters used by configure:
|
|
|
|
# Process this file with autoreconf to produce a configure script.
|
|
|
|
AC_INIT(package-unused, version-unused,,libgm2)
|
|
AC_CONFIG_SRCDIR(Makefile.am)
|
|
# AC_CONFIG_MACRO_DIR([config])
|
|
AC_CONFIG_HEADER(config.h)
|
|
|
|
libtool_VERSION=19:0:0
|
|
AC_SUBST(libtool_VERSION)
|
|
|
|
AM_ENABLE_MULTILIB(, ..)
|
|
|
|
GCC_NO_EXECUTABLES
|
|
|
|
AC_USE_SYSTEM_EXTENSIONS
|
|
|
|
# Do not delete or change the following two lines. For why, see
|
|
# http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
|
|
AC_CANONICAL_SYSTEM
|
|
target_alias=${target_alias-$host_alias}
|
|
AC_SUBST(target_alias)
|
|
|
|
if test "$build" != "$host"; then
|
|
# We are being configured with some form of cross compiler.
|
|
GLIBCXX_IS_NATIVE=false
|
|
case "$host","$target" in
|
|
# Darwin crosses can use the host system's libraries and headers,
|
|
# because of the fat library support. Of course, it must be the
|
|
# same version of Darwin on both sides. Allow the user to
|
|
# just say --target=foo-darwin without a version number to mean
|
|
# "the version on this system".
|
|
*-*-darwin*,*-*-darwin*)
|
|
hostos=`echo $host | sed 's/.*-darwin/darwin/'`
|
|
targetos=`echo $target | sed 's/.*-darwin/darwin/'`
|
|
if test $hostos = $targetos || test $targetos = darwin ; then
|
|
GLIBCXX_IS_NATIVE=true
|
|
fi
|
|
;;
|
|
|
|
*)
|
|
GCC_NO_EXECUTABLES
|
|
;;
|
|
esac
|
|
else
|
|
GLIBCXX_IS_NATIVE=true
|
|
fi
|
|
|
|
# Runs configure.host, and assorted other critical bits. Sets
|
|
# up critical shell variables.
|
|
GLIBCXX_CONFIGURE
|
|
|
|
# For gettimeofday support.
|
|
GLIBCXX_CHECK_GETTIMEOFDAY
|
|
|
|
# For clock_gettime, nanosleep and sched_yield support.
|
|
GLIBCXX_ENABLE_LIBSTDCXX_TIME
|
|
|
|
AM_INIT_AUTOMAKE([1.15.1 no-define foreign no-dist -Wall -Wno-portability])
|
|
|
|
AH_TEMPLATE(PACKAGE, [Name of package])
|
|
AH_TEMPLATE(VERSION, [Version number of package])
|
|
|
|
AC_ARG_WITH(cross-host,
|
|
[ --with-cross-host=HOST Configuring with a cross compiler])
|
|
|
|
# Checks for header files.
|
|
AC_HEADER_STDC
|
|
AC_HEADER_SYS_WAIT
|
|
AC_CHECK_HEADER([math.h],
|
|
[AC_DEFINE([HAVE_MATH_H], [1], [have math.h])])
|
|
|
|
AC_CHECK_HEADERS(getopt.h limits.h stddef.h string.h strings.h \
|
|
stdlib.h time.h \
|
|
fcntl.h unistd.h sys/file.h sys/time.h sys/mman.h \
|
|
sys/resource.h sys/param.h sys/times.h sys/stat.h \
|
|
sys/socket.h \
|
|
sys/wait.h sys/ioctl.h errno.h sys/errno.h \
|
|
pwd.h direct.h dirent.h signal.h malloc.h langinfo.h \
|
|
pthread.h stdarg.h stdio.h sys/types.h termios.h \
|
|
netinet/in.h netdb.h sys/uio.h sys/stat.h wchar.h)
|
|
|
|
AC_CANONICAL_HOST
|
|
ACX_NONCANONICAL_HOST
|
|
ACX_NONCANONICAL_TARGET
|
|
GCC_TOPLEV_SUBDIRS
|
|
|
|
AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
|
|
AC_ARG_ENABLE(version-specific-runtime-libs,
|
|
[ --enable-version-specific-runtime-libs Specify that runtime libraries should be installed in a compiler-specific directory ],
|
|
[case "$enableval" in
|
|
yes) version_specific_libs=yes ;;
|
|
no) version_specific_libs=no ;;
|
|
*) AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
|
|
esac],
|
|
[version_specific_libs=no])
|
|
AC_MSG_RESULT($version_specific_libs)
|
|
|
|
AC_ARG_WITH(slibdir,
|
|
[ --with-slibdir=DIR shared libraries in DIR [LIBDIR]],
|
|
slibdir="$with_slibdir",
|
|
if test "${version_specific_libs}" = yes; then
|
|
slibdir='$(libsubdir)'
|
|
elif test -n "$with_cross_host" && test x"$with_cross_host" != x"no"; then
|
|
slibdir='$(exec_prefix)/$(host_noncanonical)/lib'
|
|
else
|
|
slibdir='$(libdir)'
|
|
fi)
|
|
AC_SUBST(slibdir)
|
|
|
|
# Command-line options.
|
|
# Very limited version of AC_MAINTAINER_MODE.
|
|
AC_ARG_ENABLE([maintainer-mode],
|
|
[AC_HELP_STRING([--enable-maintainer-mode],
|
|
[enable make rules and dependencies not useful (and
|
|
sometimes confusing) to the casual installer])],
|
|
[case ${enable_maintainer_mode} in
|
|
yes) MAINT='' ;;
|
|
no) MAINT='#' ;;
|
|
*) AC_MSG_ERROR([--enable-maintainer-mode must be yes or no]) ;;
|
|
esac
|
|
maintainer_mode=${enableval}],
|
|
[MAINT='#'])
|
|
AC_SUBST([MAINT])dnl
|
|
|
|
toolexecdir=no
|
|
toolexeclibdir=no
|
|
|
|
# Calculate toolexeclibdir
|
|
# Also toolexecdir, though it's only used in toolexeclibdir
|
|
case ${version_specific_libs} in
|
|
yes)
|
|
# Need the gcc compiler version to know where to install libraries
|
|
# and header files if --enable-version-specific-runtime-libs option
|
|
# is selected.
|
|
toolexecdir='$(libdir)/gcc/$(target_noncanonical)'
|
|
toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)'
|
|
;;
|
|
no)
|
|
if test -n "$with_cross_host" &&
|
|
test x"$with_cross_host" != x"no"; then
|
|
# Install a library built with a cross compiler in tooldir, not libdir.
|
|
toolexecdir='$(exec_prefix)/$(target_noncanonical)'
|
|
toolexeclibdir='$(toolexecdir)/lib'
|
|
else
|
|
toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)'
|
|
toolexeclibdir='$(libdir)'
|
|
fi
|
|
multi_os_directory=`$CC -print-multi-os-directory`
|
|
case $multi_os_directory in
|
|
.) ;; # Avoid trailing /.
|
|
*) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
AC_SUBST(toolexecdir)
|
|
AC_SUBST(toolexeclibdir)
|
|
|
|
AH_TEMPLATE(PACKAGE, [Name of package])
|
|
AH_TEMPLATE(VERSION, [Version number of package])
|
|
|
|
AM_MAINTAINER_MODE
|
|
|
|
# Check the compiler.
|
|
# The same as in boehm-gc and libstdc++. Have to borrow it from there.
|
|
# We must force CC to /not/ be precious variables; otherwise
|
|
# the wrong, non-multilib-adjusted value will be used in multilibs.
|
|
# As a side effect, we have to subst CFLAGS ourselves.
|
|
|
|
m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS])
|
|
m4_define([_AC_ARG_VAR_PRECIOUS],[])
|
|
AC_PROG_CC
|
|
AC_PROG_CXX
|
|
AM_PROG_AS
|
|
m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
|
|
|
|
AC_SUBST(CFLAGS)
|
|
|
|
# In order to override CFLAGS_FOR_TARGET, all of our special flags go
|
|
# in XCFLAGS. But we need them in CFLAGS during configury. So put them
|
|
# in both places for now and restore CFLAGS at the end of config.
|
|
save_CFLAGS="$CFLAGS"
|
|
|
|
# Find other programs we need.
|
|
AC_CHECK_TOOL(AR, ar)
|
|
AC_CHECK_TOOL(NM, nm)
|
|
AC_CHECK_TOOL(RANLIB, ranlib, ranlib-not-found-in-path-error)
|
|
AC_PROG_MAKE_SET
|
|
AC_PROG_INSTALL
|
|
|
|
AM_PROG_LIBTOOL
|
|
LT_INIT
|
|
AC_LIBTOOL_DLOPEN
|
|
|
|
AM_CONDITIONAL([ENABLE_DARWIN_AT_RPATH], [test x$enable_darwin_at_rpath = xyes])
|
|
|
|
AC_SUBST(enable_shared)
|
|
AC_SUBST(enable_static)
|
|
|
|
if test "${multilib}" = "yes"; then
|
|
multilib_arg="--enable-multilib"
|
|
else
|
|
multilib_arg=
|
|
fi
|
|
|
|
AC_CHECK_TYPES([struct timezone, struct stat, struct timespec, struct timeval, struct tm])
|
|
|
|
# Check if struct tm contains the tm_gmtoff field.
|
|
AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
|
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
|
|
#include <time.h>
|
|
], [
|
|
struct tm tm;
|
|
tm.tm_gmtoff = 1;
|
|
])],
|
|
[ac_cv_struct_tm_gmtoff=yes],
|
|
[ac_cv_struct_tm_gmtoff=no]
|
|
)
|
|
)
|
|
|
|
if (test "$ac_cv_struct_tm_gmtoff" = "yes"); then
|
|
AC_MSG_CHECKING([m2 front end detects struct tm with the tm_gmtoff field.])
|
|
AC_DEFINE(HAVE_TM_TM_GMTOFF, 1, [Define if struct tm has a tm_gmtoff field.])
|
|
fi
|
|
|
|
AC_LANG_C
|
|
# Check the compiler.
|
|
# The same as in boehm-gc and libstdc++. Have to borrow it from there.
|
|
# We must force CC to /not/ be precious variables; otherwise
|
|
# the wrong, non-multilib-adjusted value will be used in multilibs.
|
|
# As a side effect, we have to subst CFLAGS ourselves.
|
|
|
|
m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS])
|
|
m4_define([_AC_ARG_VAR_PRECIOUS],[])
|
|
AC_PROG_CC
|
|
m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
|
|
|
|
AC_SUBST(CFLAGS)
|
|
|
|
AC_DEFUN([GM2_UNDEF],[
|
|
$as_echo "#undef HAVE_$1" >>confdefs.h
|
|
])
|
|
|
|
AC_DEFUN([GM2_CHECK_LIB],[
|
|
AC_MSG_CHECKING([m2 front end checking $1 library for $2])
|
|
if test x$gcc_no_link != xyes; then
|
|
AC_CHECK_LIB([$1],[$2],[AC_DEFINE([HAVE_$3],[1],[found $2])],[GM2_UNDEF([$3],[$2])])
|
|
else
|
|
if test "x$[ac_cv_lib_$1_$2]" = xyes; then
|
|
AC_DEFINE([HAVE_$3],[1],[lib$1 includes $2])
|
|
elif test "x$[ac_cv_func_$2]" = xyes; then
|
|
AC_DEFINE([HAVE_$3],[1],[function $2 exists])
|
|
else
|
|
GM2_UNDEF([$3],[$2])
|
|
fi
|
|
fi
|
|
])
|
|
|
|
GM2_CHECK_LIB([c],[access],[ACCESS])
|
|
GM2_CHECK_LIB([c],[brk],[BRK])
|
|
GM2_CHECK_LIB([c],[cfmakeraw],[CFMAKERAW])
|
|
GM2_CHECK_LIB([c],[clock_gettime],[CLOCK_GETTIME])
|
|
GM2_CHECK_LIB([c],[clock_settime],[CLOCK_SETTIME])
|
|
GM2_CHECK_LIB([c],[close],[CLOSE])
|
|
GM2_CHECK_LIB([c],[ctime],[CTIME])
|
|
GM2_CHECK_LIB([c],[creat],[CREAT])
|
|
GM2_CHECK_LIB([c],[daylight],[DAYLIGHT])
|
|
GM2_CHECK_LIB([c],[dup],[DUP])
|
|
GM2_CHECK_LIB([c],[execve],[EXECVE])
|
|
GM2_CHECK_LIB([c],[exit],[EXIT])
|
|
GM2_CHECK_LIB([c],[fcntl],[FCNTL])
|
|
GM2_CHECK_LIB([c],[fstat],[FSTAT])
|
|
GM2_CHECK_LIB([c],[getdents],[GETDENTS])
|
|
GM2_CHECK_LIB([c],[getgid],[GETGID])
|
|
GM2_CHECK_LIB([c],[getopt_long],[GETOPT_LONG])
|
|
GM2_CHECK_LIB([c],[getopt_long_only],[GETOPT_LONG_ONLY])
|
|
GM2_CHECK_LIB([c],[getpid],[GETPID])
|
|
GM2_CHECK_LIB([c],[gettimeofday],[GETTIMEOFD])
|
|
GM2_CHECK_LIB([c],[getuid],[GETUID])
|
|
GM2_CHECK_LIB([c],[ioctl],[IOCTL])
|
|
GM2_CHECK_LIB([c],[kill],[KILL])
|
|
GM2_CHECK_LIB([c],[link],[LINK])
|
|
GM2_CHECK_LIB([c],[lseek],[LSEEK])
|
|
GM2_CHECK_LIB([c],[open],[OPEN])
|
|
GM2_CHECK_LIB([c],[pause],[PAUSE])
|
|
GM2_CHECK_LIB([c],[pipe],[PIPE])
|
|
GM2_CHECK_LIB([c],[rand],[RAND])
|
|
GM2_CHECK_LIB([c],[read],[READ])
|
|
GM2_CHECK_LIB([c],[select],[SELECT])
|
|
GM2_CHECK_LIB([c],[setitimer],[SETITIMER])
|
|
GM2_CHECK_LIB([c],[setgid],[SETGID])
|
|
GM2_CHECK_LIB([c],[setuid],[SETUID])
|
|
GM2_CHECK_LIB([c],[stat],[STAT])
|
|
GM2_CHECK_LIB([c],[strsignal],[STRSIGNAL])
|
|
GM2_CHECK_LIB([c],[strtod],[STRTOD])
|
|
GM2_CHECK_LIB([c],[strtold],[STRTOLD])
|
|
GM2_CHECK_LIB([c],[times],[TIMES])
|
|
GM2_CHECK_LIB([c],[timezone],[TIMEZONE])
|
|
GM2_CHECK_LIB([c],[tzname],[TZNAME])
|
|
GM2_CHECK_LIB([c],[unlink],[UNLINK])
|
|
GM2_CHECK_LIB([c],[wait],[WAIT])
|
|
GM2_CHECK_LIB([c],[write],[WRITE])
|
|
|
|
GM2_CHECK_LIB([m],[signbit],[SIGNBIT])
|
|
GM2_CHECK_LIB([m],[signbitf],[SIGNBITF])
|
|
GM2_CHECK_LIB([m],[signbitl],[SIGNBITL])
|
|
|
|
AC_MSG_NOTICE([libgm2 has finished checking target libc and libm contents.])
|
|
|
|
# We test the host here and later on check the target.
|
|
|
|
# All known M2_HOST_OS values. This is the union of all host operating systems
|
|
# supported by gm2.
|
|
|
|
M2_SUPPORTED_HOST_OS="aix freebsd hurd linux netbsd openbsd solaris windows darwin"
|
|
|
|
M2_HOST_OS=unknown
|
|
|
|
case ${host} in
|
|
*-*-darwin*) M2_HOST_OS=darwin ;;
|
|
*-*-freebsd*) M2_HOST_OS=freebsd ;;
|
|
*-*-linux*) M2_HOST_OS=linux ;;
|
|
*-*-netbsd*) M2_HOST_OS=netbsd ;;
|
|
*-*-openbsd*) M2_HOST_OS=openbsd ;;
|
|
*-*-solaris2*) M2_HOST_OS=solaris ;;
|
|
*-*-aix*) M2_HOST_OS=aix ;;
|
|
*-*-gnu*) M2_HOST_OS=hurd ;;
|
|
esac
|
|
|
|
M2_TARGET_OS=unknown
|
|
|
|
case ${target} in
|
|
*-*-darwin*) M2_TARGET_OS=darwin ;;
|
|
*-*-freebsd*) M2_TARGET_OS=freebsd ;;
|
|
*-*-linux*) M2_TARGET_OS=linux ;;
|
|
*-*-netbsd*) M2_TARGET_OS=netbsd ;;
|
|
*-*-openbsd*) M2_TARGET_OS=openbsd ;;
|
|
*-*-solaris2*) M2_TARGET_OS=solaris ;;
|
|
*-*-aix*) M2_TARGET_OS=aix ;;
|
|
*-*-gnu*) M2_TARGET_OS=hurd ;;
|
|
esac
|
|
|
|
# M2_HOST_OS=unknown
|
|
if test x${M2_HOST_OS} = xunknown; then
|
|
AC_MSG_NOTICE([unsupported host, will build a minimal m2 library])
|
|
BUILD_PIMLIB=false
|
|
BUILD_ISOLIB=false
|
|
BUILD_CORLIB=false
|
|
BUILD_LOGLIB=false
|
|
else
|
|
AC_MSG_NOTICE([m2 library will be built on ${M2_HOST_OS}])
|
|
BUILD_PIMLIB=true
|
|
BUILD_ISOLIB=true
|
|
BUILD_CORLIB=true
|
|
BUILD_LOGLIB=true
|
|
fi
|
|
|
|
CC_FOR_BUILD=${CC_FOR_BUILD:-gcc}
|
|
AC_SUBST(CC_FOR_BUILD)
|
|
|
|
# Propagate GM2_FOR_TARGET into Makefiles
|
|
GM2_FOR_TARGET=${GM2_FOR_TARGET:-gcc}
|
|
AC_SUBST(GM2_FOR_TARGET)
|
|
|
|
# Now we check the target as long as it is a supported host.
|
|
# For some embedded targets we choose minimal runtime system which is
|
|
# just enough to satisfy the linker targetting raw metal.
|
|
if test x${M2_HOST_OS} != xunknown; then
|
|
AC_MSG_NOTICE([m2 library building for target ${target}])
|
|
case "$target" in
|
|
|
|
avr25*-*-* | avr31*-*-* | avr35*-*-* | avr4*-*-* | avr5*-*-* | avr51*-*-* | avr6*-*-*)
|
|
BUILD_PIMLIB=false
|
|
BUILD_ISOLIB=false
|
|
BUILD_CORLIB=false
|
|
BUILD_LOGLIB=false
|
|
;;
|
|
|
|
avrxmega2*-*-* | avrxmega4*-*-* | avrxmega5*-*-* | avrxmega6*-*-* | avrxmega7*-*-*)
|
|
BUILD_PIMLIB=false
|
|
BUILD_ISOLIB=false
|
|
BUILD_CORLIB=false
|
|
BUILD_LOGLIB=false
|
|
;;
|
|
|
|
avr3-*-*)
|
|
BUILD_PIMLIB=true
|
|
BUILD_ISOLIB=true
|
|
BUILD_CORLIB=true
|
|
BUILD_LOGLIB=true
|
|
;;
|
|
esp32-*-*)
|
|
BUILD_PIMLIB=false
|
|
BUILD_ISOLIB=false
|
|
BUILD_CORLIB=false
|
|
BUILD_LOGLIB=false
|
|
;;
|
|
|
|
esac
|
|
fi
|
|
|
|
# GM2_MSG_RESULT issue a query message from the first parameter and a boolean result
|
|
# in the second parameter is printed as a "yes" or "no".
|
|
|
|
AC_DEFUN([GM2_MSG_RESULT],[
|
|
AC_MSG_CHECKING([$1])
|
|
if test x${$2} = xtrue; then
|
|
AC_MSG_RESULT([yes])
|
|
else
|
|
AC_MSG_RESULT([no])
|
|
fi
|
|
])
|
|
|
|
if test x${M2_HOST_OS} = xunknown; then
|
|
AC_MSG_NOTICE([m2 front end will only build minimal Modula-2 runtime library on this host])
|
|
else
|
|
GM2_MSG_RESULT([m2 front end will build PIM libraries:],[BUILD_PIMLIB])
|
|
GM2_MSG_RESULT([m2 front end will build ISO libraries:],[BUILD_ISOLIB])
|
|
GM2_MSG_RESULT([m2 front end will build coroutine libraries:],[BUILD_CORLIB])
|
|
GM2_MSG_RESULT([m2 front end will build Logitech compatability libraries:],[BUILD_LOGLIB])
|
|
fi
|
|
|
|
AM_CONDITIONAL([BUILD_PIMLIB], [test x$BUILD_PIMLIB = xtrue])
|
|
AM_CONDITIONAL([BUILD_ISOLIB], [test x$BUILD_ISOLIB = xtrue])
|
|
AM_CONDITIONAL([BUILD_CORLIB], [test x$BUILD_CORLIB = xtrue])
|
|
AM_CONDITIONAL([BUILD_LOGLIB], [test x$BUILD_LOGLIB = xtrue])
|
|
AM_CONDITIONAL([TARGET_DARWIN], [test x$M2_TARGET_OS = xdarwin])
|
|
|
|
# Determine what GCC version number to use in filesystem paths.
|
|
GCC_BASE_VER
|
|
|
|
AC_CONFIG_SRCDIR([Makefile.am])
|
|
AC_CONFIG_FILES([Makefile])
|
|
|
|
AC_CONFIG_FILES(AC_FOREACH([DIR], [libm2min libm2pim libm2iso libm2cor libm2log], [DIR/Makefile ]),
|
|
[ cat > vpsed$$ << \_EOF
|
|
s!`test -f '$<' || echo '$(srcdir)/'`!!
|
|
_EOF
|
|
sed -f vpsed$$ $ac_file > tmp$$
|
|
mv tmp$$ $ac_file
|
|
rm vpsed$$
|
|
echo 'MULTISUBDIR =' >> $ac_file
|
|
ml_norecursion=yes
|
|
. ${multi_basedir}/config-ml.in
|
|
AS_UNSET([ml_norecursion])
|
|
])
|
|
|
|
AC_MSG_NOTICE([libgm2 has been configured.])
|
|
|
|
AC_OUTPUT
|