Add autosetup/README.md - maintenance-related docs for SQLite developers (e.g. how to update autosetup). Start marking up the proj.tcl APIs with autosetup's doc markup so that they appear in the ./configure --reference output.

FossilOrigin-Name: aa6213767f0d7e63c753e33aadb95cbeb8e522c22f2fe1bbfa4df66bea6e3380
This commit is contained in:
stephan 2024-11-06 04:38:05 +00:00
parent e957bd1ce7
commit 4c2f7e57a2
5 changed files with 260 additions and 18 deletions

View File

@ -939,6 +939,9 @@ proc sqlite-check-line-editing {} {
# If we found a library, configure the build to use it...
if {"" ne $rlLib} {
if {"editline" eq $editLibName && "HAVE_READLINE" eq $editLibDef} {
# Alert the user that, despite outward appearances, we won't be
# linking to the GPL'd libreadline. Presumably that distinction is
# significant for those using --editline.
proj-indented-notice {
NOTE: the local libedit but uses <readline/readline.h> so we
will compile with -DHAVE_READLINE=1 but will link with

164
autosetup/README.md Normal file
View File

@ -0,0 +1,164 @@
Maintaining Autosetup in the SQLite Tree
========================================================================
This document provides some tips and reminders for the SQLite
developers regarding using and maintaining the [Autosetup][]-based
build infrastructure. It is not an [Autosetup][] reference.
**Table of Contents**:
- [Autosetup API Reference](#apiref)
- [API Tips](#apitips)
- [Ensuring TCL Compatibility](#tclcompat)
- [Updating Autosetup](#updating)
------------------------------------------------------------------------
<a name="apiref"></a>
Autosetup API Reference
========================================================================
The Autosetup API is quite extensive and can be read either in
the [files in the `autosetup` dir](/dir/autosetup) or using:
>
```
$ ./configure --reference | less
```
That will include any docs from any TCL files in the `./autosetup` dir
which contain certain (simple) markup defined by autosetup.
This project's own autosetup-related APIs are in [proj.tcl][] or
[auto.def][]. The former contains helper APIs which are, more or
less, portable across projects (that file is re-used as-is in other
projects) and all have a `proj-` name prefix. The latter is the main
configure script driver and contains related functions which are
specific to this tree.
<a name="apitips"></a>
Autosetup API Tips
========================================================================
This section briefly covers only APIs which are frequently useful in
day-to-day maintenance and might not be immediately recognized as such
obvious from a casual perusal of `auto.def`. Their complete docs can be
found in [proj.tcl][].
In (mostly) alphabetical order:
- **`get-env VAR ?default?`**\
Will fetch an "environment variable"
from the first of either: (A) a KEY=VALUE passed to the configure
script or (B) the system's environment variables. Not to be confused
with `getenv`, which only does the latter and is rarely, if ever,
useful in this tree.
- **`proj-get-env VAR ?default?`**\
Works like `get-env` but will, if that function finds no match,
look for a file named `./.env-$VAR` and, if found, return its
trimmed contents. This can be used, e.g., to set a developer's
local preferences for the default `CFLAGS`.
- **`proj-define-if-opt-truthy flag defineName checkingMsg ?yesVal=1? ?noVal=0?`**\
Defines `defineName` to either `yesVal` or `noVal`, depending on
whether `--flag` is truthy or not.
- **`proj-if-opt-truthy flag thenScript ?elseScript?`**\
Evals `thenScript` if the given `--flag` is truthy, else it
evals the optional `elseScript`.
- **`proj-indented-notice ?-error? msg`**\
Breaks its `msg` argument into lines, trims them, and emits them
with consistent indentation. If the `-error` flag is used, it them
exits with non-0. This will stick out starkly from normal output
and is intended to be used only for important notices.
- **`proj-opt-truthy flag`**\
Returns 1 if `--flag`'s value is "truthy," i.e. one of (1, on,
enabled, yes).
- **`proj-opt-was-provided FLAG`**\
Returns 1 if `--FLAG` was explicitly provided to configure,
else 0. This distinction can be used to determine, e.g., whether
`--with-readline` was provided or whether we're searching for
readline by default. In the former case, failure to find it should
be treated as fatal.
- **`proj-val-truthy value`**\
Returns 1 if `$value` is "truthy," i.e. one of (1, on, enabled,
yes).
<a name="tclcompat"></a>
Ensuring TCL Compatibility
========================================================================
It is important that any TCL files used by the configure process
remain compatible with both [JimTCL][] and the canonical TCL. Though
JimTCL has outstanding compatibility with canonical TCL, it does have
a few corners with incompatibilities, e.g. regular expressions. If a
script runs in JimTCL without using any JimTCL-specific features, then
it's a certainty that it will run in canonical TCL as well. The
opposite, however, is not _always_ the case.
By default, the configure script will search for an available `tclsh`
(under several common names, e.g. `tclsh8.6`) before falling back to
compiling the copy of `jimsh0.c` included in the source tree.
There are two simple ways to ensure that the configure process uses
JimTCL instead of the canonical `tclsh`, and either approach ensures
configure script compatibility:
1. Build on a system with no `tclsh` installed. In that case, the
configure process will fall back to building the in-tree copy of
JimTCL.
2. Manually build `./jimsh0` in the top of the checkout with:\
`cc -o jimsh0 autosetup/jimsh0.c`\
With that in place, the configure script will prefer to use that
before looking for a system-level `tclsh`. Note that `make distclean`
will remove that file.
**Note that `jimsh0` is distinctly different** from the `jimsh` which
gets built for code-generation purposes. The latter requires
non-default build flags to enable features which are
platform-dependent, most notably to make its `[file normalize]`
work. This means, for example, that the configure script and its
utility APIs must not use `[file normalize]`, but autosetup provides a
TCL implementation of `[file-normalize]` (note the dash) for portable
use in the configure script.
<a name="updating"></a>
Updating Autosetup
========================================================================
Updating autosetup is, more often than not, painless. It requires having
a checked-out copy of [the autosetup git repository][autosetup-git]:
>
```
$ git clone https://github.com/msteveb/autosetup
$ cd autosetup
# Or, if it's already checked out:
$ git pull
```
Then, from the top-most directory of an SQLite checkout:
>
```
$ /path/to/autosetup-checkout/autosetup --install .
$ fossil status # show the modified files
```
Unless the upgrade made any incompatible changes (which is exceedingly
rare), that's all there is to it. Check over the diff, test the
configure process, and check it in.
[Autosetup]: https://msteveb.github.io/autosetup/
[auto.def]: ../auto.def?mimetype=text/plain
[autosetup-git]: https://github.com/msteveb/autosetup
[proj.tcl]: ./proj.tcl?mimetype=text/plain
[JimTCL]: https://jim.tcl.tk

View File

@ -47,15 +47,26 @@
# updating global state via feature tests.
########################################################################
# ----- @module proj.tcl -----
# @section Project Helper APIs
########################################################################
# $proj_ is an internal-use-only array for storing whatever generic
# internal stuff we need stored.
array set proj_ {}
set proj_(isatty) [isatty? stdout]
########################################################################
# @proj-warn msg
#
# Emits a warning message to stderr.
proc proj-warn {msg} {
puts stderr [proj-bold "WARNING: $msg"]
}
########################################################################
# @proj-error msg
#
# Emits an error message to stderr and exits with non-0.
proc proj-fatal {msg} {
show-notices
puts stderr [proj-bold "ERROR: $msg"]
@ -63,6 +74,8 @@ proc proj-fatal {msg} {
}
########################################################################
# @proj-assert script
#
# Kind of like a C assert if uplevel (eval) of $script is false,
# triggers a fatal error.
proc proj-assert {script} {
@ -75,6 +88,8 @@ proc proj-assert {script} {
}
########################################################################
# @proj-bold str
#
# If this function believes that the current console might support
# ANSI escape sequences then this returns $str wrapped in a sequence
# to bold that text, else it returns $str as-is.
@ -86,6 +101,8 @@ proc proj-bold {str} {
}
########################################################################
# @proj-indented-notice ?-error? msg
#
# Takes a multi-line message and emits it with consistent indentation
# using [user-notice] (which means its rendering will (A) go to stderr
# and (B) be delayed until the next time autosetup goes to output a
@ -162,6 +179,8 @@ proc proj-check-function-in-lib {function libs {otherlibs {}}} {
}
########################################################################
# @proj-search-for-header-dir ?-dirs LIST? ?-subdirs LIST? header
#
# Searches for $header in a combination of dirs and subdirs, specified
# by the -dirs {LIST} and -subdirs {LIST} flags (each of which have
# sane defaults). Returns either the first matching dir or an empty
@ -193,7 +212,7 @@ proc proj-search-for-header-dir {header args} {
}
########################################################################
# Usage: proj-find-executable-path ?-v? binaryName
# @proj-find-executable-path ?-v? binaryName
#
# Works similarly to autosetup's [find-executable-path $binName] but:
#
@ -220,6 +239,8 @@ proc proj-find-executable-path {args} {
}
########################################################################
# @proj-bin-define binName ?defName?
#
# Uses [proj-find-executable-path $binName] to (verbosely) search for
# a binary, sets a define (see below) to the result, and returns the
# result (an empty string if not found).
@ -237,7 +258,7 @@ proc proj-bin-define {binName {defName {}}} {
}
########################################################################
# Usage: proj-first-bin-of bin...
# @proj-first-bin-of bin...
#
# Looks for the first binary found of the names passed to this
# function. If a match is found, the full path to that binary is
@ -262,6 +283,8 @@ proc proj-first-bin-of {args} {
}
########################################################################
# @proj-opt-was-provided key
#
# Returns 1 if the user specifically provided the given configure
# flag, else 0. This can be used to distinguish between options which
# have a default value and those which were explicitly provided by the
@ -281,6 +304,8 @@ proc proj-opt-was-provided {key} {
}
########################################################################
# @proj-opt-set flag ?val?
#
# Force-set autosetup option $flag to $val. The value can be fetched
# later with [opt-val], [opt-bool], and friends.
#
@ -297,6 +322,8 @@ proc proj-opt-set {flag {val 1}} {
}
########################################################################
# @proj-val-truthy val
#
# Returns 1 if $val appears to be a truthy value, else returns
# 0. Truthy values are any of {1 on enabled yes}
proc proj-val-truthy {val} {
@ -304,6 +331,8 @@ proc proj-val-truthy {val} {
}
########################################################################
# @proj-opt-truthy flag
#
# Returns 1 if [opt-val $flag] appears to be a truthy value or
# [opt-bool $flag] is true. See proj-val-truthy.
proc proj-opt-truthy {flag} {
@ -317,6 +346,8 @@ proc proj-opt-truthy {flag} {
}
########################################################################
# @proj-if-opt-truthy boolFlag thenScript ?elseScript?
#
# If [proj-opt-truthy $flag] is true, eval $then, else eval $else.
proc proj-if-opt-truthy {boolFlag thenScript {elseScript {}}} {
if {[proj-opt-truthy $boolFlag]} {
@ -327,6 +358,8 @@ proc proj-if-opt-truthy {boolFlag thenScript {elseScript {}}} {
}
########################################################################
# @proj-define-if-opt-truthy flag def ?msg? ?iftrue? ?iffalse?
#
# If [proj-opt-truthy $flag] then [define $def $iftrue] else [define
# $def $iffalse]. If $msg is not empty, output [msg-checking $msg] and
# a [msg-results ...] which corresponds to the result. Returns 1 if
@ -354,7 +387,7 @@ proc proj-define-if-opt-truthy {flag def {msg ""} {iftrue 1} {iffalse 0}} {
}
########################################################################
# Args: [-v] optName defName {descr {}}
# @proj-opt-define-bool ?-v? optName defName ?descr?
#
# Checks [proj-opt-truthy $optName] and calls [define $defName X]
# where X is 0 for false and 1 for true. descr is an optional
@ -392,6 +425,8 @@ proc proj-opt-define-bool {args} {
}
########################################################################
# @proj-check-module-loader
#
# Check for module-loading APIs (libdl/libltdl)...
#
# Looks for libltdl or dlopen(), the latter either in -ldl or built in
@ -455,6 +490,8 @@ proc proj-check-module-loader {} {
}
########################################################################
# @proj-no-check-module-loader
#
# Sets all flags which would be set by proj-check-module-loader to
# empty/falsy values, as if those checks had failed to find a module
# loader. Intended to be called in place of that function when
@ -466,6 +503,8 @@ proc proj-no-check-module-loader {} {
}
########################################################################
# @proj-file-conent ?-trim? filename
#
# Opens the given file, reads all of its content, and returns it. If
# the first arg is -trim, the contents of the file named by the second
# argument are trimmed before returning them.
@ -484,6 +523,8 @@ proc proj-file-content {args} {
}
########################################################################
# @proj-file-conent filename
#
# Returns the contents of the given file as an array of lines, with
# the EOL stripped from each input line.
proc proj-file-content-list {fname} {
@ -497,6 +538,8 @@ proc proj-file-content-list {fname} {
}
########################################################################
# @proj-check-compile-commands ?configFlag?
#
# Checks the compiler for compile_commands.json support. If passed an
# argument it is assumed to be the name of an autosetup boolean config
# which controls whether to run/skip this check.
@ -506,9 +549,9 @@ proc proj-file-content-list {fname} {
#
# This test has a long history of false positive results because of
# compilers reacting differently to the -MJ flag.
proc proj-check-compile-commands {{configOpt {}}} {
proc proj-check-compile-commands {{configFlag {}}} {
msg-checking "compile_commands.json support... "
if {"" ne $configOpt && ![proj-opt-truthy $configOpt]} {
if {"" ne $configFlag && ![proj-opt-truthy $configFlag]} {
msg-result "explicitly disabled"
define MAKE_COMPILATION_DB no
return 0
@ -529,15 +572,15 @@ proc proj-check-compile-commands {{configOpt {}}} {
}
########################################################################
# @proj-touch filename
#
# Runs the 'touch' command on one or more files, ignoring any errors.
proc proj-touch {filename} {
catch { exec touch {*}$filename }
}
########################################################################
# Usage:
#
# proj-make-from-dot-in ?-touch? filename(s)...
# @proj-make-from-dot-in ?-touch? filename...
#
# Uses [make-template] to create makefile(-like) file(s) $filename
# from $filename.in but explicitly makes the output read-only, to
@ -569,6 +612,8 @@ proc proj-make-from-dot-in {args} {
}
########################################################################
# @proj-check-profile-flag ?flagname?
#
# Checks for the boolean configure option named by $flagname. If set,
# it checks if $CC seems to refer to gcc. If it does (or appears to)
# then it defines CC_PROFILE_FLAG to "-pg" and returns 1, else it
@ -599,6 +644,8 @@ proc proj-check-profile-flag {{flagname profile}} {
}
########################################################################
# @proj-looks-like-windows ?key?
#
# Returns 1 if this appears to be a Windows environment (MinGw,
# Cygwin, MSys), else returns 0. The optional argument is the name of
# an autosetup define which contains platform name info, defaulting to
@ -610,7 +657,7 @@ proc proj-check-profile-flag {{flagname profile}} {
proc proj-looks-like-windows {{key host}} {
global autosetup
switch -glob -- [get-define $key] {
*-*-ming* - *-*-cygwin - *-*-msys {
*-*-ming* - *-*-cygwin - *-*-msys - *windows* {
return 1
}
}
@ -626,6 +673,8 @@ proc proj-looks-like-windows {{key host}} {
}
########################################################################
# @proj-looks-like-mac ?key?
#
# Looks at either the 'host' (==compilation target platform) or
# 'build' (==the being-built-on platform) define value and returns if
# if that value seems to indicate that it represents a Mac platform,
@ -642,6 +691,8 @@ proc proj-looks-like-mac {{key host}} {
}
########################################################################
# @proj-exe-extension
#
# Checks autosetup's "host" and "build" defines to see if the build
# host and target are Windows-esque (Cygwin, MinGW, MSys). If the
# build environment is then BUILD_EXEEXT is [define]'d to ".exe", else
@ -661,6 +712,8 @@ proc proj-exe-extension {} {
}
########################################################################
# @proj-dll-extension
#
# Works like proj-exe-extension except that it defines BUILD_DLLEXT
# and TARGET_DLLEXT to one of (.so, ,dll, .dylib).
#
@ -685,6 +738,8 @@ proc proj-dll-extension {} {
}
########################################################################
# @proj-lib-extension
#
# Static-library counterpart of proj-dll-extension. Defines
# BUILD_LIBEXT and TARGET_LIBEXT to the conventional static library
# extension for the being-built-on resp. the target platform.
@ -704,6 +759,8 @@ proc proj-lib-extension {} {
}
########################################################################
# @proj-file-extensions
#
# Calls all of the proj-*-extension functions.
proc proj-file-extensions {} {
proj-exe-extension
@ -712,6 +769,8 @@ proc proj-file-extensions {} {
}
########################################################################
# @proj-affirm-files-exist ?-v? filename...
#
# Expects a list of file names. If any one of them does not exist in
# the filesystem, it fails fatally with an informative message.
# Returns the last file name it checks. If the first argument is -v
@ -735,6 +794,8 @@ proc proj-affirm-files-exist {args} {
}
########################################################################
# @proj-check-emsdk
#
# Emscripten is used for doing in-tree builds of web-based WASM stuff,
# as opposed to WASI-based WASM or WASM binaries we import from other
# places. This is only set up for Unix-style OSes and is untested
@ -802,6 +863,8 @@ proc proj-check-emsdk {} {
}
########################################################################
# @proj-check-rpath
#
# Tries various approaches to handling the -rpath link-time
# flag. Defines LDFLAGS_RPATH to that/those flag(s) or an empty
# string. Returns 1 if it finds an option, else 0.
@ -844,6 +907,8 @@ proc proj-check-rpath {} {
}
########################################################################
# @proj-check-soname ?libname?
#
# Checks whether CC supports the -Wl,soname,lib... flag. If so, it
# returns 1 and defines LDFLAGS_SONAME_PREFIX to the flag's prefix, to
# which the client would need to append "libwhatever.N". If not, it
@ -984,6 +1049,8 @@ proc proj-dump-defs-json {file args} {
}
########################################################################
# @proj-xfer-option-aliases map
#
# Expects a list of pairs of configure flags which have been
# registered with autosetup, in this form:
#
@ -1049,6 +1116,8 @@ proc proj-redefine-cc-for-build {} {
}
########################################################################
# @proj-which-linenoise headerFile
#
# Attempts to determine whether the given linenoise header file is of
# the "antirez" or "msteveb" flavor. It returns 2 for msteveb, else 1
# (it does not validate that the header otherwise contains the
@ -1063,8 +1132,9 @@ proc proj-which-linenoise {dotH} {
}
########################################################################
# @proj-remap-autoconf-dir-vars
#
# "Re-export" the autoconf-conventional --XYZdir flags into something
# "Re-map" the autoconf-conventional --XYZdir flags into something
# which is more easily overridable from a make invocation.
#
# Based off of notes in <https://sqlite.org/forum/forumpost/00d12a41f7>.
@ -1134,6 +1204,8 @@ proc proj-remap-autoconf-dir-vars {} {
}
########################################################################
# @proj-env-file flag ?default?
#
# If a file named .env-$flag exists, this function returns a
# trimmed copy of its contents, else it returns $dflt. The intended
# usage is that things like developer-specific CFLAGS preferences can
@ -1147,6 +1219,8 @@ proc proj-env-file {flag {dflt ""}} {
}
########################################################################
# @proj-get-env var ?default?
#
# Extracts the value of "environment" variable $var from the first of
# the following places where it's defined:
#

View File

@ -1,5 +1,5 @@
C Enhance\sthe\s--with-emsdk\sflag\sto\suse\sa\sdefault\svalue\sof\s'auto',\smeaning\sto\ssearch\sthe\senvironment\sfor\sit,\sand\sto\sfail\sfatally\sif\s--with-emsdk\sis\sexplicitly\sprovided\sbut\sthe\sSDK\sis\snot\sfound.
D 2024-11-06T02:59:59.807
C Add\sautosetup/README.md\s-\smaintenance-related\sdocs\sfor\sSQLite\sdevelopers\s(e.g.\show\sto\supdate\sautosetup).\sStart\smarking\sup\sthe\sproj.tcl\sAPIs\swith\sautosetup's\sdoc\smarkup\sso\sthat\sthey\sappear\sin\sthe\s./configure\s--reference\soutput.
D 2024-11-06T04:38:05.379
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md c5b4009dca54d127d2d6033c22fd9cc34f53bedb6ef12c7cbaa468381c74ab28
@ -13,7 +13,7 @@ F art/icon-80x90.gif 65509ce3e5f86a9cd64fe7fca2d23954199f31fe44c1e09e208c80fb83d
F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90
F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2
F auto.def 4a5115da298b51f0332fda72933976bded86700c94e30d75066e665795d638d7
F auto.def 062b05538bc09779962a5265125aa289152f6abbb1ebaded9b22e8969b151d75
F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903
F autoconf/Makefile.am adedc1324b6a87fdd1265ddd336d2fb7d4f36a0e77b86ea553ae7cc4ea239347
F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac
@ -37,6 +37,7 @@ F autoconf/tea/win/rules.vc 94a18c3e453535459b4a643983acca52fb8756e79055bd2ad4b0
F autoconf/tea/win/targets.vc 96a25a1fa6e9e9cfb348fd3760a5395b4ce8acafc8ed10f0412937ec200d5dbd
F autosetup/LICENSE 41a26aebdd2cd185d1e2b210f71b7ce234496979f6b35aef2cbf6b80cbed4ce4
F autosetup/README.autosetup a78ff8c4a3d2636a4268736672a74bf14a82f42687fcf0631a70c516075c031e
F autosetup/README.md 94a117db60b2a8efbfed58e548809631f1941a8df9c3c6a356080771b772e31c
F autosetup/autosetup 9416ffdcdd6e2dbf7f6d1e5c890078518930f8af7722a950eacc28c7f151d2d6 x
F autosetup/autosetup-config.guess dfa101c5e8220e864d5e9c72a85e87110df60260d36cb951ad0a85d6d9eaa463 x
F autosetup/autosetup-config.sub a38fb074d0dece01cf919e9fb534a26011608aa8fa606490864295328526cd73 x
@ -49,7 +50,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e
F autosetup/default.auto 5cdf016de2140e50f1db190a02039dc42fb390af1dda4cc4853e3042a9ef0e82
F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14
F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba
F autosetup/proj.tcl 57b9c794d01124c91af840b3ba0ef1e991e815c9a872fa451baff0dc03e9f84a
F autosetup/proj.tcl b3a0621b6e98b9e87813ba7a15a64f92708527dd8efc99a764846c16336aadf0
F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9
F autosetup/tmake.auto eaebc74ad538dfdd3c817c27eefc31930c20510c4f3a3704071f6cb0629ed71f
F autosetup/tmake.tcl a275793ec1b6f8708179af0acef1f6f10d46c2920739743f7a8720c6d700c7a9
@ -2199,8 +2200,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P 8b58cf9bbd3090c60f1ee7468cdeeb0b0fa4560d1e51a5fd0bef43692d10fe04
R caf12b590890f202527bfa9f99549a98
P 9724b747caa926bca09653ea6ac3c0f7869824c9a476eb81f03e1a6763552da1
R 22b44d94fb3a53e904cadda0982c176f
U stephan
Z 9566a0d488cad676e06a60ec48a87114
Z e3f63aefb44fb343dd26a948d9892eb7
# Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
9724b747caa926bca09653ea6ac3c0f7869824c9a476eb81f03e1a6763552da1
aa6213767f0d7e63c753e33aadb95cbeb8e522c22f2fe1bbfa4df66bea6e3380