commit 8d5674aa5af25e520a3451aa74c6a63748780357
parent 9e6fb6f91a9a8486cd83a287963ebb2193be3112
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date: Wed, 23 Apr 2025 00:56:20 +0200
Add configure and make and README
Diffstat:
7 files changed, 287 insertions(+), 35 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,25 +0,0 @@
-all: gana server cli
-
-SCRIPT_TARGET:=$(shell dirname $(shell go list -f '{{.Target}}' ./cmd/taldir-server))
-
-gana:
- mkdir -p internal/gana
- git submodule update --init --recursive
- git submodule sync --recursive
- cd third_party/gana/gnu-taler-error-codes && make taler_error_codes.go
- cp third_party/gana/gnu-taler-error-codes/taler_error_codes.go internal/gana/
-
-VERSION=`git describe --tags`
-
-server:
- go build -ldflags "-X main.version=${VERSION}" ./cmd/taldir-server
-
-cli:
- go build -ldflags "-X main.version=${VERSION}" ./cmd/taldir-cli
-
-install: server cli
- go install ./cmd/taldir-server && go install ./cmd/taldir-cli
- chmod +x scripts/validators/*
- cp scripts/validators/* $(SCRIPT_TARGET)
-
-.PHONY: all gana
diff --git a/Makefile.in b/Makefile.in
@@ -0,0 +1,27 @@
+all: server cli
+
+SCRIPT_TARGET:=$(shell dirname $(shell go list -f '{{.Target}}' ./cmd/taldir-server))
+
+VERSION=`git describe --tags`
+
+server:
+ ${GO} build -ldflags "-X main.version=${VERSION} -X main.taldirdatahome=${datadir}/taldir" ./cmd/taldir-server
+
+cli:
+ ${GO} build -ldflags "-X main.version=${VERSION} -X main.taldirdatahome=${datadir}/taldir" ./cmd/taldir-cli
+
+conf:
+ sed taldir.conf.in
+
+install: server cli
+ install ./taldir-server ${DESTDIR}${bindir}
+ install ./taldir-cli ${DESTDIR}${bindir}
+ mkdir -p ${DESTDIR}${datadir}/taldir
+ chmod +x scripts/validators/*
+ cp scripts/validators/* ${DESTDIR}${bindir}
+
+uninstall:
+ ${RM} ${DESTDIR}${bindir}/taldir-*
+ ${RM} -r ${DESTDIR}${datadir}/taldir
+
+.PHONY: all
diff --git a/README.md b/README.md
@@ -8,6 +8,8 @@ The API can be found here: https://docs.taler.net/core/api-taldir.html
Compile and run:
```
+$ ./bootstrap
+$ ./configure --prefix=PREFIX
$ make && make install
(You may have to set your $PATH to include the go/bin folder accordingly)
$ cp config/taldir-example.conf taldir.conf
diff --git a/bootstrap b/bootstrap
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+if ! existence go; then
+ echo "Go binary not in $PATH!"
+ exit 1
+fi
+
+mkdir -p internal/gana
+git submodule update --init --recursive
+git submodule sync --recursive
+cd third_party/gana/gnu-taler-error-codes && make taler_error_codes.go
+cp third_party/gana/gnu-taler-error-codes/taler_error_codes.go internal/gana/
+
+
diff --git a/cmd/taldir-server/main.go b/cmd/taldir-server/main.go
@@ -38,6 +38,7 @@ import (
var (
t taldir.Taldir
version string
+ taldirdatahome string
)
func handleRequests(t *taldir.Taldir) {
@@ -54,7 +55,7 @@ func main() {
cfgfile = *cfgFlag
}
t := taldir.Taldir{}
- t.Initialize(cfgfile, version)
+ t.Initialize(cfgfile, version, taldirdatahome)
t.Cfg.WriteTo(os.Stdout)
handleRequests(&t)
}
diff --git a/configure b/configure
@@ -0,0 +1,220 @@
+#!/bin/sh
+
+pkg_name="taldir"
+pkg_default_features=""
+pkg_optional_features=""
+pkg_optional_dependencies=""
+
+# DO NOT EDIT BELOW THIS LINE
+standard_dirs="prefix exec_prefix bindir sbindir libexecdir sysconfdir sharedstatedir localstatedir runstatedir libdir includedir oldincludedir datarootdir datadir infodir localedir mandir docdir htmldir dvidir pdfdir psdir srcdir"
+standard_utils="AR AS BISON CC CXX CPP FLEX INSTALL LD LDCONFIG LEX MAKE MAKEINFO RANLIB TEXI2DVI YACC CHGRP CHMOD CHOWN MKNOD RM GO"
+standard_flags="ARFLAGS BISONFLAGS CFLAGS CXXFLAGS CPPFLAGS FLEXFLAGS INSTALLFLAGS LDFLAGS LDCONFIGFLAGS LFLAGS MAKEFLAGS MAKEINFOFLAGS RANLIBFLAGS TEXI2DVIFLAGS YACCFLAGS CHGRPFLAGS CHMODFLAGS CHOWNFLAGS MKNODFLAGS"
+standard_vars="INSTALL_DATA INSTALL_PROGRAM INSTALL_SCRIPT"
+generated_comment="# This file was generated by configure. DO NOT edit it directly."
+
+# Save arguments
+cat > config.status <<EOF
+#!/bin/sh
+$generated_comment
+$0 $*
+EOF
+chmod 755 config.status
+
+# Parse arguments
+oldifs="$IFS"
+while [ "$#" -gt "0" ]; do
+ arg="$1"
+ shift
+ argsave="$@"
+
+ IFS="="
+ set -- $arg
+ IFS="$oldifs"
+ arg="$1"
+ shift
+ argparam="$@"
+
+ case "$arg" in
+ --help|-h)
+ cat <<-EOF
+ Usage: $0 [options...]
+ General options:
+
+ <variable>=<value> Overrides default utils and flags, e.g. CC=gcc
+ EOF
+ echo ""
+ echo "Directory variables:"
+ for sdir in $standard_dirs; do
+ echo "--$sdir=<directory>"
+ done
+ echo ""
+ echo "Options specific to $pkg_name:"
+ for feat in $pkg_optional_features; do
+ echo "--enable-$feat[=arg]"
+ done
+ for feat in $pkg_default_features; do
+ echo "--disable-$feat"
+ done
+ for dep in $pkg_optional_dependencies; do
+ echo "--with-$dep"
+ done
+
+ echo
+ echo Other options will be ignored. Please see the README for additional information.
+ exit 0
+ ;;
+ --enable-*)
+ for feat in $pkg_optional_features $pkg_default_features; do
+ ft=$(echo $feat | tr - _)
+ if [ "--enable-$feat" = "$arg" ] && [ -z "$argparam" ]; then
+ eval "enable_$ft=true"
+ elif [ "--enable-$feat" = "$arg" ]; then
+ if [ "$argparam" = "yes" ]; then
+ eval "enable_$ft=\"true\""
+ else
+ eval "enable_$ft=\"$argparam\""
+ fi
+ fi
+ done
+ ;;
+ --disable-*)
+ argsave="--enable-${arg#--disable-}=false $argsave"
+ ;;
+ --with-*)
+ for dep in $pkg_optional_dependencies; do
+ if [ "--with-$dep" = "$arg" ] && [ -z "$argparam" ]; then
+ eval "with_$dep=yes"
+ elif [ "--with-$dep" = "$arg" ]; then
+ eval "with_$dep=\"$argparam\""
+ fi
+ done
+ ;;
+ --without-*)
+ argsave="--with-${arg#--without-}=no $argsave"
+ ;;
+ --*)
+ for dir in $standard_dirs; do
+ [ "--$dir" = "$arg" ] && eval "var_$dir=\"$argparam\""
+ done
+ ;;
+ *)
+ for flag in $standard_utils $standard_flags standard_vars; do
+ [ "$flag" = "$arg" ] && eval "$flag=\"$argparam\""
+ done
+ ;;
+ esac
+
+ set -- $argsave
+done
+
+# Set default values
+for util in $standard_utils; do
+ case "$util" in
+ CPP) eval "$util=\"\${${util}:-\\\$(CC) -E}\"" ;;
+ CXX) eval "$util=\"\${${util}:-g++}\"" ;;
+ RM) eval "$util=\"\${${util}:-rm -f}\"" ;;
+ GO) eval "$util=\"\${${util}:-go}\"" ;;
+ *) eval "$util=\"\${${util}:-${util}}\"" ;;
+ esac
+done
+for feat in $pkg_optional_features; do
+ ft=$(echo $feat | tr - _)
+ eval "enable_$ft=\${enable_$ft:-false}"
+done
+for feat in $pkg_default_features; do
+ eval "enable_$feat=\${enable_$feat:-true}"
+done
+for feat in $pkg_optional_dependencies; do
+ eval "with_$feat=\${with_$feat:-no}"
+done
+
+# Find source files
+if [ -z "$var_srcdir" ]; then
+ [ -f ../Makefile.in ] && var_srcdir=..
+ [ -f ./Makefile.in ] && var_srcdir=.
+fi
+if [ -z "$var_srcdir" ]; then
+ echo "Source files not found. Please specify a directory using --srcdir=..." >&2
+ exit 1
+fi
+
+# Write Makefile
+cat > Makefile <<EOF
+$generated_comment
+SHELL = /bin/sh
+VPATH = ${var_srcdir}
+
+srcdir = ${var_srcdir}
+prefix = ${var_prefix:-/usr/local}
+exec_prefix = ${var_exec_prefix:-\$(prefix)}
+bindir = ${var_bindir:-\$(exec_prefix)/bin}
+sbindir = ${var_sbindir:-\$(exec_prefix)/sbin}
+libexecdir = ${var_libexecdir:-\$(exec_prefix)/libexec}
+datarootdir = ${var_datarootdir:-\$(prefix)/share}
+datadir = ${var_datadir:-\$(datarootdir)}
+sysconfdir = ${var_sysconfdir:-\$(prefix)/etc}
+sharedstatedir = ${var_sharedstatedir:-\$(prefix)/com}
+localstatedir = ${var_localstatedir:-\$(prefix)/var}
+runstatedir = ${var_runstatedir:-\$(localstatedir)/run}
+includedir = ${var_includedir:-\$(prefix)/include}
+oldincludedir = ${var_oldincludedir:-/usr/include}
+docdir = ${var_docdir:-\$(datarootdir)/doc/"$pkg_name"}
+infodir = ${var_infodir:-\$(datarootdir)/info}
+htmldir = ${var_htmldir:-\$(docdir)}
+dvidir = ${var_dvidir:-\$(docdir)}
+pdfdir = ${var_pdfdir:-\$(docdir)}
+psdir = ${var_psdir:-\$(docdir)}
+libdir = ${var_libdir:-\$(exec_prefix)/lib}
+lispdir = ${var_lispdir:-\$(datarootdir)/emacs/site-lisp}
+localedir = ${var_localedir:-\$(datarootdir)/locale}
+mandir = ${var_mandir:-\$(datarootdir)/man}
+manext = .1
+EOF
+
+for var in $standard_utils $standard_flags $standard_vars; do
+ eval "echo \"${var} = \$${var}\" >> Makefile"
+done
+echo >> Makefile
+
+for feat in $pkg_optional_features $pkg_default_features; do
+ ft=$(echo $feat | tr - _)
+ eval "echo \"enable_$ft=\${enable_$ft}\" >> Makefile"
+done
+for dep in $pkg_optional_dependencies; do
+ eval "echo \"with_$dep=\${with_$dep}\" >> Makefile"
+done
+echo >> Makefile
+
+cat "${var_srcdir}/Makefile.in" >> Makefile
+
+# Create default targets, if not already present
+default_target() {
+ grep "^$1:" Makefile >/dev/null && return
+ echo ".PHONY: $1" >> Makefile
+ echo "$1: $2" >> Makefile
+ cat >> Makefile
+ echo >> Makefile
+}
+
+#default_target Makefile <<EOF
+# ./config.status
+#EOF
+for format in html dvi pdf ps; do
+ default_target "$format" </dev/null
+ default_target "install-$format" "$format" </dev/null
+done
+default_target check </dev/null
+default_target mostlyclean clean </dev/null
+default_target distclean clean <<EOF
+ \$(RM) Makefile config.status
+EOF
+default_target maintainer-clean distclean </dev/null
+default_target install-strip <<EOF
+ \$(MAKE) INSTALL_PROGRAM='\$(INSTALL_PROGRAM) -s' \\
+ INSTALL_SCRIPT='\$(INSTALL_SCRIPT)' install
+EOF
+
+# Done
+echo "Package $pkg_name configured successfully."
+echo "Run 'make' to build and 'make install' to install the package"
+
diff --git a/pkg/rest/taldir.go b/pkg/rest/taldir.go
@@ -916,14 +916,27 @@ func getFuncs(current *i18n.Locale) template.FuncMap {
}
}
+func (t *Taldir) getFileName(relativeFileName string, datahome string) string {
+ _, err := os.Stat(relativeFileName)
+ if errors.Is(err, os.ErrNotExist) {
+ _, err := os.Stat(datahome + "/" + relativeFileName)
+ if errors.Is(err, os.ErrNotExist) {
+ return ""
+ }
+ return datahome + "/" + relativeFileName
+ }
+ return relativeFileName
+}
+
// Initialize the Taldir instance with cfgfile
-func (t *Taldir) Initialize(cfgfile string, version string) {
+func (t *Taldir) Initialize(cfgfile string, version string, datahome string) {
_cfg, err := ini.LooseLoad(cfgfile)
if err != nil {
log.Fatalf("Failed to read config: %v", err)
os.Exit(1)
}
t.Cfg = _cfg
+ // FIXME localedir
t.I18n, err = i18n.New(i18n.Glob("./locales/*/*", i18n.LoaderConfig{
// Set custom functions per locale!
Funcs: getFuncs,
@@ -935,8 +948,8 @@ func (t *Taldir) Initialize(cfgfile string, version string) {
fmt.Println("Production mode enabled")
}
- navTplFile := t.Cfg.Section("taldir").Key("navigation").MustString("web/templates/nav.html")
- footerTplFile := t.Cfg.Section("taldir").Key("footer").MustString("web/templates/footer.html")
+ navTplFile := t.Cfg.Section("taldir").Key("navigation").MustString(t.getFileName("web/templates/nav.html", datahome))
+ footerTplFile := t.Cfg.Section("taldir").Key("footer").MustString(t.getFileName("web/templates/footer.html", datahome))
t.Version = version
t.BaseUrl = t.Cfg.Section("taldir").Key("base_url").MustString("http://localhost:11000")
t.Validators = make(map[string]Validator)
@@ -949,7 +962,7 @@ func (t *Taldir) Initialize(cfgfile string, version string) {
continue
}
vname := strings.TrimPrefix(sec.Name(), "taldir-validator-")
- vlandingPageTplFile := sec.Key("registration_page").MustString("web/templates/landing_" + vname + ".html")
+ vlandingPageTplFile := sec.Key("registration_page").MustString(t.getFileName("web/templates/landing_" + vname + ".html", datahome))
vlandingPageTpl, err := template.ParseFiles(vlandingPageTplFile, navTplFile, footerTplFile)
if err != nil {
log.Printf("`%s` template not found, disabling validator `%s`.\n", vlandingPageTplFile, vname)
@@ -1023,31 +1036,31 @@ func (t *Taldir) Initialize(cfgfile string, version string) {
time.Sleep(validationExp)
}
}()
- imprintTplFile := t.Cfg.Section("taldir").Key("imprint_page").MustString("web/templates/imprint.html")
+ imprintTplFile := t.Cfg.Section("taldir").Key("imprint_page").MustString(t.getFileName("web/templates/imprint.html", datahome))
t.ImprintTpl, err = template.ParseFiles(imprintTplFile, navTplFile, footerTplFile)
if err != nil {
log.Fatal(err)
os.Exit(1)
}
- validationLandingTplFile := t.Cfg.Section("taldir").Key("validation_landing").MustString("web/templates/validation_landing.html")
+ validationLandingTplFile := t.Cfg.Section("taldir").Key("validation_landing").MustString(t.getFileName("web/templates/validation_landing.html", datahome))
t.ValidationTpl, err = template.ParseFiles(validationLandingTplFile, navTplFile, footerTplFile)
if err != nil {
log.Fatal(err)
os.Exit(1)
}
- landingTplFile := t.Cfg.Section("taldir").Key("landing_page").MustString("web/templates/landing.html")
+ landingTplFile := t.Cfg.Section("taldir").Key("landing_page").MustString(t.getFileName("web/templates/landing.html", datahome))
t.LandingPageTpl, err = template.ParseFiles(landingTplFile, navTplFile, footerTplFile)
if err != nil {
log.Fatal(err)
os.Exit(1)
}
- lookupResultTplFile := t.Cfg.Section("taldir").Key("lookup_result_page").MustString("web/templates/lookup_result.html")
+ lookupResultTplFile := t.Cfg.Section("taldir").Key("lookup_result_page").MustString(t.getFileName("web/templates/lookup_result.html", datahome))
t.LookupResultPageTpl, err = template.ParseFiles(lookupResultTplFile, navTplFile, footerTplFile)
if err != nil {
log.Fatal(err)
os.Exit(1)
}
- aboutTplFile := t.Cfg.Section("taldir").Key("about_page").MustString("web/templates/about.html")
+ aboutTplFile := t.Cfg.Section("taldir").Key("about_page").MustString(t.getFileName("web/templates/about.html", datahome))
t.AboutPageTpl, err = template.ParseFiles(aboutTplFile, navTplFile, footerTplFile)
if err != nil {
log.Fatal(err)