From: Leo Famulari <leo@famulari.name>
To: guix-devel@gnu.org
Subject: Go build system
Date: Mon, 11 Jul 2016 17:36:21 -0400 [thread overview]
Message-ID: <20160711213621.GA22573@jasmine> (raw)
[-- Attachment #1: Type: text/plain, Size: 846 bytes --]
Now that we have go-1.4 and (almost) go-1.5, we should start thinking
about a go-build-system.
I just wrote my first package using Go, the crude Syncthing package that
is attached. It still needs a lot of work, especially since it builds
Syncthing's dependencies from bundled copies instead of external
packages.
But, it does illustrate some of the assumptions that Go makes when
building. It seems that Go is very particular about directory
structures; it would be better if we could avoid these contortions by
setting some environment variables.
Should Go packages refer to the compiler? This Syncthing package does
retain a reference.
I hope to get some replies from some people who have been building Go
software for longer than 1 day ;)
This is the guide that I used to create this package:
https://docs.syncthing.net/dev/building.html
[-- Attachment #2: 0001-WIP-Add-syncthing.patch --]
[-- Type: text/x-diff, Size: 6865 bytes --]
From 24fad181e128d987cc4066265bbd6e34ff4f5461 Mon Sep 17 00:00:00 2001
From: Leo Famulari <leo@famulari.name>
Date: Mon, 11 Jul 2016 16:37:17 -0400
Subject: [PATCH] WIP: Add syncthing.
* gnu/packages/syncthing.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
---
gnu/local.mk | 1 +
gnu/packages/syncthing.scm | 123 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 124 insertions(+)
create mode 100644 gnu/packages/syncthing.scm
diff --git a/gnu/local.mk b/gnu/local.mk
index d011844..fe3b1d2 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -322,6 +322,7 @@ GNU_SYSTEM_MODULES = \
%D%/packages/suckless.scm \
%D%/packages/swig.scm \
%D%/packages/sxiv.scm \
+ %D%/packages/syncthing.scm \
%D%/packages/synergy.scm \
%D%/packages/task-management.scm \
%D%/packages/tbb.scm \
diff --git a/gnu/packages/syncthing.scm b/gnu/packages/syncthing.scm
new file mode 100644
index 0000000..97ca8ec
--- /dev/null
+++ b/gnu/packages/syncthing.scm
@@ -0,0 +1,123 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages syncthing)
+ #:use-module (guix build-system gnu)
+ #:use-module (guix download)
+ #:use-module (guix git-download)
+ #:use-module (guix licenses)
+ #:use-module (guix packages)
+ #:use-module (gnu packages golang))
+
+(define-public syncthing
+ (package
+ (name "syncthing")
+ (version "v0.13.10")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/syncthing/syncthing.git")
+ (commit version)))
+ (file-name (string-append name "-" version))
+ (sha256
+ (base32
+ "07q3j6mnrza719rnvbkdsmvlkyr2pch5sj2l204m5iy5mxaghpx7"))))
+
+ ;; TODO Make go-build-system.
+ (build-system gnu-build-system)
+ (arguments
+ `(#:phases
+ (modify-phases %standard-phases
+ (delete 'configure) ; No ./configure script.
+
+ ;; This is the directory structure recommended by Syncthings "guide to
+ ;; building": https://docs.syncthing.net/dev/building.html
+ ;; Can we simplify this step?
+ (replace 'unpack
+ (lambda* (#:key source #:allow-other-keys)
+ (let ((tree "src/github.com/syncthing/syncthing"))
+ (copy-recursively source tree))))
+
+ (add-after 'unpack 'set-env
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (let ((source (assoc-ref inputs "source")))
+ (setenv "GOPATH" (getcwd))
+
+ ;; This should control where `go run build.go install` installs
+ ;; things, but it seems to have no effect in this case.
+ (setenv "GOBIN" (assoc-ref outputs "out"))
+
+ ;; Enable use of bundled dependencies. This is a stop-gap
+ ;; until the dependencies are packaged properly.
+ (setenv "GO15VENDOREXPERIMENT" "1"))))
+
+ ;; This is related to the unpack phase. Can it be avoided?
+ (add-before 'build 'chdir
+ (lambda _ (chdir "src/github.com/syncthing/syncthing")))
+
+ (replace 'build
+ (lambda _
+ (zero? (system* "go" "run" "build.go"
+ ;; Disable Syncthing's built-in updater.
+ "-no-upgrade"
+ ;; This might not be necessary if building from a
+ ;; tarball.
+ "-version" ,version))))
+ (replace 'check
+ (lambda _
+ (zero? (system* "go" "run" "build.go" "test"))))
+
+ ;; TODO Make this use `go run build.go install`.
+ (replace 'install
+ (lambda _
+ (copy-recursively "bin" (string-append (assoc-ref %outputs "out")
+ "/bin"))))
+ ;; TODO These man pages are generated from a different Git
+ ;; repo, https://github.com/syncthing/docs.
+ (add-after 'install 'install-doc
+ (lambda* (#:key outputs source #:allow-other-keys)
+ (let* ((out (assoc-ref outputs "out"))
+ (man1 (string-append out "/share/man/man1"))
+ (man5 (string-append out "/share/man/man5"))
+ (man7 (string-append out "/share/man/man7"))
+ (src (string-append source "/man/")))
+ (install-file (string-append src "syncthing.1") man1)
+ (install-file (string-append src "syncthing-config.5") man5)
+ (install-file (string-append src "syncthing-stignore.5") man5)
+ (install-file (string-append src "syncthing-bep.7") man7)
+ (install-file (string-append src "syncthing-device-ids.7") man7)
+ (install-file (string-append src "syncthing-event-api.7") man7)
+ (install-file (string-append src "syncthing-faq.7") man7)
+ (install-file (string-append src "syncthing-globaldisco.7") man7)
+ (install-file (string-append src "syncthing-localdisco.7") man7)
+ (install-file (string-append src "syncthing-networking.7") man7)
+ (install-file (string-append src "syncthing-relay.7") man7)
+ (install-file (string-append src "syncthing-rest-api.7") man7)
+ (install-file (string-append src "syncthing-security.7") man7)
+ (install-file (string-append src "syncthing-versioning.7") man7)
+ (install-file (string-append src "syncthing.1") man7)
+ #t))))))
+ (native-inputs
+ `(("go" ,go-1.5)))
+ (synopsis "Decentralized filesystem synchronization")
+ (description "Syncthing is a peer-to-peer file synchronization tool that
+supports a wide variety of computing platforms. It uses the Block Exchange
+Protocol.")
+ (home-page "https://syncthing.net")
+ ;; TODO Either delete the bundled dependencies or list their licenses here.
+ (license mpl2.0)))
--
2.9.0
next reply other threads:[~2016-07-11 21:36 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-11 21:36 Leo Famulari [this message]
2016-07-24 22:25 ` Go build system Ludovic Courtès
2016-07-25 8:47 ` Andy Wingo
2016-07-25 19:50 ` Leo Famulari
2016-07-25 22:05 ` Go & bundling Ludovic Courtès
2016-07-26 1:56 ` Catonano
2016-07-26 4:06 ` Alex Griffin
2016-07-26 12:07 ` Alex Griffin
2016-08-02 20:50 ` Leo Famulari
2016-07-26 6:33 ` Go build system Christopher Baines
2016-08-02 20:42 ` Leo Famulari
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160711213621.GA22573@jasmine \
--to=leo@famulari.name \
--cc=guix-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.