Update to jdk-16.0.0.0+36
Update tarball generation script to use git following OpenJDK's move to github Update tarball generation script to use PR3823 which handles JDK-8235710 changes Use upstream default for version-pre rather than setting it to "ea" or "" Drop libsunec.so which is no longer generated, thanks to JDK-8235710 Drop unnecessary compiler flags, dating back to work on GCC 6 & 10 Adapt RH1750419 alt-java patch to still apply after some variable re-naming in the makefiles Update filever to remove any trailing zeros, as in the OpenJDK build, and use for source filename Use system harfbuzz now this is supported. Pass SOURCE_DATE_EPOCH to build for reproducible builds
This commit is contained in:
parent
071adc0652
commit
cc2e153362
1
.gitignore
vendored
1
.gitignore
vendored
@ -13,3 +13,4 @@
|
||||
/jdk-updates-jdk15u-jdk-15.0.1+9.tar.xz
|
||||
/tapsets-icedtea-3.15.0.tar.xz
|
||||
/jdk-updates-jdk15u-jdk-15.0.2+7.tar.xz
|
||||
/openjdk-jdk16-jdk-16+36.tar.xz
|
||||
|
@ -7,9 +7,9 @@
|
||||
# If you want to use a local copy of patch PR3788, set the path to it in the PR3788 variable
|
||||
#
|
||||
# In any case you have to set PROJECT_NAME REPO_NAME and VERSION. eg:
|
||||
# PROJECT_NAME=jdk
|
||||
# REPO_NAME=jdk
|
||||
# VERSION=tip
|
||||
# PROJECT_NAME=openjdk
|
||||
# REPO_NAME=jdk16
|
||||
# VERSION=HEAD
|
||||
# or to eg prepare systemtap:
|
||||
# icedtea7's jstack and other tapsets
|
||||
# VERSION=6327cf1cea9e
|
||||
@ -26,16 +26,16 @@
|
||||
# level folder, name is created, based on parameter
|
||||
#
|
||||
|
||||
if [ ! "x$PR3803" = "x" ] ; then
|
||||
if [ ! -f "$PR3803" ] ; then
|
||||
echo "You have specified PR3803 as $PR3803 but it does not exist. Exiting"
|
||||
if [ ! "x$PR3823" = "x" ] ; then
|
||||
if [ ! -f "$PR3823" ] ; then
|
||||
echo "You have specified PR3823 as $PR3823 but it does not exist. Exiting"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
set -e
|
||||
|
||||
OPENJDK_URL_DEFAULT=http://hg.openjdk.java.net
|
||||
OPENJDK_URL_DEFAULT=https://github.com
|
||||
COMPRESSION_DEFAULT=xz
|
||||
|
||||
if [ "x$1" = "xhelp" ] ; then
|
||||
@ -47,7 +47,7 @@ if [ "x$1" = "xhelp" ] ; then
|
||||
echo "COMPRESSION - the compression type to use (optional; defaults to ${COMPRESSION_DEFAULT})"
|
||||
echo "FILE_NAME_ROOT - name of the archive, minus extensions (optional; defaults to PROJECT_NAME-REPO_NAME-VERSION)"
|
||||
echo "TO_COMPRESS - what part of clone to pack (default is openjdk)"
|
||||
echo "PR3788 - the path to the PR3788 patch to apply (optional; downloaded if unavailable)"
|
||||
echo "PR3823 - the path to the PR3823 patch to apply (optional; downloaded if unavailable)"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
@ -90,7 +90,7 @@ if [ "x$FILE_NAME_ROOT" = "x" ] ; then
|
||||
echo "No file name root specified; default to ${FILE_NAME_ROOT}"
|
||||
fi
|
||||
if [ "x$REPO_ROOT" = "x" ] ; then
|
||||
REPO_ROOT="${OPENJDK_URL}/${PROJECT_NAME}/${REPO_NAME}"
|
||||
REPO_ROOT="${OPENJDK_URL}/${PROJECT_NAME}/${REPO_NAME}.git"
|
||||
echo "No repository root specified; default to ${REPO_ROOT}"
|
||||
fi;
|
||||
|
||||
@ -107,7 +107,7 @@ else
|
||||
mkdir "${FILE_NAME_ROOT}"
|
||||
pushd "${FILE_NAME_ROOT}"
|
||||
echo "Cloning ${VERSION} root repository from ${REPO_ROOT}"
|
||||
hg clone ${REPO_ROOT} openjdk -r ${VERSION}
|
||||
git clone -b ${VERSION} ${REPO_ROOT} openjdk
|
||||
popd
|
||||
fi
|
||||
pushd "${FILE_NAME_ROOT}"
|
||||
@ -125,18 +125,18 @@ pushd "${FILE_NAME_ROOT}"
|
||||
rm -vf ${CRYPTO_PATH}/ecp_224.c
|
||||
|
||||
echo "Syncing EC list with NSS"
|
||||
if [ "x$PR3803" = "x" ] ; then
|
||||
if [ "x$PR3823" = "x" ] ; then
|
||||
# originally for 8:
|
||||
# get PR3803.patch (from http://icedtea.classpath.org/hg/icedtea15) from most correct tag
|
||||
# Do not push it or publish it (see https://icedtea.classpath.org/bugzilla/show_bug.cgi?id=3803)
|
||||
echo "PR3803 not found. Downloading..."
|
||||
wget https://icedtea.classpath.org/hg/icedtea15/raw-file/d68ffcc9a497/patches/pr3803.patch
|
||||
echo "Applying ${PWD}/pr3803.patch"
|
||||
patch -Np1 < pr3803.patch
|
||||
rm pr3803.patch
|
||||
# get PR3823.patch (from http://icedtea.classpath.org/hg/icedtea16) from most correct tag
|
||||
# Do not push it or publish it (see https://icedtea.classpath.org/bugzilla/show_bug.cgi?id=3823)
|
||||
echo "PR3823 not found. Downloading..."
|
||||
wget https://icedtea.classpath.org/hg/icedtea16/raw-file/tip/patches/pr3823.patch
|
||||
echo "Applying ${PWD}/pr3823.patch"
|
||||
patch -Np1 < pr3823.patch
|
||||
rm pr3823.patch
|
||||
else
|
||||
echo "Applying ${PR3803}"
|
||||
patch -Np1 < $PR3803
|
||||
echo "Applying ${PR3823}"
|
||||
patch -Np1 < $PR3823
|
||||
fi;
|
||||
find . -name '*.orig' -exec rm -vf '{}' ';'
|
||||
popd
|
||||
|
@ -247,18 +247,18 @@
|
||||
%endif
|
||||
|
||||
# New Version-String scheme-style defines
|
||||
%global featurever 15
|
||||
%global featurever 16
|
||||
%global interimver 0
|
||||
%global updatever 2
|
||||
%global updatever 0
|
||||
%global patchver 0
|
||||
# If you bump featurever, you must bump also vendor_version_string
|
||||
# Used via new version scheme. JDK 15 was
|
||||
# GA'ed in September 2020 => 20.9
|
||||
%global vendor_version_string 20.9
|
||||
# Used via new version scheme. JDK 16 was
|
||||
# GA'ed in March 2020 => 21.3
|
||||
%global vendor_version_string 21.3
|
||||
# buildjdkver is usually same as %%{featurever},
|
||||
# but in time of bootstrap of next jdk, it is featurever-1,
|
||||
# and this it is better to change it here, on single place
|
||||
%global buildjdkver %{featurever}
|
||||
%global buildjdkver 15
|
||||
# We don't add any LTS designator for STS packages (this package).
|
||||
# Neither for Fedora nor EPEL which would have %%{rhel} macro defined.
|
||||
%global lts_designator ""
|
||||
@ -271,8 +271,8 @@
|
||||
%global origin openjdk
|
||||
%global origin_nice OpenJDK
|
||||
%global top_level_dir_name %{origin}
|
||||
%global buildver 7
|
||||
%global rpmrelease 1
|
||||
%global buildver 36
|
||||
%global rpmrelease 0
|
||||
# Priority must be 8 digits in total; up to openjdk 1.8, we were using 18..... so when we moved to 11, we had to add another digit
|
||||
%if %is_system_jdk
|
||||
# Using 10 digits may overflow the int used for priority, so we combine the patch and build versions
|
||||
@ -286,30 +286,27 @@
|
||||
%global priority %( printf '%08d' 1 )
|
||||
%endif
|
||||
%global newjavaver %{featurever}.%{interimver}.%{updatever}.%{patchver}
|
||||
|
||||
# Omit trailing 0 in filenames when the patch version is 0
|
||||
%if 0%{?patchver} > 0
|
||||
%global filever %{newjavaver}
|
||||
%else
|
||||
%global filever %{featurever}.%{interimver}.%{updatever}
|
||||
%endif
|
||||
|
||||
%global javaver %{featurever}
|
||||
|
||||
# Strip up to 6 trailing zeros in newjavaver, as the JDK does, to get the correct version used in filenames
|
||||
%global filever %(svn=%{newjavaver}; for i in 1 2 3 4 5 6 ; do svn=${svn%%.0} ; done; echo ${svn})
|
||||
|
||||
# Define milestone (EA for pre-releases, GA for releases)
|
||||
# Release will be (where N is usually a number starting at 1):
|
||||
# - 0.N%%{?extraver}%%{?dist} for EA releases,
|
||||
# - N%%{?extraver}{?dist} for GA releases
|
||||
%global is_ga 1
|
||||
%if %{is_ga}
|
||||
%global ea_designator ""
|
||||
%global build_type GA
|
||||
%global expected_ea_designator ""
|
||||
%global ea_designator_zip ""
|
||||
%global extraver %{nil}
|
||||
%global eaprefix %{nil}
|
||||
%else
|
||||
%global ea_designator ea
|
||||
%global ea_designator_zip -%{ea_designator}
|
||||
%global extraver .%{ea_designator}
|
||||
%global build_type EA
|
||||
%global expected_ea_designator ea
|
||||
%global ea_designator_zip -%{expected_ea_designator}
|
||||
%global extraver .%{expected_ea_designator}
|
||||
%global eaprefix 0.
|
||||
%endif
|
||||
|
||||
@ -347,7 +344,7 @@
|
||||
# fix for https://bugzilla.redhat.com/show_bug.cgi?id=1111349
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1590796#c14
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1655938
|
||||
%global _privatelibs libsplashscreen[.]so.*|libawt_xawt[.]so.*|libjli[.]so.*|libattach[.]so.*|libawt[.]so.*|libextnet[.]so.*|libawt_headless[.]so.*|libdt_socket[.]so.*|libfontmanager[.]so.*|libinstrument[.]so.*|libj2gss[.]so.*|libj2pcsc[.]so.*|libj2pkcs11[.]so.*|libjaas[.]so.*|libjavajpeg[.]so.*|libjdwp[.]so.*|libjimage[.]so.*|libjsound[.]so.*|liblcms[.]so.*|libmanagement[.]so.*|libmanagement_agent[.]so.*|libmanagement_ext[.]so.*|libmlib_image[.]so.*|libnet[.]so.*|libnio[.]so.*|libprefs[.]so.*|librmi[.]so.*|libsaproc[.]so.*|libsctp[.]so.*|libsunec[.]so.*|libzip[.]so.*
|
||||
%global _privatelibs libsplashscreen[.]so.*|libawt_xawt[.]so.*|libjli[.]so.*|libattach[.]so.*|libawt[.]so.*|libextnet[.]so.*|libawt_headless[.]so.*|libdt_socket[.]so.*|libfontmanager[.]so.*|libinstrument[.]so.*|libj2gss[.]so.*|libj2pcsc[.]so.*|libj2pkcs11[.]so.*|libjaas[.]so.*|libjavajpeg[.]so.*|libjdwp[.]so.*|libjimage[.]so.*|libjsound[.]so.*|liblcms[.]so.*|libmanagement[.]so.*|libmanagement_agent[.]so.*|libmanagement_ext[.]so.*|libmlib_image[.]so.*|libnet[.]so.*|libnio[.]so.*|libprefs[.]so.*|librmi[.]so.*|libsaproc[.]so.*|libsctp[.]so.*|libzip[.]so.*
|
||||
%global _publiclibs libjawt[.]so.*|libjava[.]so.*|libjvm[.]so.*|libverify[.]so.*|libjsig[.]so.*
|
||||
%if %is_system_jdk
|
||||
%global __provides_exclude ^(%{_privatelibs})$
|
||||
@ -692,7 +689,6 @@ exit 0
|
||||
%{_jvmdir}/%{sdkdir -- %{?1}}/lib/libsaproc.so
|
||||
%endif
|
||||
%{_jvmdir}/%{sdkdir -- %{?1}}/lib/libsctp.so
|
||||
%{_jvmdir}/%{sdkdir -- %{?1}}/lib/libsunec.so
|
||||
%{_jvmdir}/%{sdkdir -- %{?1}}/lib/libverify.so
|
||||
%{_jvmdir}/%{sdkdir -- %{?1}}/lib/libzip.so
|
||||
%dir %{_jvmdir}/%{sdkdir -- %{?1}}/lib/jfr
|
||||
@ -1093,7 +1089,8 @@ URL: http://openjdk.java.net/
|
||||
|
||||
# to regenerate source0 (jdk) run update_package.sh
|
||||
# update_package.sh contains hard-coded repos, revisions, tags, and projects to regenerate the source archives
|
||||
Source0: jdk-updates-jdk%{featurever}u-jdk-%{filever}+%{buildver}%{?tagsuffix:-%{tagsuffix}}.tar.xz
|
||||
#Source0: openjdk-jdk%{featurever}u-jdk-%{filever}+%{buildver}%{?tagsuffix:-%{tagsuffix}}.tar.xz
|
||||
Source0: openjdk-jdk%{featurever}-jdk-%{filever}+%{buildver}.tar.xz
|
||||
|
||||
# Use 'icedtea_sync.sh' to update the following
|
||||
# They are based on code contained in the IcedTea project (3.x).
|
||||
@ -1165,6 +1162,7 @@ BuildRequires: freetype-devel
|
||||
BuildRequires: giflib-devel
|
||||
BuildRequires: gcc-c++
|
||||
BuildRequires: gdb
|
||||
BuildRequires: harfbuzz-devel
|
||||
BuildRequires: lcms2-devel
|
||||
BuildRequires: libjpeg-devel
|
||||
BuildRequires: libpng-devel
|
||||
@ -1566,8 +1564,8 @@ export CFLAGS="$CFLAGS -mieee"
|
||||
# We use ourcppflags because the OpenJDK build seems to
|
||||
# pass EXTRA_CFLAGS to the HotSpot C++ compiler...
|
||||
# Explicitly set the C++ standard as the default has changed on GCC >= 6
|
||||
EXTRA_CFLAGS="%ourcppflags -std=gnu++98 -Wno-error -fno-delete-null-pointer-checks -fno-lifetime-dse -fcommon"
|
||||
EXTRA_CPP_FLAGS="%ourcppflags -std=gnu++98 -fno-delete-null-pointer-checks -fno-lifetime-dse -fcommon"
|
||||
EXTRA_CFLAGS="%ourcppflags"
|
||||
EXTRA_CPP_FLAGS="%ourcppflags"
|
||||
|
||||
%ifarch %{power64} ppc
|
||||
# fix rpmlint warnings
|
||||
@ -1586,6 +1584,24 @@ fi
|
||||
# Variable used in hs_err hook on build failures
|
||||
top_dir_abs_path=$(pwd)/%{top_level_dir_name}
|
||||
|
||||
# The OpenJDK version file includes the current
|
||||
# upstream version information. For some reason,
|
||||
# configure does not automatically use the
|
||||
# default pre-version supplied there (despite
|
||||
# what the file claims), so we pass it manually
|
||||
# to configure
|
||||
VERSION_FILE=${top_dir_abs_path}/make/autoconf/version-numbers
|
||||
if [ -f ${VERSION_FILE} ] ; then
|
||||
EA_DESIGNATOR=$(grep '^DEFAULT_PROMOTED_VERSION_PRE' ${VERSION_FILE} | cut -d '=' -f 2)
|
||||
else
|
||||
echo "Could not find OpenJDK version file.";
|
||||
exit 16
|
||||
fi
|
||||
if [ "x${EA_DESIGNATOR}" != "x%{expected_ea_designator}" ] ; then
|
||||
echo "Spec file is configured for a %{build_type} build, but upstream version-pre setting is ${EA_DESIGNATOR}";
|
||||
exit 17
|
||||
fi
|
||||
|
||||
mkdir -p %{buildoutputdir -- $suffix}
|
||||
pushd %{buildoutputdir -- $suffix}
|
||||
|
||||
@ -1597,7 +1613,7 @@ bash ../configure \
|
||||
--with-jobs=1 \
|
||||
%endif
|
||||
--with-version-build=%{buildver} \
|
||||
--with-version-pre="%{ea_designator}" \
|
||||
--with-version-pre="${EA_DESIGNATOR}" \
|
||||
--with-version-opt=%{lts_designator} \
|
||||
--with-vendor-version-string="%{vendor_version_string}" \
|
||||
--with-vendor-name="Red Hat, Inc." \
|
||||
@ -1613,11 +1629,13 @@ bash ../configure \
|
||||
--with-giflib=system \
|
||||
--with-libpng=system \
|
||||
--with-lcms=system \
|
||||
--with-harfbuzz=system \
|
||||
--with-stdc++lib=dynamic \
|
||||
--with-extra-cxxflags="$EXTRA_CPP_FLAGS" \
|
||||
--with-extra-cflags="$EXTRA_CFLAGS" \
|
||||
--with-extra-ldflags="%{ourldflags}" \
|
||||
--with-num-cores="$NUM_PROC" \
|
||||
--with-source-date="${SOURCE_DATE_EPOCH}" \
|
||||
--disable-javac-server \
|
||||
%ifarch %{zgc_arches}
|
||||
--with-jvm-features=zgc \
|
||||
@ -2129,6 +2147,18 @@ require "copy_jdk_configs.lua"
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Fri Feb 19 2021 Andrew Hughes <gnu.andrew@redhat.com> - 1:16.0.0.0.36-0.0.ea.rolling
|
||||
- Update to jdk-16.0.0.0+36
|
||||
- Update tarball generation script to use git following OpenJDK's move to github
|
||||
- Update tarball generation script to use PR3823 which handles JDK-8235710 changes
|
||||
- Use upstream default for version-pre rather than setting it to "ea" or ""
|
||||
- Drop libsunec.so which is no longer generated, thanks to JDK-8235710
|
||||
- Drop unnecessary compiler flags, dating back to work on GCC 6 & 10
|
||||
- Adapt RH1750419 alt-java patch to still apply after some variable re-naming in the makefiles
|
||||
- Update filever to remove any trailing zeros, as in the OpenJDK build, and use for source filename
|
||||
- Use system harfbuzz now this is supported.
|
||||
- Pass SOURCE_DATE_EPOCH to build for reproducible builds
|
||||
|
||||
* Fri Feb 19 2021 Stephan Bergmann <sbergman@redhat.com> - 1:15.0.2.0.7-1.rolling
|
||||
- Hardcode /usr/sbin/alternatives for Flatpak builds
|
||||
|
||||
|
@ -1,25 +1,27 @@
|
||||
diff -r 1356affa5e44 make/modules/java.base/Launcher.gmk
|
||||
--- openjdk/make/modules/java.base/Launcher.gmk
|
||||
diff --git openjdk.orig/make/modules/java.base/Launcher.gmk openjdk/make/modules/java.base/Launcher.gmk
|
||||
index 700ddefda49..2882de68eb2 100644
|
||||
--- openjdk.orig/make/modules/java.base/Launcher.gmk
|
||||
+++ openjdk/make/modules/java.base/Launcher.gmk
|
||||
@@ -37,6 +37,14 @@
|
||||
@@ -41,6 +41,14 @@ $(eval $(call SetupBuildLauncher, java, \
|
||||
OPTIMIZATION := HIGH, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, java, \
|
||||
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS -DENABLE_ARG_FILES, \
|
||||
+ EXTRA_RC_FLAGS := $(JAVA_RC_FLAGS), \
|
||||
+#Wno-error=cpp is present to allow commented warning in ifdef part of main.c
|
||||
+$(eval $(call SetupBuildLauncher, alt-java, \
|
||||
+ CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS -DENABLE_ARG_FILES -DREDHAT_ALT_JAVA -Wno-error=cpp, \
|
||||
+ EXTRA_RCFLAGS := $(JAVA_RCFLAGS), \
|
||||
+ VERSION_INFO_RESOURCE := $(JAVA_VERSION_INFO_RESOURCE), \
|
||||
+ OPTIMIZATION := HIGH, \
|
||||
+))
|
||||
+
|
||||
+#Wno-error=cpp is present to allow commented warning in ifdef part of main.c
|
||||
+$(eval $(call SetupBuildLauncher, alt-java, \
|
||||
+ CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS -DENABLE_ARG_FILES -DREDHAT_ALT_JAVA -Wno-error=cpp, \
|
||||
EXTRA_RC_FLAGS := $(JAVA_RC_FLAGS), \
|
||||
VERSION_INFO_RESOURCE := $(JAVA_VERSION_INFO_RESOURCE), \
|
||||
OPTIMIZATION := HIGH, \
|
||||
|
||||
diff -r 25e94aa812b2 src/share/bin/alt_main.h
|
||||
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
|
||||
+++ openjdk/src/java.base/share/native/launcher/alt_main.h Tue Jun 02 17:15:28 2020 +0100
|
||||
ifeq ($(call isTargetOs, windows), true)
|
||||
$(eval $(call SetupBuildLauncher, javaw, \
|
||||
CFLAGS := -DJAVAW -DEXPAND_CLASSPATH_WILDCARDS -DENABLE_ARG_FILES, \
|
||||
diff --git openjdk.orig/src/java.base/share/native/launcher/alt_main.h openjdk/src/java.base/share/native/launcher/alt_main.h
|
||||
new file mode 100644
|
||||
index 00000000000..697df2898ac
|
||||
--- /dev/null
|
||||
+++ openjdk/src/java.base/share/native/launcher/alt_main.h
|
||||
@@ -0,0 +1,73 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2019, Red Hat, Inc. All rights reserved.
|
||||
@ -94,9 +96,10 @@ diff -r 25e94aa812b2 src/share/bin/alt_main.h
|
||||
+}
|
||||
+
|
||||
+#endif // REDHAT_ALT_JAVA
|
||||
diff -r 25e94aa812b2 src/share/bin/main.c
|
||||
--- openjdk/src/java.base/share/native/launcher/main.c Wed Feb 05 12:20:36 2020 -0300
|
||||
+++ openjdk/src/java.base/share/native/launcher/main.c Tue Jun 02 17:15:28 2020 +0100
|
||||
diff --git openjdk.orig/src/java.base/share/native/launcher/main.c openjdk/src/java.base/share/native/launcher/main.c
|
||||
index b734fe2ba78..79dc8307650 100644
|
||||
--- openjdk.orig/src/java.base/share/native/launcher/main.c
|
||||
+++ openjdk/src/java.base/share/native/launcher/main.c
|
||||
@@ -34,6 +34,14 @@
|
||||
#include "jli_util.h"
|
||||
#include "jni.h"
|
||||
|
2
sources
2
sources
@ -1,2 +1,2 @@
|
||||
SHA512 (tapsets-icedtea-3.15.0.tar.xz) = c752a197cb3d812d50c35e11e4722772be40096c81d2a57933e0d9b8a3c708b9c157b8108a4e33a06ca7bb81648170994408c75d6f69d5ff12785d0c31009671
|
||||
SHA512 (jdk-updates-jdk15u-jdk-15.0.2+7.tar.xz) = d82e932671464d5c3643bda95c66bccb8cff7f22fdfb242e8b17f41b8b07cdf843ce5e85388edff8ab81ccad09f17575451440039adada2cd49d479ea600bf18
|
||||
SHA512 (openjdk-jdk16-jdk-16+36.tar.xz) = 8fc618b960eb6d982d408dd5607dea61f230895b2e2b233793308048ae004868595f501e56a1ab79c3d6aa5b638e06f58383c34d0a09fb321f48678a3a89f5f4
|
||||
|
Loading…
Reference in New Issue
Block a user