Ticket #52551: ghc-8.diff

File ghc-8.diff, 19.2 KB (added by neverpanic (Clemens Lang), 8 years ago)

Patch for GHC 8.0.1

  • Portfile

     
    88# Do not update GHC separate from Haskell Platform.
    99# When updating GHC, make sure to revbump all Haskell ports.
    1010# Also make sure to update the version in the Haskell PortGroup.
    11 version             7.8.3
    12 revision            4
     11version             8.0.1
     12revision            0
    1313categories          lang haskell
    1414maintainers         cal openmaintainer
    1515license             BSD
     
    3434distname        ${name}-${version}-src
    3535worksrcdir      ${name}-${version}
    3636
    37 use_bzip2       yes
     37use_xz          yes
    3838
    3939distfiles       ${name}-${version}-src${extract.suffix} \
    4040                ${name}-${version}-testsuite${extract.suffix}
    4141
    42 checksums       ghc-7.8.3-src.tar.bz2 \
    43                 rmd160  464d31d924a8c1e23e94b3cae810c4e41dad4b75 \
    44                 sha256  2358826f8424bf571dcc313bd882422fe108a340d6e37db4339ff6d5d6ac3f37 \
    45                 ghc-7.8.3-testsuite.tar.bz2 \
    46                 rmd160  abc39b71e2f3926b80c681428c447f39599d7d83 \
    47                 sha256  9cfef874adf5b895701ae52e507f07049a64246af120ac15200e7bf612521122
     42checksums       ghc-8.0.1-src.tar.xz \
     43                rmd160  3ad5728492a7dd874de320fe0a3936fcd7681693 \
     44                sha256  90fb20cd8712e3c0fbeb2eac8dab6894404c21569746655b9b12ca9684c7d1d2 \
     45                ghc-8.0.1-testsuite.tar.xz \
     46                rmd160  20e03e566d0842dfcd12f48fa0cc86c6d5a3caff \
     47                sha256  bc57163656ece462ef61072559d491b72c5cdd694f3c39b80ac0f6b9a3dc8151
    4848
    4949depends_build   port:ghc-bootstrap \
    5050                port:libxslt
    5151
    52 depends_lib     port:gmp           \
    53                 port:ncurses       \
    54                 port:libiconv      \
    55                 port:llvm-3.5      \
     52depends_lib     port:gmp \
     53                port:ncurses \
     54                port:libiconv \
     55                port:llvm-3.7 \
    5656                port:libffi
    5757
    58 patchfiles      patch-configure-workaround-bsdsed-incompatibility.diff \
    59                 patch-configure-disable-docs.diff \
    60                 patch-unix_lib_osx_sandbox_compatibility.diff
     58patchfiles      patch-configure-link-ghc-pwd-against-system-libiconv.diff \
     59                buildpath-abi-stability.patch
    6160
    6261livecheck.type  none
    6362test.run        yes
     
    7877                macports-clang-3.3
    7978
    8079set bootstraproot ${prefix}/share/ghc-bootstrap
    81 set llvmPrefix  ${prefix}/libexec/llvm-3.5
     80set llvmPrefix  ${prefix}/libexec/llvm-3.7
    8281configure.args  --with-ghc=${bootstraproot}/bin/ghc \
    8382                --with-iconv-includes=${prefix}/include \
    8483                --with-iconv-libraries=${prefix}/lib \
     
    9190                --with-llc=${llvmPrefix}/bin/llc \
    9291                --with-opt=${llvmPrefix}/bin/opt
    9392
     93# See https://ghc.haskell.org/trac/ghc/ticket/11744
     94pre-configure {
     95    try {
     96        set nmclassic [exec -- xcrun --find nm-classic]
     97        if {$nmclassic ne ""} {
     98            configure.args-append   --with-nm=${nmclassic}
     99        }
     100    } catch {*} {}
     101}
     102
    94103# OK so because the bootstrap binary has been prebuilt for libraries in
    95104# /usr/lib we search these in addition to MacPorts' paths to prevent link
    96105# errors. GHC _should_ actually compile itself in stage2 using paths from the
     
    98107compiler.cpath /usr/include
    99108compiler.library_path /usr/lib
    100109
    101 build.args      VERBOSE=1
    102 destroot.args   VERBOSE=1
     110pre-configure {
     111    file mkdir ${worksrcpath}/build
     112    file copy -force ${filespath}/build.mk ${worksrcpath}/build/build.mk
     113}
    103114
    104115pre-activate {
    105116    set obsoletes [list]
  • files/build.mk

     
     1# -----------------------------------------------------------------------------
     2# MacPorts GHC build configuration
     3#
     4# Uncomment one of the following BuildFlavour settings to get the desired
     5# overall build type.
     6
     7# Disable building the documentation, we want to avoid the dependency
     8BUILD_DOCBOOK_HTML = NO
     9BUILD_DOCBOOK_PS   = NO
     10BUILD_DOCBOOK_PDF  = NO
     11
     12# -------- Build profiles -----------------------------------------------------
     13# Uncomment one of these to select a build profile below:
     14
     15# Full build with max optimisation and everything enabled (very slow build)
     16#BuildFlavour = perf
     17
     18# As above but build GHC using the LLVM backend
     19#BuildFlavour = perf-llvm
     20
     21# Perf build configured for a cross-compiler
     22#BuildFlavour = perf-cross
     23
     24# Fast build with optimised libraries, no profiling (RECOMMENDED):
     25BuildFlavour = quick
     26
     27# Fast build with optimised libraries, no profiling, with LLVM:
     28#BuildFlavour = quick-llvm
     29
     30# Fast build configured for a cross compiler
     31#BuildFlavour  = quick-cross
     32
     33# Even faster build.  NOT RECOMMENDED: the libraries will be
     34# completely unoptimised, so any code built with this compiler
     35# (including stage2) will run very slowly:
     36#BuildFlavour = quickest
     37
     38# Profile the stage2 compiler:
     39#BuildFlavour = prof
     40
     41# A development build, working on the stage 1 compiler:
     42#BuildFlavour = devel1
     43
     44# A development build, working on the stage 2 compiler:
     45#BuildFlavour = devel2
     46
     47# A build with max optimisation that still builds the stage2 compiler
     48# quickly. Compiled code will be the same as with "perf". Programs
     49# will compile more slowly.
     50#BuildFlavour = bench
     51
     52# As above but build GHC using the LLVM backend
     53#BuildFlavour = bench-llvm
     54
     55# Bench build configured for a cross-compiler
     56#BuildFlavour = bench-cross
     57
     58# Use the same settings as validate.
     59#BuildFlavour = validate
     60
     61ifneq "$(BuildFlavour)" ""
     62include mk/flavours/$(BuildFlavour).mk
     63endif
     64
     65# -------- Miscellaneous variables --------------------------------------------
     66
     67# Set to V = 0 to get prettier build output.
     68# Please use V=1 (the default) when reporting GHC bugs.
     69V = 0
     70
     71# Should all enabled warnings (see mk/warnings.mk) be turned into errors while
     72# building stage 2?
     73#WERROR=-Werror
     74
     75# After stage 1 and the libraries have been built, you can uncomment this line:
     76#stage=2
     77
     78# Then stage 1 will not be touched by the build system, until
     79# you comment the line again.  This is a useful trick for when you're
     80# working on stage 2 and want to freeze stage 1 and the libraries for
     81# a while.
     82
     83# Build the "extra" packages (see ./packages). This enables more tests. See:
     84# https://ghc.haskell.org/trac/ghc/wiki/Building/RunningTests/Running#AdditionalPackages
     85#BUILD_EXTRA_PKGS=YES
     86
     87# Uncomment the following line to enable building DPH
     88#BUILD_DPH=YES
     89
     90# Uncomment the following to force `integer-gmp` to use the in-tree GMP 5.0.4
     91# (other sometimes useful configure-options: `--with-gmp-{includes,libraries}`)
     92#libraries/integer-gmp_CONFIGURE_OPTS += --configure-option=--with-intree-gmp
     93
     94GhcLibWays = $(if $(filter $(DYNAMIC_GHC_PROGRAMS),YES),v dyn,v)
     95
     96# Only use -fasm by default on platforms that support it.
     97GhcFAsm = $(if $(filter $(GhcWithNativeCodeGen),YES),-fasm,)
     98
     99# ----------- A Performance/Distribution build --------------------------------
     100
     101ifeq "$(BuildFlavour)" "perf"
     102
     103# perf matches the default settings, repeated here for comparison:
     104
     105SRC_HC_OPTS     = -O -H64m
     106GhcStage1HcOpts = -O $(GhcFAsm)
     107GhcStage2HcOpts = -O2 $(GhcFAsm)
     108GhcHcOpts       = -Rghc-timing
     109GhcLibHcOpts    = -O2
     110GhcLibWays     += p
     111
     112ifeq "$(PlatformSupportsSharedLibs)" "YES"
     113GhcLibWays += dyn
     114endif
     115
     116endif
     117
     118# ---------------- Perf build using LLVM --------------------------------------
     119
     120ifeq "$(BuildFlavour)" "perf-llvm"
     121
     122SRC_HC_OPTS     = -O -H64m -fllvm
     123GhcStage1HcOpts = -O -fllvm
     124GhcStage2HcOpts = -O2 -fllvm
     125GhcHcOpts       = -Rghc-timing
     126GhcLibHcOpts    = -O2
     127GhcLibWays     += p
     128
     129endif
     130
     131# ------- A Perf build configured for cross-compilation ----------------------
     132
     133ifeq "$(BuildFlavour)" "perf-cross"
     134
     135SRC_HC_OPTS     = -O -H64m -fllvm
     136GhcStage1HcOpts = -O2
     137GhcStage2HcOpts = -O2 -fllvm
     138GhcHcOpts       = -Rghc-timing
     139GhcLibHcOpts    = -O2
     140GhcLibWays     += p
     141INTEGER_LIBRARY    = integer-simple
     142Stage1Only         = YES
     143
     144HADDOCK_DOCS       = NO
     145BUILD_DOCBOOK_HTML = NO
     146BUILD_DOCBOOK_PS   = NO
     147BUILD_DOCBOOK_PDF  = NO
     148
     149DYNAMIC_BY_DEFAULT   = NO
     150DYNAMIC_GHC_PROGRAMS = NO
     151
     152endif
     153
     154# -------- A Fast build -------------------------------------------------------
     155
     156ifeq "$(BuildFlavour)" "quickest"
     157
     158SRC_HC_OPTS        = -H64m -O0 $(GhcFAsm)
     159GhcStage1HcOpts    = -O $(GhcFAsm)
     160GhcStage2HcOpts    = -O0 $(GhcFAsm)
     161GhcLibHcOpts       = -O0 $(GhcFAsm)
     162SplitObjs          = NO
     163HADDOCK_DOCS       = NO
     164BUILD_DOCBOOK_HTML = NO
     165BUILD_DOCBOOK_PS   = NO
     166BUILD_DOCBOOK_PDF  = NO
     167
     168endif
     169
     170# -------- A Fast build with optimised libs -----------------------------------
     171
     172ifeq "$(BuildFlavour)" "quick"
     173
     174SRC_HC_OPTS        = -H64m -O0 $(GhcFAsm)
     175GhcStage1HcOpts    = -O $(GhcFAsm)
     176GhcStage2HcOpts    = -O0 $(GhcFAsm)
     177GhcLibHcOpts       = -O $(GhcFAsm)
     178SplitObjs          = NO
     179HADDOCK_DOCS       = NO
     180BUILD_DOCBOOK_HTML = NO
     181BUILD_DOCBOOK_PS   = NO
     182BUILD_DOCBOOK_PDF  = NO
     183
     184endif
     185
     186# -------- A Fast build with optimised libs using LLVM ------------------------
     187
     188ifeq "$(BuildFlavour)" "quick-llvm"
     189
     190SRC_HC_OPTS        = -H64m -O0 -fllvm
     191GhcStage1HcOpts    = -O -fllvm
     192GhcStage2HcOpts    = -O0 -fllvm
     193GhcLibHcOpts       = -O -fllvm
     194SplitObjs          = NO
     195HADDOCK_DOCS       = NO
     196BUILD_DOCBOOK_HTML = NO
     197BUILD_DOCBOOK_PS   = NO
     198BUILD_DOCBOOK_PDF  = NO
     199
     200endif
     201
     202# -------- A Fast build configured for cross-compilation ----------------------
     203
     204ifeq "$(BuildFlavour)" "quick-cross"
     205
     206SRC_HC_OPTS        = -H64m -O0
     207GhcStage1HcOpts    = -O
     208GhcStage2HcOpts    = -O0 -fllvm
     209GhcLibHcOpts       = -O -fllvm
     210SplitObjs          = NO
     211HADDOCK_DOCS       = NO
     212BUILD_DOCBOOK_HTML = NO
     213BUILD_DOCBOOK_PS   = NO
     214BUILD_DOCBOOK_PDF  = NO
     215INTEGER_LIBRARY    = integer-simple
     216Stage1Only         = YES
     217
     218DYNAMIC_BY_DEFAULT   = NO
     219DYNAMIC_GHC_PROGRAMS = NO
     220
     221endif
     222
     223# -------- Profile the stage2 compiler ----------------------------------------
     224
     225ifeq "$(BuildFlavour)" "prof"
     226
     227SRC_HC_OPTS        = -H64m -O0 $(GhcFAsm)
     228GhcStage1HcOpts    = -O $(GhcFAsm)
     229GhcStage2HcOpts    = -O $(GhcFAsm)
     230GhcLibHcOpts       = -O $(GhcFAsm)
     231
     232GhcLibWays         += p
     233GhcProfiled        = YES
     234
     235SplitObjs          = NO
     236HADDOCK_DOCS       = NO
     237BUILD_DOCBOOK_HTML = NO
     238BUILD_DOCBOOK_PS   = NO
     239BUILD_DOCBOOK_PDF  = NO
     240
     241endif
     242
     243# -------- A Development build (stage 1) --------------------------------------
     244
     245ifeq "$(BuildFlavour)" "devel1"
     246
     247SRC_HC_OPTS        = -H64m -O $(GhcFAsm)
     248GhcLibHcOpts       = -O -dcore-lint
     249GhcStage1HcOpts    = -Rghc-timing -O0 -DDEBUG
     250GhcStage2HcOpts    = -Rghc-timing -O $(GhcFAsm)
     251SplitObjs          = NO
     252HADDOCK_DOCS       = NO
     253BUILD_DOCBOOK_HTML = NO
     254BUILD_DOCBOOK_PS   = NO
     255BUILD_DOCBOOK_PDF  = NO
     256LAX_DEPENDENCIES   = YES
     257
     258endif
     259
     260# -------- A Development build (stage 2) --------------------------------------
     261
     262ifeq "$(BuildFlavour)" "devel2"
     263
     264SRC_HC_OPTS        = -H64m -O $(GhcFAsm)
     265GhcLibHcOpts       = -O -dcore-lint
     266GhcStage1HcOpts    = -Rghc-timing -O $(GhcFAsm)
     267GhcStage2HcOpts    = -Rghc-timing -O0 -DDEBUG
     268SplitObjs          = NO
     269HADDOCK_DOCS       = NO
     270BUILD_DOCBOOK_HTML = NO
     271BUILD_DOCBOOK_PS   = NO
     272BUILD_DOCBOOK_PDF  = NO
     273LAX_DEPENDENCIES   = YES
     274
     275endif
     276
     277# -------- A bench build with optimised libs -----------------------------------
     278
     279ifeq "$(BuildFlavour)" "bench"
     280
     281SRC_HC_OPTS        = -O -H64m
     282GhcStage1HcOpts    = -O $(GhcFAsm)
     283GhcStage2HcOpts    = -O0 $(GhcFAsm)
     284GhcLibHcOpts       = -O2 $(GhcFAsm)
     285SplitObjs          = NO
     286HADDOCK_DOCS       = NO
     287BUILD_DOCBOOK_HTML = NO
     288BUILD_DOCBOOK_PS   = NO
     289BUILD_DOCBOOK_PDF  = NO
     290
     291endif
     292
     293# ---------------- Bench build using LLVM --------------------------------------
     294
     295ifeq "$(BuildFlavour)" "bench-llvm"
     296
     297SRC_HC_OPTS        = -O -H64m
     298GhcStage1HcOpts    = -O -fllvm
     299GhcStage2HcOpts    = -O0 -fllvm
     300GhcLibHcOpts       = -O2 -fllvm
     301SplitObjs          = NO
     302HADDOCK_DOCS       = NO
     303BUILD_DOCBOOK_HTML = NO
     304BUILD_DOCBOOK_PS   = NO
     305BUILD_DOCBOOK_PDF  = NO
     306
     307endif
     308
     309# ------- A Bench build configured for cross-compilation ----------------------
     310
     311ifeq "$(BuildFlavour)" "bench-cross"
     312
     313SRC_HC_OPTS        = -O -H64m
     314GhcStage1HcOpts    = -O $(GhcFAsm)
     315GhcStage2HcOpts    = -O0 $(GhcFAsm)
     316GhcLibHcOpts       = -O2 $(GhcFAsm)
     317SplitObjs          = NO
     318INTEGER_LIBRARY    = integer-simple
     319Stage1Only         = YES
     320HADDOCK_DOCS       = NO
     321BUILD_DOCBOOK_HTML = NO
     322BUILD_DOCBOOK_PS   = NO
     323BUILD_DOCBOOK_PDF  = NO
     324
     325DYNAMIC_BY_DEFAULT   = NO
     326DYNAMIC_GHC_PROGRAMS = NO
     327
     328endif
     329
     330# -----------------------------------------------------------------------------
     331# Other settings that might be useful
     332
     333# NoFib settings
     334NoFibWays =
     335STRIP_CMD = :
     336
     337# ghc-pwd needs to link against /usr/lib/libiconv.dylib explicitly, because
     338# ghc-bootstrap's base library .a archive expects it
     339utils/ghc-pwd_EXTRA_LIBRARIES += "/usr/lib/libiconv.dylib"
  • files/buildpath-abi-stability.patch

     
     1Avoid leaking build path into ABI hashes
     2
     3GHC's build path leaks into the ABI hashes it generates by default. This
     4causes problems because it means that recompiling GHC in a different path
     5also requires recompiling all Haskell packages. Obviously, this is
     6undesirable for a distribution.
     7
     8This patch originates from Debian's Joachim Breitner. See
     9http://bugs.debian.org/785282 for the Debian bug report. It has been
     10submitted upstream in https://ghc.haskell.org/trac/ghc/ticket/10424.
     11
     12Upstream-Status: Submitted [https://ghc.haskell.org/trac/ghc/ticket/10424]
     13Index: ./compiler/iface/MkIface.hs
     14===================================================================
     15--- ./compiler/iface/MkIface.hs 2015-05-17 20:34:02.808643844 +0200
     16+++ ./compiler/iface/MkIface.hs 2015-05-17 20:34:02.804643799 +0200
     17@@ -611,7 +611,7 @@
     18    iface_hash <- computeFingerprint putNameLiterally
     19                       (mod_hash,
     20                        ann_fn (mkVarOcc "module"),  -- See mkIfaceAnnCache
     21-                       mi_usages iface0,
     22+                       usages,
     23                        sorted_deps,
     24                        mi_hpc iface0)
     25 
     26@@ -644,6 +644,9 @@
     27     (non_orph_fis,   orph_fis)   = mkOrphMap ifFamInstOrph (mi_fam_insts iface0)
     28     fix_fn = mi_fix_fn iface0
     29     ann_fn = mkIfaceAnnCache (mi_anns iface0)
     30+    -- Do not allow filenames to affect the interface
     31+    usages = [ case u of UsageFile _ fp -> UsageFile "" fp; _ -> u | u <- mi_usages iface0 ]
     32+
     33 
     34 getOrphanHashes :: HscEnv -> [Module] -> IO [Fingerprint]
     35 getOrphanHashes hsc_env mods = do
  • files/patch-configure-disable-docs.diff

     
    1 --- configure.orig      2014-09-17 23:12:43.000000000 +0200
    2 +++ configure   2014-09-17 23:13:29.000000000 +0200
    3 @@ -11943,6 +11943,9 @@
    4      BUILD_DOCBOOK_PS=YES
    5      BUILD_DOCBOOK_PDF=YES
    6  fi
    7 +BUILD_DOCBOOK_HTML=NO
    8 +BUILD_DOCBOOK_PS=NO
    9 +BUILD_DOCBOOK_PDF=NO
    10  
    11  
    12  
  • files/patch-configure-link-ghc-pwd-against-system-libiconv.diff

     
     1Fix initial build of ghc-pwd due to missing libiconv
     2
     3ghc-pwd fails to build because it is built using ghc-bootstrap, which ships
     4libHSbase-$version.a, which references symbols from libiconv (and actually the
     5system libiconv, because the MacPorts use uses _libiconv as symbol names, but
     6the archive uses _iconv). Fix this by explicitly linking against the system
     7libiconv for this initial build of ghc-pwd.
     8
     9Upstream-Status: Inappropriate (/usr/lib/libiconv.dylib is system-specific; a generic solution would be needed)
     10--- configure.orig      2016-05-20 23:40:29.000000000 +0200
     11+++ configure   2016-05-20 23:41:06.000000000 +0200
     12@@ -4149,7 +4149,7 @@
     13 $as_echo "$as_me: Building in-tree ghc-pwd" >&6;}
     14                 rm -rf utils/ghc-pwd/dist-boot
     15     mkdir  utils/ghc-pwd/dist-boot
     16-                GHC_LDFLAGS=`perl -e 'foreach (@ARGV) { print "-optl$_ " }' -- $LDFLAGS`
     17+                GHC_LDFLAGS=`perl -e 'foreach (@ARGV) { print "-optl$_ " }' -- $LDFLAGS /usr/lib/libiconv.dylib`
     18         if ! "$WithGhc" $GHC_LDFLAGS -v0 -no-user-$GHC_PACKAGE_DB_FLAG -hidir utils/ghc-pwd/dist-boot -odir utils/ghc-pwd/dist-boot -stubdir utils/ghc-pwd/dist-boot --make utils/ghc-pwd/Main.hs -o utils/ghc-pwd/dist-boot/ghc-pwd
     19     then
     20         as_fn_error $? "Building ghc-pwd failed" "$LINENO" 5
  • files/patch-configure-workaround-bsdsed-incompatibility.diff

     
    1 --- configure.orig      2014-09-17 22:40:16.000000000 +0200
    2 +++ configure   2014-09-17 22:40:40.000000000 +0200
    3 @@ -4075,7 +4075,7 @@
    4  $as_echo "$as_me: Building in-tree ghc-pwd" >&6;}
    5                  rm -rf utils/ghc-pwd/dist-boot
    6      mkdir  utils/ghc-pwd/dist-boot
    7 -                GHC_LDFLAGS=`echo $LDFLAGS | sed 's/\(^\| \)\([^ ]\)/\1-optl\2/g'`
    8 +                GHC_LDFLAGS= # this breaks our build with BSD sed, and we don't need the LDFLAGS here
    9          if ! "$WithGhc" $GHC_LDFLAGS -v0 -no-user-$GHC_PACKAGE_DB_FLAG -hidir utils/ghc-pwd/dist-boot -odir utils/ghc-pwd/dist-boot -stubdir utils/ghc-pwd/dist-boot --make utils/ghc-pwd/Main.hs -o utils/ghc-pwd/dist-boot/ghc-pwd
    10      then
    11          as_fn_error $? "Building ghc-pwd failed" "$LINENO" 5
  • files/patch-unix_lib_osx_sandbox_compatibility.diff

     
    1 --- libraries/unix/System/Posix/Files.hsc.orig  2014-09-21 17:58:47.000000000 +0200
    2 +++ libraries/unix/System/Posix/Files.hsc       2014-09-21 17:59:31.000000000 +0200
    3 @@ -152,7 +152,8 @@
    4      if (r == 0)
    5          then return True
    6          else do err <- getErrno
    7 -                if (err == eACCES || err == eROFS || err == eTXTBSY)
    8 +                if (err == eACCES || err == eROFS || err == eTXTBSY ||
    9 +                    err == ePERM)
    10                     then return False
    11                     else throwErrnoPath "fileAccess" name
    12  
    13 --- libraries/unix/System/Posix/Files/ByteString.hsc.orig       2014-09-21 17:58:54.000000000 +0200
    14 +++ libraries/unix/System/Posix/Files/ByteString.hsc    2014-09-21 18:02:27.000000000 +0200
    15 @@ -158,9 +158,10 @@
    16      if (r == 0)
    17         then return True
    18         else do err <- getErrno
    19 -               if (err == eACCES)
    20 -                  then return False
    21 -                  else throwErrnoPath "fileAccess" name
    22 +                if (err == eACCES || err == eROFS || err == eTXTBSY ||
    23 +                    err == ePERM)
    24 +                   then return False
    25 +                   else throwErrnoPath "fileAccess" name
    26  
    27  
    28  -- | @getFileStatus path@ calls gets the @FileStatus@ information (user ID,