diff options
author | Philip McGrath <philip@philipmcgrath.com> | 2022-05-18 14:10:50 -0400 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2022-05-22 01:07:51 +0200 |
commit | aefcfdd0ae2aa41adb3d1106752b6a291ef1d80f (patch) | |
tree | 55fd26db24776324bda13f84260ab0f36a404166 /doc | |
parent | 0d480d4c624fba4e192a0718d1500a5924d688f7 (diff) | |
download | guix-aefcfdd0ae2aa41adb3d1106752b6a291ef1d80f.tar guix-aefcfdd0ae2aa41adb3d1106752b6a291ef1d80f.tar.gz |
guix: Add elm-build-system.
* gnu/packages/patches/elm-offline-package-registry.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/elm.scm (elm): Use it.
* guix/build-system/elm.scm, guix/build/elm-build-system.scm,
tests/elm.scm: New files.
* Makefile.scm (MODULES, SCM_TESTS): Add them.
* doc/guix.texi (Build Systems): Document 'elm-build-system'.
* doc/contributing.texi (Elm Packages): New section. Document naming
conventions and utilities.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Diffstat (limited to 'doc')
-rw-r--r-- | doc/contributing.texi | 82 | ||||
-rw-r--r-- | doc/guix.texi | 52 |
2 files changed, 134 insertions, 0 deletions
diff --git a/doc/contributing.texi b/doc/contributing.texi index 862dcbf12a..555b9bb961 100644 --- a/doc/contributing.texi +++ b/doc/contributing.texi @@ -447,6 +447,7 @@ needed is to review and apply the patch. * Perl Modules:: Little pearls. * Java Packages:: Coffee break. * Rust Crates:: Beware of oxidation. +* Elm Packages:: Trees of browser code * Fonts:: Fond of fonts. @end menu @@ -898,6 +899,87 @@ developed for a different Operating System, depend on features from the Nightly Rust compiler, or the test suite may have atrophied since it was released. +@node Elm Packages +@subsection Elm Packages + +@cindex Elm +Elm applications can be named like other software: their names need not +mention Elm. + +Packages in the Elm sense (see @code{elm-build-system} under @ref{Build +Systems}) are required use names of the format +@var{author}@code{/}@var{project}, where both the @var{author} and the +@var{project} may contain hyphens internally, and the @var{author} sometimes +contains uppercase letters. + +To form the Guix package name from the upstream name, we follow a convention +similar to Python packages (@pxref{Python Modules}), adding an @code{elm-} +prefix unless the name would already begin with @code{elm-}. + +In many cases we can reconstruct an Elm package's upstream name heuristically, +but, since conversion to a Guix-style name involves a loss of information, +this is not always possible. Care should be taken to add the +@code{'upstream-name} property when necessary so that tools +will work correctly. The most notable scenarios +when explicitly specifying the upstream name is necessary are: + +@enumerate +@item +When the @var{author} is @code{elm} and the @var{project} contains one or more +hyphens, as with @code{elm/virtual-dom}; and + +@item +When the @var{author} contains hyphens or uppercase letters, as with +@code{Elm-Canvas/raster-shapes}---unless the @var{author} is +@code{elm-explorations}, which is handled as a special case, so packages like +@code{elm-explorations/markdown} do @emph{not} need to use the +@code{'upstream-name} property. +@end enumerate + +The module @code{(guix build-system elm)} provides the following utilities for +working with names and related conventions: + +@deffn {Scheme procedure} elm-package-origin @var{elm-name} @var{version} @ + @var{hash} +Returns a Git origin using the repository naming and tagging regime required +for a published Elm package with the upstream name @var{elm-name} at version +@var{version} with sha256 checksum @var{hash}. + +For example: +@lisp +(package + (name "elm-html") + (version "1.0.0") + (source + (elm-package-origin + "elm/html" + version + (base32 "15k1679ja57vvlpinpv06znmrxy09lbhzfkzdc89i01qa8c4gb4a"))) + ...) +@end lisp +@end deffn + +@deffn {Scheme procedure} elm->package-name @var{elm-name} +Returns the Guix-style package name for an Elm package with upstream name +@var{elm-name}. + +Note that there is more than one possible @var{elm-name} for which +@code{elm->package-name} will produce a given result. +@end deffn + +@deffn {Scheme procedure} guix-package->elm-name @var{package} +Given an Elm @var{package}, returns the possibly-inferred upstream name, or +@code{#f} the upstream name is not specified via the @code{'upstream-name} +property and can not be inferred by @code{infer-elm-package-name}. +@end deffn + +@deffn {Scheme procedure} infer-elm-package-name @var{guix-name} +Given the @var{guix-name} of an Elm package, returns the inferred upstream +name, or @code{#f} if the upstream name can't be inferred. If the result is +not @code{#f}, supplying it to @code{elm->package-name} would produce +@var{guix-name}. +@end deffn + @node Fonts @subsection Fonts diff --git a/doc/guix.texi b/doc/guix.texi index faa35060ef..3eff660f0e 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -102,6 +102,7 @@ Copyright @copyright{} 2021 Sarah Morgensen@* Copyright @copyright{} 2021 Josselin Poiret@* Copyright @copyright{} 2022 Remco van 't Veer@* Copyright @copyright{} 2022 Aleksandr Vityazev@* +Copyright @copyright{} 2022 Philip M@sup{c}Grath@* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -8717,6 +8718,57 @@ only one of them. This is equivalent to passing the @code{-p} argument to @end defvr +@defvr {Scheme variable} elm-build-system +This variable is exported by @code{(guix build-system elm)}. It implements a +build procedure for @url{https://elm-lang.org, Elm} packages similar to +@samp{elm install}. + +The build system adds an Elm compiler package to the set of inputs. The +default compiler package (currently @code{elm}) can be overridden +using the @code{#:elm} argument. Additionally, Elm packages needed by the +build system itself are added as implicit inputs if they are not already +present: to suppress this behavior, use the +@code{#:implicit-elm-package-inputs?} argument, which is primarily useful for +bootstrapping. + +The @code{"dependencies"} and @code{"test-dependencies"} in an Elm package's +@file{elm.json} file correspond to @code{propagated-inputs} and @code{inputs}, +respectively. + +Elm requires a particular structure for package names: @pxref{Elm Packages} +for more details, including utilities provided by @code{(guix build-system +elm)}. + +There are currently a few noteworthy limitations to @code{elm-build-system}: + +@itemize +@item +The build system is focused on @dfn{packages} in the Elm sense of the word: +Elm @dfn{projects} which declare @code{@{ "type": "package" @}} in their +@file{elm.json} files. Using @code{elm-build-system} to build Elm +@dfn{applications} (which declare @code{@{ "type": "application" @}}) is +possible, but requires ad-hoc modifications to the build phases. + +@item +Elm supports multiple versions of a package coexisting simultaneously under +@env{ELM_HOME}, but this does not yet work well with @code{elm-build-system}. +This limitation primarily affects Elm applications, because they specify +exact versions for their dependencies, whereas Elm packages specify supported +version ranges. As a workaround, you can use +the @code{patch-application-dependencies} procedure provided by +@code{(guix build elm-build-system)} to rewrite their @file{elm.json} files to +refer to the package versions actually present in the build environment. +Alternatively, Guix package transformations (@pxref{Defining Package +Variants}) could be used to rewrite an application's entire dependency graph. + +@item +We are not yet able to run tests for Elm projects because neither +@url{https://github.com/mpizenberg/elm-test-rs, @command{elm-test-rs}} nor the +Node.js-based @url{https://github.com/rtfeldman/node-test-runner, +@command{elm-test}} runner has been packaged for Guix yet. +@end itemize +@end defvr + @defvr {Scheme Variable} go-build-system This variable is exported by @code{(guix build-system go)}. It implements a build procedure for Go packages using the standard |