From 0cfffaef5409f99bbc4140b97b769a400b7467f8 Mon Sep 17 00:00:00 2001 From: Daniel Patterson Date: Wed, 2 Mar 2022 03:38:59 +0000 Subject: [PATCH] config: specify sharedir during build We should use the Makefile value of SHAREDIR when searching for config files and templates etc. This is important for systems which do not use the standard file hierarchy or which do not have a consistent location for installing program files, for example NixOS, which will have a different install location with every update. Signed-off-by: Daniel Patterson Acked-by: Robin Jarry --- Makefile | 1 + README.md | 19 +++++++++++++++++++ config/aerc.conf | 8 ++++---- config/config.go | 39 ++++++++++++++++++++++++++++++++------- doc/aerc-config.5.scd | 8 ++++---- 5 files changed, 60 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 9b9d24f..cf8d743 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,7 @@ MANDIR?=$(PREFIX)/share/man GO?=go GOFLAGS?= LDFLAGS+=-X main.Version=$(VERSION) +LDFLAGS+=-X git.sr.ht/~rjarry/aerc/config.shareDir=$(SHAREDIR) GOSRC!=find * -name '*.go' GOSRC+=go.mod go.sum diff --git a/README.md b/README.md index e562c23..fabed0c 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,25 @@ To install aerc locally: # make install +By default, aerc will install config files to directories under `/usr/local/aerc`, +and will search for templates and stylesets in these locations in order: + +- `${XDG_CONFIG_HOME:-~/.config}/aerc` +- `${XDG_DATA_HOME:-~/.local/share}/aerc` +- `/usr/local/share/aerc` +- `/usr/share/aerc` + +At build time it is possible to add an extra location to this list and to use +that location as the default install location for config files by setting the +`PREFIX` option like so: + + # make PREFIX=/custom/location + # make install PREFIX=/custom/location + +This will install templates and other config files to `/custom/location/share/aerc`, +and man pages to `/custom/location/share/man`. This extra location will have lower +priority than the XDG locations but higher than the fixed paths. + ## Contribution Quick Start Anyone can contribute to aerc. First you need to clone the repository and build diff --git a/config/aerc.conf b/config/aerc.conf index 631a566..a7628e3 100644 --- a/config/aerc.conf +++ b/config/aerc.conf @@ -105,8 +105,8 @@ next-message-on-delete=true # list of directories. If this is unset or if a styleset cannot be found, the # following paths will be used as a fallback in that order: # -# ~/.config/aerc/stylesets -# ~/.local/share/aerc/stylesets +# ${XDG_CONFIG_HOME:-~/.config}/aerc/stylesets +# ${XDG_DATA_HOME:-~/.local/share}/aerc/stylesets # /usr/local/share/aerc/stylesets # /usr/share/aerc/stylesets # @@ -251,8 +251,8 @@ new-email= # list of directories. If this is unset or if a template cannot be found, the # following paths will be used as a fallback in that order: # -# ~/.config/aerc/templates -# ~/.local/share/aerc/templates +# ${XDG_CONFIG_HOME:-~/.config}/aerc/templates +# ${XDG_DATA_HOME:-~/.local/share}/aerc/templates # /usr/local/share/aerc/templates # /usr/share/aerc/templates # diff --git a/config/config.go b/config/config.go index d2512d2..f5d43ec 100644 --- a/config/config.go +++ b/config/config.go @@ -297,13 +297,38 @@ func parseCredential(cred, command string) (string, error) { return u.String(), nil } -var defaultDirs []string = []string{ - path.Join(xdg.ConfigHome(), "aerc"), - path.Join(xdg.DataHome(), "aerc"), - "/usr/local/share/aerc", - "/usr/share/aerc", +// Set at build time +var shareDir string + +func buildDefaultDirs() []string { + var defaultDirs []string + + prefixes := []string{ + xdg.ConfigHome(), + xdg.DataHome(), + } + + // Add XDG_CONFIG_HOME and XDG_DATA_HOME + for _, v := range prefixes { + if v != "" { + defaultDirs = append(defaultDirs, path.Join(v, "aerc")) + } + } + + // Add custom buildtime shareDir + if shareDir != "" && shareDir != "/usr/local/share/aerc" { + defaultDirs = append(defaultDirs, shareDir) + } + + // Add fixed fallback locations + defaultDirs = append(defaultDirs, "/usr/local/share/aerc") + defaultDirs = append(defaultDirs, "/usr/share/aerc") + + return defaultDirs } +var searchDirs = buildDefaultDirs() + func installTemplate(root, name string) error { var err error if _, err = os.Stat(root); os.IsNotExist(err) { @@ -313,7 +338,7 @@ func installTemplate(root, name string) error { } } var data []byte - for _, dir := range defaultDirs { + for _, dir := range searchDirs { data, err = ioutil.ReadFile(path.Join(dir, name)) if err == nil { break @@ -464,7 +489,7 @@ func (config *AercConfig) LoadConfig(file *ini.File) error { } // append default paths to template-dirs and styleset-dirs - for _, dir := range defaultDirs { + for _, dir := range searchDirs { config.Ui.StyleSetDirs = append( config.Ui.StyleSetDirs, path.Join(dir, "stylesets"), ) diff --git a/doc/aerc-config.5.scd b/doc/aerc-config.5.scd index ae8ce1b..9e8451f 100644 --- a/doc/aerc-config.5.scd +++ b/doc/aerc-config.5.scd @@ -219,8 +219,8 @@ These options are configured in the *[ui]* section of aerc.conf. be found, the following paths will be used as a fallback in that order: ``` - ~/.config/aerc/stylesets - ~/.local/share/aerc/stylesets + ${XDG_CONFIG_HOME:-~/.config}/aerc/stylesets + ${XDG_DATA_HOME:-~/.local/share}/aerc/stylesets /usr/local/share/aerc/stylesets /usr/share/aerc/stylesets ``` @@ -417,8 +417,8 @@ These options are configured in the *[templates]* section of aerc.conf. be found, the following paths will be used as a fallback in that order: ``` - ~/.config/aerc/templates - ~/.local/share/aerc/templates + ${XDG_CONFIG_HOME:-~/.config}/aerc/templates + ${XDG_DATA_HOME:-~/.local/share}/aerc/templates /usr/local/share/aerc/templates /usr/share/aerc/templates ```